Com android server pm packagemanagerservice

Русские Блоги

Android 10.0 Packagemanagerservice (1) Принцип работы и процесс запуска — [Android принимает проход]

Резюме:PackageManagerservice является одним из основных услуг системы Android, которая очень важна в Android, в основном несет ответственность за управление APK, пакетами JAR.

Это займет около 50 минут, чтобы прочитать эту статью.

Содержание статьи в основном проанализировано из исходного кода. Хотя это вонючий, если вы хотите изучить исходный код системы Android, надо ходить, нет ярлыка.

По отношению к изучению мусора я предпочитаю успокоиться и принять серьезное изучение одного часа.

Статья Начальный WECHAT Открытый номер: программа Play Cat Cat

Сосредоточьтесь на анализе исходного кода системного кода системы Android, дизайн платформы Android, пожалуйста, обратите внимание на меня внимание, спасибо!

В предыдущем разделе мы завершили процесс создания процесса приложений и процессу форка Zygote, этот раздел, чтобы увидеть рабочий процесс Packagemanagerservice.

Статья серии:

1 обзор

PackageManagerservice является одним из основных услуг системы Android. Это очень важно в Android. Основные ответственные функции следующие:

Анализировать AndroidManifest.xml, в основном, включая анализ информации узла в AndroidManifest и Analysis и Refining Target-Name

Сканирование локальных файлов, в основном для APK, в основном системных приложений, локальных установочных приложений и многое другое. Эта часть будет тщательно объяснена ниже.

Управляйте локальным APK, в основном, включая установку, удаление и многое другое.

Затем PackageManagerservice является ПКМ.

2. Основной исходный код

3. Архитектура

3.1 PKMS Процесс запуска

3,2 ПКМ наследование

3.3 Управление разрешениями

3.4 сканирование APK

Сканирование каждой информации о тегах в AndroidManifest.xml в APK,

Например, «Применение», «Наложение», «Разрешение», «Использование-разрешение» и другая информация.

Сканирование процесса подтекста для каждой этикетки,

Например, приложение сканирует «активность», «приемник», «сервис», «провайдер» и другая информация.

Процесс сканирования будет подробно объяснен позже

4. Процесс запуска

4.1 Процесс запуска

Служба PKMS запускается Systemserver. Startbootstrapservices () в Systemyerver запускает службу PKMS, затем вызовов StartizateIves () для выполнения оптимизации DEX, управление дисками и т. Д., И пусть PKMS входит в систему.

Start Call Stage, как показано ниже:

4.1.1 [SystemServer.java] startBootstrapServices()

Описание:STARTBOOTSTRAPSERVICES () Запустите службу установки сначала, то есть установщик, затем определите, находится ли текущее устройство в зашифрованном состоянии, если это только приложение для разбора сервиса, затем вызовите статический метод PackageManagerservice Maine, чтобы создать объект PMS

(1) Начало Услуги установщиков

(2) Получите шифрование устройства (пароль настроек мобильного телефона), если устройство зашифровано, проанализировано только «ядро» приложение

(3) Вызовите основной способ PKMS для инициализации PackageManagerservice, где конструктор Packagemanagerservice () создает объект PKMS.

(4) Если устройство не зашифровано, он работает. Управление OTA OTA DEXPOPTION.

Исходный код:

4.1.2 [SystemServer.java]

startOtherServices()

Описание:

(5) выполнить UpdatePackageiFneded для завершения оптимизации DEX;

(6) Выполните Performifstrifneded для завершения обслуживания диска;

(7) Позвоните SystemReady, готовы.

Исходный код:

4.1.3 [PackageManagerService.java] main()

Описание:

(1) Проверьте свойства, связанные с компиляцией пакета, связанные с компиляцией

(2) Создание метода строительства Packagemanagerservice

(3) Включить некоторые услуги приложений для многопользовательской сцены

(4) Зарегистрируйте «пакет» и «Package_native» в ServiceManager.

Исходный код:

Основной частью инициализации PKMS является содержание конструктора PackageManagerservice (), давайте проанализируем процесс.

4.2 Анализ функции строительства PKMS

Конструктор PKMS состоит из двух важных замков (MinstallLock, Mpackages) и 5 ​​фаз, которые будут подробными для анализа этих контент.

