Diferencia entre revisiones de «Usuario:Juanda/android/adb»

De WikiEducator
Saltar a: navegación, buscar
(2º método: desde el PC)
 
(63 revisiones intermedias por el mismo usuario no mostrado)
Línea 3: Línea 3:
 
<div class="slides layout-regular template-default">
 
<div class="slides layout-regular template-default">
 
<div class="slide">
 
<div class="slide">
Habilitar el modo de depuración por USB:  Esta opción es una casilla que debéis marcar en "Ajustes->Aplicaciones->Depuración USB". A partir de ahora deberíamos acostumbrar-nos a tener siempre esta casilla marcada, ya que en caso de problemas con esta modalidad funcionando podremos conectarnos al aparato mediante el programa ADB para intentar salvar el dispositivo.
+
=Herramienta adb=
 +
</div>
 +
<div class="slide">
 +
==== ¿Qué es ADB? ====
 +
*[[wikipedia:Android_Debug_Bridge|ADB]] son las siglas de Android Debug Bridge
 +
*Es una herramienta de desarrollo [http://developer.android.com/tools/help/adb.html incluida en el SDK de Android].
 +
*Comunica el dispositivo Android o el emulador con el ordenador.
 +
*Sirve para instalar aplicaciones, ver ficheros de log, hacer push o pull de ficheros...
 +
</div>
 +
<div class="slide">
 +
====Cómo usar ADB====
 +
*Debemos instalar el SDK de Android o el [http://developer.android.com/sdk/index.html ADT-Bundle]
 +
*Está situado en el directorio platform-tools.
 +
*Es conveniente añadirlo en la variable de entorno $PATH (fichero $HOME/.bashrc en Linux):
 +
<source lang="bash">
 +
juanda@juanda-PC:~$ echo $PATH
 +
/usr/local/bin:/usr/bin:/bin:/usr/games:/home/juanda/Android/sdk/tools:/home/juanda/Android/sdk/platform-tools
 +
</source>
 +
*No es necesario ser root para utilizarlo
 +
*Normalmente se utiliza vía USB pero también puede hacerse vía wifi.
 +
</div>
 +
<div class="slide">
 +
==Configuración previa para usar adb==
 
</div>
 
</div>
  
== What is adb? ==
 
 
[[wikipedia:Android_Debug_Bridge|ADB]] ("<code>adb</code>"), or the Android Debug Bridge, is a development tool included with the [[sdk|Android SDK]] (Software Developer Kit), which allows for communication from an Android device (such as a phone or tablet) to a personal computer, and vice-versa.  This communication can be made over a wifi connection.  However more commonly, it is made via a USB cable.  <code>adb</code> can also be used by developers for communicating from a computer to a virtual android machine that is also running on the computer.
 
 
<code>adb</code> is the "Swiss-army knife" of Android development.  It provides numerous functions that can be accessed in detail via the command: <code>[[adb --help]]</code>
 
 
== Popular adb commands ==
 
 
Among the most popular among CyanogenMod include the following, which can be typed from a Terminal program on the attached computer:
 
 
* <code>adb shell</code> -- this command establishes a [[wikipedia:shell (computing)|shell]] interface for establishing a [[wikipedia:command-line interface|command-line]] session with the device.  In practical purposes, this allows a person to type "into" their devices, much as one would use a terminal program a Linux or Mac OS X.  Individual shell commands can be sent to the device by typing <code>adb shell <command_to_be_executed_on_the_device></code>
 
 
* <code>adb push <local> <remote></code> -- this command pushes a local file on the computer to a remote file on the device.  You can include the full path to either the local or remote file.
 
 
* <code>adb pull <remote> [<local>]</code> -- this command will pull a remote file on the device (you can include the path) to either a specified location on the computer or, if no destination is specified, to the current directory where the command was issued.
 
 
* <code>adb logcat</code> -- this command allows you to view the device log in real time.  It is also very [[Doc:_debugging_with_logcat|useful for discovering and reporting bugs]].
 
 
* <code>adb install <file></code> -- this is used to "[[Basic_concepts#"side-loading"|side-load]]" apps (in their .apk format) to the device.
 
 
There are many more useful commands.  Check out the full instruction list [[adb --help|here]].
 
 
== Downloading and installing <code>adb</code> ==
 
 
Although <code>adb</code> can be downloaded as a simple binary, perhaps the best way to get adb is to install the [[sdk|Android SDK]] directly from Google.  That will ensure that, as <code>adb</code> is updated with the rest of the SDK, you can always have the latest version.  <code>adb</code> will be located in the <code>/platform-tools</code> directory inside the SDK directory.
 
 
==New behavior as of Android 4.2.2==
 
 
In Android 4.2.2, Google implemented some new security features for using <code>adb</code>. This requires you accept the shell session prompt from within your ROM once past whatever unlock mechanism you use for the lock screen. In order to access your device via <code>adb</code> within a booted ROM, you '''MUST''' download the latest [[sdk|Android SDK]] and '''kill''' any existing <code>adb</code> daemon sessions to proceed. Once you receive the prompt on your device, you may check the 'trust this computer' box to not be prompted again when connecting your device to that specific PC.
 
 
== Troubleshooting <code>adb</code> ==
 
 
{{Paths}}
 
 
=== "Device not found" errors ===
 
 
Sometimes adb can't find your device.  One solution is to run <code>adb kill-server</code> and then <code>adb start-server</code> as root or Administrator to restart the adb daemon with elevated privileges.
 
 
Also, you should make sure that the '''USB debugging''' or '''Android Debug Bridge''' option (this will vary depending on the version of Android) is checked in the '''Settings''' under '''Developer Options'''.
 
 
{{note|note=Some devices require a file at <code>.android/adb_usb.ini</code> be added to help your computer find the correct device.  For example, the "encore" device requires that this file include a line containing <code>0x2080</code>, the identification code for the device.  If you have installed adb and are unable to find the device, you may wish to inquire as to whether this may be the case for your device.}}
 
 
==Requisitos para usar adb==
 
*Si lo utilizamos para debuggear una aplicación se debe indicar en el Android Manifest añadiendo android:debuggable="true" al elemento <application>. Eclipse lo hace solo.
 
 
<div class="slide">
 
<div class="slide">
===Despliegue de aplicaciones a dispositivo físico===
+
====Windows====
:A partir de la [http://developer.android.com/tools/device.html] documentación oficial de Android.
+
*Tendremos que descargar el driver adb para el dispositivo.
:Desplegar una aplicación a un dispositivo físico es un proceso con dos partes:
+
*En la web de Android hay un [http://developer.android.com/tools/extras/oem-usb.html listado de enlaces] para la descarga de los drivers de los principales fabricantes.
====Configuración del dispositivo====
+
*Puedes encontrar un driver genérico que se encuentra en la carpeta android-sdk-windows\usb_driver del SDK Android.  
[[Archivo:Android_phone_settings.png|600px|thumb|center|(Configuración de dispositivo físico Android para despliegue de aplicaciones de desarrollo)]]
+
*Lo más probable es que tengas que utilizar el driver del fabricante.
*En Android 4 la habilitación del USB Debug está en Ajustes > Opciones de Desarrollo.
+
*A veces también hace falta otro ejecutable adb distinto al que aparece en el Android SDK.  
*'''Nota:''' A partir de '''Android 4.2''', las opciones de desarrollo no están visibles por defecto: ''"To make it available, go to Settings > About phone and tap Build number seven times. Return to the previous screen to find Developer options."''
+
 
</div>
 
</div>
 
<div class="slide">
 
<div class="slide">
====Configuración del dispositivo====
 
=====Windows=====
 
*Tendremos que descargar el driver adb para el dispositivo.
 
*En la web de Android hay un [http://developer.android.com/tools/extras/oem-usb.html listado de enlaces] para la descarga de los drivers de los principales fabricantes.
 
 
*Para los que no aparecen habrá que ir a sus webs o contactar con su servicio de soporte.  
 
*Para los que no aparecen habrá que ir a sus webs o contactar con su servicio de soporte.  
*A veces también hace falta otro ejecutable adb distinto al que aparece en el Android SDK.
 
 
*No siempre existen los drivers o funcionan como debieran ¡ojo!
 
*No siempre existen los drivers o funcionan como debieran ¡ojo!
 +
*En ocasiones para que funcione se utiliza el driver de google pero  modificando el fichero de instalación del driver: adb_usb.ini
 +
</div>
  
=====Mac=====
+
<div class="slide">
*No hace falta hacer nada. Filosofia MAC: O funciona directamente o no funciona.
+
  
 +
====Mac====
 +
*No hace falta hacer nada.
 +
*Filosofia MAC: O funciona directamente o no funciona.
 +
</div>
 +
<div class="slide">
 
=====Ubuntu=====
 
=====Ubuntu=====
 +
*Es conveniente leer la documentación sobre [https://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html udev] (gestión dinámica de dispositivos en Linux)
 
*Tendremos que añadir el fichero 51-android.rules con los permisos y texto que figura a continuación:
 
*Tendremos que añadir el fichero 51-android.rules con los permisos y texto que figura a continuación:
 
<source lang="bash">
 
<source lang="bash">
Línea 80: Línea 59:
 
root@juanda-PC:/etc/udev/rules.d#  
 
root@juanda-PC:/etc/udev/rules.d#  
 
</source>
 
</source>
 +
</div>
 +
<div class="slide">
 
*Tendremos que conocer el identificador del dispositivo (ID_DISPOSITIVO), así que conectamos el dispositivo y observamos las trazas del fichero de logs del sistema:
 
*Tendremos que conocer el identificador del dispositivo (ID_DISPOSITIVO), así que conectamos el dispositivo y observamos las trazas del fichero de logs del sistema:
 
<source lang="bash">
 
<source lang="bash">
Línea 95: Línea 76:
 
</source>
 
</source>
 
*De las trazas observamos que el dispositivo se conecta como  bus:3, device: 6
 
*De las trazas observamos que el dispositivo se conecta como  bus:3, device: 6
 +
</div>
 +
 +
<div class="slide">
 
*Ejecutamos lsusb para ver el vendor id del dispositivo, en nuestro caso 2207:0010:
 
*Ejecutamos lsusb para ver el vendor id del dispositivo, en nuestro caso 2207:0010:
 
<source lang="bash">
 
<source lang="bash">
Línea 111: Línea 95:
 
Bus 003 Device 006: ID 2207:0010   
 
Bus 003 Device 006: ID 2207:0010   
 
</source>
 
</source>
 +
</div>
 +
 +
<div class="slide">
 
*Actualizamos el fichero anterior:
 
*Actualizamos el fichero anterior:
 
<source lang="bash">
 
<source lang="bash">
Línea 116: Línea 103:
 
SUBSYSTEM=="usb", ATTR{id_vendor}=="2207", MODE="0666", GROUP="plugdev"
 
SUBSYSTEM=="usb", ATTR{id_vendor}=="2207", MODE="0666", GROUP="plugdev"
 
</source>
 
</source>
*Para comprobar si todo hay ido bien, se puede hacer desde la línea de comandos:
 
 
*Reiniciamos el servicio de udev:
 
*Reiniciamos el servicio de udev:
 
<source lang="bash">
 
<source lang="bash">
Línea 124: Línea 110:
 
juanda@juanda-PC:/etc/udev/rules.d$  
 
juanda@juanda-PC:/etc/udev/rules.d$  
 
</source>
 
</source>
 +
</div>
 +
 +
<div class="slide">
 
*Paramos y arrancamos adb (android device bridge) y comprobamos la lista de dispositivos:
 
*Paramos y arrancamos adb (android device bridge) y comprobamos la lista de dispositivos:
 
<source lang="bash">
 
<source lang="bash">
Línea 134: Línea 123:
 
emulator-5554 device
 
emulator-5554 device
 
</source>
 
</source>
*Es útil poner los comandos más habituales dentro del PATH:
+
</div>
 +
 
 +
<div class="slide">
 +
 
 +
====Configuración del dispositivo====
 +
[[Archivo:Android_phone_settings.png|600px|thumb|center|(Configuración de dispositivo físico Android para despliegue de aplicaciones de desarrollo)]]
 +
*En Android 4 la habilitación del USB Debug está en Ajustes > Opciones de Desarrollo.
 +
</div>
 +
<div class="slide">
 +
*'''Nota:''' A partir de '''Android 4.2''', las opciones de desarrollo no están visibles por defecto: ''"To make it available, go to Settings > About phone and tap Build number seven times. Return to the previous screen to find Developer options."''
 +
</div>
 +
 
 +
 
 +
<div class="slide">
 +
== Usos más frecuents de adb ==
 +
</div>
 +
 
 +
<div class="slide">
 +
====adb help====
 +
*<code>adb</code> provee numerosas funciones que se pueden ver en detalle mediante  el comando:
 +
<source lang="bash">adb help</source>
 +
*Veremos a continuación las más importantes
 +
</div>
 +
 
 +
<div class="slide">
 +
====Comprobación comunicación====
 +
* Mediante el comando: <code>adb devices</code>
 +
*Si nos sale un número de serie, es que todo está correcto:
 
<source lang="bash">
 
<source lang="bash">
juanda@juanda-PC:~$ cat .bashrc|grep -i PATH
+
juanda@juanda-PC:~$ adb devices
PATH=$PATH:$HOME/Android/sdk/tools:$HOME/Android/sdk/platform-tools
+
List of devices attached
 +
01a927828f90ccde device
 +
juanda@juanda-PC:~$  
 
</source>
 
</source>
 
====Indicar que queremos desplegarlo en el dispositivo al ejecutar la aplicación====
 
*Cuando ejecutemos la aplicación veremos una pantalla similar a la siguiente:
 
:Eclipse->Windows->Open Perspective->DDMS
 
*Aparecerán los emuladores que tengamos corriendo y los dispositivos físicos que estén enchufados a la entrada USB del PC
 
*En caso de tener un solo dispositivo disponible esta pantalla no aparecerá.
 
 
</div>
 
</div>
<div>
 
  
===Error en funcionamiento de dispositivos físicos y emuladores===
+
<div class="slide">
*El error es el siguiente:
+
====Comunicación vía shell====
:[2013-02-22 13:55:20 - adb] Unexpected exception 'Cannot run program "/home/juanda/Android/sdk/platform-tools/adb": java.io.IOException: error=2, No existe el archivo o el directorio' while attempting to get adb version from '/home/juanda/Android/sdk/platform-tools/adb'
+
* Mediante el comando: <code>adb shell</code>
*Solución, instalar los siguientes paquetes:
+
*Se pueden mandar comandos individuales de shell mediante: <code>adb shell <command_to_be_executed_on_the_device></code>
 +
*Desde Android 4.2.2 se pide autorizar el acceso a cada ordenador desde una ventana emergente el el dispositivo movil.
 +
*Si el terminal resulta pequeño podemos ejecutar el siguiente comando:  
 
<source lang="bash">
 
<source lang="bash">
sudo apt-get update
+
stty rows 60 cols 156
sudo apt-get install ia32-libs
+
 
</source>
 
</source>
 
</div>
 
</div>
  
 +
<div class="slide">
 +
====Transferencia de ficheros====
 +
* <code>adb push <local> <remote></code>
 +
: Copiamos un fichero del ordenador al movil.
 +
: Se  pueden incluir tanto el path local como el remoto.
 +
* <code>adb pull <remote> [<local>]</code>
 +
:Copiamos un fichero remoto (del movil) al PC.
 +
</div>
  
 +
<div class="slide">
 +
====Ver el fichero de log en tiempo real====
 +
* <code>adb logcat</code>
 +
* Devuelve una ingente cantidad de eventos escritos en diversos registros sobre el funcionamiento del sistema
 +
* Es útil usar algún filtro o redirigir a un fichero.
 +
</div>
  
 +
<div class="slide">
 +
====Instalación de aplicaciones====
 +
* <code>adb install <file></code>
 +
*Los ficheros (aplicaciones) deben tener extensión .apk
 +
*Es necesario tener el side-load marcado.
 +
* <code>adb install -r <file></code>: Para actualizar
 +
*adb uninstall Aplicacion.apk: Para desinstalar
 +
</div>
  
 +
<div class="slide">
 +
====Reiniciar el dispositivo====
 +
*<code>adb reboot</code>
 +
*<code>adb reboot bootloader</code>
 +
*<code>adb reboot recovery</code>
 +
</div>
  
 +
<div class="slide">
 +
==== Error "Device not found" ====
 +
*Se producen cuando adb no encuentra el dispositivo. 
 +
*Podemos reiniciar el servicio de adb:
 +
<source lang="bash">adb kill-server
 +
adb start-server</source>
 +
*Hay que asegurarse que la opción '''USB debugging''' o '''Android Debug Bridge''' desde Ajustes->Herramientas de Desarrollo (varía un poco de versión a versión).
 +
</div>
  
 +
<div class="slide">
 +
====Errores habituales====
 +
*No se reconoce el dispositivo:
 +
<source lang="bash">
 +
juanda@juanda-PC:~$ adb devices
 +
List of devices attached
 +
?????????? device
 +
</source>
 +
*False de permisos:
 +
<source lang="bash">
 +
juanda@juanda-PC:~$ adb devices
 +
List of devices attached
 +
???????????? no permissions
 +
juanda@juanda-PC:~$
 +
</source>
 +
</div>
 +
<div class="slide">
 +
*Driver incorrecto
 +
*Configuración errónea fichero udev
 +
*Reiniciar udev:
 +
<source lang="bash">
 +
juanda@juanda-PC:/etc/udev/rules.d$ sudo service udev restart
 +
udev stop/waiting
 +
udev start/running, process 9069
 +
juanda@juanda-PC:/etc/udev/rules.d$
 +
</source>
 +
*Reiniciar servicio adb:
 +
<source lang="bash">
 +
adb kill-server
 +
adb start-server
 +
</source>
 +
</div>
 +
<div class="slide">
  
 +
====Error en funcionamiento de dispositivos físicos y emuladores====
 +
*El error es el siguiente:
 +
:[2013-02-22 13:55:20 - adb] Unexpected exception 'Cannot run program "/home/juanda/Android/sdk/platform-tools/adb": java.io.IOException: error=2, No existe el archivo o el directorio' while attempting to get adb version from '/home/juanda/Android/sdk/platform-tools/adb'
 +
*Solución, instalar los siguientes paquetes:
 +
<source lang="bash">
 +
sudo apt-get update
 +
sudo apt-get install ia32-libs
 +
</source>
 +
</div>
 +
<div class="slide">
 +
==adb vía wifi==
 +
</div>
 +
<div class="slide">
 +
====Primer método: desde el terminal====
 +
*Habilitar adb desde el dispositivo movil (debemos ser root):
 +
<source lang="bash">
 +
setprop service.adb.tcp.port 5555
 +
stop adbd
 +
start adbd
 +
</source>
  
 +
*Para deshabilitarlo:
 +
<source lang="bash">
 +
setprop service.adb.tcp.port -1
 +
stop adbd
 +
start adbd
 +
</source>
 +
</div>
  
 +
<div class="slide">
  
=== Problema con libncurses.so.5 64-bit===
+
====2º método: desde el PC====
Under 64bits version of Linux Mint 14 and maybe other Debian/Ubuntu flavours <code>adb</code> shows the following error:
+
*Desde un equipo, '''con acceso USB'''
./adb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
+
<source lang="bash">
 +
adb tcpip 5555
 +
adb connect <ip>:5555
 +
</source>
 +
*El puerto no hace falta, por defecto es el 5555
 +
*Para volver a escuchar por USB:
 +
<source lang="bash">
 +
adb usb
 +
</source>
 +
</div>
 +
<div class="slide">
 +
*Primer método: hay que teclear mucho desde el movil, ¡muy pesado!
 +
*Segundo método: hace falta llevar el cable usb, ¡una lata!
 +
*Tercer método: Instalar una aplicación en el móvil: adbWireless, WiFi ADB o ADB WiFi. ¡Necesitan acceso root!
 +
</div>
 +
<div class="slide">
 +
==Eclipse y adb==
 +
</div>
 +
<div class="slide">
 +
*Si adb no está correctamente configurado desde Eclipse no funcionará.
 +
*Indicar que queremos desplegarlo en el dispositivo al ejecutar la aplicación
 +
*Cuando ejecutemos la aplicación veremos una pantalla similar a la siguiente:
 +
:Eclipse->Windows->Open Perspective->DDMS
 +
*Aparecerán los emuladores que tengamos corriendo y los dispositivos físicos que estén enchufados a la entrada USB del PC
 +
*En caso de tener un solo dispositivo disponible esta pantalla no aparecerá.
 +
</div>
 +
<div class="slide">
 +
==Ejemplos uso terminal Linux en en Android==
 +
</div>
 +
<div class="slide">
 +
====Actualización fichero /etc/hosts====
 +
*El comando para ver las interfaces del movil es netcfg (no ifconfig)
 +
*El fichero hosts se encuentra en /system/etc/hosts
 +
*Obtenemos el fichero hosts del movil para modificarlo:
 +
<source lang="bash">
 +
juanda@dpto-01:~/Android/sdk/tools$ adb pull /etc/hosts
 +
0 KB/s (25 bytes in 0.038s)
 +
juanda@dpto-01:~/Android/sdk/tools$ cat hosts
 +
127.0.0.1     localhost
 +
</source>
 +
</div>
  
You can solve it by installing '''libncurses5''' i386's version. Just type <code>apt-get install libncurses5:i386</code> as root.
+
<div class="slide">
 +
*Añado una o varias entradas en el fichero pero hay un error al hacer el push:
 +
<source lang="bash">
 +
juanda@dpto-01:~/Android/sdk/tools$ vi hosts
 +
juanda@dpto-01:~/Android/sdk/tools$ cat hosts
 +
127.0.0.1    localhost
 +
192.168.1.1  incidencias.jd  www.incidencias.jd
 +
192.168.1.1  spp.jd  www.spp.jd
 +
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
 +
failed to copy 'hosts' to '/etc/hosts': Read-only file system
 +
juanda@dpto-01:~/Android/sdk/tools$
 +
</source>
 +
</div>
  
==adb vía wifi==
+
<div class="slide">
To update ADB use SDK Manager.
+
*En muchos dispositivos la partición /system se monta como solo lectura así que hay que montarla con permisos de escritura.
 +
*A continuación todas las trazas al cambiarlo en mi sistema:
 +
<source lang="bash">
 +
juanda@dpto-01:~/Android/sdk/tools$ adb shell
 +
shell@android:/ $ su -
 +
shell@android:/ # mount -o rw,remount /system                             
 +
shell@android:/ # exit
 +
shell@android:/ $ exit
 +
juanda@dpto-01:~/
 +
</source>
 +
</div>
  
For some reason the SDK Manager does not automatically show the new release versions of Android SDK Tools and Android Platform-Tools, so if the versions of your Android SDK Tools and/or Android Platform-Tools are respectively older than 21.1 and 16.0.1, you will need to first delete them then reload the SDK Manager to get their new release versions to be displayed and available for installation.
+
<div class="slide">
 +
*La partición ya tiene permisos de lectura, hacemos el push:
 +
<source lang="bash">
 +
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
 +
failed to copy 'hosts' to '/etc/hosts': Permission denied
 +
juanda@dpto-01:~/
 +
</source>
 +
*¡Vaya! Ahora fallan los permisos....
 +
</div>
  
Also, it appears that Android Support Libraries (under Extra) is also required for ADB to work, so you should install it as well.
+
<div class="slide">
 +
*Cambiamos permisos fichero /etc/hosts para su sustitución:
 +
<source lang="bash">
 +
juanda@dpto-01:~/Android/sdk/tools$ adb shell
 +
shell@android:/ $ cd etc
 +
shell@android:/etc $ su -
 +
shell@android:/system/etc # chmod 777 hosts
 +
shell@android:/system/etc # exit
 +
shell@android:/etc $ exit
 +
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
 +
2 KB/s (103 bytes in 0.040s)
 +
juanda@dpto-01:~/Android/sdk/tools$
 +
</source>
 +
</div>
  
Also, to get ADB-over-WiFi to work, first use ADB-over-USB to the same given PC/Laptop and grant access with "always" box checked.
+
<div class="slide">
 
+
*Comprobamos que todo ha ido bien y ponemos todo como estaba:
 
+
<source lang="bash">
==Comandos habituales de Linux en Android==
+
juanda@dpto-01:~/Android/sdk/tools$ adb shell
*netcfg ->ifconfig
+
shell@android:/ $ su -
 +
shell@android:/ # cd etc
 +
shell@android:/etc # chmod 644 hosts
 +
shell@android:/etc # ls -l hosts
 +
-rw-r--r-- root    root          103 2013-04-12 13:00 hosts
 +
shell@android:/etc # mount -o ro,remount /system
 +
shell@android:/etc # cat hosts
 +
127.0.0.1    localhost
 +
192.168.1.1  incidencias.jd  www.incidencias.jd
 +
192.168.1.1  spp.jd  www.spp.jd
 +
shell@android:/etc #
 +
</source>
 +
</div>

Última revisión de 11:10 15 may 2013


¿Qué es ADB?

  • ADB son las siglas de Android Debug Bridge
  • Es una herramienta de desarrollo incluida en el SDK de Android.
  • Comunica el dispositivo Android o el emulador con el ordenador.
  • Sirve para instalar aplicaciones, ver ficheros de log, hacer push o pull de ficheros...

Cómo usar ADB

  • Debemos instalar el SDK de Android o el ADT-Bundle
  • Está situado en el directorio platform-tools.
  • Es conveniente añadirlo en la variable de entorno $PATH (fichero $HOME/.bashrc en Linux):
juanda@juanda-PC:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games:/home/juanda/Android/sdk/tools:/home/juanda/Android/sdk/platform-tools
  • No es necesario ser root para utilizarlo
  • Normalmente se utiliza vía USB pero también puede hacerse vía wifi.

Configuración previa para usar adb

Windows

  • Tendremos que descargar el driver adb para el dispositivo.
  • En la web de Android hay un listado de enlaces para la descarga de los drivers de los principales fabricantes.
  • Puedes encontrar un driver genérico que se encuentra en la carpeta android-sdk-windows\usb_driver del SDK Android.
  • Lo más probable es que tengas que utilizar el driver del fabricante.
  • A veces también hace falta otro ejecutable adb distinto al que aparece en el Android SDK.
  • Para los que no aparecen habrá que ir a sus webs o contactar con su servicio de soporte.
  • No siempre existen los drivers o funcionan como debieran ¡ojo!
  • En ocasiones para que funcione se utiliza el driver de google pero modificando el fichero de instalación del driver: adb_usb.ini

Mac

  • No hace falta hacer nada.
  • Filosofia MAC: O funciona directamente o no funciona.
Ubuntu
  • Es conveniente leer la documentación sobre udev (gestión dinámica de dispositivos en Linux)
  • Tendremos que añadir el fichero 51-android.rules con los permisos y texto que figura a continuación:
root@juanda-PC:/etc/udev/rules.d# ls -l 51-android.rules 
-rw-r--r-- 1 root root 76 feb 24 11:33 51-android.rules
root@juanda-PC:/etc/udev/rules.d# cat 51-android.rules 
SUBSYSTEM=="usb", ATTR{idVendor}=="ID_DISPOSITIVO", MODE="0666", GROUP="plugdev"
root@juanda-PC:/etc/udev/rules.d#
  • Tendremos que conocer el identificador del dispositivo (ID_DISPOSITIVO), así que conectamos el dispositivo y observamos las trazas del fichero de logs del sistema:
tail -100f /var/log/syslog
Feb 24 11:12:27 juanda-PC kernel: [ 1918.767308] usb 3-1: new high-speed USB device number 6 using xhci_hcd
Feb 24 11:12:27 juanda-PC mtp-probe: checking bus 3, device 6: "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-1"
Feb 24 11:12:27 juanda-PC kernel: [ 1918.784245] usb 3-1: ep 0x81 - rounding interval to 32768 microframes, ep desc says 0 microframes
Feb 24 11:12:27 juanda-PC kernel: [ 1918.784252] usb 3-1: ep 0x83 - rounding interval to 32768 microframes, ep desc says 0 microframes
Feb 24 11:12:27 juanda-PC kernel: [ 1918.784256] usb 3-1: ep 0x4 - rounding interval to 32768 microframes, ep desc says 0 microframes
Feb 24 11:12:27 juanda-PC kernel: [ 1918.784796] scsi11 : usb-storage 3-1:1.0
Feb 24 11:12:27 juanda-PC mtp-probe: bus: 3, device: 6 was not an MTP device
Feb 24 11:12:28 juanda-PC kernel: [ 1919.781950] scsi 11:0:0:0: Direct-Access     Linux    File-CD Gadget   0000 PQ: 0 ANSI: 2
Feb 24 11:12:28 juanda-PC kernel: [ 1919.782212] scsi 11:0:0:1: Direct-Access     Linux    File-CD Gadget   0000 PQ: 0 ANSI: 2
Feb 24 11:12:28 juanda-PC kernel: [ 1919.782607] sd 11:0:0:0: Attached scsi generic sg8 type 0
  • De las trazas observamos que el dispositivo se conecta como bus:3, device: 6
  • Ejecutamos lsusb para ver el vendor id del dispositivo, en nuestro caso 2207:0010:
juanda@juanda-PC:/etc/udev$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID 413c:2111 Dell Computer Corp. 
Bus 001 Device 004: ID 046d:c063 Logitech, Inc. DELL Laser Mouse
Bus 004 Device 002: ID 059f:104a LaCie, Ltd 
Bus 002 Device 003: ID 058f:6362 Alcor Micro Corp. Flash Card Reader/Writer
Bus 001 Device 006: ID 0cf3:e004 Atheros Communications, Inc. 
Bus 003 Device 006: ID 2207:0010
  • Actualizamos el fichero anterior:
juanda@juanda-PC:/etc/udev/rules.d$ cat 51-android.rules 
SUBSYSTEM=="usb", ATTR{id_vendor}=="2207", MODE="0666", GROUP="plugdev"
  • Reiniciamos el servicio de udev:
juanda@juanda-PC:/etc/udev/rules.d$ sudo service udev restart
udev stop/waiting
udev start/running, process 9069
juanda@juanda-PC:/etc/udev/rules.d$
  • Paramos y arrancamos adb (android device bridge) y comprobamos la lista de dispositivos:
juanda@juanda-PC:/etc/udev/rules.d$ adb kill-server
juanda@juanda-PC:/etc/udev/rules.d$ adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
juanda@juanda-PC:/etc/udev/rules.d$ adb devices
List of devices attached 
emulator-5554	device

Configuración del dispositivo

(Configuración de dispositivo físico Android para despliegue de aplicaciones de desarrollo)
  • En Android 4 la habilitación del USB Debug está en Ajustes > Opciones de Desarrollo.
  • Nota: A partir de Android 4.2, las opciones de desarrollo no están visibles por defecto: "To make it available, go to Settings > About phone and tap Build number seven times. Return to the previous screen to find Developer options."


Usos más frecuents de adb

adb help

  • adb provee numerosas funciones que se pueden ver en detalle mediante el comando:
adb help
  • Veremos a continuación las más importantes

Comprobación comunicación

  • Mediante el comando: adb devices
  • Si nos sale un número de serie, es que todo está correcto:
juanda@juanda-PC:~$ adb devices
List of devices attached 
01a927828f90ccde	device
juanda@juanda-PC:~$

Comunicación vía shell

  • Mediante el comando: adb shell
  • Se pueden mandar comandos individuales de shell mediante: adb shell <command_to_be_executed_on_the_device>
  • Desde Android 4.2.2 se pide autorizar el acceso a cada ordenador desde una ventana emergente el el dispositivo movil.
  • Si el terminal resulta pequeño podemos ejecutar el siguiente comando:
stty rows 60 cols 156

Transferencia de ficheros

  • adb push <local> <remote>
Copiamos un fichero del ordenador al movil.
Se pueden incluir tanto el path local como el remoto.
  • adb pull <remote> [<local>]
Copiamos un fichero remoto (del movil) al PC.

Ver el fichero de log en tiempo real

  • adb logcat
  • Devuelve una ingente cantidad de eventos escritos en diversos registros sobre el funcionamiento del sistema
  • Es útil usar algún filtro o redirigir a un fichero.

Instalación de aplicaciones

  • adb install <file>
  • Los ficheros (aplicaciones) deben tener extensión .apk
  • Es necesario tener el side-load marcado.
  • adb install -r <file>: Para actualizar
  • adb uninstall Aplicacion.apk: Para desinstalar

Reiniciar el dispositivo

  • adb reboot
  • adb reboot bootloader
  • adb reboot recovery

Error "Device not found"

  • Se producen cuando adb no encuentra el dispositivo.
  • Podemos reiniciar el servicio de adb:
adb kill-server 
adb start-server
  • Hay que asegurarse que la opción USB debugging o Android Debug Bridge desde Ajustes->Herramientas de Desarrollo (varía un poco de versión a versión).

Errores habituales

  • No se reconoce el dispositivo:
juanda@juanda-PC:~$ adb devices
List of devices attached 
??????????	device
  • False de permisos:
juanda@juanda-PC:~$ adb devices
List of devices attached 
????????????	no permissions
juanda@juanda-PC:~$
  • Driver incorrecto
  • Configuración errónea fichero udev
  • Reiniciar udev:
juanda@juanda-PC:/etc/udev/rules.d$ sudo service udev restart
udev stop/waiting
udev start/running, process 9069
juanda@juanda-PC:/etc/udev/rules.d$
  • Reiniciar servicio adb:
adb kill-server 
adb start-server

Error en funcionamiento de dispositivos físicos y emuladores

  • El error es el siguiente:
[2013-02-22 13:55:20 - adb] Unexpected exception 'Cannot run program "/home/juanda/Android/sdk/platform-tools/adb": java.io.IOException: error=2, No existe el archivo o el directorio' while attempting to get adb version from '/home/juanda/Android/sdk/platform-tools/adb'
  • Solución, instalar los siguientes paquetes:
sudo apt-get update
sudo apt-get install ia32-libs

adb vía wifi

Primer método: desde el terminal

  • Habilitar adb desde el dispositivo movil (debemos ser root):
setprop service.adb.tcp.port 5555
stop adbd
start adbd
  • Para deshabilitarlo:
setprop service.adb.tcp.port -1
stop adbd
start adbd

2º método: desde el PC

  • Desde un equipo, con acceso USB
adb tcpip 5555
adb connect <ip>:5555
  • El puerto no hace falta, por defecto es el 5555
  • Para volver a escuchar por USB:
adb usb
  • Primer método: hay que teclear mucho desde el movil, ¡muy pesado!
  • Segundo método: hace falta llevar el cable usb, ¡una lata!
  • Tercer método: Instalar una aplicación en el móvil: adbWireless, WiFi ADB o ADB WiFi. ¡Necesitan acceso root!

Eclipse y adb

  • Si adb no está correctamente configurado desde Eclipse no funcionará.
  • Indicar que queremos desplegarlo en el dispositivo al ejecutar la aplicación
  • Cuando ejecutemos la aplicación veremos una pantalla similar a la siguiente:
Eclipse->Windows->Open Perspective->DDMS
  • Aparecerán los emuladores que tengamos corriendo y los dispositivos físicos que estén enchufados a la entrada USB del PC
  • En caso de tener un solo dispositivo disponible esta pantalla no aparecerá.

Ejemplos uso terminal Linux en en Android

Actualización fichero /etc/hosts

  • El comando para ver las interfaces del movil es netcfg (no ifconfig)
  • El fichero hosts se encuentra en /system/etc/hosts
  • Obtenemos el fichero hosts del movil para modificarlo:
juanda@dpto-01:~/Android/sdk/tools$ adb pull /etc/hosts
0 KB/s (25 bytes in 0.038s)
juanda@dpto-01:~/Android/sdk/tools$ cat hosts
127.0.0.1		    localhost
  • Añado una o varias entradas en el fichero pero hay un error al hacer el push:
juanda@dpto-01:~/Android/sdk/tools$ vi hosts 
juanda@dpto-01:~/Android/sdk/tools$ cat hosts
127.0.0.1    localhost
192.168.1.1  incidencias.jd  www.incidencias.jd
192.168.1.1  spp.jd  www.spp.jd
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
failed to copy 'hosts' to '/etc/hosts': Read-only file system
juanda@dpto-01:~/Android/sdk/tools$
  • En muchos dispositivos la partición /system se monta como solo lectura así que hay que montarla con permisos de escritura.
  • A continuación todas las trazas al cambiarlo en mi sistema:
juanda@dpto-01:~/Android/sdk/tools$ adb shell
shell@android:/ $ su -
shell@android:/ # mount -o rw,remount /system                              
shell@android:/ # exit
shell@android:/ $ exit
juanda@dpto-01:~/
  • La partición ya tiene permisos de lectura, hacemos el push:
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
failed to copy 'hosts' to '/etc/hosts': Permission denied
juanda@dpto-01:~/
  • ¡Vaya! Ahora fallan los permisos....
  • Cambiamos permisos fichero /etc/hosts para su sustitución:
juanda@dpto-01:~/Android/sdk/tools$ adb shell
shell@android:/ $ cd etc
shell@android:/etc $ su - 
shell@android:/system/etc # chmod 777 hosts
shell@android:/system/etc # exit
shell@android:/etc $ exit
juanda@dpto-01:~/Android/sdk/tools$ adb push hosts /etc/hosts
2 KB/s (103 bytes in 0.040s)
juanda@dpto-01:~/Android/sdk/tools$
  • Comprobamos que todo ha ido bien y ponemos todo como estaba:
juanda@dpto-01:~/Android/sdk/tools$ adb shell
shell@android:/ $ su -
shell@android:/ # cd etc 
shell@android:/etc # chmod 644 hosts
shell@android:/etc # ls -l hosts
-rw-r--r-- root     root          103 2013-04-12 13:00 hosts
shell@android:/etc # mount -o ro,remount /system
shell@android:/etc # cat hosts
127.0.0.1    localhost
192.168.1.1  incidencias.jd  www.incidencias.jd
192.168.1.1  spp.jd  www.spp.jd
shell@android:/etc #