Android Debug Bridge y dispositivos USB no encontrados.

Uno de los pasos mas laboriosos a la hora de establecer un entorno de trabajo con Android, es configurar un dispositivo (un teléfono, un tablet, o algo similar) en nuestro equipo de desarrollo y conseguir que ADB (Android Debug Bridge) lo reconozca para poder desplegar nuestras aplicaciones al dispositivo y depurarlas.

Normalmente el proceso suele funcionar sin demasiados contratiempos, y generalmente consiste en instalar el driver USB adecuado a nuestro dispositivo Android.

Si para nuestras pruebas utilizamos un dispositivo oficial de google (Nexus One, Nexus 7, Nexus Q, Google Nexus…), nos llegará con el driver de google que podemos descargar con el Android SDK Manager.

Descargar el driver usb de google para dispositivos nexus
Descargar el driver usb de google para dispositivos nexus

Si nuestro dispositivo es un teléfono o tablet de otra marca, por ejemplo, un Samsung Galaxy SII, tendremos que instalar los drivers oficiales de Samsung para desarroladores.

Normalmente, cada marca nos proporcionará un driver USB, que con mayor o menor fortuna, hará que nuestro dispositivo sea reconocido por ADB. Sin embargo, ¿que ocurre con aquellos dispositivos que pertenecen a marcas con la categoría de «menor fortuna»? Es decir, ¿aquellos dispositivos que tras instalar los drivers USB pertinentes, siguen sin ser reconocidos por el Android Debug Bridge?

Esto me ha ocurrido recientemente tratando de hace funcionar un dispositivo Honeywell Dolphin 7800 con Android 2.3.4. Un dispositivo industrial orientado al trabajo en fábricas y su utilización intensiva en entornos agresivos. Protegido contra caidas y golpes, humedades,  elementos agresivos, abusos del usuario, con lector de codigo de barras integrado, etc, pero con unos drivers USB que después de su instalación, seguían sin hacer que el dispositivo fuera detectado por ADB.

Honeywell Dolphin 7800 con Android 2.3.4
Honeywell Dolphin 7800 con Android 2.3.4

Tras dirigirme al servicio de soporte de la marca, y esperar en vano varios días una respuesta, la desesperación me llevó a solucionar por mi mismo el problema (google is your friend). Sin embargo me costó lo suficiente encontrar la solución como para plantearme que merece la pena escribirla aquí. Puede que el siguiente método sirva para hacer que otros dispositivos Android de difícil configuración con ADB también funcionen.

La instalación de los drivers USB en principio, funcionó correctamente, ya que el dispositivo aparecía en el administrador de dispositivos correctamente listado:

Android Phone en administrador de dispositivos (device manager)
Android Phone en administrador de dispositivos (device manager)

Pero, sin embargo, si nos vamos a la linea de comandos, observamos que ADB no ha detectado el dispositivo, aunque ejecutemos los comandos de actualización pertinentes (si te dedicas a pelear en esto de la programación en Android, lo siguiente te sonará):

Bien, a continuación de «List of devices attached», debería salir nuestro dispositivo, pero, no aparece. Tras muchas indagaciones, llegamos al siguiente método para forzar su aparición.

  1. En el administrador de dispositivos, pulsamos botón derecho sobre el nuestro (Android Composite ADB Interface), y nos vamos a Propiedades->Detalles.
  2. Aquí podremos ver una cadena de texto llamada «id. de instancia de dispositivo», también conocida como Vendor ID (VID), algo parecido a lo siguiente:
propiedades android composite adb interface
propiedades android composite adb interface

Bien, lo importante de esta pantalla, es tomar nota del VID, es decir, el valor a continuación del «VID_», que en este caso, es «0C2E«.

Una vez tengamos anotado este valor, buscamos el fichero «adb_usb.ini», que debería estar en la carpeta «C:\Documents and Settings\usuario\.android» (si no está, podemos crearlo como fichero de texto vacío). Este fichero contiene lo siguiente:

Lo que vamos a hacer es introducir nosotros manualmente el VID de nuestro dispositivo, ya que parece que el comando «android update adb» no ha sido capaz de hacerlo:

Nótese que hemos añadido un «0x» por delante, ya que va en notación hexadecimal. Guardamos el fichero, salimos a la linea de comandos, y NO ejecutamos «android update adb», ya que sino nos generará el fichero adb_usb.ini vacío de nuevo. Lo que hacemos es parar y arrancar el demonio adb con:

