個人了解到的靜默安裝的方式有以下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],不知道怎么破了,可能是廠商的定制問題吧。。。還在思考中。。。