Utilizzo ed analisi del log Android per il debug di app e per capire il funzionamento di Android
In questo post vi vorrei parlare del log Android. E’ una fonte fondamentale di informazioni circa il comportamento del sistema dietro le quite. E’ usato di frequente nel sviluppo e debug di applicazioni, nonché nella fase di testing di nuove ROM Android.
Supponendo di avere a disposizione un device Android, sia uno smartphone, tablet o un pannello per automazioni industriali, il primo passo da fare è quello di connettere il device al PC attraverso il cavo miniUSB-USB. Nel caso abbiate già installato l’Android SDK, aprite un prompt dei comandi e digitate:
adb logcat
così facendo, avrete immediatamente a disposizione il log aggretato del sistema. Un ipotetico log di un Android ICS è il seguente:
I/SensorService( 2212): 3-axis Accelerometer I/SensorService( 2212): Intersil isl29018 Ambient Light Sensor I/SensorService( 2212): Intersil isl29018 Proximity sensor I/SensorService( 2212): ADT7461 Temperature Monitor I/sysproc ( 2212): System server: starting Android runtime. I/sysproc ( 2212): System server: starting Android services. I/sysproc ( 2212): System server: entering thread pool. I/SystemServer( 2212): Entered the Android system server! D/SensorService( 2212): nuSensorService thread starting... I/SystemServer( 2212): Entropy Service I/SystemServer( 2212): Power Manager I/SystemServer( 2212): Activity Manager I/ActivityManager( 2212): Memory class: 64 F/BatteryStatsImpl( 2212): problem reading network stats F/BatteryStatsImpl( 2212): java.lang.IllegalStateException: problem parsing idx 1 F/BatteryStatsImpl( 2212): at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:300) F/BatteryStatsImpl( 2212): at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:250) F/BatteryStatsImpl( 2212): at com.android.internal.os.BatteryStatsImpl.getNetworkStatsDetailGroupedByUid(BatteryStatsImpl.java:5734)
Descrivere il log Android in dettaglio è molto difficile. Comunque sia, lo potete pensare come l’unione di diversi sistemi di flussi informativi che provengono da diversi sottosistemi Android. Sebbene vi abbia dimostrato in precedenza come visualizzare il log da linea di comando, è ugualmente possibile ricavare la stessa informazione nella prospettiva DDMS nell’IDE Eclipse.
Il Log Android che abbiamo visto fino ad ora è di fondamentale importanza nello sviluppo di applicazioni. Nel caso in cui abbiate bisogno di conoscere il log prodotto dal kernel ed dai vari moduli che vengonno caricati durante il boot del sistema, bisogna adottare un altro approccio. Per esempio, in Android ICS, aprire una shell il comando
adb shell
ed una volta connesso, digitare:
dmesg
Grazie a quest’ultimo comando, avrete a disposizione le informazioni di log a più basso livello, importanti nel caso in cui vogliate sviluppare dei vostri moduli kernel o personalizzare la ROM Android.
alarm_set_rtc: Failed to set RTC, time will be lost on reboot request_suspend_state: wakeup (3->0) at 20282039697 (1970-01-02 00:00:04.371084282 UTC) dm9000 dm9000: eth0: link down ADDRCONF(NETDEV_UP): eth0: link is not ready init: start ~~~~~~~~ dhcpcd_eth0:-h android-b729056a8fa357e eth0 acc_open acc_release mtp_open init: cannot find '/system/busybox/bin/busybox', disabling 'preinstall' init: start ~~~~~~~~ dhcpcd_eth0:-h android-b729056a8fa357e eth0 request_suspend_state: wakeup (0->0) at 45233170762 (1970-01-02 00:00:29.322215223 UTC) init: untracked pid 2273 exited
Ogni sistema è basato su un programma a basso livello (denominato bootloader) che viene eseguito non appena il device viene alimentato. Dato che non esiste un metodo diretto per visualizzare il log che può essere prodotto durante l’esecuzione di questo codice, ricavare queste informazioni implica utilizzare un altro canale, in particolare quello seriale.
Per farvi vedere come visualizzare questo log, ho utilizzato un pannello touch Android perchè ha diverse porte seriali dove viene rediretto l’outputs del bootloader.
I passi da fare sono:
- prendere un cavo seriale DB9
- connetterlo al PC (eventualmente usando un convertitore USB-Seriale) ed al pannello touch
- lanciare l’Hyperterminal (in Windows) o minicom (in Linux)
- specificare i seguenti parametri per la porta serale in Hyperterminal: 115200 8-N-1 (l’impostazione potrebbe essere specifica per questo pannello touch Android)
- Accendere il pannello Android
Ed ecco un esempio del log prodotto dal bootloader…
Hit any key to stop autoboot: 0 reading kernel.. 1073, 8192 MMC read: dev # 0, block # 1073, count 8192 ...8192 blocks read: OK completed reading RFS.. 9265, 6144 MMC read: dev # 0, block # 9265, count 6144 ...6144 blocks read: OK completed Boot with zImage get_format -------- 0 -------- Starting kernel ... Uncompressing Linux... done, booting the kernel. Initializing cgroup subsys cpu Linux version 3.0.8 (lino@lm) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #69 PREEMPT Tue Oct 22 22:10:57 CEST 2013 CPU: ARMv7 Processor [412fc082] revision 2 (ARMv7), cr=10c53c7f CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
Come al solito, commenti, suggerimenti, opinioni sono sempre ben accetti! 🙂