Exploatarea la maxim a analizatorului APK

Wojtek Kaliciński

Follow

23 noiembrie, 2016 – 6 min citește

.

Una dintre recentele mele adăugiri preferate la Android Studio este APK Analyzer, pe care îl puteți găsi în meniul de sus la Build → Analyze APK.

Pro-tip: puteți, de asemenea, să trageți și să plasați fișierele APK în editor pentru a le deschide

APK Analyzer vă permite să deschideți și să inspectați conținutul oricărui fișier APK pe care îl aveți pe computer, fie că este construit din proiectul Android Studio local, fie că este achiziționat de pe serverul de construcție sau din alt depozit de artefacte. Nu trebuie să fie construit din orice proiect pe care îl aveți deschis în Android Studio și nu aveți nevoie de codul sursă pentru acel APK anume.

Nota: APK Analyzer funcționează cel mai bine cu versiunile de lansare. Dacă aveți nevoie să analizați o versiune de depanare a aplicației dvs., asigurați-vă că utilizați un APK care nu este instrumentat pentru Instant Run. Pentru a o obține, puteți utiliza comanda Build → Build APKcomandă. Puteți vedea dacă ați deschis un APK instrumentat pentru Instant Run verificând prezența unui fișier instant-run.zip în interiorul arhivei.

Utilizarea analizatorului APK este o modalitate excelentă de a cotrobăi prin fișierele APK și de a învăța despre structura lor, de a verifica conținutul fișierului înainte de lansare sau de a depana unele probleme comune, inclusiv probleme legate de dimensiunea APK și DEX.

Analizatorul APK vă poate oferi o mulțime de informații utile și acționabile despre dimensiunea aplicației. În partea de sus a ecranului, puteți vedea Raw File Size (Dimensiunea brută a fișierului), care este doar dimensiunea APK pe disc. Dimensiunea de descărcare arată o estimare a cantității de date utilizate pentru a descărca aplicația dvs. luând în considerare compresia aplicată de Play Store.

Lista de fișiere și foldere este ordonată după dimensiunea totală în ordine descrescătoare. Acest lucru o face să fie excelentă pentru identificarea fructelor cu potențial scăzut de optimizare a dimensiunii APK. De fiecare dată când detaliați un dosar, puteți vedea resursele și alte entități care ocupă cel mai mult spațiu în APK-ul dvs.

Resurse sortate în ordine descrescătoare în funcție de mărime

În acest exemplu, atunci când am examinat un APK pentru posibile reduceri de mărime, am putut observa imediat că o animație PNG cu 3 cadre este cel mai mare lucru din resursele noastre desenabile, cântărind 1.5MB, și asta doar pentru densitatea xxhdpi!

Din moment ce aceste imagini par a fi candidații perfecți pentru stocarea ca vectori, am găsit fișierele sursă pentru ilustrații și le-am importat ca VectorDrawables folosind noul suport PSD în instrumentul de import Vector Asset din Android Studio 2.2.

Prin parcurgerea aceluiași proces pentru cealaltă animație rămasă (instruction_touch_*.png) și eliminarea acestor fișiere PNG în toate densitățile, am reușit să economisim peste 5MB. Pentru a menține compatibilitatea retroactivă, am folosit VectorDrawableCompat din biblioteca de suport.

Urmărind alte foldere de resurse, a fost ușor să identificăm câteva fișiere WAV necomprimate care ar putea fi convertite în OGG, ceea ce a însemnat și mai multe economii fără a atinge o linie de cod.

Cercând alte dosare din APK

Următorul pe lista de lucruri de verificat a fost dosarul lib/, care conține biblioteci native pentru cele trei ABI-uri pe care le suportăm.

Am luat decizia de a folosi suportul APK splits în compilarea noastră Gradle pentru a crea versiuni separate ale aplicației pentru fiecare ABI.

M-am uitat rapid peste AndroidManifest.xml în continuare și am observat că <application> lipsește atributul android:extractNativeLibs. Setarea acestui atribut la false poate economisi ceva spațiu pe dispozitiv, deoarece împiedică copierea bibliotecilor native din APK în sistemul de fișiere. Singura cerință este ca fișierele să fie aliniate la pagină și să fie stocate necomprimate în interiorul APK-ului, ceea ce este acceptat cu noul packager din pluginul Android Gradle versiunea 2.2.0+.

Drumul AndroidManifest.xml complet, așa cum este vizualizat în APK Analyzer

După ce am făcut aceste modificări, am fost curios să văd cum se compară noua versiune a aplicației cu cea anterioară. Pentru a face acest lucru, am verificat sursa din commit-ul git cu care am început, am compilat APK-ul și l-am salvat într-un alt folder. Apoi am folosit funcția Compare with… pentru a vedea o defalcare a diferențelor de mărime între versiunea veche și cea nouă.

Comparare APK – accesați-o prin butonul din dreapta-sus

Am făcut multe progrese în ceea ce privește resursele și bibliotecile native, economisind un total de 17MB cu foarte puține modificări în aplicație. Cu toate acestea, pot vedea că dimensiunea DEX-ului nostru a regresat, cu classes2.dex crescând cu 400KB.

Debugging DEX issues

În acest caz, diferența a venit din actualizarea dependențelor noastre la versiuni mai noi și adăugarea de noi biblioteci. Proguard și Multidex erau deja activate pentru compilările noastre, așa că nu se pot face prea multe în legătură cu dimensiunea DEX-ului nostru. Totuși, APK analyzer este un instrument excelent pentru a depana orice problemă cu această configurație, în special atunci când activați Multidex sau Proguard pentru proiectul dvs. pentru prima dată.

Explorarea conținutului claselor.dex

Când faceți clic pe orice fișier DEX, veți vedea un rezumat al numărului de clase și metode pe care le definește și al numărului total de referințe pe care le conține (referințele sunt cele care se iau în considerare în limita de 64K într-un singur fișier DEX). În acest exemplu de captură de ecran, aplicația este pe cale să atingă limita, ceea ce înseamnă că va avea nevoie de MultiDex pentru a împărți clasele în fișiere separate în viitorul apropiat.

Puteți detalia pachetele pentru a vedea care dintre ele utilizează toate referințele. În acest caz, putem vedea că biblioteca Support și Google Play Services sunt principalele cauze pentru această situație:

Contul de referințe per pachet

După ce ați activat MultiDex și ați compilat aplicația, veți observa o a doua clasă2.dex (și, eventual, classes3.dex, și așa mai departe). Soluția MultiDex din pluginul Android gradle își dă seama ce clase sunt necesare pentru a porni aplicația dvs. și le pune în fișierul primar classes.dex, dar în cazul rar în care nu funcționează și primiți o excepție ClassNotFoundException, puteți utiliza APK Analyzer pentru a inspecta fișierele DEX și apoi să forțați clasele care lipsesc să fie puse în fișierul DEX primar.

Voi întâlni probleme similare atunci când activați Proguard și utilizați clase sau metode prin reflexie sau din layout-uri XML. APK Analyzer vă poate ajuta la verificarea faptului că configurația Proguard este corectă, permițându-vă să verificați cu ușurință dacă metodele și clasele de care aveți nevoie sunt prezente în APK și dacă sunt redenumite (ofuscate). De asemenea, vă puteți asigura că clasele pe care doriți să dispară sunt de fapt eliminate și nu ocupă numărul prețios de metode de referință.

Suntem curioși să aflăm ce alte utilizări găsiți pentru APK Analyzer și ce alte caracteristici ați dori să vedeți integrate în acest instrument!

.

Lasă un comentariu