Det är allmänt känt att Android-appar distribueras i form av Android Application Package filer eller APK-filer för korta. Men de flesta tittar på en APK som en svart låda och har ingen aning om hur den är skapad eller vad som är inne i den. Även de flesta apputvecklare har bara en ytlig förståelse för en APKs anatomi. I integrerade utvecklingsmiljöer, till exempel Android Studio, krävs bara ett enda klick för att omvandla ett Android-projekt till en APK.
I denna handledning kommer vi att dissekera en Android-app. Med andra ord ska vi öppna APK och ta en titt på innehållet. Dessutom, för att en APK är en binär fil som endast är avsedd att läsas av maskiner, kommer jag också att presentera dig för några verktyg du kan använda för att översätta innehållet till en mer läsbar form.
För att följa med, behöver du:
Många människor gör det av ren nyfikenhet. Andra har möjlighet att direkt komma åt bilder, ljud och andra tillgångar i deras favoritspel eller appar. Det finns dock fler viktiga skäl till varför du vill se inuti en APK.
Om du just har börjat lära sig Android apputveckling finns det mycket du kan lära dig genom att titta in i APK-filer av populära appar eller appar som skapats av proffs. Om du till exempel tittar på XML-layoutfilerna i en app som ser bra ut på flera skärmstorlekar, kan du förbättra dina egna layoutkompetens.
Apps som laddas ner från otillförlitliga källor kan innehålla skadlig kod. Om du redan är en skicklig apputvecklare, genom att demontera sådana appar, kan du titta på deras kod för att få en bättre förståelse för vad de verkligen gör under huven.
Det finns inte mycket du kan lära av en APK utan en grundläggande förståelse för hur den skapas. Faktum är att de viktigaste verktygen som används för att dissekera en APK är de verktyg som används för att skapa en.
Android-projekt består i första hand av Java-källkod, XML-layouter, XML-metadata och tillgångar, till exempel bilder, videoklipp och ljud. Innan Android-operativsystemet kan använda alla dessa filer måste de konverteras till ett formulär som det förstår. Denna omvandling innebär många mellanliggande uppgifter, som vanligtvis kallas Android-byggprocessen. Den slutliga utmatningen av byggprocessen är en APK eller Android Application Package.
I Android Studio-projekt hanterar Android Plugin for Gradle alla mellanliggande uppgifter i byggprocessen.
En av de första viktiga uppgifterna är att generera en fil som heter R.java. Det här är filen som låter utvecklare enkelt komma åt projektets layout och dragbara resurser i deras Java-kod med hjälp av numeriska konstanter. För att generera filen kallas ett verktyg aapt, vilket är förkortat Android-förpackningsverktyg, är använd. Verktyget konverterar också alla XML-resurser, tillsammans med projektets manifestfil, till ett binärt format.
Alla Java-filer, inklusive R.java, konverteras sedan till klassfiler med hjälp av Java-kompilatorn. Som du kanske redan vet består klassfiler av bytecode, vilket kan tolkas av en Java runtime-motor. Men Android använder en speciell typ av runtime som heter Android runtime (ART), som är optimerad för mobila enheter. Därför, när alla klassfiler har genererats, kallas ett verktyg dx används för att översätta bytekoden till Dalvik bytecode, ett format som ART förstår.
När resurser och Java-filer har bearbetats placeras de i en arkivfil som mycket liknar en JAR-fil. Arkivfilen skrivs sedan under, med en privat nyckel som tillhör apputvecklaren. Dessa två operationer utförs av Gradle-plugin utan att använda några externa verktyg. Utvecklarens nyckel uppnås emellertid från en nyckelbutik som hanteras av keytool.
Slutligen görs några optimeringar till arkivfilen med hjälp av zipalign verktyg för att se till att minnet som appen förbrukar under körning hålls till ett minimum. Vid denna tidpunkt är arkivfilen en giltig APK, som kan användas av Android-operativsystemet.
Nu när du förstår hur APK-filer skapas och används, låt oss öppna en och titta på innehållet. I den här handledningen använder vi APK för en app som heter Prov Soft Keyboard, som kommer förinstalleras på Android-emulatorn. Om du föredrar att använda en fysisk enhet kan du dock lika enkelt använda APK för alla appar som du har installerat på den.
För att undersöka innehållet i APK måste du först överföra det från emulatorn till din dator. Innan du gör det måste du veta APK: s paketnamn och den absoluta vägen. Använda sig av aDB
att öppna en skalsession på din emulator.
adb skal
När du väl ser shellprompten använder du pm lista
kommandot för att lista paketnamnen på alla installerade appar.
pm listpaket
Paketnamnet på den app som vi är intresserade av är com.example.android.softkeyboard. Du borde kunna se den i listan. Genom att skicka paketets namn till pm-banan
kommando kan du bestämma APK: s absoluta sökväg.
pm-sökväg com.example.android.softkeyboard
Utsignalen från ovanstående kommando ser så här ut:
paket: /data/app/SoftKeyboard/SoftKeyboard.apk
Nu när du vet sin väg kan du lämna skalet och överföra APK till din dator med hjälp av adb dra
kommando. Kommandot nedan överför det till datorns / tmp katalogen:
adb dra /data/app/SoftKeyboard/SoftKeyboard.apk / tmp
Tidigare i denna handledning lärde du dig att en APK är ingenting annat än en komprimerad arkivfil. Det innebär att du kan använda operativsystemets standardarkivhanterare för att extrahera innehållet. Om du använder Windows kanske du först måste ändra filens förlängning från .APK till .blixtlås. Efter att ha extrakt innehållet i APK bör du kunna se filerna i APK.
Om du är en apputvecklare, borde många filer i APK kännas bekanta. Men förutom bilderna i res mappen är filerna i ett format som du inte kan arbeta med utan hjälp av några verktyg.
Android SDK innehåller alla verktyg du behöver för att analysera innehållet i en APK. Du lärde dig det tidigare aapt
används för att paketera XML-resurser under byggprocessen. Det kan också användas för att läsa mycket information från en APK.
Till exempel kan du använda dess dump xmltree
möjlighet att läsa innehållet i en binär XML-fil i APK. Så här kan du läsa en layoutfil som heter res / layout / input.xml:
aapt dump xmltree /tmp/SoftKeyboard.apk res / layout / input.xml
Utgången ska se ut så här:
N: android = http: //schemas.android.com/apk/res/android E: com.example.android.softkeyboard.LatinKeyboardView (linje = 21) A: android: id (0x010100d0) = @ 0x7f080000 A: android: layout_width (0x010100f4) = (typ 0x10) 0xffffffff A: android: layout_height (0x010100f5) = (typ 0x10) 0xfffffffe A: android: layout_alignParentBottom (0x0101018e) = (typ 0x12) 0xffffffff
Det är inte XML, men tack vare indryck och etiketter som N för namespace, E för element, och en För attribut ska du kunna läsa den.
I föregående steg såg du att den dechiffrerade XML har hexadecimala tal istället för strängar. Dessa nummer är hänvisningar till strängar i en fil som heter resources.arsc, som representerar resurs tabellen för appen.
Du kan använda dump resurser
möjlighet till aapt
för att visa resurs tabellen. Här är hur:
aapt dump - värderar resurser /tmp/SoftKeyboard.apk
Från utgången av kommandot kan du bestämma de exakta värdena för strängarna som används i appen. Här är posten för ett av de hexadecimala talen i XML:
resurs 0x7f080000 com.example.android.softkeyboard: id / tangentbord: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)
Den viktigaste filen i APK är classes.dex. Det här är filen som används av Android runtime medan appen körs. Den innehåller Dalvik bytecode genererad under byggprocessen.
Genom att demontera den här filen kan du få information om de Java-klasser som används i appen. För att göra det kan du använda ett verktyg som heter dexdump. Med följande kommando kan du omdirigera produktionen av dexdump
till en fil som kan öppnas av någon textredigerare.
dexdump -d /tmp/classes.dex> /tmp/classes.dasm
Om du öppnar classes.dasm, du kommer att se att det har hundratals linjer med lågnivåkod som ser ut så här:
Det är självklart att förstå det är väldigt svårt. Tack och lov kan du ändra utmatningsformat för dexdump
till XML med hjälp av -l
alternativ. Med följande kommando kan du omdirigera dess utdata till en fil som du kan öppna i en webbläsare.
dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml
Mängden information som finns i XML-formatet är mindre, men det ger dig en rättvisande bild om de Java-klasser, metoder och fält som finns i appen.
I denna handledning lärde du dig hur en APK skapas och vad den innehåller. Du lärde dig också använda verktygen i Android SDK för att dechiffrera innehållet i APK-filer. Det finns inte mycket dokumentation om dessa verktyg, men eftersom de är öppna källor kan du försöka läsa deras omfattande kommenterade källkod för att lära sig mer om dem.
Om du letar efter något lättare att arbeta med kan du försöka använda populära verktyg från tredje part som dex2jar, vilket genererar mer läsbar demonterad kod, eller JADX, en dekompiler som kan generera Java-kod.