Android免Root自动安装apk
- 效果
- 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相关推荐
- android.os.FileUriExposedException 自动安装APK报错 5分钟搞定Android 7.0+ FileProvider
android.os.FileUriExposedException 自动安装APK报错 5分钟搞定Android 7.0+ FileProvider 适配步骤: 1. 创建file_paths.x ...
- android tmp目录权限不够,android - 使用root用户安装APK,处理“ / data / local / tmp /”文件夹的新限制 - 堆栈内存溢出...
背景 到目前为止,我可以通过以下代码使用root(在应用程序内)安装APK文件: pm install -t -f fullPathToApkFile 并且如果我想(尝试)安装到sd-card: pm ...
- 使用Android Accessibility实现免Root自动批量安装功能
对于国内Android设备,应用的自动批量安装/更新一直是一个痛点,在之前,第三方应用商店通常要求设备Root,然后调用系统的PackageManagerService命令行来实现后台安装.最近,豌豆 ...
- Android免Root环境下Hook框架Legend原理分析
0x1 应用场景 现如今,免Root环境下的逆向分析已经成为一种潮流! 在2015年之前的iOS软件逆向工程领域,要想对iOS平台上的软件进行逆向工程分析,越狱iOS设备与安装Cydia是必须的!几乎 ...
- 【android免root脚本制作】基于控件的操作——auto.js进阶
在[android免root脚本制作]自动坐标操作手机--京东金融程序金果摇钱树自动收金果 之后,想要做进一步优化,因为基于坐标点击如何屏幕被移动之类就会点击错位,不同手机还需去适配坐标,甚是麻烦,所 ...
- appium自动化脚本之自动安装apk包到手机
Appium基础篇3-第一个appium自动化脚本之自动安装apk包到手机 这篇,我们开始来一个实战练习,如何通过appium自动把电脑上一个安卓程序包给安装到一台安卓手机中.在写脚本之前,我们需要统 ...
- python自动安装apk文件
最近在学习python,在前一段时间用dos写了一脚本,自动安装apk文件,于是也试着用python写了一这样的脚本. dos脚本地址:http://blog.csdn.net/lyhdream/ar ...
- Android免root查看数据库内容
Android免root查看数据库内容 用Android Studio 的一个小工具 1.首先需要Android Studio 3.0 还没有升级AS 3.0的小伙伴赶快升级啦. AS升级方式:菜单栏 ...
- 干货|Android免Root最全Hook插件(免Root Hook任意App)
支持276个API接口的Hook,覆盖Android系统级API和50个常见开源框架的Hook,包括对网络.算法.TextView.WebView.JSONObject等API接口的Hook支持,可以 ...
最新文章
- DivCo: Diverse Conditional Image Synthesis via Contrastive Generative Adversarial Network
- 最新阿里内推Java后端面试题
- laravel 服务提供者介绍和使用
- python列表对象相同_Python中的学习列表对象,List
- visio网络拓扑图_人船模型怎么画?分享高颜值模型图软件
- mysql字段数值累加_mysql字段值(字符串)累加 | 学步园
- 计算机图形学图形旋转_计算机图形学中的平板显示
- 共享单车数据集_共享单车项目数据可视化展示
- 工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
- js中对同步和异步的理解
- 在GitHub里生成自己的网页
- python3.5和python3.6关于json模块的区别
- python下载完是什么样的图片_[宅男福利]用Python下载页面中所有的图片
- JPEG 原理分析及 JPEG 解码器的调试
- html语言文本框怎么做,HTML文本框参考样式
- 会议OA之会议排座送审
- java 气泡图_java报表开发制作气泡图
- document onload和window onload的区别?
- Python图片读显写的几种方式
- 计算机类分流论文,储蓄存款分流结构论文