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) {


编译ROM时system\data\app下APK无法升级初始化时预装到系统

在编译ROM的时候遇到的一个问题,就是本来改过系统源码后,跟另一部分源码进行合并后,编译ROM包时本来一切都正常,但是升级到demo板的时候却发现预置在System\data\app下打算预装到系统的...
  • zhanghaofor
  • zhanghaofor
  • 2014年12月08日 10:05
  • 1369

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

如果更新或者升级后系统内置应用,遇到重启Android系统后内置应用被还原,那是因为手动安装的APK版本号和系统内置API版本号一样。 1、Android系统应用更新机制 系统为每个应用在Andr...
  • berber78
  • berber78
  • 2014年06月06日 09:34
  • 1027

Android应用的自动升级、更新模块的实现

我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新。得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下。首先给出界面效果: ...
  • zml_2015
  • zml_2015
  • 2016年02月27日 20:13
  • 7384

Android 应用升级方案

转:http://www.jianshu.com/p/abbaddcf449f http://blog.csdn.net/u013718120/article/details/53018801 ...
  • lzpdz
  • lzpdz
  • 2017年03月16日 15:16
  • 1099

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

第一步:配置
  • u014375869
  • u014375869
  • 2014年08月10日 14:58
  • 4083

Android应用更新-自动检测版本及自动升级

步骤: 1.检测当前版本的信息AndroidManifest.xml–>manifest–>[Android] 2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹...
  • Imshuyuan
  • Imshuyuan
  • 2017年03月17日 13:33
  • 8089

Android应用的自动升级、更新模块的实现

我们看到很多Android应用都具有自动更新功能,用户一键就可以完成软件的升级更新。得益于Android系统的软件包管理和安装机制,这一功能实现起来相当简单,下面我们就来实践一下。首先给出界面效果: ...
  • dddxxxx
  • dddxxxx
  • 2017年03月01日 15:38
  • 1467

android 版本更新 静默安装及自启动

前段时间公司要求实现app的静默升级安装并自启动,写完都有一个多月了,现在总结下.公司的app只会安装在我们定制的广告平板上,所以都是有root权限的,至于如何获取root权限,这里就不说了.直接上代...
  • wan_ing
  • wan_ing
  • 2016年11月30日 14:36
  • 4574

Android app版本升级的问题

方式一:APP自身提示有更新,用户点击升级就在后面下载更新包 详细的请跳转: 以下是我的理解。 效果图: 第一步:存放资源的后台,存放一个包含最新版本信息的...
  • qq_30716173
  • qq_30716173
  • 2016年03月17日 14:46
  • 8457

Android开发中应用版本更新功能

前言 本文将讲解app的升级与更新。一般而言用户使用App的时候升级提醒有两种方式获得: 一种是通过应用市场 获取一种是打开应用之后提醒用户更新升级 而更新操作一般是在用户点击了升级...
  • sinat_32526807
  • sinat_32526807
  • 2017年03月23日 16:14
  • 3763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android系统内置应用更新或升级后被还原的原因
举报原因:
原因补充:

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