installd
Служба установщика пакетов
Тип файла: служба
Комментарии
Зачем нужен installd
В Android уже есть такой сложный сервис, как PMS, зачем ему еще один демон installd?
Ответ на самом деле очень прост: system_server запускается как системный пользователь, а PMS запускается в system_server, поэтому PMS также является системным пользователем. installd — пользователь root.
USER PID PPID VSIZE RSS WCHAN PC NAME
system 1698 699 2408960 149752 SyS_epoll_ 0000000000 S system_server
root 706 1 9972 2612 unix_strea 0000000000 S /system/bin/installd
Системный пользователь не имеет разрешения на доступ к каталогу приложения. Однако installd как пользователь root может получить доступ к каталогу data/data/, поэтому и существует installd.
Что такое диспетчер пакетов и установщик пакетов?
PackageInstaller — это приложение по умолчанию для Android, предназначенное для интерактивной установки обычного пакета. PackageInstaller предоставляет пользовательский интерфейс для управления приложениями/пакетами. PackageInstaller вызывает действие InstallAppProgress для получения инструкций от пользователя. InstallAppProgress попросит службу диспетчера пакетов установить пакет через installd. Исходный код доступен по адресу <Android Source>/packages/apps/PackageInstaller.
Основная роль демона Installd — получать запросы от службы диспетчера пакетов через сокет домена Linux /dev/socket/installed. installd выполняет ряд шагов для установки APK с правами root.
[Ссылка: https://github.com/android/platform_frameworks_base/blob/master/cmds/installd/commands.c]
Package Manage — это API, который фактически управляет установкой, удалением и обновлением приложений. Когда мы устанавливаем файл APK, диспетчер пакетов анализирует файл пакета (APK) и отображает подтверждение. Когда пользователь нажимает кнопку «ОК», диспетчер пакетов вызывает метод с именем «installPackage» с этими четырьмя параметрами, а именно uri, installFlags, Observer, installPackageName. Менеджер пакетов запускает одну службу с именем «пакет», и теперь в этой службе происходят все нечеткие вещи. Вы можете проверить «PackageInstallerActivity.java» и «InstallAppProgress.java» в исходном коде PackageInstaller. Служба диспетчера пакетов запускается в процессе system_service, а демон установки (installd) запускается как собственный процесс. Оба запускаются во время загрузки системы.
Где хранятся APK-файлы в Android?
а. Предварительная установка APK-файла (например, камеры, календаря, браузера и т. д.) хранится в /system/app/.
б. Пользовательская установка (ApiDemo, Any.do и т. д.) APK хранится в /data/app/.
в. Диспетчер пакетов создает каталог данных /data/data/<имя пакета>/ для хранения базы данных, общих настроек, собственной библиотеки и данных кэша.
Процесс установки APK процесс выполняется в службе диспетчера пакетов.
Ожидание
Добавить пакет в очередь для процесса установки
Определить подходящее место установки пакета
Определить установку: Установить/Обновить новую
Скопировать файл apk в указанный каталог
Определите UID приложения
Запросить процесс демона installd
оздать каталог приложения и установить разрешения
Извлечь dex-код в каталог кэша
Отразить последний статус packages.list/system/data/packages.xml
Трансляция в систему вместе с названием эффекта от установки полного пакета
Intent.ACTION_PACKAGE_ADDED: если новый
Intent.ACTION_PACKAGE_REPLACED): случай обновления
Менеджер пакетов хранит информацию о приложении в трех файлах, расположенных в /data/system.
1. packages.xml: этот файл содержит список разрешений и пакетов/приложений.
В этом XML-файле хранятся две вещи:
1. разрешения.
2. пакет (приложение), разрешения хранятся в теге <permissions>.
Каждое разрешение имеет три атрибута, а именно имя, пакет и защиту.
Атрибут name имеет имя разрешения, которое мы используем в AndroidManifest.xml, атрибут package указывает разрешение, принадлежащее пакету. В большинстве случаев значением является «android», поскольку тег <permission> содержит разрешения по умолчанию, а защита указывает уровень безопасности.
Подтеги
а. Информация о подписи sigs, атрибут count представляет номер тега сертификата.
б. cert содержит ключ сертификации, атрибут index представляет глобальный индекс сертификата. Я обнаружил, что оно увеличивается при установке новых сертификатов вместе с приложением.
в. разрешения содержат разрешения, которые разработчик установил в AndroidManifest.xml.
2. packages.list: это простой текстовый файл, содержащий имя пакета, идентификатор пользователя, флаг и каталог данных. Файл packages.list может обеспечить более быстрый поиск установленных пакетов, поскольку он хранит только важную информацию.
3. packages-stoped.xml: этот файл содержит список пакетов, состояние которых остановлено.
Приложения в остановленном состоянии не могут получать никаких широковещательных сообщений.