Diferencia entre revisiones de «Usuario:Juanda/android/adb»
De WikiEducator
(→Configuración del dispositivo) |
(→2º método: desde el PC) |
||
(70 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"> | ||
− | + | =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> | ||
− | = | + | <div class="slide"> |
− | + | ====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. | |
− | + | *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. |
− | + | </div> | |
− | + | <div class="slide"> | |
− | + | *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 | |
− | + | </div> | |
− | + | ||
− | * | + | |
− | + | ||
− | * | + | |
− | + | ||
− | * | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | = | + | <div class="slide"> |
− | + | ====Mac==== | |
− | + | *No hace falta hacer nada. | |
− | === | + | *Filosofia MAC: O funciona directamente o no funciona. |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | * | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | * | + | |
− | + | ||
</div> | </div> | ||
<div class="slide"> | <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"> | ||
root@juanda-PC:/etc/udev/rules.d# ls -l 51-android.rules | 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 | -rw-r--r-- 1 root root 76 feb 24 11:33 51-android.rules | ||
Línea 71: | Línea 58: | ||
SUBSYSTEM=="usb", ATTR{idVendor}=="ID_DISPOSITIVO", MODE="0666", GROUP="plugdev" | SUBSYSTEM=="usb", ATTR{idVendor}=="ID_DISPOSITIVO", MODE="0666", GROUP="plugdev" | ||
root@juanda-PC:/etc/udev/rules.d# | root@juanda-PC:/etc/udev/rules.d# | ||
+ | </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 86: | 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 102: | 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 107: | 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> | ||
− | |||
*Reiniciamos el servicio de udev: | *Reiniciamos el servicio de udev: | ||
<source lang="bash"> | <source lang="bash"> | ||
Línea 115: | 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 125: | Línea 123: | ||
emulator-5554 device | emulator-5554 device | ||
</source> | </source> | ||
− | + | </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> | ||
− | <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> | ||
+ | <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"> | ||
+ | juanda@juanda-PC:~$ adb devices | ||
+ | List of devices attached | ||
+ | 01a927828f90ccde device | ||
+ | juanda@juanda-PC:~$ | ||
+ | </source> | ||
+ | </div> | ||
+ | <div class="slide"> | ||
+ | ====Comunicación vía shell==== | ||
+ | * Mediante el comando: <code>adb shell</code> | ||
+ | *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"> | ||
+ | stty rows 60 cols 156 | ||
+ | </source> | ||
+ | </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== | ==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"> | |
− | + | ====2º método: desde el PC==== | |
+ | *Desde un equipo, '''con acceso USB''' | ||
+ | <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> | ||
+ | <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> | ||
− | = | + | <div class="slide"> |
− | * | + | *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> | ||
+ | |||
+ | <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> | ||
+ | |||
+ | <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> | ||
+ | |||
+ | <div class="slide"> | ||
+ | *Comprobamos que todo ha ido bien y ponemos todo como estaba: | ||
+ | <source lang="bash"> | ||
+ | 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 # | ||
+ | </source> | ||
+ | </div> |
Última revisión de 11:10 15 may 2013