Android应用程序的技术升级是如何工作的?

14

有人能够解释或指出资源,让我了解Android应用程序在操作系统级别上的升级是如何工作的吗?

3个回答

14

从包管理器日志中可以看出以下步骤是升级所采取的步骤:

1)将软件包下载到临时位置。

act=android.intent.action.PACKAGE_NEEDS_VERIFICATION dat=file:///data/app/vmdl1854135520.tmp typ=application/vnd.android.package-archive

2)进行软件包验证。

06-30 17:59:02.751 3701 3751 D PackageManager: [MSG] PACKAGE_VERIFIED: observer{237546897}

3)重命名软件包。

06-30 17:59:03.361 3701 3751 D PackageManager: 将 /data/app/vmdl1854135520.tmp 重命名为 /data/app/com.vzw.hss.myverizon-1

4)终止现有应用程序。

06-30 17:59:03.361 3701 3751 D PackageManager: !@killApplicatoin: 10031, replace sys pkg

5)对apk进行Dexopt优化(即Android执行DEX文件预处理的过程)。

06-30 17:59:03.381 3701 3751 D PackageManager: 正在对 /data/app/com.vzw.hss.myverizon-1/base.apk 进行 dexopt,pkg=com.vzw.hss.myverizon isa=arm64 vmSafeMode=false interpret_only=false

