最近研究了Android的静默安装和智能安装,于是写博客记录一下。静默安装就是无声无息的在后台安装apk,没有任何界面提示。智能安装就是有安装界面,但全部是自动的,不需要用户去点击。
首先强调两点:静默安装必须要根权限智能安装必须要用户手动开启无障碍服务
静默安装、卸载的原理就是利用点安装命令来安装apk,点卸载来卸载apk。智能安装是利用android系统提供的无障碍服务AccessibilityService,来模拟用户点击,从而自动安装。
<强>(1)点安装强>
点安装命令的用法及参数解释如下:
& lt;代码类=" hljs haml "祝辞点安装(- l) (- r) [t][我INSTALLER_PACKAGE_NAME] [s] [f]路径 选项: 与FORWARD_LOCK - l:安装包。 - r:重新安装一个现有应用程序,使其数据。 - t:允许测试. apk被安装。 我:指定安装程序包名称。 s:安装包> & lt;代码类=" hljs livecodeserver”祝辞点卸载(- k)包 选项: - k:保持数据和缓存目录。;/code>
上面英语很简单,不解释了。
为了方便演示,我把爱奇艺的安装包重命名为test.apk后放在了sdcard上。你可以自己去爱奇艺官网去下载,也可以自己找一个apk放到sdcard上,但是要知道的apk的包名,后面卸载的时候要用到。
先上代码:
& lt;代码类=" hljs cs "祝辞//静默安装 私人空间installSlient () { 字符串cmd="点安装- r/mnt/sdcard/test.apk”; 过程过程=零; DataOutputStream os=零; BufferedReader successResult=零; BufferedReader errorResult=零; StringBuilder successMsg=零; StringBuilder errorMsg=零; 尝试{//静默安装需要根权限 过程=Runtime.getRuntime () .exec(“苏”); 操作系统=new DataOutputStream (process.getOutputStream ()); os.write (cmd.getBytes ()); os.writeBytes (“\ n”); os.writeBytes(“退出\ n”); os.flush ();//执行命令 process.waitFor ();//获取返回结果 successMsg=new StringBuilder (); errorMsg=new StringBuilder (); successResult=new BufferedReader(新InputStreamReader (process.getInputStream ())); errorResult=new BufferedReader(新InputStreamReader (process.getErrorStream ())); 字符串年代; 而((s=successResult.readLine ()) !=null) { successMsg.append(年代); } 而((s=errorResult.readLine ()) !=null) { errorMsg.append(年代); } }捕捉(异常e) { e.printStackTrace (); 最后}{ 尝试{ 如果(os !=null) { os.close (); } 如果(过程!=null) { process.destroy (); } 如果(successResult !=null) { successResult.close (); } 如果(errorResult !=null) { errorResult.close (); } }捕捉(异常e) { e.printStackTrace (); } }//显示结果 tvt。setText(“成功消息:“+ successMsg.toString () +“\ n”+“错误消息:“+ errorMsg.toString ()); }& lt;/code>
这段代码就是在程序中执行点命令,和在亚洲开发银行下执行<代码>点安装- r/mnt/sdcard/测试。apk> 代码效果是一样的,关键的代码是<代码> Runtime.getRuntime () .exec (su)> 代码,这段代码会要求获取根权限,所以你的手机必须根,不想根的话,直接用模拟器也可以。
通过<代码> Runtime.getRuntime () .exec (su) 代码>获取到过程对象后就可以写入命令了,每写入一条命令就要换行,写入“\ n”即可,最后写入退出后离开命令执行的环境。
静默卸载和静默安装是一样的,只是命令不同,静默卸载需要用到包名,同样,静默卸载也需要根权限
看代码:
& lt;代码类=" hljs java "祝辞//爱奇艺的apk的包名 私有静态最终字符串PACKAGE_NAME=癱om.qiyi.video”;//静默卸载 私人空间uninstallSlient () { 字符串cmd=暗阈对亍? PACKAGE_NAME; 过程过程=零; DataOutputStream os=零; BufferedReader successResult=零; BufferedReader errorResult=零; StringBuilder successMsg=零; StringBuilder errorMsg=零; 尝试{//卸载也需要根权限 过程=Runtime.getRuntime () .exec(“苏”); 操作系统=new DataOutputStream (process.getOutputStream ()); os.write (cmd.getBytes ()); os.writeBytes (“\ n”); os.writeBytes(“退出\ n”); os.flush ();//执行命令 process.waitFor ();//获取返回结果 successMsg=new StringBuilder (); errorMsg=new StringBuilder (); successResult=new BufferedReader(新InputStreamReader (process.getInputStream ())); errorResult=new BufferedReader(新InputStreamReader (process.getErrorStream ())); 字符串年代; 而((s=successResult.readLine ()) !=null) { successMsg.append(年代); } 而((s=errorResult.readLine ()) !=null) { errorMsg.append(年代); } }捕捉(异常e) { e.printStackTrace (); 最后}{ 尝试{ 如果(os !=null) { os.close (); } 如果(过程!=null) { process.destroy (); } 如果(successResult !=null) { successResult.close (); } 如果(errorResult !=null) { errorResult.close (); } }捕捉(异常e) { e.printStackTrace (); } }//显示结果 tvt。setText(“成功消息:“+ successMsg.toString () +“\ n”+“错误消息:“+ errorMsg.toString ()); }& lt;/code>Android静默安装和智能安装的实现方法