Introduzione al Log Android

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. eclipse ddms logcat

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

Android touch panel
with IP54 or IP40 Ingress protection

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! 🙂