È risaputo che le app Android sono distribuite sotto forma di Pacchetto applicazioni Android file o file APK in breve. Tuttavia, la maggior parte delle persone guarda un APK come una scatola nera e non ha idea di come sia stato creato o cosa ci sia dentro. Anche la maggior parte degli sviluppatori di app ha solo una comprensione superficiale dell'anatomia di un APK. In ambienti di sviluppo integrati, come Android Studio, basta un solo clic per trasformare un progetto Android in un APK.
In questo tutorial, andremo a sezionare un'app per Android. In altre parole, apriremo il suo APK e daremo un'occhiata ai suoi contenuti. Inoltre, poiché un APK è un file binario che deve essere letto solo da macchine, ho anche intenzione di presentarti alcuni strumenti che puoi utilizzare per tradurre i suoi contenuti in una forma più leggibile.
Per seguire, è necessario:
Molte persone lo fanno per pura curiosità. Altri godono della possibilità di accedere direttamente alle immagini, ai suoni e ad altre risorse dei loro giochi o app preferiti. Ci sono, tuttavia, ragioni più importanti per cui vorresti guardare all'interno di un APK.
Se hai appena iniziato a studiare lo sviluppo di app per Android, puoi imparare molto guardando all'interno dei file APK di app o app popolari create da professionisti. Ad esempio, esaminando i file di layout XML di un'app che ha un bell'aspetto su più dimensioni dello schermo, è possibile migliorare le proprie capacità di creazione del layout.
Le app scaricate da fonti non attendibili potrebbero contenere codice dannoso. Se sei già un abile sviluppatore di app, smontando tali app, puoi guardare il loro codice per capire meglio cosa stanno facendo veramente sotto la cappa.
Non c'è molto da imparare da un APK senza una conoscenza di base di come viene creato. In effetti, gli strumenti più importanti utilizzati per sezionare un APK sono anche gli strumenti utilizzati per crearne uno.
I progetti Android sono composti principalmente da codice sorgente Java, layout XML, metadati XML e risorse, come immagini, video e suoni. Prima che il sistema operativo Android possa utilizzare tutti questi file, è necessario convertirli in un formato che comprende. Questa conversione implica un sacco di attività intermedie, che sono solitamente indicate come il processo di build di Android. L'output finale del processo di compilazione è un APK o Pacchetto applicazioni Android.
Nei progetti Android Studio, l'Android Plugin per Gradle gestisce tutte le attività intermedie del processo di compilazione.
Uno dei primi compiti importanti è la generazione di un file chiamato R.java. Questo è il file che consente agli sviluppatori di accedere facilmente al layout del progetto e alle risorse disegnabili nel loro codice Java utilizzando costanti numeriche. Per generare il file, è stato chiamato uno strumento aapt, che è l'abbreviazione di Strumento di pacchettizzazione delle risorse Android, viene usato. Lo strumento converte anche tutte le risorse XML, insieme al file manifest del progetto, in un formato binario.
Tutti i file Java, inclusi R.java, vengono quindi convertiti in file di classe utilizzando il compilatore Java. Come forse già sapete, i file di classe sono costituiti da bytecode, che può essere interpretato da un motore di runtime Java. Tuttavia, Android utilizza uno speciale tipo di runtime chiamato Android runtime (ART), che è ottimizzato per i dispositivi mobili. Pertanto, una volta generati tutti i file di classe, viene chiamato uno strumento dx è usato per tradurre il bytecode in bytecode Dalvik, un formato che ART comprende.
Una volta che le risorse e i file Java sono stati elaborati, vengono inseriti in un file di archivio che è molto simile a un file JAR. Il file di archivio viene quindi firmato, utilizzando una chiave privata che appartiene allo sviluppatore dell'app. Queste due operazioni sono eseguite dal plugin Gradle senza l'uso di strumenti esterni. La chiave dello sviluppatore, tuttavia, è ottenuta da un keystore gestito da keytool.
Infine, vengono apportate alcune ottimizzazioni al file di archivio mediante il comando Zipalign strumento per assicurarsi che la memoria che l'app consuma durante l'esecuzione sia ridotta al minimo. A questo punto, il file di archivio è un APK valido, che può essere utilizzato dal sistema operativo Android.
Ora che capisci come vengono creati e usati i file APK, apriamone uno e dai un'occhiata ai suoi contenuti. In questo tutorial, utilizziamo l'APK di un'app chiamata Esempio di tastiera soft, che viene preinstallato sull'emulatore Android. Tuttavia, se si preferisce utilizzare un dispositivo fisico, è altrettanto facile utilizzare l'APK di qualsiasi app installata su di esso.
Per esaminare il contenuto dell'APK, devi prima trasferirlo dall'emulatore al tuo computer. Prima di farlo, è necessario conoscere il nome del pacchetto e il percorso assoluto dell'APK. Uso adb
per aprire una sessione di shell sul tuo emulatore.
Adb shell
Una volta visualizzato il prompt della shell, utilizzare lista dei pm
comando per elencare i nomi dei pacchetti di tutte le app installate.
pm elenca i pacchetti
Il nome del pacchetto dell'app a cui siamo interessati è com.example.android.softkeyboard. Dovresti essere in grado di vederlo nella lista. Passando il nome del pacchetto al percorso pm
comando, puoi determinare il percorso assoluto dell'APK.
pm percorso com.example.android.softkeyboard
L'output del comando precedente è simile al seguente:
Pacchetto: /data/app/SoftKeyboard/SoftKeyboard.apk
Ora che conosci il suo percorso, puoi uscire dalla shell e trasferire l'APK sul tuo computer usando il adb pull
comando. Il comando qui sotto lo trasferisce al tuo computer / tmp directory:
adb pull /data/app/SoftKeyboard/SoftKeyboard.apk / tmp
In precedenza in questo tutorial, hai appreso che un APK non è altro che un file di archivio compresso. Ciò significa che è possibile utilizzare il gestore di archivi predefinito del sistema operativo per estrarne il contenuto. Se stai usando Windows, potresti prima dover cambiare l'estensione del file da .apk a .cerniera lampo. Dopo aver estratto il contenuto dell'APK, dovresti essere in grado di vedere i file all'interno dell'APK.
Se sei uno sviluppatore di app, molti file nell'APK dovrebbero apparire familiari. Tuttavia, a parte le immagini nel res cartella, i file sono in un formato con cui non si può lavorare senza l'aiuto di alcuni strumenti.
L'SDK di Android include tutti gli strumenti necessari per analizzare i contenuti di un APK. L'hai imparato prima aapt
è usato per impacchettare le risorse XML durante il processo di compilazione. Può anche essere usato per leggere molte informazioni da un APK.
Ad esempio, puoi usare il suo scarica xmltree
opzione per leggere il contenuto di qualsiasi file XML binario nell'APK. Ecco come puoi leggere un file di layout chiamato res / layout / input.xml:
aapt dump xmltree /tmp/SoftKeyboard.apk res / layout / input.xml
L'output dovrebbe essere simile a questo:
N: android = http: //schemas.android.com/apk/res/android E: com.example.android.softkeyboard.LatinKeyboardView (riga = 21) A: android: id (0x010100d0) = @ 0x7f080000 A: android: layout_width (0x010100f4) = (tipo 0x10) 0xffffffff A: android: layout_height (0x010100f5) = (tipo 0x10) 0xfffffffe A: android: layout_alignParentBottom (0x0101018e) = (tipo 0x12) 0xffffffff
Non è XML, ma, grazie all'indentazione e alle etichette come N per namespace, E per elemento, e UN per l'attributo, dovresti essere in grado di leggerlo.
Nel passaggio precedente, hai visto che l'XML decifrato ha numeri esadecimali invece di stringhe. Questi numeri sono riferimenti a stringhe in un file chiamato resources.arsc, che rappresenta la tabella delle risorse dell'app.
Puoi usare il scaricare le risorse
opzione di aapt
per visualizzare la tabella delle risorse. Ecco come:
aapt dump --valori risorse /tmp/SoftKeyboard.apk
Dall'output del comando, è possibile determinare i valori esatti delle stringhe utilizzate nell'app. Ecco la voce per uno dei numeri esadecimali nell'XML:
risorsa 0x7f080000 com.example.android.softkeyboard: id / tastiera: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)
Il file più importante nell'APK è classes.dex. Questo è il file utilizzato dal runtime Android durante l'esecuzione dell'app. Contiene il bytecode Dalvik generato durante il processo di compilazione.
Disassemblando questo file, è possibile ottenere informazioni sulle classi Java utilizzate nell'app. Per fare ciò, è possibile utilizzare uno strumento chiamato dexdump. Con il seguente comando, è possibile reindirizzare l'output di dexdump
in un file che può essere aperto da qualsiasi editor di testo.
dexdump -d /tmp/classes.dex> /tmp/classes.dasm
Se apri classes.dasm, vedrai che ha centinaia di righe di codice di basso livello che assomiglia a questo:
Inutile dire che comprenderlo è molto difficile. Per fortuna, puoi cambiare il formato di output di dexdump
a XML usando il -l
opzione. Con il seguente comando, è possibile reindirizzare l'output su un file che è possibile aprire in un browser.
dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml
La quantità di informazioni disponibili nel formato XML è inferiore, ma ti dà un'idea chiara delle classi, dei metodi e dei campi Java presenti nell'app.
In questo tutorial, hai appreso come viene creato un APK e cosa contiene. Hai anche imparato a utilizzare gli strumenti disponibili nell'SDK di Android per decifrare il contenuto dei file APK. Non c'è molta documentazione su questi strumenti, ma, dato che sono open source, puoi provare a leggere il loro codice sorgente ampiamente commentato per saperne di più su di loro.
Se stai cercando qualcosa di più facile da usare, puoi provare a utilizzare strumenti di terze parti come dex2jar, che genera codice smontato più leggibile o JADX, un decompilatore in grado di generare codice Java.