Ako funguje inštalácia aplikácií pre Android pod kapotou

A smartphone on engineering blueprints with gears, illustrating how app installation works

Keď klepnete na „Inštalovať“ v súbore APK alebo si stiahnete aplikáciu z Obchodu Play, v zákulisí sa začne zložitý sled operácií. To, čo sa javí ako jednoduchý indikátor priebehu, v skutočnosti predstavuje desiatky krokov zahŕňajúcich analýzu balíkov, kryptografické overenie, správu povolení, extrakciu súborov a optimalizáciu kódu. Pochopenie tohto procesu pomôže vysvetliť, prečo inštalácie niekedy zlyhajú a čo s tým môžete urobiť.

V tomto článku si prejdeme každý hlavný krok v procese inštalácie systému Android, od chvíle, keď systém dostane súbor APK, až po bod, kedy je aplikácia pripravená na spustenie.

Krok 1: Spustenie inštalácie

Proces inštalácie sa začína odlišne v závislosti od zdroja:

  • Obchod Play: Aplikácia Obchod Play stiahne súbor APK (alebo rozdelené súbory APK) a zavolá inštalátora balíkov systému so špeciálnymi oprávneniami, ktoré obchádzajú niektoré potvrdenia používateľov.
  • Bočné zaťaženie: Keď otvoríte súbor APK, Android spustí aktivitu inštalátora balíka. V systéme Android 8.0 a novšom musí mať inštalujúca aplikácia povolenie „Inštalovať neznáme aplikácie“ pre svoj konkrétny zdroj.
  • ADB: Príkaz adb install komunikuje priamo so službou správcu balíkov cez USB, pričom úplne obchádza grafický inštalačný program.

Bez ohľadu na zdroj, všetky inštalácie nakoniec dosiahnu rovnakú systémovú službu: PackageManagerService (PMS). Toto je centrálna autorita pre všetky operácie s balíkmi v systéme Android.

Krok 2: Analýza balíka

Pred čímkoľvek iným musí systém pochopiť, čo sa chystá nainštalovať. PackageManagerService vyvolá PackageParser na prečítanie súboru APK a extrahovanie jeho metadát.

Analyzátor načíta súbor AndroidManifest.xml zo súboru APK. Tento binárny súbor XML obsahuje dôležité informácie:

  • Názov balíka: Jedinečný identifikátor aplikácie (napr). com.example.myapp
  • Kód a názov verzie: Používa sa na určenie, či ide o aktualizáciu alebo novú inštaláciu
  • Minimálne a cieľové verzie súpravy SDK: Určuje kompatibilitu so zariadením
  • Deklarované povolenia: Obidve povolenia, ktoré aplikácia požaduje, aj vlastné povolenia, ktoré definuje
  • Komponenty: Aktivity, služby, vysielacie prijímače a poskytovatelia obsahu, ktorých aplikácia registruje
  • Hardvérové ​​a softvérové ​​funkcie: Požiadavky ako fotoaparát, GPS alebo špecifické verzie OpenGL

Ak je manifest poškodený alebo štruktúra súboru APK je neplatná, inštalácia v tejto fáze zlyhá a zobrazí sa hlásenie Chyba analýzy. Toto je jeden z najbežnejších dôvodov, prečo sa bočné súbory APK nenainštalujú.

Krok 3: Kontroly kompatibility

Po analýze manifestu systém vykoná sériu kontrol kompatibility:

  • Verzia súpravy SDK: Ak je minSdkVersion aplikácie vyššie ako úroveň API zariadenia, inštalácia bude odmietnutá.
  • ABI kompatibilita: Ak súbor APK obsahuje natívne knižnice, systém skontroluje, či zodpovedajú architektúre CPU zariadenia. Súbor APK iba s knižnicami armeabi-v7a sa nenainštaluje do zariadenia iba s x86.
  • Požadované vlastnosti: Ak aplikácia deklaruje požadované hardvérové ​​funkcie (napríklad android.hardware.telephony), systém overí, či ich zariadenie podporuje.
  • Dostupné úložisko: Systém skontroluje, či je dostatok voľného miesta na inštaláciu aplikácie, vrátane priestoru pre extrahované natívne knižnice a optimalizované súbory DEX.

Krok 4: Overenie podpisu