mInstallLock :Используется для защиты всего доступа ко всем установкам APK, эта операция обычно включает в себя операции, такие как данные тяжелых дисков, чтение и запись и запись, и является однопоточной работой, поэтому иногда она обрабатывает очень медленно.

Этот замок не будет уволен в этом случае, когда хранится блокировка MPackages, и безопасно получить MPackages сразу в случае удерживания блокировки minstalllock.

mPackages:Информация о пакете и связанное состояние, используемое для анализа всех апартаментов в памяти.

5 этапов:

Этап 1:BOOT_PROGRESS_PMS_START

Этап 2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START

Этап 3:BOOT_PROGRESS_PMS_DATA_SCAN_START

Этап 4:BOOT_PROGRESS_PMS_SCAN_END

Этап 5:BOOT_PROGRESS_PMS_READY

Служба PKMS также передается через связующее. IPackageManager.aidl автоматически генерирует сервер Binder iPackagemanager.stub.proxy после преобразования инструмента, а клиент IPackageManager.stub.proxy, определенные отношения:

Читайте также:  Легковесный плеер для android

Binder Server:Packagemanagerservice наследует в iPackageManager.stub;

Binder Client:Переменная члена MPM ApplicationPackageManager (APM) унаследована в iPckageManager.stub.proxy; сам наследуется в объекте PackageManager.

4.2.1 [PackageManagerService.java]

Описание:IPackagemanager.stub автоматически генерируется iPackagemanager.aidl, просто объяснил, что PKMS — это служба, взаимодействующая с связующим

Исходный код:

4.2.2 [PackageManagerService.java] PackageManagerService()

Описание:Packagemanagerservice Constructor.

Исходный код:

4.2.3 Фаза 1:BOOT_PROGRESS_PMS_START

Основная работа:

(1) построить дисцидентификацию, сохранить разрешение и другую связанную информацию;

(2) Создание объекта установщика, взаимодействуя с установкой;

(3) создать объект MPERMISSEMAGER для выполнения управления разрешениями;

(4) Создайте класс настроек, сохраните информацию об установке, очистите изолированное применение пути, в основном с участием / Data / System / Directory Packages.xml, packages-backup.xml, packages.list, packages-stopped.xml, Пакеты -stopped-backup.xml и другие файлы.

(5) Создание класса PackagedexoPTimizer и DEXManager для обработки оптимизации DEX;

(6) Создание экземпляра SystemConfig, получите информацию о конфигурации системы, настройте общие библиотеки Lib;

(7) Создайте нить обработчика PackageManager, сервисную обработку LOOP, связанные с установкой.

Исходный код:

ReadLpw () сканирует 5 файлов ниже

Файл разделен на три группы, и простая роль заключается в следующем:

packages.xml:PKMS создается после создания целевой папки. Этот файл будет обновлен, когда система выполняет установку программы, удаление и обновление. Этот файл содержит некоторую информацию, связанную с пакетом в системе.

packages.list:Опишите информацию обо всех несистематических апартаментах, существующих в системе. Когда эти программы имеют изменения, PKMS обновляет файл.

packages-stopped.xml:Введите страницу приложения из программы установки поставляется с системой, а затем записать соответствующую информацию приложении в этом файле при выборе FORCEDOP. То есть информация пакета, которая принудительно остановлена ​​пользователем в системе хранения файлов.

Точки этих каталогов завершены в конструкторе в настройках, как показано ниже, вызовите READLPW (), чтобы сканировать после каталога

Анализ содержимого вышеуказанного XML, установить соответствующую структуру данных

Описание:Создайте объект SharedUsEsetting и добавьте переменную участника настроек MsharedUsers, в системе Android, несколько пакетов могут работать в том же процессе, установив свойство SharedUserID, поделиться тем же UID

Исходный код:

4.2.4 Фаза 2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START

Основная работа:

(1) получить переменные среды BootclassPath и SystemberverClasspath от init.rc;

(2) для более старых обновлений версии установка изменяется на разрешение приложения времени выполнения при установке;

(3) Сканировать приложение, приложение, наложение пакета каталога, такого как System / Vendor / Product / ODM / OEM;

(4) Очистите время установки временного файла и другой ненужной информации.

Исходный код:

4.2.5 Фаза 3:BOOT_PROGRESS_PMS_DATA_SCAN_START

Основные задачи:В случае, когда проанализируется основной приложение, информация о приложении каталога данных также обрабатывается, обновляется во времени и удаляет ненужные данные.

