Het is algemeen bekend dat Android-apps worden gedistribueerd in de vorm van Android-applicatiepakket bestanden of APK-bestanden in het kort. De meeste mensen kijken echter naar een APK als een zwarte doos en hebben geen idee hoe deze is gemaakt of wat erin zit. Zelfs de meeste app-ontwikkelaars hebben slechts een oppervlakkig begrip van de anatomie van een APK. In geïntegreerde ontwikkelomgevingen, zoals Android Studio, volstaat een enkele klik om een Android-project om te zetten in een APK.
In deze zelfstudie gaan we een Android-app ontleden. Met andere woorden, we gaan zijn APK openen en de inhoud bekijken. Omdat een APK een binair bestand is dat alleen bedoeld is om door machines te worden gelezen, introduceer ik u bovendien enkele hulpmiddelen die u kunt gebruiken om de inhoud te vertalen naar een meer menselijk leesbare vorm.
Om mee te gaan, hebt u nodig:
Veel mensen doen het uit pure nieuwsgierigheid. Anderen genieten van de mogelijkheid om rechtstreeks toegang te krijgen tot de afbeeldingen, geluiden en andere elementen van hun favoriete games of apps. Er zijn echter meer belangrijke redenen waarom je in een APK zou willen kijken.
Als u net begonnen bent met het leren ontwikkelen van Android-apps, kunt u veel leren door in APK-bestanden te kijken van populaire apps of apps die zijn gemaakt door professionals. Als u bijvoorbeeld kijkt naar de XML-lay-outbestanden van een app die er op meerdere schermformaten goed uitziet, kunt u uw eigen vaardigheden voor het maken van lay-outs verbeteren.
Apps gedownload van niet-vertrouwde bronnen bevatten mogelijk schadelijke code. Als je al een ervaren app-ontwikkelaar bent door dergelijke apps te demonteren, kun je naar hun code kijken om meer inzicht te krijgen in wat ze echt doen onder de motorkap.
Je kunt niet veel leren van een APK zonder een basiskennis te hebben van hoe deze is gemaakt. In feite zijn de belangrijkste hulpmiddelen die worden gebruikt om een APK te ontleden ook de hulpmiddelen die worden gebruikt om er een te maken.
Android-projecten bestaan voornamelijk uit Java-broncode, XML-lay-outs, XML-metadata en items, zoals afbeeldingen, video's en geluiden. Voordat het Android-besturingssysteem al deze bestanden kan gebruiken, moeten deze worden geconverteerd naar een vorm die het begrijpt. Deze conversie omvat veel tussentijdse taken, die meestal het Android-buildproces worden genoemd. De uiteindelijke uitvoer van het bouwproces is een APK of Android-applicatiepakket.
In Android Studio-projecten verwerkt de Android-plug-in voor Gradle alle intermediaire taken van het bouwproces.
Een van de eerste belangrijke taken is het genereren van een bestand met de naam R.java. Dit is het bestand waarmee ontwikkelaars eenvoudig toegang kunnen krijgen tot de lay-out en tekenbare bronnen van het project in hun Java-code met behulp van numerieke constanten. Om het bestand te genereren, een tool genaamd aapt, wat een tekort is Android Asset Packaging Tool, is gebruikt. De tool converteert ook alle XML-bronnen samen met het manifestbestand van het project naar een binair formaat.
Alle Java-bestanden, inclusief R.java, worden vervolgens geconverteerd naar klassebestanden met behulp van de Java-compiler. Zoals u wellicht al weet, bestaan klassenbestanden uit bytecode, die kunnen worden geïnterpreteerd door een Java runtime-engine. Android gebruikt echter een speciaal type runtime, Android-runtime (ART), dat is geoptimaliseerd voor mobiele apparaten. Daarom, als alle klassenbestanden zijn gegenereerd, wordt een tool genoemd dx wordt gebruikt om de bytecode te vertalen naar Dalvik bytecode, een formaat dat ART begrijpt.
Nadat de bronnen en Java-bestanden zijn verwerkt, worden ze in een archiefbestand geplaatst dat sterk lijkt op een JAR-bestand. Het archiefbestand wordt vervolgens ondertekend met een privésleutel die bij de app-ontwikkelaar hoort. Deze twee bewerkingen worden uitgevoerd door de Gradle-plug-in zonder externe hulpmiddelen te gebruiken. De sleutel van de ontwikkelaar wordt echter verkregen uit een sleutelarchief dat wordt beheerd door keytool.
Ten slotte worden een paar optimalisaties doorgevoerd in het archiefbestand met behulp van de zipalign tool om ervoor te zorgen dat het geheugen dat de app verbruikt tijdens het hardlopen tot een minimum wordt beperkt. Op dit punt is het archiefbestand een geldige APK, die kan worden gebruikt door het Android-besturingssysteem.
Nu u begrijpt hoe APK-bestanden worden gemaakt en gebruikt, laten we er een openen en de inhoud ervan bekijken. In deze zelfstudie gebruiken we de APK van een app genaamd Voorbeeld van een zacht toetsenbord, die vooraf is geïnstalleerd op de Android-emulator. Als u echter liever een fysiek apparaat gebruikt, kunt u net zo gemakkelijk de APK gebruiken van elke app die u erop hebt geïnstalleerd.
Als u de inhoud van de APK wilt bekijken, moet u deze eerst van de emulator naar uw computer overbrengen. Voordat u dit doet, moet u de pakketnaam en het absolute pad van de APK weten. Gebruik adb
om een shell-sessie op uw emulator te openen.
adb shell
Zodra u de shell-prompt ziet, gebruikt u de pm lijst
commando om de pakketnamen van alle geïnstalleerde apps weer te geven.
pm lijstpakketten
De pakketnaam van de app waarin we geïnteresseerd zijn, is com.example.android.softkeyboard. Je zou het in de lijst moeten kunnen zien. Door de pakketnaam door te geven aan de pm pad
opdracht, kunt u het absolute pad van de APK bepalen.
pm path com.example.android.softkeyboard
De uitvoer van de bovenstaande opdracht ziet er als volgt uit:
pakket: /data/app/SoftKeyboard/SoftKeyboard.apk
Nu u het pad kent, kunt u de shell verlaten en de APK naar uw computer overbrengen met behulp van de adb pull
commando. De onderstaande opdracht draagt het over naar uw computer / tmp directory:
adb pull /data/app/SoftKeyboard/SoftKeyboard.apk / tmp
Eerder in deze zelfstudie hoorde u dat een APK niets anders is dan een gecomprimeerd archiefbestand. Dit betekent dat u de standaardarchiefbeheerder van uw besturingssysteem kunt gebruiken om de inhoud ervan te extraheren. Als u Windows gebruikt, moet u mogelijk eerst de extensie van het bestand wijzigen .apk naar .ritssluiting. Nadat u de inhoud van de APK hebt uitgepakt, moet u de bestanden in de APK kunnen zien.
Als u een app-ontwikkelaar bent, moeten veel van de bestanden in de APK er bekend uitzien. Afgezien van de afbeeldingen in de res map, de bestanden zijn in een indeling waar u niet mee kunt werken zonder de hulp van een paar hulpmiddelen.
De Android SDK bevat alle hulpmiddelen die u nodig hebt om de inhoud van een APK te analyseren. Dat heb je eerder geleerd aapt
wordt gebruikt om XML-bronnen te verpakken tijdens het bouwproces. Het kan ook worden gebruikt om veel informatie van een APK te lezen.
U kunt bijvoorbeeld de dump xmltree
optie om de inhoud van elk binair XML-bestand in de APK te lezen. U kunt als volgt een lay-outbestand lezen res / lay-out / input.xml:
aapt dump xmltree /tmp/SoftKeyboard.apk res / layout / input.xml
De uitvoer zou er ongeveer zo uit moeten zien:
N: android = http: //schemas.android.com/apk/res/android E: com.example.android.softkeyboard.LatinKeyboardView (line = 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
Het is geen XML, maar dankzij de inspringing en labels zoals N voor naamruimte, E voor element, en EEN voor attribuut zou je het moeten kunnen lezen.
In de vorige stap zag je dat de ontcijferde XML hexadecimale getallen heeft in plaats van strings. Die getallen zijn verwijzingen naar tekenreeksen in een genoemd bestand resources.arsc, die de resourcetabel van de app vertegenwoordigt.
U kunt de bronnen dumpen
optie van aapt
om de resourcetabel te bekijken. Hier is hoe:
aapt dump - waarden resources /tmp/SoftKeyboard.apk
Uit de uitvoer van de opdracht kunt u de exacte waarden bepalen van de strings die in de app worden gebruikt. Hier is de invoer voor een van de hexadecimale getallen in de XML:
bron 0x7f080000 com.example.android.softkeyboard: id / toetsenbord: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)
Het belangrijkste bestand in de APK is classes.dex. Dit is het bestand dat wordt gebruikt door de Android-runtime tijdens het uitvoeren van de app. Het bevat de Dalvik bytecode gegenereerd tijdens het bouwproces.
Door dit bestand uit elkaar te halen, kunt u informatie krijgen over de Java-klassen die in de app worden gebruikt. Om dit te doen, kunt u een tool gebruiken genaamd dexdump. Met de volgende opdracht kunt u de uitvoer van omleiden dexdump
naar een bestand dat kan worden geopend door een teksteditor.
dexdump -d /tmp/classes.dex> /tmp/classes.dasm
Als je opent classes.dasm, je zult zien dat het honderden regels low-level code heeft die er zo uitziet:
Onnodig te zeggen dat het heel moeilijk is om het te begrijpen. Gelukkig kunt u het uitvoerformaat van wijzigen dexdump
naar XML met behulp van de -l
keuze. Met de volgende opdracht kunt u de uitvoer omleiden naar een bestand dat u in een browser kunt openen.
dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml
De hoeveelheid informatie die beschikbaar is in het XML-formaat is minder, maar het geeft u een goed idee van de Java-klassen, -methoden en -velden in de app.
In deze zelfstudie hebt u geleerd hoe een APK is gemaakt en wat deze bevat. Je hebt ook geleerd hoe je de tools die beschikbaar zijn in de Android SDK kunt gebruiken om de inhoud van APK-bestanden te ontcijferen. Er is niet veel documentatie over deze tools, maar omdat ze open source zijn, kun je hun uitgebreide broncode gebruiken om meer over ze te weten te komen.
Als u op zoek bent naar iets dat eenvoudiger is om mee te werken, kunt u proberen populaire third-party tools te gebruiken, zoals dex2jar, die meer leesbare gedemonteerde code genereert, of JADX, een decompiler die Java-code kan genereren.