Toto je jeden z najdôležitejších krokov v procese inštalácie. Android overuje kryptografický podpis súboru APK, aby zaistil jeho integritu a pravosť.

Proces overovania závisí od toho, aké podpisové schémy sú prítomné:

Podpis V1 (podpis JAR)

Systém skontroluje, či sa v adresári META-INF/ nenachádzajú súbory podpisov (.SF, .RSA alebo .DSA). Každý súbor v súbore APK je overený podľa súhrnov uvedených v manifeste. Je to pomalé, pretože každý súbor musí byť individuálne hašovaný.

Podpis V2 (Schéma podpisu APK v2)

Táto schéma, predstavená v systéme Android 7.0, podpisuje celý súbor APK ako binárny blob. Podpisový blok sa vkladá medzi centrálny adresár ZIP a záznam na konci centrálneho adresára. Overenie je oveľa rýchlejšie, pretože pracuje s nespracovanými bajtami bez potreby dekomprimovať jednotlivé položky.

Podpis V3 (otočenie kľúča)

V3, ktorý je dostupný od Androidu 9.0, rozširuje V2 o podporu otáčania kľúčov. Zahŕňa štruktúru proof-of-rotation, ktorá spája staré a nové podpisové kľúče, čo umožňuje vývojárom zmeniť ich podpisový kľúč pri zachovaní kompatibility aktualizácií.

Podpis V4 (prírastkový)

Android 11 predstavil V4 pre prírastkové inštalácie. Poskytuje podpis založený na strome Merkle, ktorý umožňuje overenie jednotlivých blokov pri ich streamovaní do zariadenia.

Ak overenie podpisu z akéhokoľvek dôvodu zlyhá, inštalácia sa okamžite preruší. Pred inštaláciou môžete skontrolovať podpis súboru APK pomocou nášho Nástroj na overovanie súborov APK.

Aktualizujte zhodu podpisov

Ak je už nainštalovaná aplikácia s rovnakým názvom balíka, systém vykoná dodatočnú kontrolu: podpisový certifikát nového súboru APK sa musí zhodovať s certifikátom existujúcej inštalácie. To zabraňuje škodlivej strane nahradiť legitímnu aplikáciu upravenou verziou. Ak sa podpisy nezhodujú, zobrazí sa chyba „Aplikácia nie je nainštalovaná: Balík je v konflikte s existujúcim balíkom s rovnakým názvom.“

Krok 5: Potvrdenie používateľa

V prípade vedľajších inštalácií systém zobrazí dialógové okno s potvrdením inštalácie, ktoré zobrazuje:

  • Názov a ikona aplikácie (vybraté zo zdrojov súboru APK)
  • Povolenia, ktoré aplikácia vyžaduje (v starších verziách Androidu)
  • Či už ide o novú inštaláciu alebo aktualizáciu
  • Akékoľvek upozornenia týkajúce sa zdroja aplikácie alebo potenciálnych rizík

V systéme Android 12 a novšom je potvrdzovacia obrazovka jednoduchšia, pretože povolenia na spustenie sa udeľujú individuálne, keď ich aplikácia prvýkrát potrebuje, a nie pri inštalácii.

Krok 6: Extrakcia a umiestnenie súboru

Keď používateľ potvrdí (alebo v prípade inštalácie Obchodu Play automaticky), systém začne extrahovať a umiestňovať súbory:

Ukladací priestor APK

Samotný súbor APK sa skopíruje do /data/app/[package-name]-[random]/base.apk. V prípade rozdelených inštalácií APK sa vedľa základného súboru APK umiestnia ďalšie súbory ako split_config.arm64_v8a.apk. Pôvodný súbor APK v priečinku Stiahnuté súbory nie je upravený ani odstránený.

Extrakcia natívnej knižnice

Ak súbor APK obsahuje natívne knižnice (v adresári lib/, extrahujú sa do /data/app/[package-name]-[random]/lib/[abi]/). V novších verziách systému Android sa aplikácie môžu rozhodnúť ponechať natívne knižnice komprimované v rámci súboru APK a načítať ich priamo pomocou android:extractNativeLibs="false", čo šetrí úložný priestor.

Vytvorenie adresára údajov