Исходный код:

4.2.6 Этап 4:BOOT_PROGRESS_PMS_SCAN_END

Основная работа:

(1) Изменение версии SDK, обновление разрешений;

(2) После обновления OTA ненужные данные кэша очищены.

(3) После элемента по умолчанию элемент по умолчанию обновляется, очистите соответствующие данные;

(4) Обновить Package.xml

Исходный код:

4.2.7 Фаза 5:BOOT_PROGRESS_PMS_READY

Основные задачи:

(1) Создание объекта PackageInstallerservice

(2) память GC Recycling

Исходный код:

4.3 Оптимизация DEX

Проверьте, если вам нужно обновлять пакеты и оптимизировать его, если нет обновления OTA, нет больших обновлений версии, вы не знаете кеш виртуальной машины Dalvik, вы можете обновить пакеты,

Последний звонок — установка DEXOPT установщика ()

Стек вызовов выглядит следующим образом:

4.3.1 [PackageManagerService.java] updatePackagesIfNeeded()

Описание:

Проверьте, если вам нужно обновлять пакеты и делать оптимизацию DEX, если нет обновления OTA, нет большой версии обновления, вы не знаете кеш виртуальной машины Dalvik, вы можете обновить пакеты

Приоритет обновления пакетов: Core App> Системное приложение> Другое приложение, вызовите PerfortDexopTupGrade () для обновления

Исходный код:

4.3.2 [PackageManagerService.java] performDexOptUpgrade()

Описание:Судясь, необходимо ли обновить пакет, если вам нужно обновить, то следуйте приоритету, чтобы завершить оптимизацию DEX, наконец-то вызовите DEXOPT () для оптимизации DEX, обратитесь к вызоваму выше

Исходный код:

4.4 Обслуживание диска

Обслуживание диска в конечном итоге вызывает FSTRIM () процесса Vold для очистки

Стек вызовов:

[PackageManagerService.java] performFstrimIfNeeded()

Описание:Главным образом для выполнения работы на очистке диска, отпустите дисковое пространство

Исходный код:

4,5 пкс готов

[PackageManagerService.java] systemReady()

Описание:SystemReady в основном делается по умолчанию Pature Urization и Update, уведомляя о некоторых компонентах, ожидающих PMS.

Исходный код:

Следующий раздел объяснит привилегию сканирования PKMS, сканирования APK, установку и другой контент, пожалуйста, обратите внимание на меня внимание

Wechat Public Number: Big Cat Play Program

Источник

Русские Блоги

Механизм управления пакетами Android (3) Установка обработки PMS APK

предисловие

В предыдущей статьеМеханизм управления пакетами Android (2) PackageInstaller установить APKМы узнали, как PackageInstaller устанавливает APK, и, наконец, информация об APK передается в PMS. Так как же обрабатывается ПМС? Эта статья даст вам ответ.

Читайте также:  Audiobook player для андроида

1. PackageHandler обрабатывает сообщения об установке

После передачи информации об APK в PMS PMS запускает копирование и установку APK, отправляя сообщение в PackageHandler.
Сначала посмотрите на диаграмму последовательности вызовов PackageHandler, обрабатывающей сообщения об установке.

Затем следуйте логике кода предыдущей статьи, чтобы просмотреть метод installStage PMS.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

Создайте InstallParams в Note 2, который соответствует данным установки пакета. Сообщение типа INIT_COPY было создано в примечании 1, а InstallParams было отправлено сообщением в примечании 3.

1.1 Обработка сообщений INIT_COPY

Код для обработки сообщений типа INIT_COPY показан ниже.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java#PackageHandler

PackageHandler наследуется от Handler, он определен в PMS, метод doHandleMessage используется для обработки различных типов сообщений, для просмотра обработки сообщений типа INIT_COPY. MBound в Примечании 1 используется для определения того, привязан ли DefaultContainerService, а значение по умолчанию — false. DefaultContainerService — это сервис для проверки и копирования съемных файлов. Это относительно трудоемкая операция. Поэтому DefaultContainerService не выполняется в том же процессе, что и PMS. Он выполняется в процессе com.android.defcontainer и взаимодействует с PMS через IPMediaContainerService. ,Как показано ниже.

Метод connectToService в примечании 2 используется для привязки DefaultContainerService, а в примечании 3 отправляется сообщение типа MCS_BOUND, запускающее обработку первого запроса на установку.
См. метод connectToService в примечании 2:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java#PackageHandler

