最近公司有项目需要实现静默升级,升级完成之后还需要自启动,后来查阅了一些资料,实现了所需要的功能
一、静默升级
其实就是静默安装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中注册下就可以了
这个就实现了,静默升级和自启动。