Systém vytvorí súkromný dátový adresár aplikácie na /data/data/[package-name]/ (alebo /data/user/0/[package-name]/ na zariadeniach s viacerými používateľmi). Tento adresár vlastní jedinečné UID systému Linux priradené aplikácii, čo zaisťuje, že žiadna iná aplikácia k nemu nebude mať prístup bez oprávnení root.

Krok 7: Optimalizácia DEX

V tomto kroku Android transformuje bajtový kód aplikácie do formátu optimalizovaného pre špecifický hardvér zariadenia. Tento proces sa počas histórie Androidu výrazne vyvinul:

The Dalvik Era (Android 4.4 a starší)

Pôvodný virtuálny stroj Dalvik používal kompiláciu Just-In-Time (JIT). Počas inštalácie bol súbor classes.dex optimalizovaný na súbor ODEX, ktorý obsahoval overený a optimalizovaný bajtkód. Bolo to relatívne rýchle, ale znamenalo to, že aplikácia bežala pomalšie, pretože väčšina kódu bola stále interpretovaná.

ART s AOT (Android 5.0 až 6.0)

Android Runtime (ART) nahradil Dalvik a predstavil kompiláciu Ahead-Of-Time (AOT). Počas inštalácie bol celý bajtový kód DEX skompilovaný do natívneho strojového kódu. Vďaka tomu aplikácie bežia rýchlejšie, no výrazne sa predĺžil čas inštalácie a využitie úložiska. Inštalácia niektorých aplikácií trvala niekoľko minút.

Kompilácia so sprievodcom profilom (Android 7.0+)

Moderný Android využíva hybridný prístup. Počas inštalácie sa skompilujú iba kritické spúšťacie cesty. Keď používateľ spustí aplikáciu, systém zhromažďuje profily vykonávania identifikujúce často používané cesty kódu. Počas nečinnej údržby (zvyčajne počas nabíjania cez noc) systém kompiluje tieto horúce cesty do natívneho kódu. To vyvažuje rýchlosť inštalácie, využitie úložiska a výkon za behu.

Kompilovaný kód je uložený v /data/dalvik-cache/ alebo spolu s APK ako súbory .odex, .vdex a .art. Súbor .vdex obsahuje overený kód DEX, súbor .odex obsahuje skompilovaný natívny kód a súbor .art obsahuje predinicializované obrázky haldy pre rýchlejšie spustenie.

Krok 8: Registrácia povolenia

PackageManagerService registruje deklarované povolenia a komponenty aplikácie v systéme:

  • Povolenia v čase inštalácie (ako INTERNET alebo VIBRATE sa udelia automaticky bez interakcie používateľa).
  • Runtime povolenia (ako CAMERA alebo LOCATION sú registrované, ale nie sú udelené). Aplikácia si ich musí vyžiadať za behu.
  • Filtre zámerov sú registrované, takže systém vie, ktoré aplikácie dokážu spracovať aké akcie (napríklad otvorenie adresy URL alebo zdieľanie obsahu).
  • Poskytovatelia obsahu sú zaregistrované u ich úradov, takže ich môžu pýtať iné aplikácie.

Krok 9: Systémová integrácia

Posledné kroky integrujú aplikáciu do systému Android:

  • Aktualizácia databázy balíkov: Databáza balíkov systému (/data/system/packages.xml sa aktualizuje informáciami o novej aplikácii vrátane jej prideleného UID, povolení a deklarácií komponentov).
  • Upozornenie spúšťača: Spúšťač domovskej obrazovky je upozornený na novú aplikáciu, takže môže zobraziť ikonu aplikácie.
  • Vysielanie: Systém odošle vysielanie PACKAGE_ADDED, čím umožní ostatným aplikáciám reagovať na novú inštaláciu (napríklad zálohovacie aplikácie môžu naplánovať zálohovanie).
  • Kontext SELinux: Súbory aplikácie sú označené príslušným bezpečnostným kontextom SELinux na základe jej cieľovej verzie SDK a deklarovaných povolení.

Prečo inštalácie zlyhajú

