Pochopení architektury procesoru Android (ABI): Proč záleží na arm64-v8a, armeabi-v7a a x86

Diagram showing one app bundle splitting into arm64-v8a, armeabi-v7a, and x86 architecture-specific APKs

Pokud jste někdy sloučili sadu rozdělených souborů APK a sledovali, jak váš telefon vracel zprávu „Aplikace není nainstalována“, nebo ještě hůř, sledovali jste, jak se nainstaluje v pořádku, ale došlo k selhání v okamžiku, kdy jste klepli na ikonu, existuje slušná šance, že skutečný problém neměl nic společného s poškozeným stahováním. Téměř jistě šlo o architekturu: nesoulad mezi CPU, na kterém váš telefon běží, a CPU, pro které byl zkompilován nativní kód aplikace. Většina uživatelů Androidu o tom nikdy nemusí přemýšlet, až do okamžiku, kdy to tiše něco rozbije, a pak se to rychle stane relevantním. Zde je vysvětleno, co architektura CPU pro soubor APK znamená, proč se jedna aplikace v Obchodě Play tajně dodává jako několik různých sestavení a jak zkontrolovat kompatibilitu, než cokoli nainstalujete.

Co je ABI

ABI je zkratka pro Application Binary Interface. Z praktického hlediska je to instrukční sada, které čip rozumí – formát surového strojového kódu, který může procesor přímo spustit. Většina aplikací pro Android, části napsané v Javě nebo Kotlinu, se zkompiluje do bajtkódu, který běží uvnitř Android Runtime (ART), a ART se nijak zvlášť nestará, na kterém čipu náhodou sedí. Tato vrstva je designově nezávislá na architektuře, což je velká část toho, proč aplikace pro Android obecně „fungují“ na tak široké škále hardwaru.

Nativní kód je jiný příběh. Spousta aplikací, zejména hry, aplikace pro fotoaparáty, nástroje pro strojové učení a vše, co provádí náročné zpracování zvuku nebo videa, dodává nativní knihovny napsané v C nebo C++ prostřednictvím Android NDK. Tyto knihovny jsou předem zkompilovány do strojového kódu pro jednu konkrétní instrukční sadu a čip vytvořený pro jednu instrukční sadu obecně nemůže spustit strojový kód napsaný pro jinou. To je celý důvod, proč ABI existují jako něco, co stojí za pochopení: v okamžiku, kdy aplikace obsahuje byť jen jednu nativní knihovnu .so, její kompatibilita se váže na architektury, pro které byla knihovna vytvořena.

Architektury, na které narazíte

Dříve byla v tomto prostoru větší rozmanitost (pamatujete na obyčejné armeabi nebo MIPS?), ale do roku 2026 se pole zúžilo na čtyři ABI, které stojí za to znát:

ABIBitová šířkaTypická zařízeníPoznámky
arm64-v8a64bitový ARMPrakticky každý telefon prodaný zhruba od roku 2019Výchozí cíl pro nové aplikace; Google již několik let vyžaduje 64bitovou podporu pro nové položky v Obchodě Play.
armeabi-v7a32bitový ARMStarší nebo levnější zařízení, některé levné telefony se stále prodávají na rozvíjejících se trzíchStále je dodáváno mnoha aplikacemi pro zpětnou kompatibilitu, i když většina aktivních zařízení ji již nepotřebuje.
x8632bitový IntelStaré tablety na bázi Intelu, starší emulátoryVětšinou zastaralé; se skutečným 32bitovým x86 telefonem se dnes setkáte jen zřídka.
x86_6464bitový IntelNěkteré Chromebooky, desktopové emulátory Androidu, pár x86 tabletůDůležité, pokud testujete aplikace v emulátoru, jako je x86 Android Studio AVD nebo určitá sestavení BlueStacks.

Pokud držíte telefon zakoupený kdykoli za posledních pět nebo šest let, je to téměř jistě arm64-v8a. Výjimky, které stojí za zapamatování, jsou emulátory a Chromebooky, které místo toho často běží na x86_64, protože to odpovídá základnímu procesoru notebooku nebo stolního počítače.

Proč aplikace vůbec obtěžují doručovat více sestav

