Když klepnete na "Instalovat" na soubor APK nebo si stáhnete aplikaci z Obchodu Play, v zákulisí začne složitá sekvence operací. To, co vypadá jako jednoduchý ukazatel průběhu, ve skutečnosti představuje desítky kroků zahrnujících analýzu balíčků, kryptografické ověření, správu oprávnění, extrakci souborů a optimalizaci kódu. Pochopení tohoto procesu pomůže vysvětlit, proč instalace někdy selhávají a co s tím můžete dělat.
V tomto článku si projdeme každý hlavní krok instalačního kanálu Androidu, od okamžiku, kdy systém obdrží soubor APK, až po bod, kdy je aplikace připravena ke spuštění.
Krok 1: Zahájení instalace
Proces instalace začíná různě v závislosti na zdroji:
- Obchod Play: Aplikace Obchod Play stáhne soubor APK (nebo rozdělené soubory APK) a zavolá instalační program balíčků systému se speciálními oprávněními, která obcházejí některá potvrzení uživatele.
- Boční zatížení: Když otevřete soubor APK, Android spustí aktivitu instalačního programu balíčku. V systému Android 8.0 a novějším musí mít instalační aplikace oprávnění „Instalovat neznámé aplikace“ pro svůj konkrétní zdroj.
- ADB: Příkaz adb install komunikuje přímo se službou správce balíčků přes USB, přičemž zcela obchází grafický instalátor.
Bez ohledu na zdroj nakonec všechny instalace dosáhnou stejné systémové služby: PackageManagerService (PMS). Toto je ústřední autorita pro všechny operace s balíčky v systému Android.
Krok 2: Analýza balíčku
Před čímkoli jiným musí systém pochopit, co se chystá nainstalovat. PackageManagerService vyvolá PackageParser ke čtení souboru APK a extrahování jeho metadat.
Analyzátor čte soubor AndroidManifest.xml z APK. Tento binární soubor XML obsahuje důležité informace:
- Název balíčku: Jedinečný identifikátor aplikace (např). com.example.myapp
- Kód a název verze: Používá se k určení, zda se jedná o upgrade nebo novou instalaci
- Minimální a cílové verze SDK: Určuje kompatibilitu se zařízením
- Deklarovaná oprávnění: Obě oprávnění, která aplikace požaduje, i vlastní oprávnění, která definuje
- Komponenty: Činnosti, služby, přijímače vysílání a poskytovatelé obsahu, které aplikace registruje
- Hardwarové a softwarové vlastnosti: Požadavky jako fotoaparát, GPS nebo konkrétní verze OpenGL
Pokud má manifest nesprávný formát nebo je struktura APK neplatná, instalace se v této fázi nezdaří a zobrazí se zpráva „Chyba analýzy“. Toto je jeden z nejčastějších důvodů, proč se soubory APK s bočním zavedením neinstalují.
Krok 3: Kontroly kompatibility
Jakmile je manifest analyzován, systém provede řadu kontrol kompatibility:
- Verze SDK: Pokud je minSdkVersion aplikace vyšší než úroveň API zařízení, instalace bude zamítnuta.
- Kompatibilita s ABI: Pokud soubor APK obsahuje nativní knihovny, systém zkontroluje, zda odpovídají architektuře CPU zařízení. Soubor APK pouze s knihovnami armeabi-v7a se nenainstaluje do zařízení pouze pro x86.
- Požadované vlastnosti: Pokud aplikace deklaruje požadované hardwarové funkce (jako android.hardware.telephony), systém ověří, zda je zařízení podporuje.
- Dostupné úložiště: Systém zkontroluje, zda je dostatek volného místa pro instalaci aplikace, včetně místa pro extrahované nativní knihovny a optimalizované soubory DEX.
Krok 4: Ověření podpisu
Toto je jeden z nejkritičtějších kroků v procesu instalace. Android ověřuje kryptografický podpis souboru APK, aby zajistil jeho integritu a pravost.
Proces ověření závisí na tom, která schémata podepisování jsou přítomna:
Podpis V1 (podpis JAR)
Systém zkontroluje adresář META-INF/ pro soubory podpisů (.SF, .RSA nebo .DSA). Každý soubor v souboru APK je ověřen podle výtahů uvedených v manifestu. To je pomalé, protože každý soubor musí být individuálně hashován.
Podpis V2 (Schéma podpisu APK v2)
Toto schéma, představené v Androidu 7.0, podepisuje celý APK jako binární blob. Blok podpisu se vkládá mezi centrální adresář ZIP a záznam na konci centrálního adresáře. Ověření je mnohem rychlejší, protože pracuje s nezpracovanými bajty bez nutnosti dekomprimovat jednotlivé položky.
Podpis V3 (otočení klíče)
V3, dostupné od Androidu 9.0, rozšiřuje V2 o podporu otáčení klíčů. Zahrnuje strukturu proof-of-rotation, která propojuje staré a nové podpisové klíče, což umožňuje vývojářům měnit jejich podpisový klíč při zachování kompatibility aktualizací.
Podpis V4 (přírůstkový)
Android 11 představil V4 pro přírůstkové instalace. Poskytuje podpis založený na stromech Merkle, který umožňuje ověření jednotlivých bloků při jejich streamování do zařízení.
Pokud se ověření podpisu z jakéhokoli důvodu nezdaří, instalace se okamžitě přeruší. Před instalací můžete zkontrolovat podpis souboru APK pomocí našeho Nástroj Ověřovač APK.
Aktualizace shody podpisů
Pokud je již nainstalována aplikace se stejným názvem balíčku, systém provede další kontrolu: podpisový certifikát nového souboru APK se musí shodovat s certifikátem stávající instalace. Tím se zabrání tomu, aby strana se zlými úmysly nahradila legitimní aplikaci upravenou verzí. Pokud se podpisy neshodují, zobrazí se chyba „Aplikace není nainstalována: Balíček je v konfliktu s existujícím balíčkem se stejným názvem.“
Krok 5: Potvrzení uživatele
U instalací s bočním zatížením systém zobrazí dialogové okno s potvrzením instalace, které ukazuje:
- Název a ikona aplikace (získané ze zdrojů souboru APK)
- Oprávnění, která aplikace vyžaduje (ve starších verzích Androidu)
- Ať už se jedná o novou instalaci nebo aktualizaci
- Jakákoli varování o zdroji aplikace nebo potenciálních rizicích
V systému Android 12 a novějším je potvrzovací obrazovka jednodušší, protože oprávnění k běhu jsou udělována jednotlivě, když je aplikace poprvé potřebuje, nikoli v době instalace.
Krok 6: Extrakce a umístění souboru
Jakmile uživatel potvrdí (nebo v případě instalace Obchodu Play automaticky), systém začne extrahovat a umísťovat soubory:
Úložiště APK
Samotný soubor APK se zkopíruje do /data/app/[package-name]-[random]/base.apk. Pro rozdělené instalace APK jsou vedle základního APK umístěny další soubory, jako je split_config.arm64_v8a.apk. Původní soubor APK ve složce Stažené soubory nebyl upraven ani odstraněn.
Extrakce nativní knihovny
Pokud soubor APK obsahuje nativní knihovny (v adresáři lib/, jsou extrahovány do /data/app/[package-name]-[random]/lib/[abi]/). V novějších verzích Androidu se mohou aplikace rozhodnout ponechat nativní knihovny komprimované v rámci APK a načíst je přímo pomocí android:extractNativeLibs="false", což šetří úložný prostor.
Vytvoření datového adresáře
Systém vytvoří adresář soukromých dat aplikace na /data/data/[package-name]/ (nebo /data/user/0/[package-name]/ na zařízeních pro více uživatelů). Tento adresář je vlastněn jedinečným Linuxovým UID přiřazeným aplikaci, což zajišťuje, že k němu žádná jiná aplikace nebude mít přístup bez oprávnění root.
Krok 7: Optimalizace DEX
V tomto kroku Android transformuje bajtový kód aplikace do formátu optimalizovaného pro konkrétní hardware zařízení. Proces se v průběhu historie Androidu výrazně vyvíjel:
The Dalvik Era (Android 4.4 a starší)
Původní virtuální stroj Dalvik používal kompilaci Just-In-Time (JIT). Během instalace byl soubor classes.dex optimalizován na soubor ODEX, který obsahoval ověřený a optimalizovaný bajtkód. To bylo relativně rychlé, ale znamenalo to, že aplikace běžela pomaleji za běhu, protože většina kódu byla stále interpretována.
ART s AOT (Android 5.0 až 6.0)
Android Runtime (ART) nahradil Dalvik a představil kompilaci Ahead-Of-Time (AOT). Během instalace byl celý bytekód DEX zkompilován do nativního strojového kódu. Díky tomu aplikace běžely rychleji, ale výrazně se zvýšila doba instalace a využití úložiště. Instalace některých aplikací trvala několik minut.
Kompilace s průvodcem profilem (Android 7.0+)
Moderní Android používá hybridní přístup. Během instalace jsou kompilovány pouze kritické spouštěcí cesty. Když uživatel spouští aplikaci, systém shromažďuje profily provádění identifikující často používané cesty kódu. Během údržby nečinnosti (obvykle při nabíjení přes noc) systém tyto horké cesty zkompiluje do nativního kódu. To vyvažuje rychlost instalace, využití úložiště a výkon za běhu.
Zkompilovaný kód je uložen v /data/dalvik-cache/ nebo spolu s APK jako soubory .odex, .vdex a .art. Soubor .vdex obsahuje ověřený kód DEX, soubor .odex obsahuje zkompilovaný nativní kód a soubor .art obsahuje předinicializované obrázky haldy pro rychlejší spuštění.
Krok 8: Registrace oprávnění
PackageManagerService registruje deklarovaná oprávnění a komponenty aplikace v systému:
- Oprávnění v době instalace (jako INTERNET nebo VIBRATE jsou automaticky uděleny bez zásahu uživatele).
- Oprávnění za běhu (jako CAMERA nebo LOCATION jsou registrovány, ale nejsou uděleny). Aplikace si je musí vyžádat za běhu.
- Filtry záměrů jsou registrovány, takže systém ví, které aplikace zvládnou jaké akce (například otevření adresy URL nebo sdílení obsahu).
- Poskytovatelé obsahu jsou registrovány u jejich úřadů, takže je mohou ostatní aplikace dotazovat.
Krok 9: Integrace systému
Poslední kroky integrují aplikaci do systému Android:
- Aktualizace databáze balíčků: Databáze balíčků systému (/data/system/packages.xml je aktualizována informacemi o nové aplikaci, včetně přiřazeného UID, oprávnění a deklarací komponent).
- Oznámení spouštěče: Spouštěč domovské obrazovky je upozorněn na novou aplikaci, takže může zobrazit ikonu aplikace.
- Vysílání: Systém odešle vysílání PACKAGE_ADDED, které umožní ostatním aplikacím reagovat na novou instalaci (například zálohovací aplikace mohou naplánovat zálohování).
- Kontext SELinux: Soubory aplikace jsou označeny příslušným bezpečnostním kontextem SELinux na základě její cílové verze SDK a deklarovaných oprávnění.
Proč instalace selhávají
Pochopení instalačního potrubí pomáhá diagnostikovat běžné poruchy:
- "Chyba analýzy": Soubor APK je poškozený, neúplný nebo má poškozený manifest. To se často stává u neúplných stahování nebo nesprávně převedených souborů.
- "Aplikace není nainstalována" (neshoda podpisu): Pokoušíte se aktualizovat aplikaci pomocí souboru APK podepsaného jiným klíčem. Nejprve musíte odinstalovat stávající verzi.
- "Nedostatečné úložiště": Nedostatek místa pro soubor APK, extrahované knihovny a výstup optimalizace DEX. Skutečný potřebný prostor je obvykle 2-3x větší než velikost souboru APK.
- "Balík je v konfliktu se stávajícím balíčkem": Stejný název balíčku, ale jiný podpis. Běžné při přepínání mezi Obchodem Play a verzemi nahranými z boku.
- Zablokován downgrade verze: Ve výchozím nastavení Android brání instalaci starší verze před novější. ADB to může přepsat pomocí adb install -d.
Instalace rozděleného APK
Při instalaci rozdělených souborů APK (z balíčků App Bundle) je proces mírně odlišný. Systém používá instalace založená na relaci API:
- Vytvoří se nová instalační relace
- Každý rozdělený soubor APK je zapsán do relace
- Relace je potvrzena a spustí se úplný ověřovací kanál
- Všechna rozdělení musí mít odpovídající názvy balíčků, kódy verzí a podpisové certifikáty
Toto je mechanismus používaný instalátory a nástroji XAPK, jako je náš Sloučení APKS do APK, ke zpracování vícesouborových instalací.
Instalace přes ADB
Když použijete adb install, proces obchází grafický instalační program, ale postupuje podle stejného interního kanálu. ADB komunikuje se službou správce balíčků prostřednictvím připojení soketu. Podporuje další příznaky, které nejsou dostupné prostřednictvím GUI:
- -r: Nahradit stávající aplikaci (povolit přeinstalaci)
- -d: Povolit downgrade verze
- -g: Okamžitě udělte všechna oprávnění za běhu
- -t: Umožňuje instalaci souborů APK pouze pro testování
- --install-multiple: Nainstalujte rozdělené soubory APK v jedné relaci
Co se stane během odinstalace
Pro úplnost uvádíme, co se stane, když je aplikace odebrána:
- Procesy aplikace jsou zabity
- Soubor APK a extrahované knihovny jsou ze /data/app/ odstraněny
- Adresář soukromých dat aplikace je odstraněn (pokud se uživatel nerozhodne data ponechat)
- Kompilované soubory mezipaměti DEX jsou odstraněny
- Databáze balíčků je aktualizována
- Je odesláno vysílání PACKAGE_REMOVED
- Spouštěč odstraní ikonu aplikace
Všimněte si, že soubory specifické pro aplikaci na externím úložišti (/Android/data/[package]/ a /Android/obb/[package]/ jsou také odstraněny v systému Android 10 a novějším díky vynucení úložiště v rozsahu).
Proč porozumění PackageManager šetří čas ladění
Proces instalace systému Android je pečlivě uspořádaná sekvence bezpečnostních kontrol, operací se soubory a systémových integrací. Každý krok slouží svému účelu, od ochrany uživatelů před neoprávněnými aplikacemi až po optimalizaci výkonu pro konkrétní hardware. Když se instalace nezdaří, chyba obvykle ukazuje na konkrétní krok v tomto kanálu a pochopení procesu vám pomůže rychle diagnostikovat a vyřešit problémy.
Instalace z Obchodu Play, ruční načtení souboru APK a protlačení sestavy pomocí ADB stejným základním kanálem, který zajišťuje, že každá aplikace ve vašem zařízení byla ověřena, správně umístěna a optimalizována pro váš hardware.