• 效果
  • GitHub
  • 参考文章
  • 添加权限
  • 在清单文件里注册service
  • 配置文件
  • 自定义服务
  • 自定义服务中的字符串
  • 总结

效果

要开启辅助功能并且,并且android版本在api-14或者以上.

GitHub

Afra55/TrainingFirstApp
https://github.com/Afra55/TrainingFirstApp/tree/master

参考文章

最近看到应用宝最新版也加了新功能“省心装”,觉得这玩意挺不错,就研究了下,奈何网上资料少的渣渣,便参考了如下几篇文章自己动手简单实现了下。
(1)使用Android Accessibility实现免Root自动批量安装功能
http://www.infoq.com/cn/articles/android-accessibility-installing?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global

(2)专访豌豆荚「自动装」开发团队:无需Root即可批量点击「下一步」-CSDN.NET
http://www.csdn.net/article/1970-01-01/2824737

(3)https://developer.android.com/intl/zh-cn/guide/topics/ui/accessibility/services.html

添加权限

<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/>

在清单文件里注册service

<!--省心装--><service android:name=".module.accessibility_service.MAcessibilityService"android:label="@string/acc_auto_install_service_name"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"android:enabled="@bool/atLeastIceCreamSandwich"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-data
                android:name="android.accessibilityservice"android:resource="@xml/accessibility_config" /></service>
  • atLeastIceCreamSandwich”是判定当前系统是否api-14及以上版本,14以下的便自己手动安装吧>~<:

  • accessibility_config是配置文件,在res的xml文件夹下:

配置文件

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/acc_auto_install_service_description"android:accessibilityEventTypes="typeAllMask"android:accessibilityFlags="flagDefault"android:accessibilityFeedbackType="feedbackGeneric"android:notificationTimeout="100"android:canRetrieveWindowContent="true"android:packageNames="com.android.packageinstaller"
/>
  • description:是描述,在辅助功能里展示。
  • packageNames:就是要监听的包名,可以有多个,中间用逗号隔开。比如 “packageName1, packageName2”。

自定义服务

/*** Created by yangshuai in the 11:43 of 2015.10.22 .* https://developer.android.com/intl/zh-cn/guide/topics/ui/accessibility/services.html* 省心装服务*/
public class MAcessibilityService extends AccessibilityService{/* 完成安装flag*/private final static int FINISH_INSTALL = 1009;/* 检测安装过程flag*/private final static int  CHECK_INSTALL = 1008;/* 是否执行*/private static boolean enable = false;/* 正在模拟点击*/private boolean clicking = false;/* 模拟点击的次数, 完成安装后的返回没有计算在里面*/private static int onClickCount = 0;private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case CHECK_INSTALL:btnPerformClick((List<AccessibilityNodeInfo>)msg.obj);break;case FINISH_INSTALL:enable = false;AccessibilityService service = (AccessibilityService) msg.obj;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);}break;}}};/*** 设置是否监测* @param ok*/public static void setEnable(boolean ok){enable = ok;onClickCount = 0;}/*** Callback for {@link AccessibilityEvent}s.** @param event An event.*/@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {// 如果不监测,和正在模拟点击中if (!enable || clicking) return;AccessibilityNodeInfo nodeInfo = event.getSource();if (nodeInfo == null) {return;}/**for (int i = 0; i < nodeInfo.getChildCount(); i++) {Log.d("MAcessibilityService", "nodeInfo.getChild(i):" + nodeInfo.getChild(i).getText());}**/List<AccessibilityNodeInfo> nextBtn = null;if ((nextBtn = nodeInfo.findAccessibilityNodeInfosByText(getString(R.string.installing))) != null && (nextBtn.size() > 0)){   // 如果正在安装Log.d("wahaha", "正在安装");nextBtn.get(0).recycle();}else if((((nextBtn = nodeInfo.findAccessibilityNodeInfosByText(getString(R.string.next)))!=null && nextBtn.size() > 0) ||     // 获取下一步按钮控件((nextBtn = nodeInfo.findAccessibilityNodeInfosByText(getString(R.string.install))) !=null && nextBtn.size() > 0)||       // 获取安装按钮控件((nextBtn = nodeInfo.findAccessibilityNodeInfosByText(getString(R.string.done))) !=null && nextBtn.size() > 0))         // 获取完成按钮控件) {// 模拟点击flag设置为trueclicking = true;Message message = new Message();message.obj = nextBtn;message.what = CHECK_INSTALL;handler.sendMessageDelayed(message, 500);}else {// 判断是否完成安装handler.removeMessages(FINISH_INSTALL);Message message = new Message();message.what = FINISH_INSTALL;message.obj = this;handler.sendMessageDelayed(message, 1800);}nodeInfo.recycle();}/*** 模拟点击* @param nextBtn* @return*/private boolean btnPerformClick(List<AccessibilityNodeInfo> nextBtn) {Log.d("MAcessibilityService", "onClickCount:" + ++onClickCount);AccessibilityNodeInfo nextInfo = nextBtn.get(nextBtn.size() - 1);if (nextInfo == null) {return true;}nextInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);nextInfo.recycle();clicking = false;return false;}/*** Callback for interrupting the accessibility feedback.*/@Overridepublic void onInterrupt() {}
}