Jedna zřejmá otázka je, proč vývojáři prostě nenacpou nativní knihovny každé architektury do jednoho APK a neskončí s tím. Některé aplikace to dělají přesně a nazývá se to univerzální nebo „tlustý“ APK. Nevýhodou je velikost. Hra s nativními knihovnami pro arm64-v8a, armeabi-v7a, x86 a x86_64, které jsou všechny sbalené dohromady, může snadno zdvojnásobit nebo ztrojnásobit velikost ve srovnání se sestavou obsahující pouze jednu architekturu, kterou vaše zařízení potřebuje. Vynásobte to v milionech instalací a uvidíte skutečně značné množství plýtvané šířky pásma a úložiště pro kód, který se na tomto zařízení nikdy nespustí.

Aby se tomuto plýtvání zabránilo, Google Play a formát Android App Bundle rozdělili aplikaci na malý základní soubor APK plus řadu konfiguračních souborů APK, z nichž jeden je věnován architektuře. Když si váš telefon vyžádá aplikaci, Obchod Play dodá základní soubor APK společně s pouze rozdělením architektury, které odpovídá vašemu čipu, spolu s odpovídajícími rozděleními podle hustoty obrazovky a jazyka. Skončíte s instalací, která se chová jako jedna aplikace, ale skládá se z několika účelově vytvořených kusů v zákulisí.

Jak to využívají rozdělené APK a balíčky aplikací

Pokud jste někdy otevřeli balíček .apks nebo .xapk a všimli jste si, že názvy souborů jako split_config.arm64_v8a.apk, split_config.armeabi_v7a.apk, split_config.xxhdpi.apk a split_config.en.apk sedí vedle base.apk, je to přesně tento systém v akci, jen exportovaný jako sada souborů místo toho, aby byly tiše doručeny Obchodem Play. Rozdělení hustoty a jazyka je obvykle bezpečné instalovat bez rozdílu, protože telefon jednoduše ignoruje zdroje, které nepotřebuje. Rozdělení architektury je jiné: nainstalujte špatnou nebo selžete nainstalovat odpovídající a dostanete se do skutečných problémů.

Když použijete konvertor ke sloučení rozděleného balíčku zpět do jednoho instalovatelného souboru APK, proces sloučení musí vybrat, která architektura se rozděluje, aby se složila. Dobrý konvertor zachová každé rozdělení architektury, které je skutečně užitečné, nebo vám umožní vybrat si, místo aby tiše ponechal pouze jeden a doufal, že odpovídá vašemu zařízení.

Co se stane, když se architektura neshoduje

Existují dva odlišné režimy selhání, které stojí za to znát odděleně, protože vypadají a působí jinak než běžný uživatel.

Prvním je úplné selhání instalace. Pokud je aplikace postavena téměř výhradně na nativním kódu bez smysluplné zálohy, správce balíčků Android ji odmítne vůbec nainstalovat, obvykle se objeví chyba jako INSTALL_FAILED_NO_MATCHING_ABIS. Aplikaci nikdy ani neotevřete; instalační technik vás zastaví u dveří.

Druhým, více frustrujícím výsledkem je tichý dílčí úspěch. Pokud má aplikace vstupní bod Java nebo Kotlin, který se sám načte v pořádku, ale poté se pokusí volat do nativní knihovny, která pro vaši architekturu prostě neexistuje, instalace se normálně dokončí. Všechno vypadá dobře, dokud neklepnete na ikonu, v tomto okamžiku se aplikace téměř okamžitě zhroutí, často se UnsatisfiedLinkError pohřbeným v protokolech. Toto je klasický příběh „Převedl jsem to, nainstaloval jsem to, pak se to okamžitě zavře“ a téměř vždy jde spíše o problém s architekturou než o poškozený soubor.

Diagram comparing a matching arm64 APK that installs and runs successfully against an x86-only APK that fails to install on an arm64 phone with error INSTALL_FAILED_NO_MATCHING_ABIS

Jak zkontrolovat architekturu vlastního telefonu

Pro drtivou většinu lidí je to jednoduché: pokud je váš telefon z roku 2019 nebo novější, převezměte arm64-v8a a pokračujte. Pokud si chcete být jisti nebo máte co do činění se starším či neobvyklým zařízením, několik praktických možností:

Jak zkontrolovat, jaké architektury APK podporuje

Před instalací souboru mimo Obchod Play se vyplatí ověřit, co se v něm skrývá, a ne hádat. Nativní knihovny APK žijí ve složkách pojmenovaných podle jejich architektury v adresáři lib/, jako je lib/arm64-v8a/ nebo lib/armeabi-v7a/. Jakýkoli nástroj, který dokáže zkontrolovat vnitřní strukturu souboru APK, vám přesně řekne, které z těchto složek jsou přítomny, což vám přesně řekne, na kterých zařízeních bude soubor běžet.

Před instalací zkontrolujte