Pochopenie inštalačného potrubia pomáha diagnostikovať bežné poruchy:

  • "Chyba analýzy": Súbor APK je poškodený, neúplný alebo má poškodený manifest. Toto sa často stáva pri neúplných stiahnutiach alebo nesprávne konvertovaných súboroch.
  • „Aplikácia nie je nainštalovaná“ (nesúlad podpisov): Pokúšate sa aktualizovať aplikáciu pomocou súboru APK podpísaného iným kľúčom. Najprv musíte odinštalovať existujúcu verziu.
  • "Nedostatočné úložisko": Nedostatok miesta pre súbor APK, extrahované knižnice a výstup optimalizácie DEX. Skutočný potrebný priestor je zvyčajne 2 až 3-násobok veľkosti súboru APK.
  • "Balík je v konflikte s existujúcim balíkom": Rovnaký názov balíka, ale iný podpis. Bežné pri prepínaní medzi Obchodom Play a stiahnutými verziami.
  • Zablokovaný prechod na staršiu verziu: V predvolenom nastavení systém Android zabraňuje inštalácii staršej verzie pred novšou. ADB to môže prepísať pomocou adb install -d.

Inštalácia split APK

Pri inštalácii rozdelených súborov APK (z balíkov App Bundle) je proces mierne odlišný. Systém používa rozhranie API inštalácia založená na reláciách:

  1. Vytvorí sa nová relácia inštalácie
  2. Každý rozdelený súbor APK sa zapíše do relácie
  3. Relácia je potvrdená, čím sa spustí úplný overovací kanál
  4. Všetky rozdelenia musia mať zhodné názvy balíkov, kódy verzií a podpisové certifikáty

Toto je mechanizmus, ktorý používajú inštalátori XAPK a nástroje, ako je náš Zlúčenie APKS do APK na spracovanie viacsúborových inštalácií.

Inštalácia cez ADB

Keď použijete adb install, proces obíde grafický inštalátor, ale postupuje podľa rovnakého interného potrubia. ADB komunikuje so službou správcu balíkov prostredníctvom pripojenia soketu. Podporuje ďalšie príznaky, ktoré nie sú dostupné cez GUI:

  • -r: Nahradiť existujúcu aplikáciu (povoliť preinštalovanie)
  • -d: Povoliť prechod na nižšiu verziu
  • -g: Okamžite udeľte všetky povolenia na spustenie
  • -t: Povolenie inštalácie súborov APK iba na testovanie
  • --install-multiple: Nainštalujte rozdelené súbory APK v jednej relácii

Čo sa stane počas odinštalovania

Pre úplnosť uvádzame, čo sa stane po odstránení aplikácie:

  1. Procesy aplikácie sú zabité
  2. Súbor APK a extrahované knižnice sa zo /data/app/ odstránia
  3. Adresár súkromných údajov aplikácie sa odstráni (pokiaľ sa používateľ nerozhodne údaje ponechať)
  4. Kompilované súbory vyrovnávacej pamäte DEX sa vymažú
  5. Databáza balíkov je aktualizovaná
  6. Odošle sa vysielanie PACKAGE_REMOVED
  7. Spúšťač odstráni ikonu aplikácie

Upozorňujeme, že súbory špecifické pre aplikáciu v externom úložisku (/Android/data/[package]/ a /Android/obb/[package]/ sa tiež odstránia v systéme Android 10 a novšom, a to vďaka vynúteniu rozsahu úložiska).

Prečo porozumenie PackageManager šetrí čas ladenia

Proces inštalácie systému Android je starostlivo organizovaná postupnosť bezpečnostných kontrol, operácií so súbormi a systémových integrácií. Každý krok slúži svojmu účelu, od ochrany používateľov pred neoprávnenými aplikáciami až po optimalizáciu výkonu pre konkrétny hardvér. Keď inštalácie zlyhajú, chyba zvyčajne poukazuje na konkrétny krok v tomto potrubí a pochopenie procesu vám pomôže rýchlo diagnostikovať a vyriešiť problémy.

Inštalácia z Obchodu Play, ručné načítanie súboru APK a presunutie zostavy s ADB cez rovnaký základný kanál, ktorý zaisťuje, že každá aplikácia na vašom zariadení bola overená, správne umiestnená a optimalizovaná pre váš hardvér.

Navrhol a zdokumentoval Mst Shaefale Vedúci vývojár a architekt balíkov Android • Overené na Android 12–15

Mst Shaefale spravuje nástroj na zlučovanie XAPK/APKS na strane klienta, analyzátor binárnych manifestov a nástroje na podpisovanie APK v1+v2 na xapktoapk.com. Všimli ste si zastaraný príkaz alebo zmenu operačného systému? Pošlite redakčnú poznámku.