**06-30 17:59:02.741  3701  3751 D PackageManager: [VERIFY] Found 1 verifiers for intent Intent { act=android.intent.action.PACKAGE_NEEDS_VERIFICATION dat=file:///data/app/vmdl1854135520.tmp** typ=application/vnd.android.package-archive flg=0x10000001 } with 0 optional verifiers
06-30 17:59:02.741  3701  3751 D PackageManager: [VERIFY] sendOrderedBroadcastToRequiredVerifier:
06-30 17:59:02.741  3701  3751 D PackageManager: PackageVerificationState{
06-30 17:59:02.741  3701  3751 D PackageManager:     verifier packages=com.android.vending(10034),
06-30 17:59:02.741  3701  3751 D PackageManager:     intent=Intent { act=android.intent.action.PACKAGE_NEEDS_VERIFICATION dat=file:///data/app/vmdl1854135520.tmp typ=application/vnd.android.package-archive flg=0x10000001 (has extras) }
06-30 17:59:02.741  3701  3751 D PackageManager:     others=28, false, false, false, false, false
06-30 17:59:02.741  3701  3751 D PackageManager: }
06-30 17:59:02.741  3701  3751 D PackageManager: remove MCS_UNBIND message and Posting MCS_UNBIND 10 secs later
06-30 17:59:02.751  3701  3701 D PackageManager: [VERIFY] onReceive for RequiredVerifier id=28
06-30 17:59:02.751  3701  3701 D PackageManager: [VERIFY] send delayed message for CHECK_PENDING_VERIFICATION after : 10000
06-30 17:59:02.751  3701  4589 D PackageManager: [VERIFY] verifyPendingInstall(28, VERIFICATION_ALLOW), uid=10034
06-30 17:59:02.751  3701  3751 D PackageManager: [MSG] PACKAGE_VERIFIED: observer{237546897}
06-30 17:59:02.751  3701  3751 D PackageManager: [VERIFY] PACKAGE_VERIFIED: 
06-30 17:59:02.751  3701  3751 D PackageManager: PackageVerificationState{
06-30 17:59:02.751  3701  3751 D PackageManager:     verifier packages=com.android.vending(10034),
06-30 17:59:02.751  3701  3751 D PackageManager:     intent=Intent { act=android.intent.action.PACKAGE_NEEDS_VERIFICATION dat=file:///data/app/vmdl1854135520.tmp typ=application/vnd.android.package-archive flg=0x10000001 cmp=com.android.vending/com.google.android.vending.verifier.PackageVerificationReceiver (has extras) }
06-30 17:59:02.751  3701  3751 D PackageManager:     others=28, false, false, false, false, false
06-30 17:59:02.751  3701  3751 D PackageManager: }
06-30 17:59:02.751  3701  3751 D PackageManager: [VERIFY] broadcastPackageVerified(28, VERIFICATION_ALLOW, file:///data/app/vmdl1854135520.tmp)
06-30 17:59:02.761  3701  3751 D PackageManager: /data/app/vmdl1854135520.tmp already staged; skipping copy
06-30 17:59:02.761  3701  3751 D PackageManager: remove MCS_UNBIND and Posting MCS_UNBIND
06-30 17:59:02.761  3701  3751 D PackageManager: [MSG] PROCESS_PENDING_INSTALL: observer{237546897}
06-30 17:59:02.761  3701  3751 D PackageManager: currentStatus{1}
06-30 17:59:02.761  3701  3751 D PackageManager: installPackageLI: path
06-30 17:59:03.321  3701  3751 W PackageManager: verifying app can be installed or not
**06-30 17:59:03.361  3701  3751 D PackageManager: Renaming /data/app/vmdl1854135520.tmp to /data/app/com.vzw.hss.myverizon-1**
**06-30 17:59:03.361  3701  3751 D PackageManager: replacePackageLI**
**06-30 17:59:03.361  3701  3751 D PackageManager: !@killApplicatoin: 10031, replace sys pkg**
06-30 17:59:03.371  3701  3751 W PackageManager: Trying to update system app code path from /system/priv-app/MyVerizon to /data/app/com.vzw.hss.myverizon-1
06-30 17:59:03.371  3701  3751 I PackageManager: scanFileNewer : com.vzw.hss.myverizon
**06-30 17:59:03.381  3701  3751 D PackageManager: Running dexopt on: /data/app/com.vzw.hss.myverizon-1/base.apk pkg=com.vzw.hss.myverizon isa=arm64 vmSafeMode=false interpret_only=false**
06-30 17:59:06.861  3701  3751 I PackageManager: do mInstaller.dexopt : 0
06-30 17:59:06.861  3701  3751 D PackageManager: Time to dexopt: 3.482 seconds
06-30 17:59:06.861  3701  3751 D PackageManager: !@killApplicatoin: 10031, update pkg
06-30 17:59:06.861  3701  3751 W PackageManager: Code path for pkg : com.vzw.hss.myverizon changing from /system/priv-app/MyVerizon to /data/app/com.vzw.hss.myverizon-1
06-30 17:59:06.861  3701  3751 W PackageManager: Resource path for pkg : com.vzw.hss.myverizon changing from /system/priv-app/MyVerizon to /data/app/com.vzw.hss.myverizon-1
06-30 17:59:06.961  3701  3751 D PackageManager: New package installed
06-30 17:59:06.971  3701  3751 I PackageManager: Un-granting permission android.permission.sec.ENTERPRISE_DEVICE_ADMIN from package com.samsung.mdmtest1 (protectionLevel=2 flags=0x89be44)
06-30 17:59:06.971  3701  3751 I PackageManager: Un-granting permission com.sec.enterprise.knox.permission.KNOX_ENTERPRISE_BILLING from package com.samsung.mdmtest1 (protectionLevel=2 flags=0x89be44)
06-30 17:59:07.141  3701  3751 D PackageManager: doPostInstall for uid{10031}
06-30 17:59:07.151  3701  3751 D PackageManager: [MSG] MCS_UNBIND
06-30 17:59:07.151  3701  3751 D PackageManager: [MSG] POST_INSTALL: observer{237546897}
06-30 17:59:07.151  3701  3751 D PackageManager:           Handling post-install for 29
06-30 17:59:07.661  3701  3751 D PackageManager: result of install: 1{237546897}

7
我找不到好的资源,但以下是我对该过程的理解。
当应用程序被安装时,APK文件存储在手机的私有目录中。升级时,新的APK将从应用商店下载,然后旧的APK将被替换为新的APK。新的AndroidManifest会被解析并安装,就像是一次新安装,检查版本、签名密钥等以确保允许升级。实际的应用数据存储在另一个位置,并且在升级期间不会受到影响。如果更改了数据库模式等内容,则需要在首次启动时迁移数据。

谢谢您的回答。我更多地考虑当前应用程序保持不变,升级后的版本仅从先前版本接管控制的角度。 - Ankit Garg
在开发过程中,我发现当应用程序即将更新时,如果您单击图标,它会显示“xyz未安装”。因此,数据肯定应该存储在单独的区域中,并且应用程序存储在私有沙盒存储中。 - Ankit Garg
在Android上,当前应用程序的进程在升级过程中被终止,因此这里没有任何“控制权”的问题(至少如果我理解你的意思是正确的)。 - David Wasser

5

来源: http://java.dzone.com/articles/depth-android-package-manager

我不确定您是否想要的是这个,但我找到的最好的就是这个。

包管理器API负责管理安装、卸载和升级APK文件。

它使用'uri'、'installFlags'、'observer'和'InstallPackageName'参数调用方法“InstallPackage”,然后启动名为“package”的服务来实际安装/升级它。

PackageManager Service在system_server进程中运行,而install daemon(installd)以原生进程形式运行。两者都在系统启动时开始运行。

流程概述:

  • 等待;
  • 将包添加到安装过程的队列中;
  • 确定包安装的适当位置;
  • 确定安装是否为新的安装/更新;
  • 将APK文件复制到给定目录;
  • 确定应用程序的UID;
  • 请求installd守护进程进程;
  • 创建应用程序目录并设置权限;
  • 将dex代码提取到缓存目录中;
  • 反射packages.list / system / data / packages.xml最新的软件包状态;
  • 向系统广播效果与包的名称一起安装;
  • Intent.ACTION_PACKAGE_ADDED:如果包是新的//(Intent.ACTION_PACKAGE_REPLACED)如果包已更新 Overview of the installation/upgrade process

软件包管理器将应用程序信息存储在三个文件中,位于/data/system中:

  1. packages.xml-具有属于该包的权限
  2. packages.list-它只是一个包含软件包名称、用户ID、标志和数据目录的文本文件
  3. packages-stopped.xml-此文件包含已停止状态的软件包列表。停止状态的应用程序无法接收任何广播。

软件包管理器(和软件包安装程序)的相关源代码链接如下所示:

Package Manager https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/services/java/com/android/server/pm/Settings.java

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/services/java/com/android/server/pm/PackageManagerService.java

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/core/java/android/content/pm/IPackageManager.aidl

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/services/java/com/android/server/pm/PackageSignatures.java

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/services/java/com/android/server/pm/PreferredActivity.java

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/services/java/com/android/server/PreferredComponent.java

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/core/java/android/content/IntentFilter.java

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/core/java/android/content/pm/PackageParser.java

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/core/java/android/content/pm/IPackageManager.aidl

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/services/java/com/android/server/pm/Installer.java

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/core/java/com/android/internal/app/IMediaContainerService.aidl

https://android.googlesource.com/platform/frameworks/base/+/483f3b06ea84440a082e21b68ec2c2e54046f5a6/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java

安装程序包

https://android.googlesource.com/platform/packages/apps/PackageInstaller/+/47fe118e0178e9d72c98073ff588ee5cf353258e/src/com/android/packageinstaller/PackageInstallerActivity.java

https://android.googlesource.com/platform/packages/apps/PackageInstaller/+/47fe118e0178e9d72c98073ff588ee5cf353258e/src/com/android/packageinstaller/PackageUtil.java

https://android.googlesource.com/platform/packages/apps/PackageInstaller/+/47fe118e0178e9d72c98073ff588ee5cf353258e/src/com/android/packageinstaller/InstallAppProgress.java


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接