“APK” – il formato dei file applicativi Android”
Da Milano – Android sta rapidamente scalando posizioni in termini di popolarità. Le applicazioni per il Googlefonino si stanno moltiplicando in modo esponenziale: a fianco della fonte ufficiale (Android Market) in rapida espansione, fioriscono anche altri siti. In questo articolo cercheremo di svelare la struttura di queste applicazioni.
Creare un’applicazione APK
Per evitare problemi di copyright, il modo migliore di comprendere il formato APK è quello di crearci una nostra App, da dissezionare in libertà.
Entriamo in eclipse e creiamo un nuovo progetto Android. Chiamiamolo “it.genoma.tutor.helloworld” (Project Name e Package Name: meglio se uguali; il resto a vostra scelta). Accettiamo tutti i valori di default e proseguiamo fino ad ottenere la nostra applicazione di esempio. I ragazzi di Android hanno fatto un eccellente lavoro nel mascherare la complessità e permetterci di avere un’ applicazione pronta in un paio di click. A questo punto facciamo il nostro primo “build”.
Bottone destro del mouse sul titolo del progetto → Android Tools → Export unsigned application package (figura 1).
Notate che per gli scopi del nostro articolo, non ci occupiamo della firma e pubblicazione ufficiale.
Ci apparirà un dialog box per scegliere dove salvare la nostra applicazione.
Se tutto è andato a buon fine, ci comparirà un messaggio tipo quello in figura 2.
Struttura di un progetto Android
Per comprendere il formato delle applicazioni, riassumiamo brevemente la struttura di un progetto Android. Per fare questo facciamo riferimento alla figura 3. Senza entrare in troppi dettagli, è importante notare un punto utile per il proseguo: si tratta di una struttura ad albero, con sorgenti, librerie e risorse in rami separati della struttura. Queste ultime sono in generale file di tipo immagine e XML, mentre le librerie Java usano il noto formato “jar”.
Come riconoscere un’ Applicazione Android?
Già da questi primi passi, possiamo dire che un’applicazione Android è un singolo file con estensione APK.
Non si sa bene quale sia l’origine dell’acronimo APK, ma probabilmente sta per “Android PacKage”. Nel sito di Google ci dicono che un’applicazione Android può avere un nome qualunque (grazie per avercelo detto 🙂 , ma che l’estensione APK è mandatoria. In altri termini, non basta che il contenuto sia corretto: se l’estensione non è giusta, l’applicazione non verrà riconosciuta come tale.
A questo punto, a noi che cerchiamo sempre di capire le cose a fondo, c’è qualcosa che non quadra. Una rapida ricerca su internet ci confermerà che ci sono altre applicazioni (ne ho trovate almeno 4) che usano l’estensione APK per i loro file. APK è ad esempio il formato di alcuni file audio, ma anche quello delle packaged activities di Microsoft Train Simulator.
E allora? Ci deve essere qualcos’altro, magari non proprio documentato. Certamente potremmo fare una ricerca su internet, ma a noi piace scoprire le cose. E allora mettiamo in campo l’esperienza accumulata: questa ci dice che probabilmente ci deve essere dentro il file qualche tipo di tag. E noi sappiamo che questo tipo di identificatori si trova all’inizio dei file.
E allora apriamo con un qualunque editor esadecimale la nostra applicazione… Scarichiamo dal web, per confronto, anche alcuni esempi di APK pubbliche, e cerchiamo di vedere se c’è qualcosa in comune.
Ed in effetti sembra che tutte le APK inizino con la stringa esadecimale “50 4B 03 04”, che tradotta in ASCII suona “PK..”. Probabilmente ci siamo. Adesso cerchiamo conferma su Google, che puntualmente arriva.
In figura 4 possiamo vedere la schermata del nostro editor esadecimale aperto su it.genoma.tutor.helloworld. apk. Ci sono riquadrate in rosso alcune sezioni interessanti (oltre al tag di cui abbiamo appena parlato).
Struttura dell’archivio APK
Guardando le altre sezioni evidenziate in figura 4 riconosciamo alcuni dei path e dei nomi dei file della nostra struttura di progetto (figura 3). Tuttavia riconoscerne i contenuti non è ovvio, ne ce lo aspettiamo. Ma alcune considerazioni le possiamo comunque fare. Le applicazioni Android sono basate su codice Java e su file XML. Ci aspettiamo che il codice Java venga “compilato” in una qualche forma di byte-code, e che quindi non è da attendersi di riconoscere le istruzioni. Tuttavia per le risorse XML, possiamo ragionevolmente aspettarci che il loro formato nativo sia preservato (altrimenti perché usare XML?).
Questo ci fa sorgere il sospetto che il file APK sia una forma di archivio. Un salto alla documentazione di Android (glossary) ci conferma la parte ovvia (“Ogni applicazione Android è compilata e pacchettizzata in un singolo file che include il codice – files .dex – , risorse, file manifest, etc.”), ma non ci dice molto sul formato della pacchettizzazione. Siccome i guru di Google hanno deciso di basare il tutto su standard aperti, possibile mai che per la struttura delle loro applicazioni si siano inventati qualcosa di proprietario? Non suona logico. Allora proviamo ad aprirlo con Winzip. Nulla.
Ma siccome Google è nostro amico, sembra che qualcuno abbia provato un trucco molto intelligente: cambiare l’estensione dell’applicazione da “.apk” a “.zip” e vedere se lo standard è proprio quello. Il trucco funziona e Winzip apre il file senza problemi.
Se guardiamo ora figura 5 potremo riconoscere alcuni dei file della nostra struttura di progetto:
• Icone (icon.gif): le tre icone a diversa risoluzione della sezione “Res”
• Main.xml: il file di layout
• AndroidManifest.xml: il file Manifest, con le informazioni generali sul progetto
• Classes.dex: il contenitore del codice compilato, secondo la definizione vista in precedenza
• Resources.arsc: sembra un indice della sezione “Res”, più il contenuto di strings.xml
Ma mentre le icone sono utilizzabili per come sono (cioè basta estrarli dall’archivio per avere i file originali), i file XML appaiono codificati, compilati. Alcune stringhe si riconoscono, ma sono presenti numerosi caratteri di controllo.
Dove da qui?
Proprio perché alle cose abbiamo cercato di arrivare con ragionamento, a questo punto abbiamo già capito molto, e nella nostra “cassetta degli attrezzi” ci sono le basi per poter procedere oltre con le nostre gambe.
Per i più curiosi potrebbe infatti essere interessante, sorta di “cyberenigma”, il cercare, studiare, capire come sono codificati i file XML. C’è anche la possibilità di verificare cosa succede al file .apk quando si applica la firma e si esegue l’utilità zipalign menzionata al completamento del build (si veda figura 2).
Il premio di tanta fatica è la possibilità di poter imparare molto, per fare applicazioni più efficienti, veloci, portabili, e sopratutto sicure. E Google è, come al solito, nostro amico.
Link Utili
Android SDK: http://developer.android.com/sdk/index.html
Eclipse: http://www.eclipse.org