Slik oppsummerer du et Android-program

Det er allment kjent at Android apps distribueres i form av Android Application Package filer eller APK-filer for kort. Men de fleste ser på en APK som en svart boks og har ingen anelse om hvordan den er opprettet eller hva som er inne i den. Selv de fleste app-utviklere har bare en overfladisk forståelse av en APKs anatomi. I integrerte utviklingsmiljøer, for eksempel Android Studio, er alt som trengs, et enkelt klikk for å forvandle et Android-prosjekt til en APK.

I denne opplæringen skal vi dissekere en Android-app. Med andre ord skal vi åpne APK og ta en titt på innholdet. I tillegg, fordi en APK er en binær fil som bare er ment å bli lest av maskiner, skal jeg også introdusere deg til noen få verktøy du kan bruke til å oversette innholdet til en mer lesbar form.

Forutsetninger

Å følge med, du trenger:

  • den nyeste versjonen av Android SDK
  • en Android-enhet eller emulator som kjører Android 4.4 eller høyere

1. Hvorfor se inne i en APK?

Mange mennesker gjør det ut av ren nysgjerrighet. Andre liker muligheten til å få direkte tilgang til bildene, lydene og andre eiendeler av deres favorittspill eller -apper. Det er imidlertid flere viktige grunner til at du vil se på en APK.

læring

Hvis du nettopp har begynt å lære Android app utvikling, er det mye du kan lære ved å se i APK-filer av populære apper eller apper laget av profesjonelle. For eksempel, ved å se på XML-layoutfilene til en app som ser bra ut på flere skjermstørrelser, kan du forbedre dine egne oppsettegenskaper.

Sikkerhet

Apper lastet ned fra usikre kilder kan inneholde skadelig kode. Hvis du allerede er en dyktig apputvikler, ved å demontere slike apper, kan du se på koden for å få bedre forståelse av hva de egentlig gjør under hetten.

2. Hvordan er en APK opprettet?

Det er ikke mye du kan lære av en APK uten en grunnleggende forståelse av hvordan den er opprettet. Faktisk er de viktigste verktøyene som brukes til å dissekere en APK, også verktøyene som brukes til å opprette en.

Android-prosjekter består primært av Java-kildekode, XML-oppsett, XML-metadata og ressurser, for eksempel bilder, videoer og lyder. Før Android-operativsystemet kan bruke alle disse filene, må de konverteres til et skjema som det forstår. Denne konverteringen innebærer mange mellomliggende oppgaver, som vanligvis kalles Android-byggeprosessen. Den endelige produksjonen av byggeprosessen er en APK eller Android Application Package.

I Android Studio-prosjekter håndterer Android Plugin for Gradle alle mellomliggende oppgaver i byggeprosessen.

En av de første viktige oppgavene er genereringen av en fil som heter R.java. Dette er filen som lar utviklere enkelt få tilgang til prosjektets layout og trekkbare ressurser i deres Java-kode ved hjelp av numeriske konstanter. For å generere filen, kalles et verktøy AAPT, som er kort for Android Asset Packaging Tool, benyttes. Verktøyet konverterer også alle XML-ressursene, sammen med prosjektets manifestfil, til et binært format.

Alle Java-filene, inkludert R.java, blir deretter konvertert til klassefiler ved hjelp av Java-kompilatoren. Som du kanskje allerede vet, består klassefiler av bytecode, som kan tolkes av en Java-runtime-motor. Imidlertid bruker Android en spesiell type runtime kalt Android runtime (ART), som er optimalisert for mobile enheter. Derfor, når alle klassefilene er generert, kalles et verktøy dx brukes til å oversette bytekoden til Dalvik bytecode, et format som ART forstår.

Når ressursene og Java-filene er behandlet, plasseres de i en arkivfil som ligner på en JAR-fil. Arkivfilen blir da signert, ved hjelp av en privat nøkkel som tilhører apputvikleren. Disse to operasjonene utføres av Gradle-plugin uten bruk av eksterne verktøy. Utviklerens nøkkel er imidlertid hentet fra et nøkkelhus administrert av keytool.

Endelig gjøres noen optimaliseringer til arkivfilen ved hjelp av zipalign verktøy for å sikre at minnet appen forbruker mens du kjører, holdes til et minimum. På dette tidspunktet er arkivfilen en gyldig APK, som kan brukes av Android-operativsystemet.

3. Analysere innholdet i en APK

Nå som du forstår hvordan APK-filer blir opprettet og brukt, la oss åpne en og se på innholdet. I denne opplæringen bruker vi APK til en app som heter Sample Soft Keyboard, som kommer forhåndsinstallert på Android-emulatoren. Men hvis du foretrekker å bruke en fysisk enhet, kan du like enkelt bruke APK til en app du har installert på den.

Trinn 1: Overføre APK til en datamaskin

For å undersøke innholdet i APK må du først overføre det fra emulatoren til datamaskinen. Før du gjør det, må du vite pakkenavnet og den absolutte banen til APK. Bruk ADB å åpne en shell-sesjon på emulatoren din.

