Android系统内置应用更新或升级后被还原的原因

转载 2016年08月30日 15:33:04
如果更新或者升级后系统内置应用,遇到重启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更新判断条件
//如果是系统安装包  
if (updatedPkg != null && (parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0) {  
    //如果apk的路径已经更改  
    if (ps != null && !ps.codePath.equals(scanFile)) {  
        //判断当前apk版本号是否小于原始版本  
        if (pkg.mVersionCode < ps.versionCode) {  
            // 系统包已经是最新版本,且安装路径不匹配,忽略  
            mLastScanError = PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;  
            return null;  
        } else {  
            //更新安装包到系统分区中  
            synchronized (mPackages) {  
                // 从PackageManagerService的安装包列表中删除该包  
                mPackages.remove(ps.name);  
            }  
            //创建安装参数InstallArgs  
            InstallArgs args = createInstallArgs(packageFlagsToInstallFlags(ps),  
                    ps.codePathString, ps.resourcePathString, ps.nativeLibraryPathString);  
            synchronized (mInstaller) {  
                //清空dex文件及安装包的挂载点  
                args.cleanUpResourcesLI();  
            }  
            synchronized (mPackages) {  
                mSettings.enableSystemPackageLPw(ps.name);  
            }  
        }  
    }  
}  

从上面代码注释可以知道:更新系统内置应用时,如果新的versionCode没有大于当前安装的版本,更新将被忽略。
3、开发者误区
对Android应用更新机制不熟悉的开发者,错误地把versionName作为应用更新的依据,以致于在更新程序出现一些问题:
1、更新程序设计时必须把versionName设置小数形式,如2.1,当设置为2.2.1时程序就不好判断是否该更新版本。

2、可能导致系统内置应用无法升级,不断被还原。

如果升级Android内置apk版本,遇到系统重启后又被还原,那是因为你手动安装的apk版本号和内置系统的apk版本号一样。

这样的情况,在开发调试系统apk的情况中容易出现。

关于Android系统内置的apk更新后,在系统重启以后又被还原的问题,解决方法如下:

将 frameworks/base/services/java/com/android/server/PackageManagerService.java 中 scanPackageLI函数的package更新判断条件

if (pkg.mVersionCode < ps.versionCode) {
修改为
if (pkg.mVersionCode <= ps.versionCode) {


相关文章推荐

Android系统应用静默升级/安装

第一步:配置

android -- 系统应用替换玩法

需求如下: android下的system分区下的文件全部经过系统签名认证,包含动态库,可执行文件及系统apk应用,整个一块整体,这些文件必须一次性全部升级才可使用,否则将因为签名及不可修改之特性导致...

android 内置apk 卸载后开机自动恢复的实现

最近刷了个ROM 发现里面有几个内置APK,在 /system/app/ 我用 RE管理器删除后,重新开机,莫名其妙有恢复了 我擦,按照我目前对安卓系统的了解,我才应该是某个开机启动程序,在...

PC上检测是否更新并获取泛泰手机OTA包,更新通用获取脚本(7.29)

首先看一下检测更新时手机发送的数据 POST /apkmanager/Process/sky_station_30_server.php HTTP/1.1 Connection: Keep-Ali...
  • su_ky
  • su_ky
  • 2012-07-09 14:07
  • 5023

Android-6.0之PMS解析中篇1

本文转载于:http://www.iloveandroid.net/2016/06/20/Android_PackageManagerService-2/ 本篇文章主要介绍PMS扫描...

Android PackageManagerService scanDirLI文件扫描方法

在Android服务之PackageManagerService启动源码分析中介绍了PackageManagerService服务的整个启动过程,启动过程相对来说较为简单,就是构造一个PackageM...

如何从apk中得到version code

Android中用Package 这个类来代表一个apk。 final Package pkg = parseBaseApk(baseApk, assets, flags); 我们Package ...

Android6.0 AMS启动Activity(六) AMS与PKMS关系(通过Intent获取ActivityInfo)

之前几篇博客分析AMS中启动Activity的时候,我们把主要流程理的差不多了。今天主要看下AMS中通过PKMS来获取ActivityInfo。 一、AMS通过PKMS获取ActivityInfo...

Android6.0关于预置三方app卸载 扫描system/third_app目录

之前两篇博客分析了三方应用如何安装的问题,但是两个方法都有问题 1.调用接口安装的,可能Launcher启动后还没安装完。 2.而copy到data/app下又会有两份apk问题。 这篇博客我们...

如何删除Android系统中的内置应用

PS:此法是给Android开发人员的,如果只是Android爱好者,此方法可能有些难度闲话不说,直接转入正题:此法方法原理是采用手动挂载的命令是mount,然后更改权限,步骤如下:1.输入 adb ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)