最近公司有項目需要實現靜默升級,升級完成之后還需要自啟動,后來查閱了一些資料,實現了所需要的功能
一、靜默升級
其實就是靜默安裝apk,常見的方式一般都要root,或者開啟輔助功能,(需要的話可以看下這個項目github.com/a-voyager/AutoInstaller),但是這不是我們想要的,后來觀察源碼發現真正的安裝是通過“pm”工具完成的,那我們就通過他來實現靜默安裝
1、找到所需要的“pm"工具,可以在你需要升級的Android版本的源碼中找到(frameworks -> base -> core -> java -> android -> content -> pm :),然后放到項目里
IPackageManager類中有個
installPackage( packageURI, observer, flags, installerPackageName)
packageURI:安裝包的地址。
observer:安裝完成后的回調函數。
flags:安裝方式,主要有普通安裝和覆蓋安裝。1表示普通,2表示覆蓋。
installerPackageName:執行安裝的應用程序名。
然后通過Java的反射原理拿到ServiceManager的getService方法,下載好apk調用下面方法就可以安裝了
2、配置權限,因為靜默升級需要系統權限所有我們在Manifest文件中加上
android:sharedUserId="android.uid.system"
并且配置安裝apk的權限
android:name="android.permission.INSTALL_PACKAGES"
3、給你的應用打上系統簽名
文件位置:..\android_project\build\target\product\security中找到media.pk8、media.x509.pem、platform.pk8、platform.x509.pem、shared.pk8、shared.x509.pem、testkey.pk8、testkey.x509.pem等簽名文件,對應不同的權限系統,我們需要的是
首先把項目打成一個未簽名的包,然后在對這個包進行簽名,找到簽名文件所在位置,調用以下命令進行簽名
java -jar signapk.jar platform.x509.pem platform.pk8 app-debug.apk app-test-sign.apk
這個時候就會生成我們想要的簽名包
靜默升級就完成了。
二、自啟動
1、原本想著安裝完成有回調方法
然后通過包名啟動APP,
后來發現無法啟動。有興趣的同學可以再去試試看,之所以后來沒用這種方式,因為我找了一個更加簡單的方式
2、通過廣播啟動
通過這個廣播我們就可以監聽到APP是否更新過,然后在Manifast中注冊下就可以了
這個就實現了,靜默升級和自啟動。