您的位置:首页 > 移动开发 > Android开发

android系统级应用静默升级及注意事项

2014-11-13 12:04 393 查看
android静默安装apk使用android.content.pm.PackageManager.installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName)进行安装应用程序,ovserver
和packagename都可为null,但是为系统级应用静默升级时,由于在android源代码里面的PackageManager会检查versionCode:

如果更新或者升级后系统内置应用,遇到重启Android系统后内置应用被还原,那是因为手动安装的APK版本号和系统内置API版本号一样。

1、Android系统应用更新机制

系统为每个应用在AndroidMainfest.xml提供了versionName、versionCode两个属性。

versionName:String类型,用来给应用的使用者来查看版本.

versionCode:Integer类型,作为系统判断应用是否能升级的依据。

2、Android系统内置应用更新判断代码

代码来自frameworks/base/services/java/com/android/server/PackageManagerService.java 中 scanPackageLI函数的package更新判断条件(约第2580-2621行附近)

// First check if this is a system package that may involve an update

if (updatedPkg != null && (parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0) {

if (!ps.codePath.equals(scanFile)) {

// The path has changed from what was last scanned... check the

// version of the new path against what we have stored to determine

// what to do.

if (pkg.mVersionCode < ps.versionCode) {

// The system package has been updated and the code path does not match

// Ignore entry. Skip it.

从上面代码注释可以知道:更新系统内置应用时,如果新的versionCode没有大于当前安装的版本,更新将被忽略。

注意事项:

升级apk制作,升级的apk和升级后的apk,两个apk都需要用相同签名,否则用上面的方法升级时不成功,会报签名不同的错误,所以两个apk要在同一个pc编译的apk,或者用同一签名apk
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: