Коли ви натискаєте «Встановити» у файлі APK або завантажуєте програму з магазину Play, за лаштунками починається складна послідовність операцій. Те, що здається простим індикатором виконання, насправді представляє десятки кроків, пов’язаних із розбором пакетів, криптографічною перевіркою, керуванням дозволами, вилученням файлів і оптимізацією коду. Розуміння цього процесу допомагає пояснити, чому іноді не вдається інсталювати та що з цим робити.
У цій статті ми розглянемо кожен основний крок конвеєра встановлення Android, від моменту отримання системою APK до того моменту, коли програма буде готова до запуску.
Крок 1: Початок встановлення
Процес встановлення починається по-різному залежно від джерела:
- Play Store: Програма Play Store завантажує APK (або розділені APK) і викликає програму встановлення пакетів системи зі спеціальними привілеями, які обходять деякі підтвердження користувача.
- Бокове завантаження: Коли ви відкриваєте файл APK, Android запускає інсталятор пакета. В Android 8.0 і новіших версіях програма, яка встановлюється, повинна мати дозвіл «Встановлювати невідомі програми» для певного джерела.
- ADB: Команда adb install спілкується безпосередньо зі службою менеджера пакетів через USB, повністю минаючи графічний інсталятор.
Незалежно від джерела, усі інсталяції зрештою досягають однієї системної служби: PackageManagerService (PMS). Це центральний орган для всіх операцій з пакетами на Android.
Крок 2: Аналіз пакета
Перш за все система повинна зрозуміти, що вона збирається встановити. PackageManagerService викликає PackageParser для читання файлу APK і вилучення його метаданих.
Синтаксичний аналізатор читає файл AndroidManifest.xml з APK. Цей бінарний файл XML містить важливу інформацію:
- Назва пакета: Унікальний ідентифікатор програми (наприклад, com.example.myapp)
- Код і назва версії: Використовується, щоб визначити, чи це оновлення чи нове встановлення
- Мінімальна та цільова версії SDK: Визначає сумісність із пристроєм
- Заявлені дозволи: Дозволи, які запитує програма, і власні дозволи, які вона визначає
- Компоненти: Діяльність, послуги, приймачі трансляції та постачальники контенту, які реєструє програма
- Характеристики апаратного та програмного забезпечення: Вимоги, такі як камера, GPS або певні версії OpenGL
Якщо маніфест неправильно сформований або структура APK недійсна, інсталяція не вдасться на цьому етапі з повідомленням «Помилка аналізу». Це одна з найпоширеніших причин, через яку не вдається встановити сторонньо завантажені APK.
Крок 3: Перевірка сумісності
Після аналізу маніфесту система виконує серію перевірок сумісності:
- Версія SDK: Якщо minSdkVersion програми вищий за рівень API пристрою, встановлення відхиляється.
- Сумісність з ABI: Якщо APK містить власні бібліотеки, система перевіряє, чи відповідають вони архітектурі ЦП пристрою. APK лише з бібліотеками armeabi-v7a не встановлюється на пристрої лише з x86.
- Необхідні функції: Якщо програма заявляє про необхідні апаратні функції (наприклад, android.hardware.telephony), система перевіряє, чи пристрій їх підтримує.
- Доступне зберігання: Система перевіряє, чи достатньо вільного місця для встановлення програми, включно з місцем для видобутих нативних бібліотек і оптимізованих файлів DEX.
Крок 4: перевірка підпису
Це один із найважливіших кроків у процесі встановлення. Android перевіряє криптографічний підпис APK, щоб переконатися в його цілісності та автентичності.
Процес перевірки залежить від наявних схем підписання:
Підпис V1 (підпис JAR)
Система перевіряє каталог META-INF/ на наявність файлів підписів (.SF, .RSA або .DSA. Кожен файл у файлі .apk) перевіряється на дайджести, зазначені в маніфесті. Це повільно, оскільки кожен файл потрібно хешувати окремо.
Підпис V2 (схема підпису APK v2)
Представлена в Android 7.0, ця схема підписує весь APK як двійковий блоб. Блок підпису вставляється між центральним каталогом ZIP і записом кінця центрального каталогу. Перевірка набагато швидша, оскільки вона працює з необробленими байтами без необхідності розпаковувати окремі записи.
Підпис V3 (обертання ключів)
Доступний з Android 9.0, V3 розширює V2 підтримкою обертання клавіш. Він містить структуру підтвердження ротації, яка пов’язує старі та нові ключі підпису, дозволяючи розробникам змінювати свій ключ підпису, зберігаючи сумісність з оновленнями.
Підпис V4 (інкрементний)
Android 11 представив V4 для поетапного встановлення. Він забезпечує підпис на основі дерева Merkle, який дозволяє перевіряти окремі блоки під час їх потокової передачі на пристрій.
Якщо з будь-якої причини перевірка підпису не вдасться, установку буде негайно припинено. Ви можете перевірити підпис APK перед встановленням за допомогою нашого Інструмент перевірки APK.
Оновити відповідність підписів
Якщо програму з такою назвою пакета вже встановлено, система виконує додаткову перевірку: новий сертифікат підпису APK має збігатися з наявним сертифікатом інсталяції. Це запобігає заміні зловмисниками легітимної програми зміненою версією. Якщо підписи не збігаються, ви побачите повідомлення про помилку «Додаток не встановлено: пакет конфліктує з існуючим пакетом із такою ж назвою».
Крок 5: Підтвердження користувача
Для інсталяцій із стороннім завантаженням система відображає діалогове вікно підтвердження інсталяції, яке показує:
- Назва програми та піктограма (витягнуто з ресурсів APK)
- Дозволи, які запитує програма (у старіших версіях Android)
- Чи це нова інсталяція, чи оновлення
- Будь-які застереження щодо джерела програми або потенційних ризиків
В Android 12 і новіших версіях екран підтвердження є простішим, оскільки дозволи на виконання надаються окремо, коли вони вперше потрібні додатку, а не під час встановлення.
Крок 6: Вилучення та розміщення файлу
Щойно користувач підтвердить (або автоматично для встановлення Play Store), система почне витягувати та розміщувати файли:
Зберігання APK
Сам файл APK копіюється в /data/app/[package-name]-[random]/base.apk. Для розділеної інсталяції APK додаткові файли, наприклад split_config.arm64_v8a.apk, розміщуються поряд з базовим APK. Оригінальний файл APK у папці завантажень не змінюється та не видаляється.
Витяг рідної бібліотеки
Якщо APK містить рідні бібліотеки (у каталозі lib/, вони розпаковуються до /data/app/[package-name]-[random]/lib/[abi]/.) У новіших версіях Android програми можуть зберігати рідні бібліотеки стиснутими в APK і завантажувати їх безпосередньо за допомогою android:extractNativeLibs="false", що економить місце для зберігання.
Створення каталогу даних
Система створює приватний каталог даних програми за адресою /data/data/[package-name]/ (або /data/user/0/[package-name]/ на багатокористувацьких пристроях). Цей каталог належить унікальному UID Linux, призначеному програмі, що гарантує, що жодна інша програма не може отримати до нього доступ без привілеїв root.
Крок 7: Оптимізація DEX
На цьому етапі Android перетворює байт-код програми у формат, оптимізований для конкретного апаратного забезпечення пристрою. За історію Android цей процес значно вдосконалився:
Ера Dalvik (Android 4.4 і раніші версії)
Оригінальна віртуальна машина Dalvik використовувала компіляцію Just-In-Time (JIT). Під час встановлення файл classes.dex було оптимізовано у файл ODEX, який містив перевірений та оптимізований байт-код. Це було відносно швидко, але означало, що програма працювала повільніше під час виконання, оскільки більшість коду все одно інтерпретувалося.
ART з AOT (Android від 5.0 до 6.0)
Android Runtime (ART) замінив Dalvik і представив Ahead-Of-Time (AOT) компіляцію. Під час встановлення весь байт-код DEX було скомпільовано до рідного машинного коду. Це пришвидшило роботу програм, але значно збільшило час встановлення та використання пам’яті. Деякі програми встановлювалися кілька хвилин.
Компіляція з урахуванням профілю (Android 7.0+)
Сучасний Android використовує гібридний підхід. Під час інсталяції компілюються лише критичні шляхи запуску. Коли користувач запускає програму, система збирає профілі виконання, які ідентифікують шляхи коду, які часто використовуються. Під час обслуговування в режимі очікування (зазвичай під час заряджання протягом ночі) система компілює ці гарячі шляхи до рідного коду. Це балансує швидкість встановлення, використання пам’яті та продуктивність під час виконання.
Зібраний код зберігається в /data/dalvik-cache/ або поряд з APK як файли .odex, .vdex і .art. Файл .vdex містить перевірений код DEX, файл .odex містить скомпільований власний код, а файл .art містить попередньо ініціалізовані зображення купи для швидшого запуску.
Крок 8: Реєстрація дозволу
PackageManagerService реєструє декларовані дозволи та компоненти програми в системі:
- Дозволи під час встановлення (наприклад, INTERNET або VIBRATE надаються автоматично без участі користувача).
- Дозволи виконання (наприклад, CAMERA або LOCATION зареєстровані, але не надаються). Програма має запитувати їх під час виконання.
- Фільтри намірів зареєстровано, щоб система знала, які програми можуть виконувати які дії (наприклад, відкриття URL-адреси чи обмін вмістом).
- Постачальники контенту зареєстровані у своїх органах влади, тому інші програми можуть запитувати їх.
Крок 9: Системна інтеграція
Останні кроки інтеграції програми в систему Android:
- Пакет оновлення бази даних: Системну базу даних пакетів (/data/system/packages.xml) оновлено інформацією про нову програму, включаючи її призначений UID, дозволи та оголошення компонентів.
- Сповіщення панелі запуску: Панель запуску головного екрана сповіщається про нову програму, щоб вона могла відображати піктограму програми.
- Трансляція: Система надсилає широкомовне повідомлення PACKAGE_ADDED, дозволяючи іншим програмам реагувати на нове встановлення (наприклад, програми резервного копіювання можуть запланувати резервне копіювання).
- Контекст SELinux: Файли програми позначені відповідним контекстом безпеки SELinux на основі версії цільового SDK і заявлених дозволів.
Чому не вдається встановити
Розуміння інсталяційного трубопроводу допомагає діагностувати загальні збої:
- "Помилка аналізу": Файл .apk пошкоджений, неповний або має неправильний маніфест. Це часто трапляється з неповними завантаженнями або неправильно конвертованими файлами.
- «Програма не встановлена» (невідповідність підпису): Ви намагаєтеся оновити програму за допомогою файлу .apk, підписаного іншим ключем. Спочатку потрібно видалити наявну версію.
- "Недостатньо пам'яті": Недостатньо місця для APK, витягнутих бібліотек і оптимізаційного виводу DEX. Фактично необхідний простір зазвичай у 2-3 рази перевищує розмір APK.
- «Пакет конфліктує з існуючим пакетом»: Та сама назва пакета, але інший підпис. Поширене під час перемикання між Play Store і сторонніми версіями.
- Пониження версії заблоковано: За замовчуванням Android забороняє інсталювати старішу версію замість новішої. ADB може змінити це за допомогою adb install -d.
Встановлення розділеного APK
Під час встановлення розділених файлів .apk (з App Bundle) процес дещо відрізняється. Система використовує встановлення на основі сесії API:
- Створюється новий сеанс встановлення
- Кожен розділений APK записується в сеанс
- Сеанс зафіксовано, що запускає конвеєр повної перевірки
- Усі розбиття повинні мати відповідні назви пакетів, коди версій і сертифікати підпису
Це механізм, який використовують інсталятори XAPK і такі інструменти, як наш Об’єднання APKS в APK, для встановлення кількох файлів.
Установка через ADB
Коли ви використовуєте adb install, процес обходить графічний інсталятор, але слідує тому самому внутрішньому конвеєру. ADB спілкується зі службою менеджера пакетів через сокет-з’єднання. Він підтримує додаткові позначки, недоступні через GUI:
- -r: замінити наявну програму (дозволити повторне встановлення)
- -d: Дозволити зниження версії
- -g: негайно надайте всі дозволи на виконання
- -t: Дозволити інсталяцію файлів APK лише для тестування
- --install-multiple: установіть розділені файли APK за один сеанс
Що відбувається під час видалення
Для повноти, ось що відбувається після видалення програми:
- Процеси програми припинено
- APK і витягнуті бібліотеки видаляються з /data/app/
- Каталог особистих даних програми видаляється (якщо користувач не вирішив зберегти дані)
- Зкомпільовані файли кешу DEX видаляються
- Оновлено базу даних пакетів
- Надсилається трансляція PACKAGE_REMOVED
- Панель запуску видаляє піктограму програми
Зауважте, що файли програми на зовнішній пам’яті (/Android/data/[package]/ і /Android/obb/[package]/ також видаляються в Android 10 і пізніших версіях завдяки застосуванню обмеженого обсягу зберігання).
Чому розуміння PackageManager заощаджує час налагодження
Процес встановлення Android — це ретельно організована послідовність перевірок безпеки, операцій з файлами та системної інтеграції. Кожен крок має певну мету: від захисту користувачів від підроблених додатків до оптимізації продуктивності для конкретного обладнання. Коли інсталяції не вдаються, помилка зазвичай вказує на певний крок у цьому конвеєрі, і розуміння процесу допомагає вам швидко діагностувати та вирішувати проблеми.
Встановлення з магазину Play, ручне завантаження файлу APK і просування збірки за допомогою ADB через той самий основний конвеєр, який гарантує, що кожна програма на вашому пристрої перевірена, правильно розміщена та оптимізована для вашого апаратного забезпечення.