Náš Nástroj APK Info čte interní složku lib/ souboru APK a uvádí všechny architektury, pro které byl vytvořen, takže si můžete ověřit kompatibilitu, než cokoliv nahrajete. Když převedete rozdělený balíček pomocí našeho Převodník XAPK na APK, také to automaticky objevíme po každém převodu, uvedeme seznam architektur nalezených ve sloučeném souboru a označíme jej, když se zdá, že v sestavě chybí řez, který by běžná zařízení potřebovala.

Univerzální APK vs Single-ABI APK: Který byste měli použít?

MetrikaUniverzální / tlustý APKSingle-ABI APK
Velikost souboruVětší, někdy 2-4xMalý, obsahuje pouze to, co vaše zařízení potřebuje
KompatibilitaFunguje téměř na jakémkoli zařízeníFunguje pouze na odpovídající architektuře
Nejlepší proSdílení jednoho souboru, který by měl fungovat všude, nejistí příjemciVlastní zařízení, když už znáte jeho architekturu
RizikoVelmi nízké riziko nesouladu ABISelže nebo havaruje, pokud vyberete ten špatný

Běžné chyby, které lidé dělají s rozdělenými balíčky

Klíčové věci

  • ABI je instrukční sada, které čip rozumí; záleží pouze na aplikacích, které obsahují nativní kód (C/C++).
  • arm64-v8a pokrývá téměř každý moderní telefon; armeabi-v7a je pro starší zařízení; x86/x86_64 se většinou zobrazují v emulátorech a Chromeboocích.
  • Aplikace jsou běžně rozděleny podle architektury, aby se zabránilo odesílání zbytečného nativního kódu do každého zařízení.
  • Neodpovídající architektura buď instalaci přímo zablokuje, nebo způsobí okamžité zhroucení po zdánlivě úspěšné instalaci.
  • Než cokoliv nainstalujete, můžete zkontrolovat architekturu vašeho zařízení i podporované architektury APK, čímž se zcela vyhnete dohadům.

Často Kladené Otázky (FAQ)

Potřebuji znát architekturu svého telefonu, abych mohl nainstalovat normální aplikaci Obchod Play?

Ne. Obchod Play automaticky rozpozná vaše zařízení a poskytne pouze odpovídající rozdělení architektury, takže to bude relevantní pouze v případě, že načtete soubory APK mimo Obchod Play.

Může jeden APK podporovat více architektur najednou?

Ano. Univerzální nebo tlustý soubor APK sdružuje nativní knihovny pro každou podporovanou architekturu do jednoho souboru. Je větší, ale nainstaluje se na jakékoli kompatibilní zařízení bez ohledu na čip.

Proč se můj převedený soubor APK nainstaloval, ale okamžitě selhal?

K tomu obvykle dochází, když aplikace obsahuje malé množství kódu Java, který se dobře nainstaluje, ale poté se pokusí načíst nativní knihovnu, která nebyla zahrnuta pro architekturu vašeho zařízení, a za běhu vyvolá chybu UnsatisfiedLinkError.

Je arm64-v8a zpětně kompatibilní s aplikacemi armeabi-v7a?

Obecně ano. Většina čipů arm64-v8a může také provádět 32bitové instrukce ARM, takže soubor APK pouze pro armeabi-v7a bude obvykle stále běžet na moderním telefonu arm64, jen ne naopak.

Jsou zařízení x86 Android ještě v roce 2026?

Dnes jsou v telefonech vzácné, ale stále najdete x86 nebo x86_64 v některých starších tabletech s procesorem Intel, hrstce Chromebooků s aplikacemi pro Android a většině emulátorů Androidu pro stolní počítače.

Nic z toho se nemusíte učit nazpaměť. Krátká verze: moderní telefony jsou téměř vždy arm64-v8a, aplikace jsou rozděleny podle architektury, aby se ušetřilo místo, a pokud se něco odmítne nainstalovat nebo se zhroutí hned po otevření, nesoulad architektury je jednou z prvních věcí, které stojí za to vyloučit, než se předpokládá, že samotný soubor je nefunkční.

Navrhl a zdokumentoval Mst Shaefale Vedoucí vývojář a architekt balíčku Android • Ověřeno na Androidu 12–15

Mst Shaefale spravuje nástroje pro slučování XAPK/APKS na straně klienta, analyzátor binárních manifestů a nástroje pro podepisování APK v1+v2 na xapktoapk.com. Zaznamenali jste zastaralý příkaz nebo změnu operačního systému? Pošlete redakční poznámku.