Примечание 2 Если привязка DefaultContainerService выполнена успешно, для mBound будет установлено значение true. Метод bindServiceAsUser в Примечании 1 будет передаваться в mDefContainerConn. Логика обработки метода bindServiceAsUser аналогична нашему вызову bindService. После того как служба установит соединение, будет вызван метод onServiceConnected:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

Примечание 1 отправило сообщение типа MCS_BOUND, с PackageHandler.doHandleMessage Разница между тремя комментариями в методе заключается в том, что сообщение, отправляемое здесь, имеет параметры типа объекта. Вот два случая, которые нужно объяснить: один — это то, что сообщение не имеет параметра типа объекта, а другой — сообщение с параметром типа объекта. ,

1.2 Обработка сообщений типа MCS_BOUND

Сообщение без параметров типа Object
Просмотр обработки сообщений типа MCS_BOUND:

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

Если сообщение не имеет параметра типа объекта, условие в примечании 1 не может быть выполнено, и mContainerService типа IMediaContainerService в примечании 2 не может быть назначен, так что условие в примечании 3 выполняется.
Если условия в Примечании 4 соблюдены, это означает, что услуга не была связана, и PackageHandler.doHandleMessage Метод привязки службы вызывается в комментарии 2 метода, что, очевидно, является ненормальным, поэтому он отвечает за обработку ситуации с ошибкой службы в комментарии 5. Если условия в примечании 4 не выполняются, что указывает на то, что служба была привязана, системный журнал будет распечатан, чтобы информировать пользователя о необходимости ожидания привязки системы системой.

Сообщение с параметрами типа Object
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

Если сообщение типа MCS_BOUND с параметрами типа объекта не будет соответствовать условиям в примечании 1, будет принято решение в примечании 2, а если количество запросов на установку не превышает 0, будет напечатан журнал в примечании 6, указывающий, что очередь запросов на установку опорожнить. После установки APK в примечании 5 будет отправлено сообщение MSC_BOUND, чтобы продолжить обработку оставшихся запросов на установку, пока очередь запросов на установку не станет пустой.
Получите первый запрос HandlerParams в очереди запросов на установку в примечании 3. Если HandlerParams не равен нулю, то для запуска процесса копирования APK будет вызван метод startCopy объекта HandlerParams в примечании 4.

2. Скопируйте APK

Давайте сначала проверим временную диаграмму копирования APK.

HandlerParams — это абстрактный класс в PMS, а его класс реализации — это внутренний класс PMS InstallParams. Метод startCopy в HandlerParams показан ниже.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java#HandlerParams

MRetries в примечании 1 используется для записи количества вызовов метода startCopy. Когда вызывается метод startCopy, он автоматически увеличивается на 1. Если число превышает 4 раза, запрос на установку будет отменен: отправьте сообщение типа MCS_GIVE_UP в примечании 2 и отправьте первый запрос на установку (Этот запрос на установку) удаляется из очереди запросов на установку mPendingInstalls. Примечание 4 используется для обработки логики установки APK после копирования APK, и это будет упомянуто снова в Разделе 3. Абстрактный метод handleStartCopy вызывается в примечании 3, а его реализация находится в InstallParams, как показано ниже.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java#InstallParams

У метода handleStartCopy много кода, и ключевая часть здесь перехватывается.
Примечание 1: межпроцессный вызов IMediaContainerService вызывает метод getContainerService getMinimalPackageInfo, который слегка анализирует APK и получает небольшое количество информации об APK , Небольшое количество информации об APK будет инкапсулировано в PackageInfoLite. Затем определите место установки APK в примечании 2. InstallArgs был создан в Примечании 3. InstallArgs — это абстрактный класс, который определяет логику установки APK, такую ​​как копирование и переименование APK, и имеет три подкласса, каждый из которых определен в PMS, как показано на следующем рисунке.

Где FileInstallArgs используется для обработки APK-файлов, установленных в пространстве хранения не-ASEC, то есть во внутреннем пространстве хранения (раздел данных), AsecInstallArgs используется для обработки установки в ASEC (mnt / asec), то есть SD APK в карточке. MoveInstallArgs используется для обработки движения установленной логики APK.
После проверки APK в Note 4 для установки будет вызван метод installAps copyApk.
Различные подклассы InstallArgs будут обрабатываться по-разному, например, FileInstallArgs. Метод copyApk FileInstallArgs будет напрямую возвращать метод doCopyApk FileInstallArgs:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java#FileInstallArgs

