个人了解到的静默安装的方式有以下4种:
- root手机,通过su命令获取root权限,并执行pm -r path命令。
缺点:需要root手机;需要询问用户获取超级权限;
参考:Android静默安装实现方案,仿360手机助手秒装和智能安装功能
注意:上述参考的文章中的isRoot方法有误,应改为如下:
//bool = (!new File("/system/bin/su").exists()) || (!new File("/system/xbin/su").exists());
bool = new File("/system/bin/su").exists() || new File("/system/xbin/su").exists();
使用无障碍服务
缺点:需要引导用户打开对应的无障碍服务;安装界面仍旧会弹出,只是智能地帮用户完成了点击操作;
参考:Android静默安装实现方案,仿360手机助手秒装和智能安装功能打上系统签名,声明INSTALL_PACKAGES权限,执行pm -r path命令。
缺点:需要系统签名;
参考:使用pm命令安装或卸载apk,静默安装、卸载方法
注意:上述参考的文章中在给apk系统签名前,在manifest中添加了android:sharedUserId,但我使用源码编译的方式来打上系统签名时没有添加android:sharedUserId也没问题;文章中没有提到要添加INSTALL_PACKAGES权限,但我测试后发现是需要的。关于系统签名请看
Android应用程序获取系统签名的方法,个人对是否需要添加android:sharedUserId还是有疑惑,有知道的小伙伴麻烦告知下哈。打上系统签名,声明INSTALL_PACKAGES权限,引入IPackageManager相关代码,调用iPm.installPackage(Uri.fromFile(apkFile), null, 2,apkFile.getName());进行静默安装。
缺点:需要系统签名;需要引入源码中的相关代码;
参考:Android真正的静默安装
我看了一些第三方的应用市场,一般在设置下都会有前两种静默安装的方式可供选择,而后两种静默安装的方式主要是厂商自己的应用市场使用。
Android7.0静默安装
如果在7.0的系统上使用第三种静默安装的方式会出现以下错误:
java.lang.SecurityException:
Permission Denial: runInstallCreate from pm command asks to run as user -1 but is calling from user 0;
this requires android.permission.INTERACT_ACROSS_USERS_FULL
参考:
Android7.0的静默安装失败问题研究
Android N 静默安装和卸载
主要步骤如下:
- 修改命令为pm install -i 作为安装者的应用包名 --user 0 需要安装的应用在移动设备上的路径。
- 添加android.permission.INTERACT_ACROSS_USERS_FULL权限。
我试了以上两篇文章的介绍的方法,还是失败,提示Failure [null],不知道怎么破了,可能是厂商的定制问题吧。。。还在思考中。。。