自定义服务中的字符串

values/strings

 <!-- 省心装--><string name="install">INSTALL</string><string name="installing">Installing…</string><string name="done">DONE</string><string name="next">NEXT</string>

values-zh-rCN/strings

 <!-- 省心装--><string name="install">安装</string><string name="installing">正在安装...</string><string name="done">完成</string><string name="next">下一步</string>

总结

如上,很简单就实现了自动安装的功能,当然这里没有对所有机型进行适配。在使用的时候要注意一点是,在使用的时候添加如下一行代码,这样服务才会进行检查:

MAcessibilityService.setEnable(true);

博客地址:http://blog.csdn.net/yang786654260/article/details/49422687

Android免Root自动安装apk相关推荐

  1. android.os.FileUriExposedException 自动安装APK报错 5分钟搞定Android 7.0+ FileProvider

    android.os.FileUriExposedException 自动安装APK报错  5分钟搞定Android 7.0+ FileProvider 适配步骤: 1. 创建file_paths.x ...

  2. android tmp目录权限不够,android - 使用root用户安装APK,处理“ / data / local / tmp /”文件夹的新限制 - 堆栈内存溢出...

    背景 到目前为止,我可以通过以下代码使用root(在应用程序内)安装APK文件: pm install -t -f fullPathToApkFile 并且如果我想(尝试)安装到sd-card: pm ...

  3. 使用Android Accessibility实现免Root自动批量安装功能

    对于国内Android设备,应用的自动批量安装/更新一直是一个痛点,在之前,第三方应用商店通常要求设备Root,然后调用系统的PackageManagerService命令行来实现后台安装.最近,豌豆 ...

  4. Android免Root环境下Hook框架Legend原理分析

    0x1 应用场景 现如今,免Root环境下的逆向分析已经成为一种潮流! 在2015年之前的iOS软件逆向工程领域,要想对iOS平台上的软件进行逆向工程分析,越狱iOS设备与安装Cydia是必须的!几乎 ...

  5. 【android免root脚本制作】基于控件的操作——auto.js进阶

    在[android免root脚本制作]自动坐标操作手机--京东金融程序金果摇钱树自动收金果 之后,想要做进一步优化,因为基于坐标点击如何屏幕被移动之类就会点击错位,不同手机还需去适配坐标,甚是麻烦,所 ...

  6. appium自动化脚本之自动安装apk包到手机

    Appium基础篇3-第一个appium自动化脚本之自动安装apk包到手机 这篇,我们开始来一个实战练习,如何通过appium自动把电脑上一个安卓程序包给安装到一台安卓手机中.在写脚本之前,我们需要统 ...

  7. python自动安装apk文件

    最近在学习python,在前一段时间用dos写了一脚本,自动安装apk文件,于是也试着用python写了一这样的脚本. dos脚本地址:http://blog.csdn.net/lyhdream/ar ...

  8. Android免root查看数据库内容

    Android免root查看数据库内容 用Android Studio 的一个小工具 1.首先需要Android Studio 3.0 还没有升级AS 3.0的小伙伴赶快升级啦. AS升级方式:菜单栏 ...

  9. 干货|Android免Root最全Hook插件(免Root Hook任意App)

    支持276个API接口的Hook,覆盖Android系统级API和50个常见开源框架的Hook,包括对网络.算法.TextView.WebView.JSONObject等API接口的Hook支持,可以 ...

最新文章

  1. DivCo: Diverse Conditional Image Synthesis via Contrastive Generative Adversarial Network
  2. 最新阿里内推Java后端面试题
  3. laravel 服务提供者介绍和使用
  4. python列表对象相同_Python中的学习列表对象,List
  5. visio网络拓扑图_人船模型怎么画?分享高颜值模型图软件
  6. mysql字段数值累加_mysql字段值(字符串)累加 | 学步园
  7. 计算机图形学图形旋转_计算机图形学中的平板显示
  8. 共享单车数据集_共享单车项目数据可视化展示
  9. 工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
  10. js中对同步和异步的理解
  11. 在GitHub里生成自己的网页
  12. python3.5和python3.6关于json模块的区别
  13. python下载完是什么样的图片_[宅男福利]用Python下载页面中所有的图片
  14. JPEG 原理分析及 JPEG 解码器的调试
  15. html语言文本框怎么做,HTML文本框参考样式
  16. 会议OA之会议排座送审
  17. java 气泡图_java报表开发制作气泡图
  18. document onload和window onload的区别?
  19. Python图片读显写的几种方式
  20. 计算机类分流论文,储蓄存款分流结构论文

热门文章

  1. 2021年工具钳工(中级)考试内容及工具钳工(中级)模拟试题
  2. android测试框架对比(二)
  3. 本篇适合攻壳机动队初学者阅读
  4. 用草料二维码生成器制作二维码
  5. banq 为什么大部分NoSQL不提供分布式事务?
  6. 51单片机“密码锁”代码详解
  7. python程序化交易实例-python程序化交易神器——tushare
  8. Linux下安装TMalign、IUpred2a和DSSP
  9. 详解如何批量采集58同城二手房数据及中介联系方式
  10. pkpm服务器修改数据,[转载]pkpm参数不满足调整方法