Programmare applicativi in C per Android

Diego Stamigni
Diego Stamigni
Programmare applicativi in C per Android

Cari lettori,

com'è andato il weekend ? Spero che ieri abbiate adempito ai vostri compiti, compilando i sorgenti di Android, perciò da questo momento darò per scontato che abbiate tutto pronto.. quindi.. let's rock!

Oggi vedremo come far girare applicativi scritti in C sul nostro Androino, in modo nativo, e in dynamic binary (no dai, non è arabo).

NOTE: Per i motivi esposti nell'articolo sui sorgenti di Android, gli utenti Windows sono penalizzati e per tanto non potranno completarla; utenti Mac e Linux, questa guida è indifferente per voi, fate tranquillamente ciò che espliciterò senza alcun timore.

Innanzitutto dobbiamo aggiungere alla variabile d'ambiente $PATH qualcosa di molto importante per cui apriamo un Terminale e, da utenti, facciamo quanto segue:

Utenti Mac/Linux

mkdir -p ~/.bin/

Attenti al passo che segue, dovete sostituire a /percorso/myandroid il percorso della cartella di compilazione dei sorgenti di Android, ad esempio il mio su Mac è: /Volumes/TestingIMG/myandroid/[..]

Utenti Mac:

echo "export PATH=$PATH:/percorso/mydroid/prebuilt/$(uname -s | tr \[A-Z\] \[a-z\])/toolchain/arm-eabi-4.2.1/bin/:/percorso/mydroid/prebuilt/$(uname -s | tr \[A-Z\] \[a-z\])/bin/:~/.bin/" >> .bash_profile

Utenti Linux:

echo "export PATH=$PATH:/percorso/mydroid/prebuilt/$(uname -s | tr \[A-Z\] \[a-z\])/toolchain/arm-eabi-4.2.1/bin/:/percorso/mydroid/prebuilt/$(uname -s | tr \[A-Z\] \[a-z\])/bin/:~/.bin/" >> .bashrc

In questo modo avremo a disposizione i binari necessari per le nostre operazioni e una cartella nascosta, .bin, nella nostra Home, nella quale inserire i nostri binari; dovreste però, prima di proseguire, per confermare le modiche, o riavviare, o fare un logout/login, scegliete voi.

Successivamente, dobbiamo scaricare uno script che facila di molto la compilazione dei nostri sorgenti C in modo dynamic:

Utenti Mac/Linux

curl -f http://plausible.org/andy/agcc -o ~/.bin/agcc && chmod +x ~/.bin/agcc

Questo script autolinkerà in modo dinamico i nostri applicativi.

Ma cosa vuol dire esattamente utilizzare le Dynamic Linked ?

Bene, per Android sono state modificate le famose libc, o per meglio dire, le API C con le quali costruiamo le nostre applicazioni, appunto, mediante il C; il problema fu che per girare sotto ARM si aveva bisogno di qualcosa di più portabile, più rapido e ottimizzato, perciò il team Google ha pensato bene a riscrivere un gruppo di API LIBC denominato Bionic (tra l'altro trovate la cartella della loro compilazione in /percorso/mydroid/platform/bionic);  compilare in static-linked invece, avrebbe creato un binario statico, che non sfrutta le Bionic, ma le standard libc, non ottimizzate per il nostro piccolo sistema embedded.

Fatto ciò, non dobbiamo fare altro che scrivere un piccolo Hello World in C e compilarlo, trasportare il binario sul dispositivo ed eseguirlo:

salvarlo con estensione .c, tipo helloworld.c e poi compilarlo

agcc helloworld.c -o helloworld

Ora lo caricheremo nella /data/ del nostro smartphone, perciò collegate il vostro Android alla USB (ricordate sempre il Debug USB) :

adb push helloworld /data/

Apriamo una shell:

adb shell
cd /data/
ls

verifichiamo la presenza del nostro helloworld, ed eseguiamolo:

./helloworld
Hello World!


Interessante vero ? Sì, lo è, ma, perchè scrivere applicativi in C ? Chiaramente non per una reverse shell, ma piuttosto per operare a più basso livello con il nostro dispositivo, magari a livello kernel (~$ -> ~#), o magari perchè ci piace smanettare, amiamo il C (tipo me) e (almeno per quanto riguarda me) sapere che c'è questa possibilità mi rende realmente felice e mi fa innamorare ancora più del piccolo Android (ma dove diavolo sei stato in tutti questi anni di Symbian ?!).

Alla prossima amici!
Diego Stamigni