adb shell

Når du ser shellprompten, bruker du pm liste kommandoen for å oppgi pakkenavnene for alle installerte appene.

pm listepakker

Pakkenavnet til appen vi er interessert i er com.example.android.softkeyboard. Du bør kunne se den på listen. Ved å sende pakkenavnet til pm sti kommando, kan du bestemme den absolutte banen til APK.

pm sti com.example.android.softkeyboard

Utgangen av kommandoen ovenfor ser slik ut:

pakke: /data/app/SoftKeyboard/SoftKeyboard.apk

Nå som du kjenner banen, kan du gå ut av skallet og overføre APK til datamaskinen din ved hjelp av adb pull kommando. Kommandoen nedenfor overfører den til datamaskinens / tmp katalogen:

adb pull /data/app/SoftKeyboard/SoftKeyboard.apk / tmp

Trinn 2: Utdrag av innholdet i APK

Tidligere i denne opplæringen lærte du at en APK er ingenting annet enn en komprimert arkivfil. Dette betyr at du kan bruke operativsystemets standardarkivleder til å trekke ut innholdet. Hvis du bruker Windows, må du kanskje først endre filens utvidelse fra .apk til .glidelås. Etter å ha hentet innholdet i APK, bør du kunne se filene i APK.

Hvis du er en apputvikler, bør mange av filene i APK se kjent ut. Men bortsett fra bildene i res mappen, filene er i et format du ikke kan jobbe med uten hjelp av noen få verktøy.

Trinn 3: Dekryptere binære XML-filer

Android SDK inneholder alle verktøyene du trenger for å analysere innholdet i en APK. Du lærte tidligere det AAPT brukes til å pakke XML-ressurser under byggeprosessen. Det kan også brukes til å lese mye informasjon fra en APK.

For eksempel kan du bruke det dump xmltree alternativ til å lese innholdet i en binær XML-fil i APK. Slik kan du lese en layoutfil som heter res / layout / input.xml:

aapt dump xmltree /tmp/SoftKeyboard.apk res / layout / input.xml

Utgangen skal se slik ut:

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) = (type 0x10) 0xffffffff A: android: layout_height (0x010100f5) = (type 0x10) 0xfffffffe A: android: layout_alignParentBottom (0x0101018e) = (type 0x12) 0xffffffff

Det er ikke XML, men takket være innrykk og etiketter som N for navneområde, E for element, og EN for attributt, bør du kunne lese det.

Trinn 4: Dekryptere Strings

I det forrige trinnet så du at den dechifrede XML har heksadesimale tall i stedet for strenger. Disse tallene er referanser til strenger i en fil som heter resources.arsc, som representerer ressurstabellen til appen.

Du kan bruke dump ressurser mulighet for AAPT for å vise ressurs tabellen. Dette er hvordan:

aapt dump - verdier ressurser /tmp/SoftKeyboard.apk

Fra utgangen av kommandoen kan du bestemme de nøyaktige verdiene for strengene som brukes i appen. Her er oppføringen for et av de heksadesimale tallene i XML:

ressurs 0x7f080000 com.example.android.softkeyboard: id / tastatur: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)

Trinn 5: Demontering av Dalvik Bytecode

Den viktigste filen i APK er classes.dex. Dette er filen som brukes av Android-kjøretiden mens du kjører programmet. Den inneholder Dalvik bytecode generert under byggeprosessen.

Ved å demontere denne filen kan du få informasjon om Java-klassene som brukes i appen. For å gjøre det kan du bruke et verktøy som heter dexdump. Med følgende kommando kan du omdirigere utgangen av dexdump til en fil som kan åpnes av ethvert tekstredigeringsprogram.

dexdump -d /tmp/classes.dex> /tmp/classes.dasm

Hvis du åpner classes.dasm, du kommer til å se at den har hundrevis av linjer med lavnivåkode som ser slik ut:

Det er unødvendig å forstå at det er veldig vanskelig å forstå det. Heldigvis kan du endre utdataformatet til dexdump til XML ved hjelp av -l alternativ. Med følgende kommando kan du omdirigere utdataene til en fil som du kan åpne i en nettleser.

dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml

Mengden informasjon tilgjengelig i XML-formatet er mindre, men det gir deg en god ide om Java-klassene, metodene og feltene som er tilstede i appen.

Konklusjon

I denne opplæringen lærte du hvordan en APK er opprettet og hva den inneholder. Du lærte også hvordan du bruker verktøyene som er tilgjengelige i Android SDK, for å dechifisere innholdet i APK-filer. Det er ikke mye dokumentasjon om disse verktøyene, men siden de er åpen kildekode, kan du prøve å lese deres omfattende kommentert kildekode for å lære mer om dem.

Hvis du leter etter noe enklere å jobbe med, kan du prøve å bruke populære tredjepartsverktøy som dex2jar, som genererer mer lesbar demontert kode, eller JADX, en dekompiler som kan generere Java-kode.