A continuación ejecutamos:

Y, ¡tachán!, por fin ADB reconoce nuestro dispositivo, y podremos usar Eclipse o Android Studio para depurar nuestros programas.

Enlaces relacionados:

Driver de Dolphin 7800 para ADB (enlace a la Knowledgebase de Honeywell).

D7800_Android_USB_Driver_Package_v1.2 (descarga directa del driver).

28 comentarios en “Android Debug Bridge y dispositivos USB no encontrados.”

  1. Buenas tardes. Tu post me viene de perlas porque estoy con el mismo problema. Una sola pregunta: Los drivers de dónde los sacaste? en la caja no nos venían y en la web no los encuentro…

    Muchas gracias.

  2. Muchas gracias por responder tan rápido y perdona que te vuelva a molestar.
    Con la url que me das me sale la ficha de la pda. Si pincho en la pestaña de software me salen dos cosas para descargar:
    _ Honeywell_SDK_Windows_Android_2.08
    _ Honeywell_PowerTool_and_Demo_D7800A_2.08

    Ninguna de ellas parece tener los drivers (no hay ejecutable ninguno para instalar)…qué se me está escapando?

    Gracias de nuevo.

  3. Hola. Estamos desarrollando una aplicación para la honeywell con su base de datos. Podemos «debugear» sobre la pda sin problemas gracias a los drivers que nos pasaste, pero no conseguimos de ninguna manera acceder a la base de datos local, para ver la estructura una vez creada, consultar el resultado de la sincronización de los datos con nuestro servidor, etc… Me preguntaba si tú lo habrías conseguido.

    Gracias.

    • Hola Jorge,

      la base de datos de tu aplicación estará en un fichero en la ruta //data/data/com.mi_paquete.loquesea/databases/nombre_de_mi_bd

      Ahora bien, creo que solo puedes acceder a ella si estas probando tu aplicación en el emulador, a través de la herramienta file explorer o tambien por linea de comandos. En el dispositivo honeywell y en cualquier dispositivo android, ese directorio tiene permisos 700, vamos que no tienes permiso de lectura a menos que seas root. No veo claro como rootear el dispositivo de honeywell, y creo que tampoco merece la pena complicarse la vida con ello.

      Puedes utilizar el emulador para obtener el archivo y examinarlo desde tu pc, o desarrollar sobre un dispositivo rooteado (cualquier telefono). Una ocurrencia de ultima hora es crear una pequeña rutina de codigo que haga una copia del fichero de base de datos cada vez que inicias la aplicacion o sales de ella (o la invocas con un boton o menú) en otra ubicacion a la que si puedas acceder (de hecho yo tengo una función que hace una copia de una bd local en otra carpeta, es algo trivial).

      Yo me encontré con tu problema al principio. Habia diseñado una bd, y me parecía bastante tedioso tener que crearla y modificarla con consultas sql cada vez que añadia o modificaba un campo. Asi que aproveché la ocasión para probar algo nuevo, y utilizar una librería para ORM. Como opciones, las mas conocidas son Green Dao y ORM Lite.

      Me gustó más el funcionamiento de Orm lite, y tengo que decir que me ha facilitado mucho el trabajo con bases de datos en el entorno android, incluida su creación y modificación. Merece la pena, echale un ojo.

      Un saludo.

  4. public static void BD_backup() throws IOException {
    String timeStamp = new SimpleDateFormat(«ddMMyyyy_HHmmss»).format(new Date());

    final String inFileName = «/data/data/com.midominio.app_ejemplo/databases/»+DATABASE_NAME;
    File dbFile = new File(inFileName);
    FileInputStream fis = null;

    fis = new FileInputStream(dbFile);

    String directorio = obtenerDirectorioCopias();
    File d = new File(directorio);
    if (!d.exists()) {
    d.mkdir();
    }
    String outFileName = directorio + «/»+DATABASE_NAME + «_»+timeStamp;

    OutputStream output = new FileOutputStream(outFileName);

    byte[] buffer = new byte[1024];
    int length;
    while ((length = fis.read(buffer)) > 0) {
    output.write(buffer, 0, length);
    }

    output.flush();
    output.close();
    fis.close();

    }

  5. Ayudaaaaaaaaaaaaaaaaaa
    +++++++++++++++++++++++++
    No me funciona
    Tal vez hago algo mal
    Y eso q estoy en esto de android un rato
    Podrías hacer un video o algo
    Es muy importante para mí por q
    Tengo una tablet le cambie la ROM
    Dejo de funcionar el táctil
    Se le puedo inyectar el controlador pero si no lo detecta el adb Debug Bridge no se puede aser nada
    mvirus696@gmail.com

  6. Thanks a alot (you and google translate :D). Worked for me with Dolphin 70e Black. ( First I’ve installed Dolphin Black as an ADB device using Device Manager first, since it was not detected automatically.)

    • Lamento decirte que lo desconozco. Ya hace tiempo que no trabajo en la empresa en la que probé el dispositivo Dolphin, y no tengo uno a mano para probar.

      Un saludo

  7. Muchísimas gracias por el aporte. Saludos desde San Luis Potosí, México. En lo que te pueda apoyar.

  8. Hola,
    tengo un problema con un servicio Rest montado en eclipse y mi app en Android Studio. He detectado que cuando arranco el servicio Rest en Eclipse y lanzo mi app desde Android Studio me da este error:
    [2015-07-01 18:11:00 – ddmlib] Se ha anulado una conexión establecida por el software en su equipo host.
    java.io.IOException: Se ha anulado una conexión establecida por el software en su equipo host.
    at sun.nio.ch.SocketDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(Unknown Source)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(Unknown Source)
    at sun.nio.ch.IOUtil.write(Unknown Source)
    at sun.nio.ch.SocketChannelImpl.write(Unknown Source)
    at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213)
    at com.android.ddmlib.Client.sendAndConsume(Client.java:675)
    at com.android.ddmlib.HandleHeap.sendREAQ(HandleHeap.java:342)
    at com.android.ddmlib.Client.requestAllocationStatus(Client.java:521)
    at com.android.ddmlib.DeviceMonitor.createClient(DeviceMonitor.java:831)
    at com.android.ddmlib.DeviceMonitor.openClient(DeviceMonitor.java:799)
    at com.android.ddmlib.DeviceMonitor.processIncomingJdwpData(DeviceMonitor.java:759)
    at com.android.ddmlib.DeviceMonitor.deviceClientMonitorLoop(DeviceMonitor.java:648)
    at com.android.ddmlib.DeviceMonitor.access$100(DeviceMonitor.java:44)
    at com.android.ddmlib.DeviceMonitor$3.run(DeviceMonitor.java:576)
    En cambio, si cierro Andorid Studio y ejecuto la app desde mi movil esta funciona, se conecta al servicio Rest y actualiza mi BD. ¿puedes echarme una mano? Gracias.

    • Hola, perdona por la tardanza en la respuesta,

      esto es un poco dar palos de ciego, porque sin tener delante el codigo fuente de la app es dificil. Pero me ha pasado alguna vez desarrollando que desde la app intento invocar los webservices de mi ordenador desarrollo y por despiste, invoco las urls de la forma http://localhost/mi_web_Service. Esto me funciona desde el emulador, pero no desde mi movil, y es obvio, porque lo que hay que invocar es la direccion IP del ordenador que esta ofreciendo los servicios web.

      No tengo ni idea de si este es tu problema, pero ya te digo a mi me ha pasado alguna vez, y a lo mejor van por ahi tus tiros. Sino te ayuda esta idea dame mas detalles, y a ver si se me ocurre algo.

      Saludos-.

  9. Hola soy novato en esto

    hice todos los pasos y no me funciona con un S3… tengo win7 64 bit…
    solo detecte una diferencia: en el admin de dispisitovos me muestra «Dispositivos Portatiles_ GT-I9300», y en el tutorial muestra «Android Phone_Android Composite ADB Interface»…
    Necesito otros drivers?.
    Sera esto lo que hace que no me detecte el celu.?
    Tal vez la version del adb no es la correcta?
    Ojala me puedas ayudar

  10. Gracias por este artículo, en mi caso no había instalado correctamente el driver, busqué «huawei Android USB Driver for Windows», bajé el instalador y listo!! .. con eso fue suficiente.

  11. Bro a mi me aparece android adb interface y en propiedades me dice que el dispositivo no pudo pudo iniciar codigo 10, alguna ayuda-‘
    saludos!

Los comentarios están cerrados.