Читайте также:  Как сохранить прямой эфир инстаграм андроид

Примечание 1 используется для создания каталога временного хранения, такого как /data/app/vmdl18300388.tmp, где 18300388 — установленный идентификатор сеанса. Примечание 2 Метод CopyPackage в DefaultContainerService вызывается между процессами через IMediaContainerService.Этот метод копирует APK в каталог временного хранения в процессе, где расположен DefaultContainerService, например /data/app/vmdl18300388.tmp/base.apk Итак, копирование APK завершено, а затем процесс установки APK завершен.

3. Установите APK

Как обычно, давайте проверим временную диаграмму установки APK.

Мы возвращаемся к методу head цепочки вызовов copy в APK: метод startCopy для HandlerParams, а метод handleReturnCode будет вызываться в примечании 4. Его реализация выполняется в InstallParams, как показано ниже.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

В методе handleReturnCode вызывается только метод processPendingInstall. Для проверки состояния APK используется примечание 1. Перед установкой убедитесь в надежности среды установки. Если это ненадежно, скопированный файл APK будет очищен. Примечание 3 используется для обработки операции завершения после установки. Если установка не удалась, удалите связанные с установкой каталоги и файлы. В основном посмотрите на метод installPackageTracedLI в Примечании 2, который вызовет метод installPackageLI PMS.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

Метод installPackageLI содержит около 500 строк кода, основная часть которого перехвачена, и сделано несколько вещей:

  1. Создать PackageParser парсинг APK.
  2. Проверьте, существует ли APK.Если он существует, получите имя пакета, который не был переименован ранее, и присвойте его типу pkg PackageParser.Package в примечании 1. Установите бит флага в true в примечании 3, чтобы указать замену установки.
  3. Примечание 3: если информация об устанавливаемом APK сохраняется в настройках, указывая на то, что APK был установлен ранее, необходимо проверить информацию о подписи APK, чтобы обеспечить ее безопасную замену.
  4. Переименуйте временный файл в Note 4, например, вышеупомянутый /data/app/vmdl18300388.tmp/base.apk, и переименуйте его в / data / app / package name-1 / base.apk.
  5. На установку обновлений системного приложения будут накладываться два ограничения: во-первых, системное приложение нельзя заменить и установить на SD-карту, а во-вторых, системное приложение не может быть заменено приложением Instant App.
  6. Примечание 5 различается в зависимости от замены. Если это установка замены, будет вызван метод replacePackageLIF. Этот метод также будет различать системное приложение и несистемное приложение. Если это новый установленный APK, будет вызван метод installNewPackageLIF.

Здесь мы возьмем недавно установленный APK в качестве примера и вызовем метод PMS installNewPackageLIF.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

installNewPackageLIF в основном выполняет следующие 3 вещи:
1. Отсканируйте APK и сохраните информацию об APK в новом пакете типа PackageParser.Package. Информация о пакете содержит 1 базовый APK и 0 или более разделенных APK.
2. Обновите информацию о настройках, соответствующую APK. Настройки используются для сохранения динамических настроек всех пакетов.
3. Если установка прошла успешно, подготовьте данные для вновь установленного приложения. Если установка не удалась, удалите APK.

Это конец процесса установки APK, поэтому я не буду анализировать его дальше. Заинтересованные студенты могут углубиться.

4. Резюме

Эта статья в основном объясняет, как PMS выполняет установку APK. Есть несколько шагов:
1. Когда PackageInstaller устанавливает APK, информация об APK будет передана в PMS. PMS отправит сообщение PackageHandler, чтобы начать копирование и установку APK.
2. PMS отправляет сообщения типа INIT_COPY и MCS_BOUND, управляет PackageHandler для связывания DefaultContainerService, завершает копирование APK и другую работу.
3. После копирования APK начнется процесс установки APK, включая проверку перед установкой, установку APK и завершающие работы после установки.

Здесь представлены не только Android, Java и мобильные технологии, связанные с интерфейсом, но и отраслевые тренды, техническая информация, личный опыт и личное восприятие. Каждый месяц мы будем стараться рассылать книги всем.

Источник

Оцените статью