Este cunoscut faptul că aplicațiile Android sunt distribuite sub formă de Pachetul de aplicații Android fișiere sau fișiere APK pe scurt. Cu toate acestea, majoritatea oamenilor privesc un fișier APK ca o cutie neagră și nu au nicio idee despre modul în care este creat sau despre ce se află în interiorul acestuia. Chiar și majoritatea dezvoltatorilor de aplicații au doar o înțelegere superficială a anatomiei unui APK. În mediile de dezvoltare integrate, cum ar fi Android Studio, este nevoie doar de un singur clic pentru a transforma un proiect Android într-un fișier APK.
În acest tutorial, vom diseca o aplicație Android. Cu alte cuvinte, vom deschide APK-ul și vom arunca o privire asupra conținutului acestuia. În plus, deoarece un fișier APK este un fișier binar destinat citirii numai de mașini, vă voi prezenta și câteva instrumente pe care le puteți utiliza pentru a traduce conținutul acestuia într-o formă mai ușor de citit de om.
Pentru a continua, aveți nevoie de:
Mulți oameni o fac din curiozitate. Alții se bucură de posibilitatea de a accesa direct imaginile, sunetele și alte elemente ale jocurilor sau aplicațiilor lor preferate. Există totuși motive mai importante pentru care doriți să vă uitați în interiorul unui fișier APK.
Dacă tocmai ați început să învățați dezvoltarea aplicațiilor Android, puteți afla multe prin căutarea în fișierele APK ale aplicațiilor sau aplicațiilor populare create de profesioniști. De exemplu, examinând fișierele XML de aspect ale unei aplicații care arată bine pe mai multe dimensiuni ale ecranului, puteți îmbunătăți abilitățile de creare a aspectului.
Aplicațiile descărcate din surse neîncrezătoare pot conține cod rău intenționat. Dacă sunteți deja un dezvoltator de aplicații calificate, prin dezasamblarea unor astfel de aplicații, puteți să vă uitați la codul acestora pentru a înțelege mai bine ce fac cu adevărat sub capotă.
Nu există multe lucruri pe care le puteți învăța dintr-un fișier APK fără o înțelegere de bază a modului în care este creat. De fapt, cele mai importante instrumente folosite pentru a diseca un fișier APK sunt, de asemenea, instrumentele folosite pentru a crea unul.
Proiectele Android sunt compuse în principal din cod sursă Java, machete XML, metadate XML și materiale, cum ar fi imagini, videoclipuri și sunete. Înainte ca sistemul de operare Android să poată utiliza toate aceste fișiere, acestea trebuie transformate într-o formă pe care o înțeleg. Această conversie implică o mulțime de sarcini intermediare, care sunt de obicei denumite proces de construire Android. Outputul final al procesului de construire este un APK sau Pachetul de aplicații Android.
În proiectele Android Studio, pluginul Android pentru Gradle se ocupă de toate sarcinile intermediare ale procesului de construire.
Una dintre primele sarcini importante este generarea unui fișier numit R.java. Acesta este fișierul care permite dezvoltatorilor să acceseze cu ușurință structura proiectului și resursele trasabile din codul lor Java utilizând constante numerice. Pentru a genera fișierul, este apelat un instrument aapt, care este scurt pentru Instrumentul de ambalare pentru activele Android, este folosit. Instrumentul convertește, de asemenea, toate resursele XML, împreună cu fișierul manifest al proiectului, într-un format binar.
Toate fișierele Java, inclusiv R.java, sunt apoi convertite în fișiere de clasă folosind compilatorul Java. După cum probabil știți, fișierele de clasă constau în bytecode, care pot fi interpretate de un motor Java runtime. Cu toate acestea, Android utilizează un tip special de runtime numit ART (Android Runtime), optimizat pentru dispozitivele mobile. Prin urmare, odată ce toate fișierele de clasă au fost generate, un instrument numit dx este folosit pentru a traduce bytecode la octetul Dalvik, un format pe care ART îl înțelege.
Odată ce resursele și fișierele Java au fost procesate, acestea sunt plasate într-un fișier de arhivă foarte asemănător cu un fișier JAR. Fișierul de arhivă este apoi semnat, utilizând o cheie privată care aparține dezvoltatorului de aplicații. Aceste două operații sunt efectuate de pluginul Gradle fără a utiliza instrumente externe. Cheia dezvoltatorului, cu toate acestea, este obținută de la o cheie de stocare gestionată de unelte cheie.
În cele din urmă, se fac câteva optimizări în fișierul de arhivă utilizând zipalign pentru a vă asigura că memoria pe care o consumă aplicația în timp ce rulează este menținută la minimum. În acest moment, fișierul de arhivă este un fișier APK valid, care poate fi utilizat de sistemul de operare Android.
Acum că înțelegeți cum sunt create și utilizate fișierele APK, să deschidem unul și să aruncăm o privire asupra conținutului acestuia. În acest tutorial, folosim fișierul APK al unei aplicații numite Tastatură soft exemplu, care vine pre-instalat pe emulatorul Android. Cu toate acestea, dacă preferați să utilizați un dispozitiv fizic, puteți folosi cu ușurință aplicația APK a oricărei aplicații pe care ați instalat-o.
Pentru a examina conținutul fișierului APK, trebuie mai întâi să îl transferați din emulator pe computer. Înainte de a face acest lucru, trebuie să știți numele pachetului și calea absolută a fișierului APK. Utilizare adb
pentru a deschide o sesiune shell pe emulator.
adb shell
Odată ce vedeți promptul shell, utilizați pm lista
comanda pentru a lista numele de pachete ale tuturor aplicațiilor instalate.
pm pachete listă
Numele pachetului aplicației de care ne interesează este com.example.android.softkeyboard. Ar trebui să îl puteți vedea în listă. Prin trecerea numelui pachetului la pm cale
comanda, puteți determina calea absolută a fișierului APK.
pm path com.example.android.softkeyboard
Ieșirea comenzii de mai sus arată astfel:
Pachet: /data/app/SoftKeyboard/SoftKeyboard.apk
Acum, când îi cunoașteți calea, puteți să părăsiți shell-ul și să transferați fișierul APK pe computer folosind adb trageți
comanda. Comanda de mai jos o transferă în computer / tmp director:
adb trageți /data/app/SoftKeyboard/SoftKeyboard.apk / tmp
Mai devreme în acest tutorial, ați aflat că un fișier APK nu este altceva decât un fișier comprimat de arhivă. Aceasta înseamnă că puteți utiliza managerul implicit de arhivare al sistemului de operare pentru a extrage conținutul acestuia. Dacă utilizați Windows, este posibil să fiți nevoit mai întâi să modificați extensia fișierului .apk la .zip. După extragerea conținutului fișierului APK, ar trebui să puteți vedea fișierele din interiorul fișierului APK.
Dacă sunteți dezvoltator de aplicații, multe dintre fișierele din fișierul APK ar trebui să pară familiare. Cu toate acestea, în afară de imaginile din res folder, fișierele sunt într-un format în care nu puteți lucra fără ajutorul câtorva instrumente.
SDK-ul Android include toate instrumentele de care aveți nevoie pentru a analiza conținutul unui fișier APK. Ați învățat mai devreme aapt
este folosit pentru a pachete de resurse XML în timpul procesului de construire. De asemenea, poate fi folosit pentru a citi o mulțime de informații dintr-un fișier APK.
De exemplu, puteți să o utilizați dump xmltree
opțiunea de a citi conținutul oricărui fișier XML binar din fișierul APK. Iată cum puteți citi un fișier de aspect numit res / aspect / input.xml:
aapt dump xmltree /tmp/SoftKeyboard.apk res / aspect / input.xml
Rezultatul ar trebui să arate cam așa:
N: android = http: //schemas.android.com/apk/res/android E: com.example.android.softkeyboard.LatinKeyboardView A: android: id (0x010100d0) = @ 0x7f080000 A: Android: (0x010100f4) = (tip 0x10) 0xffffffff A: android: layout_height (0x010100f5) = (tip 0x10) 0xfffffffe A: android: layout_alignParentBottom (0x0101018e) = (tip 0x12) 0xffffffff
Nu este XML, ci datorită indentării și etichetelor de genul N pentru spațiul de nume, E pentru element, și A pentru atribut, ar trebui să îl puteți citi.
În pasul anterior, ați văzut că XML descifrat are numere hexazecimale în loc de șiruri de caractere. Aceste numere sunt referințe la șiruri dintr-un fișier numit resources.arsc, care reprezintă tabelul de resurse al aplicației.
Puteți utiliza funcția dump resurse
opțiunea de aapt
pentru a vedea tabela de resurse. Iată cum:
aapt dump - apreciază resursele /tmp/SoftKeyboard.apk
Din ieșirea comenzii, puteți determina valorile exacte ale șirurilor utilizate în aplicație. Iată intrarea pentru unul dintre numerele hexazecimale din XML:
resursă 0x7f080000 com.example.android.softkeyboard: id / tastatură: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)
Fișierul APK cel mai important este classes.dex. Acesta este fișierul utilizat de runtime-ul Android în timp ce rulează aplicația. Acesta conține octetul Dalvik generat în timpul procesului de construire.
Prin dezasamblarea acestui fișier, puteți obține informații despre clasele Java utilizate în aplicație. Pentru a face acest lucru, puteți utiliza un instrument numit dexdump. Cu următoarea comandă, puteți redirecționa ieșirea din dexdump
la un fișier care poate fi deschis de orice editor de text.
dexdump -d /tmp/classes.dex> /tmp/classes.dasm
Dacă vă deschideți classes.dasm, veți vedea că are sute de linii de cod de nivel scăzut care arată astfel:
Inutil să spun, înțelegerea este foarte greu. Din fericire, puteți schimba formatul de ieșire din dexdump
la XML folosind -L
opțiune. Cu următoarea comandă, puteți redirecționa ieșirea către un fișier pe care îl puteți deschide într-un browser.
dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml
Cantitatea de informații disponibile în formatul XML este mai mică, dar vă oferă o idee corectă despre clasele, metodele și câmpurile Java prezente în aplicație.
În acest tutorial, ați aflat cum se creează un fișier APK și ce conține acesta. De asemenea, ați învățat cum să utilizați instrumentele disponibile în SDK-ul Android pentru a descifra conținutul fișierelor APK. Nu există o mulțime de documente despre aceste instrumente, dar, deoarece acestea sunt open source, puteți încerca să citiți codul sursă extensiv comentat pentru a afla mai multe despre ele.
Dacă sunteți în căutarea unui lucru mai ușor de utilizat, puteți încerca să folosiți instrumente populare de terță parte cum ar fi dex2jar, care generează un cod mai dezasamblat mai ușor de citit sau JADX, un decompiler care poate genera cod Java.