Как приложения для Android-приложений работают технически?

Может кто-нибудь объяснить или указать ресурсы, где я могу прочитать, как обновление приложений Android действительно работает на уровне ОС?

Ответ 1

Из журналов диспетчера пакетов, кажется, следующие шаги для обновления:

1) Загрузите пакет во временную папку.

акт = android.intent.action.PACKAGE_NEEDS_VERIFICATION Дат = файл:///data/app/vmdl1854135520.tmp Тип = применение/vnd.android.package-архив

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/vmdl 1854135520.tmp в /data/app/com.vzw.hss.myverizon-1

4) Убейте существующее приложение

06-30 17: 59: 03.361 3701 3751 D PackageManager:! @killApplicatoin: 10031, заменить sys pkg

5) Dexopt apk

06-30 17: 59: 03.381 3701 3751 D PackageManager: Запуск dexopt: /data/app/com.vzw.hss.myverizon-1/base.apk pkg = com.vzw.hss.myverizon isa = arm64 vmSafeMode = false interp_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: [email protected]: 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: [email protected]: 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}

Ответ 2

Я не могу найти хороший ресурс, но вот что я понимаю о процессе.

APK хранятся в закрытом каталоге телефона, когда они установлены. Когда происходит обновление, новый APK загружается из магазина, а затем старый APK заменяется новым. Новый AndroidManifest анализируется и устанавливается так, как если бы он был новой установкой, и проверяет наличие версии, ключа подписи и т.д., Чтобы убедиться, что обновление разрешено. Фактические данные приложения хранятся в отдельном месте и не затрагиваются во время обновления. Если вы измените схему базы данных или что-то еще, вам нужно будет перенести данные при первом запуске.

Ответ 3

Источник: http://java.dzone.com/articles/depth-android-package-manager

Я не уверен, что это то, что вам нужно, но лучшее, что я мог найти, это.

API диспетчера пакетов отвечает за управление установкой, удалением и обновлением файлов APK.

Он вызывает метод "InstallPackage" с параметрами "uri", "installFlags", "observer" и "InstallPackageName", затем запускает службу с именем "package", которая фактически устанавливает/обновляет ее.

Служба диспетчера пакетов запускается в процессе system_service, а запуск daemon (installd) выполняется как собственный процесс. Оба запускаются при загрузке системы.

Обзор процесса:

  • Ожидание
  • Добавить пакет в очередь для процесса установки;
  • Определите подходящее место установки пакета;
  • Определить установку Установить/обновить новую
  • Скопировать файл APK в заданный каталог;
  • Определите UID приложения;
  • Запросить процесс демонстрации installd;
  • Создайте каталог приложений и установите разрешения;
  • Извлечение кода dex в каталог кэша;
  • Отразить package.list/system/data/packages.xml статус последних пакетов;
  • Передача в систему вместе с именем пакета эффекта установки;
  • Intent.ACTION_PACKAGE_ADDED: если новый пакет // (Intent.ACTION_PACKAGE_REPLACED) Если пакет обновлен Overview of the instalation/upgrade process

Менеджер пакетов хранит информацию о приложении в трех файлах, расположенных в /data/system:

  • packages.xml - с разрешениями, входящими в пакет
  • packages.list - это просто текстовый файл, содержащий имя пакета, идентификатор пользователя, флаг и каталог данных
  • packages-stopped.xml: этот файл содержит список пакетов, который остановлен. Остановленные государственные приложения не могут получать трансляцию.

Ссылки на соответствующий исходный код для диспетчера пакетов (и установщика пакетов) приведены ниже:

Менеджер пакетов 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