¿Cómo parcheo el controlador ADB de Android?

Dolores de cabeza con Android SDK otra vez!

Sé cómo configurar el SDK de Android. He hecho esto varias veces a lo largo de los años. ¡Y tuve que hacer algunos parches del controlador para el ADB cada vez! ¡Lo he hecho tantas veces rutinariamente que puedo hacerlo con los ojos vendados!

¿Por qué es tan problemático para Google incluir un controlador USB que funcione con el SDK de Android?

Este es el archivo INF para el controlador USB proporcionado por Google.

;
; Android WinUsb driver installation.
;
[Version]
Signature           = "$Windows NT$"
Class               = AndroidUsbDeviceClass
ClassGuid           = {3F966BD9-FA04-4ec5-991C-D326973B5128}
Provider            = %ProviderName%
DriverVer           = 08/27/2012,7.0.0000.00001
CatalogFile.NTx86   = androidwinusb86.cat
CatalogFile.NTamd64 = androidwinusba64.cat

[ClassInstall32]
Addreg = AndroidWinUsbClassReg

[AndroidWinUsbClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-1


[Manufacturer]
%ProviderName% = Google, NTx86, NTamd64


[Google.NTx86]

;Google Nexus One
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_0D02
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_0D02&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E11
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E12&MI_01

;Google Nexus S
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E21
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E22&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E23
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E24&MI_01

;Google Nexus 7
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_4E40
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E41
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E42
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E42&MI_01
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E44&MI_01

;Google Nexus Q
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_2C10
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_2C11

;Google Nexus (generic)
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_4EE0
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4EE1
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4EE2
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4EE2&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4EE3
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4EE4&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4EE5
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4EE6&MI_01


[Google.NTamd64]

;Google Nexus One
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_0D02
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_0D02&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E11
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E12&MI_01

;Google Nexus S
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E21
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E22&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E23
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E24&MI_01

;Google Nexus 7
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_4E40
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E41
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E42
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E42&MI_01
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E44&MI_01

;Google Nexus Q
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_2C10
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_2C11

;Google Nexus (generic)
%SingleBootLoaderInterface% = USB_Install, USB\VID_18D1&PID_4EE0
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4EE1
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4EE2
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4EE2&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4EE3
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4EE4&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4EE5
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4EE6&MI_01

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include     = winusb.inf
AddService  = WinUSB,0x00000002,WinUSB_ServiceInstall

[WinUSB_ServiceInstall]
DisplayName     = %WinUSB_SvcDesc%
ServiceType     = 1
StartType       = 3
ErrorControl    = 1
ServiceBinary   = %12%\WinUSB.sys

[USB_Install.Wdf]
KmdfService = WINUSB, WinUSB_Install

[WinUSB_Install]
KmdfLibraryVersion  = 1.9

[USB_Install.HW]
AddReg  = Dev_AddReg

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{F72FE0D4-CBCB-407d-8814-9ED673D0DD6B}"

[USB_Install.CoInstallers]
AddReg    = CoInstallers_AddReg
CopyFiles = CoInstallers_CopyFiles

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll"

[CoInstallers_CopyFiles]
WinUSBCoInstaller2.dll
WdfCoInstaller01009.dll

[DestinationDirs]
CoInstallers_CopyFiles=11

[SourceDisksNames]
1 = %DISK_NAME%,,,\i386
2 = %DISK_NAME%,,,\amd64

[SourceDisksFiles.x86]
WinUSBCoInstaller2.dll  = 1
WdfCoInstaller01009.dll = 1

[SourceDisksFiles.amd64]
WinUSBCoInstaller2.dll  = 2
WdfCoInstaller01009.dll = 2

[Strings]
ProviderName                = "Google, Inc."
SingleAdbInterface          = "Android ADB Interface"
CompositeAdbInterface       = "Android Composite ADB Interface"
SingleBootLoaderInterface   = "Android Bootloader Interface"
WinUSB_SvcDesc              = "Android USB Driver"
DISK_NAME                   = "Android WinUsb installation disk"
ClassName                   = "Android Device"

Este controlador se puede obtener a través del SDK Manager y así es como lo obtuve. Se encuentra en el directorio de instalación Android\android-sdk\extras\google\usb_driver.

¿Por qué no hay entradas para teléfonos HTC o Samsung?

Ahora bien, este es el archivo INF para el controlador que usé en el pasado (pero para el mismo teléfono).

;
; Android WinUsb driver installation.
;
[Version]
Signature           = "$Windows NT$"
Class               = AndroidUsbDeviceClass
ClassGuid           = {3F966BD9-FA04-4ec5-991C-D326973B5128}
Provider            = %ProviderName%
DriverVer           = 08/11/2009,2.0.0010.00002
CatalogFile.NTx86   = androidwinusb86.cat
CatalogFile.NTamd64 = androidwinusba64.cat

;
; This section seems to be required for WinUsb driver installation.
; If this section is removed the installer will report an error
; "Required section not found in INF file".
;
[ClassInstall32]
Addreg = AndroidWinUsbClassReg

[AndroidWinUsbClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-1

[Manufacturer]
%ProviderName% = Google, NTx86, NTamd64

[Google.NTx86]
; HTC Dream
%SingleAdbInterface%        = USB_Install, USB\VID_0BB4&PID_0C01
%CompositeAdbInterface%     = USB_Install, USB\VID_0BB4&PID_0C02&MI_01
%SingleBootLoaderInterface% = USB_Install, USB\VID_0BB4&PID_0FFF
; HTC Magic
%CompositeAdbInterface%     = USB_Install, USB\VID_0BB4&PID_0C03&MI_01
; HTC Desire
%CompositeAdbInterface% = USB_Install, USB\VID_0bb4&Pid_0c94
;
;Moto Sholes
%SingleAdbInterface%        = USB_Install, USB\VID_22B8&PID_41DB
%CompositeAdbInterface%     = USB_Install, USB\VID_22B8&PID_41DB&MI_01
;
;Google NexusOne
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_0D02
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_0D02&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E11
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E12&MI_01

[Google.NTamd64]
; HTC Dream
%SingleAdbInterface%        = USB_Install, USB\VID_0BB4&PID_0C01
%CompositeAdbInterface%     = USB_Install, USB\VID_0BB4&PID_0C02&MI_01
%SingleBootLoaderInterface% = USB_Install, USB\VID_0BB4&PID_0FFF
; HTC Magic
%CompositeAdbInterface%     = USB_Install, USB\VID_0BB4&PID_0C03&MI_01
; HTC Desire
%CompositeAdbInterface% = USB_Install, USB\VID_0bb4&Pid_0c94
;
;Moto Sholes
%SingleAdbInterface%        = USB_Install, USB\VID_22B8&PID_41DB
%CompositeAdbInterface%     = USB_Install, USB\VID_22B8&PID_41DB&MI_01
;
;Google NexusOne
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_0D02
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_0D02&MI_01
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_4E11
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_4E12&MI_01

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include     = winusb.inf
AddService  = WinUSB,0x00000002,WinUSB_ServiceInstall

[WinUSB_ServiceInstall]
DisplayName     = %WinUSB_SvcDesc%
ServiceType     = 1
StartType       = 3
ErrorControl    = 1
ServiceBinary   = %12%\WinUSB.sys

[USB_Install.Wdf]
KmdfService = WINUSB, WinUSB_Install

[WinUSB_Install]
KmdfLibraryVersion  = 1.7

[USB_Install.HW]
AddReg  = Dev_AddReg

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{F72FE0D4-CBCB-407d-8814-9ED673D0DD6B}"

[USB_Install.CoInstallers]
AddReg    = CoInstallers_AddReg
CopyFiles = CoInstallers_CopyFiles

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01007.dll,WdfCoInstaller","WinUSBCoInstaller.dll"

[CoInstallers_CopyFiles]
WinUSBCoInstaller.dll
WdfCoInstaller01007.dll

[DestinationDirs]
CoInstallers_CopyFiles=11

[SourceDisksNames]
1 = %DISK_NAME%,,,\i386
2 = %DISK_NAME%,,,\amd64

[SourceDisksFiles.x86]
WinUSBCoInstaller.dll  = 1
WdfCoInstaller01007.dll = 1

[SourceDisksFiles.amd64]
WinUSBCoInstaller.dll  = 2
WdfCoInstaller01007.dll = 2

[Strings]
ProviderName                = "Google, Inc."
SingleAdbInterface          = "Android ADB Interface"
CompositeAdbInterface       = "Android Composite ADB Interface"
SingleBootLoaderInterface   = "Android Bootloader Interface"
WinUSB_SvcDesc              = "Android USB Driver"
DISK_NAME                   = "Android WinUsb installation disk"
ClassName                   = "Android Phone"
; HTC Desire
%SingleAdbInterface% = USB_Install, USB\VID_0bb4&Pid_0c94&Rev_0100
%CompositeAdbInterface% = USB_Install, USB\VID_0bb4&Pid_0c94
%SingleBootLoaderInterface% = USB_Install, USB\VID_0BB4&Pid_0c94

Este controlador se descargó del foro de desarrolladores de XDA, de este hilo. He revisado este hilo cada vez que tuve que instalar Android SDK. El truco que usa el autor es simplemente reemplazar las identificaciones de hardware en el archivo INF por aquellas que realmente corresponden al dispositivo de hardware real que se está conectando.

Si no me equivoco, tenía la misma identificación que describe el autor en el hilo, es decir USB\VID_0bb4&Pid_0c94. Pero ahora cuando lo reviso tengo uno diferente.

propiedades del controlador

Hace poco flasheé el teléfono. Pero usé la imagen original de RUU, con el mismo número de compilación que la que ya estaba en el teléfono. El RUU era la utilidad de actualización de ROM original de HTC que se usaba para flashearlo. Tuve que hacer esto para habilitar el uso de Unrevoked para rootear y luego Alpha Rev para configurar S-OFF. ¿Será que, de alguna manera, esto cambió la identificación del hardware? Pensé que se suponía que las identificaciones de hardware eran permanentes y fijadas en el hardware...

Usando el segundo controlador, con un archivo INF sin editar e intentando actualizar el dispositivo ADB en el Administrador de dispositivos, esto es lo que dice.

actualización del controlador

actualización del controlador

Simplemente falla al instalarlo, porque las identificaciones no coinciden. Ahora, estas son las líneas que usé en la versión editada del archivo INF. Estos ahora incluyen las identificaciones reales de mi teléfono.

[Google.NTx86]
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01

[Google.NTamd64]
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01

[Strings]
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&REV_0226
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87
%SingleBootLoaderInterface% = USB_Install, USB\VID_0BB4&PID_0C87

Entonces, cuando intento actualizar el controlador nuevamente, aparece el mensaje de advertencia, ya conoce la advertencia habitual de Windows sobre la instalación de software de origen desconocido.

actualización del controlador

Así que hago clic para instalarlo de todos modos.

actualización del controladorE intenta instalarlo, pero luego se detiene y dice que la instalación falló y algo sobre ADB Composite.

Entonces, ¿por qué no se instala? ¿Y por qué se cambió mi ID de hardware en primer lugar?

¿No hay una forma "normal" de instalar este estúpido controlador? Ya sabes, sin tener que hackear la maldita cosa o jugarle una mala pasada?...

Sé que algunos usuarios sugieren que uno debería obtener el último software de sincronización del fabricante porque con eso también vienen algunos controladores USB que son necesarios. Pero no quiero nada del bloatware de HTC. Y no tengo ningún problema para transferir archivos entre el teléfono y la computadora cuando estoy en el modo "Unidad de disco". Así que no necesito nada más. ¿Y no es este el controlador para usar ADB (Android Debug Bridge) que es parte de Android SDK? Quiero decir, ¿no debería ser Google el que proporcione un controlador que funcione entonces? ...

Solo para que conste, el teléfono en cuestión es HTC Desire, el original. Ya sabes, el primero, ninguno de sus muchos hermanos que siguieron.

Por favor, eche un vistazo a esto y hágame saber lo que cree que podría ser. Y también avíseme si conoce alguna forma alternativa de hacer esto, solo para uso futuro. Estoy harto y cansado de tener que hacer esto cada vez que quiero instalar el SDK de Android. Normalmente solo hago eso cuando necesito reinstalar Windows, pero una vez instalado y configurado, generalmente no lo toco, pero reinstalo Windows al menos dos veces al año.

Creo que la solución es que @Sammy solo necesita instalar los controladores de HTC porque no creo que estén incluidos en el SDK. Tengo que hacer esto para mi Nota.
¿Cómo se obtienen los controladores sin instalar nada más en la computadora? ¿Y estos controladores funcionan para ADB o solo para HTC Sync y demás?
Es posible que tenga más suerte con el SDK en Linux. Al menos, nunca tuve que instalar controladores LG para mi dispositivo.

Respuestas (1)

Tuve que cambiar la última parte del archivo INF.

[Strings]
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&REV_0226&MI_01
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01
%SingleBootLoaderInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01

Funcionó perfectamente después de este cambio.