Využití analyzátoru APK

Wojtek Kaliciński

Sledovat

23. listopadu, 2016 – 6 minut čtení

.

Jedním z mých nejoblíbenějších nedávných doplňků Android Studia je APK Analyzer, který najdete v horní nabídce v části Sestavit → Analyzovat APK.

Pro tip: můžete také přetáhnout soubory APK do editoru a otevřít je

APK Analyzer umožňuje otevřít a zkontrolovat obsah libovolného souboru APK, který máte v počítači, ať už sestaveného z místního projektu Android Studia, nebo získaného ze sestavovacího serveru či jiného úložiště artefaktů. Nemusí být sestaven z žádného projektu, který máte otevřený v aplikaci Android Studio, a nepotřebujete zdrojový kód daného souboru APK.

Poznámka: APK Analyzer funguje nejlépe se sestaveními pro vydání. Pokud potřebujete analyzovat ladicí sestavení aplikace, ujistěte se, že používáte APK, který není instrumentován pro okamžité spuštění. K jeho získání můžete použít příkaz Sestavit → Sestavit APK. Zda jste otevřeli instrumentovaný soubor APK pro okamžité spuštění, zjistíte tak, že zkontrolujete přítomnost souboru instant-run.zip uvnitř archivu.

Použití analyzátoru APK je skvělý způsob, jak se prohrabat soubory APK a zjistit jejich strukturu, ověřit obsah souboru před vydáním nebo odladit některé běžné problémy, včetně problémů s velikostí APK a DEX.

Analyzátor APK vám může poskytnout mnoho užitečných a použitelných informací o velikosti aplikace. V horní části obrazovky můžete vidět Raw File Size (Surová velikost souboru), což je pouze velikost APK na disku. Velikost ke stažení ukazuje odhad, kolik dat bude použito ke stažení aplikace s přihlédnutím ke kompresi použité Obchodem Play.

Seznam souborů a složek je seřazen podle celkové velikosti sestupně. Díky tomu se skvěle hodí pro identifikaci nízko visících plodů optimalizace velikosti APK. Při každém prohloubení složky se zobrazí zdroje a další entity, které v souboru APK zabírají nejvíce místa.

Zdroje seřazené sestupně podle velikosti

V tomto příkladu jsem si při zkoumání APK z hlediska možného zmenšení velikosti mohl okamžitě všimnout, že třísnímková animace PNG je jedinou největší věcí v našich kreslitelných zdrojích, která váží 1,5 kg.5 MB, a to jen pro hustotu xxhdpi!

Protože tyto obrázky vypadají jako ideální kandidáti na uložení jako vektory, našli jsme zdrojové soubory kresby a importovali je jako VectorDrawables pomocí nové podpory PSD v nástroji pro import vektorových prostředků v aplikaci Android Studio 2.2.

Pokud jsme prošli stejným postupem pro další zbývající animaci (instruction_touch_*.png) a odstranili tyto soubory PNG ve všech hustotách, podařilo se nám ušetřit více než 5 MB. Abychom zachovali zpětnou kompatibilitu, použili jsme VectorDrawableCompat z podpůrné knihovny.

Při pohledu na ostatní složky zdrojů bylo snadné odhalit některé nekomprimované soubory WAV, které bylo možné převést na OGG, což znamenalo ještě větší úsporu, aniž bychom se dotkli jediného řádku kódu.

Prohlížení dalších složek v APK

Další na seznamu věcí ke kontrole byla složka lib/, která obsahuje nativní knihovny pro tři podporovaná ABI.

Bylo rozhodnuto, že v našem sestavení Gradle použijeme podporu rozdělení APK a vytvoříme samostatné verze aplikace pro každé ABI.

Další jsem rychle prohlédl soubor AndroidManifest.xml a všiml jsem si, že v souboru <application> chybí atribut android:extractNativeLibs. Nastavení tohoto atributu na hodnotu false může ušetřit nějaké místo v zařízení, protože zabrání zkopírování nativních knihoven z APK do souborového systému. Jediným požadavkem je, aby byly soubory zarovnány na stránku a uloženy uvnitř APK bez komprese, což je podporováno novým balíčkovacím programem v zásuvném modulu Android Gradle verze 2.2.0+.

Úplný soubor AndroidManifest.xml zobrazený v nástroji APK Analyzer

Po provedení těchto úprav jsem byl zvědavý, jak si nová verze aplikace povede ve srovnání s předchozí. Za tímto účelem jsem zkontroloval zdrojový kód z revize git, kterou jsem začal, zkompiloval APK a uložil jej do jiné složky. Poté jsem použil funkci Porovnat s…, abych se podíval na rozpis rozdílů ve velikosti mezi starým a novým sestavením.

Srovnání APK – přístup k němu přes tlačítko vpravo nahoře

Udělali jsme velký pokrok v oblasti zdrojů a nativních knihoven, celkem jsme ušetřili 17 MB při velmi malých změnách v aplikaci. Vidím však, že naše velikost DEX regresovala, přičemž soubor classes2.dex narostl o 400 KB.

Debugování problémů DEX

V tomto případě rozdíl vznikl aktualizací našich závislostí na novější verze a přidáním nových knihoven. Proguard a Multidex již byly pro naše sestavení povoleny, takže s velikostí našeho DEX se toho moc dělat nedá. Přesto je analyzátor APK skvělým nástrojem pro ladění případných problémů s tímto nastavením, zejména pokud povolujete Multidex nebo Proguard pro svůj projekt poprvé.

Zkoumání obsahu tříd.dex

Když kliknete na libovolný soubor DEX, zobrazí se přehled, kolik tříd a metod definuje a kolik celkem obsahuje referencí (právě reference se započítávají do limitu 64K v jednom souboru DEX). Na tomto ukázkovém snímku je aplikace těsně před dosažením limitu, což znamená, že v blízké budoucnosti bude muset MultiDex rozdělit třídy do samostatných souborů.

Můžete se ponořit do balíčků a zjistit, které z nich využívají všechny reference. V tomto případě vidíme, že hlavní příčinou této situace jsou knihovna Support a služby Google Play:

Počet referencí na balíček

Po povolení funkce MultiDex a zkompilování aplikace si všimnete druhé třídy2.dex (a případně soubor classes3.dex atd.). Řešení MultiDex v zásuvném modulu Android gradle zjistí, které třídy jsou potřeba ke spuštění aplikace, a vloží je do primárního souboru classes.dex, ale ve vzácných případech, kdy to nefunguje a objeví se výjimka ClassNotFoundException, můžete pomocí nástroje APK Analyzer zkontrolovat soubory DEX a poté vynutit vložení chybějících tříd do primárního souboru DEX.

Na podobné problémy narazíte, když povolíte funkci Proguard a budete používat třídy nebo metody pomocí reflexe nebo z rozvržení XML. S ověřením správnosti konfigurace nástroje Proguard vám může pomoci nástroj APK Analyzer, který vám umožní snadno zkontrolovat, zda jsou požadované metody a třídy v souboru APK přítomny a zda nejsou přejmenovány (obfuskovány). Můžete se také ujistit, že třídy, které chcete odstranit, jsou skutečně odstraněny a nezabírají vám drahocenný počet referenčních metod.

Zajímá nás, jaké další využití pro nástroj APK Analyzer najdete a jaké další funkce byste rádi viděli v nástroji integrované!

Napsat komentář