Recentemente mi sono imbattuto in un problema che mi ha fatto perdere una bella oretta per cui ho deciso di postare qui la soluzione, a beneficio di coloro che si troveranno nella stessa condizione. La situazione è la seguente: state sviluppando una applicazione Android, avete un device Android in modalità USB debug connesso alla porta USB del vostro Mac, aprite un terminale e, per controllare che tutto sia a posto prima di avviare l’applicazione in debug da Eclipse, digitate come al solito ‘adb devices‘. Vi aspettate di vedere la lista di dispositivi Android connessi ma, per quanto proviate a sconnettere e riconnettere, non succede nulla!
Il mio problema è che sviluppando su Mac OS X la cosa ha sempre funzionato in maniera talmente semplice rispetto a Windows (ed anche a Linux), che non mi ero mai posto il problema di driver proprietari dei dispositivi, nè di altri possibili cause che impedissero ad adb di “vedere” i device connessi.
Per prima cosa ho provato a cercare un po’ fra le possibili cause collegate al device che stavo utilizzando, ovvero un Galaxy Nexus, oggi il telefono da sviluppo per eccellenza. Mi son imbattuto in un po’ di post poco rassicuranti che suggerivano di utilizzare driver proprietari Samsung, o di creare a mano il mounting point per il dispositivo. Quest’ultima soluzione mi sembrava ancor meno sensata della prima perchè dmesg mostrava chiaramente i log del kernel che correttamente evidenziavano la connessione dello smartphone.
USBMSC Identifier (non-unique): SH12FRT00755 0xbb4 0xc91 0x226 USBMSC Identifier (non-unique): SH12FRT00755 0xbb4 0xc91 0x226
A questo punto ho iniziato a capire che c’era qualcosa sul mio sistema che impediva ad adb di interagire con il dispositivo e tadà mi è tornato in mente che qualche giorno fa, mentre giravo con un Acer Liquid E Donut 1.6, avevo dovuto riesumare Easy Tether per ovviare al fatto che su un Android così datato non disponevo della possibilità di usare il telefono come Access Point WIFI.
Easy Tether è un software un tempo molto utile per usare un telefono Android connesso alla rete 3G come modem condividendo la connessione con il Mac tramite USB. Ora l’utilità di questo tipo di applicazioni è molto calata perchè il sistema operativo Android permette di default di usare gli smartphone come Access Point. Ad ogni modo, su Mac OS X, Easy Tether crea una nuova interfaccia di rete in una posizione a scelta dell’utente, e nello stesso tempo crea un kext file nelle estensioni delle librerie di sistema.
Ho deciso di provare a rimuoverlo usando l’utility kextunload e dopo di rimuovere completamente il file (rm -rf) perchè il problema non si ripresentasse al boot. Se volete ancora usate Easy Tether non digitate il secondo comando perchè lo renderà inutilizzabile.
sudo kextunload /System/Library/Extensions/EasyTetherUSBEthernet.kext sudo rm -rf /System/Library/Extensions/EasyTetherUSBEthernet.kext
A questo punto è sufficiente sconnettere e riconnettere il dispositivo per vederlo apparire felice fra i device visti da adb.
dex:~ Lu$ adb devices List of devices attached 01498B0C19021010 device
La soluzione ha carattere generale e può servire come spunto a chi si trova nella stessa soluzione. Prima di fasciarvi la testa fate un bel controllo dei file .kext e magari qualcosa di possibilmente incompatibile salta fuori.
E ora continuiamo a sviluppare 🙂