转载,英文原文链接

网上很多人宣称可以给windows系统提供一个通用adb驱动,但他们通常只是重新打包一下Google提供给亲儿子Nexus设备的USB驱动包,通过修改android_winusb_inf文件,添加大量USB的Vendor ID和Product ID进去。为什么这样还做不到真正的通用呢?因为如果你设备的ID信息没有添加进去,这样的驱动并不能驱动你的设备。

然而微软的系统提供一种实现通用的驱动的方法。给一个设备寻找相应驱动的时候,windows系统可以通过硬件ID(例如:USB的Vendor ID和Product ID),也可以通过兼容ID(例如:InterfaceClassClassID,InterfaceSubClassID和InterfaceProtocolID)。幸运的是,所有安卓adb驱动的接口ID都是一样的。

在几年前,我曾经做了一个这样的adb驱动,并已经在很多不同的安卓设备上试验成功,如下面步骤所述,你也可以自己制作一个安卓的adb驱动:
1.通过官网下载最新的Google USB driver
2.解压到usb_driver文件夹
3.使用文档编辑器(例如Notepad++)打开usb_driver\android_winusb.inf文件
4.把[Google.Ntx86]和[Google.NTamd64]的内容修改成如下所示:

[Google.NTx86]
%SingleAdbInterface% = USB_Install, USB\Class_ff&SubClass_42&Prot_01
%SingleBootLoaderInterface% = USB_Install, USB\Class_ff&SubClass_42&Prot_03

[Google.NTamd64]
%SingleAdbInterface% = USB_Install, USB\Class_ff&SubClass_42&Prot_01
%SingleBootLoaderInterface% = USB_Install, USB\Class_ff&SubClass_42&Prot_03

5.保存文件,这样你就有了一个真正的通用adb驱动。

如果需要的话,不要忘了更新文件.android\adb_usb.ini。

在安装完这个驱动的时候,可以通过一下命令测试驱动是否在运行,可以顺便测试一下是否加载到之前的驱动。

powershell "gwmi Win32_USBControllerDevice | %{[wmi]($_.Dependent)} | 
?{$_.CompatibleID -like \"USB\Class_ff^&SubClass_42^&Prot_0?\"} | fl Name,DeviceID,Service" 

修改后的inf文件如下所示:

;
; Android WinUsb driver installation.
;
[Version]
Signature           = "$Windows NT$"
Class               = AndroidUsbDeviceClass
ClassGuid           = {3F966BD9-FA04-4ec5-991C-D326973B5128}
Provider            = %ProviderName%
DriverVer           = 08/28/2014,11.0.0000.00000
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]
%SingleAdbInterface% = USB_Install, USB\Class_ff&SubClass_42&Prot_01
%SingleBootLoaderInterface% = USB_Install, USB\Class_ff&SubClass_42&Prot_03

[Google.NTamd64]
%SingleAdbInterface% = USB_Install, USB\Class_ff&SubClass_42&Prot_01
%SingleBootLoaderInterface% = USB_Install, USB\Class_ff&SubClass_42&Prot_03


[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"

----------------------------------------------------
全文已经翻译完了,后面是彩蛋。
经过初步验证,大部分机型的确都是能够进行adb shell来连接,但是好像某些机型还是不行的,但是查看设备管理器可以看出加载了android adb driver。但是adb连接时就显示error: device not found,初步推断应该不关驱动的事,看了原文前几几篇博客,发现原文把这类问题叫做ADB connection trouble-shooting,解决的关键是修改adb_usb.ini,把设备的USB Vendor ID添加到adb_usb.ini中。
然后问题来了,adb_usb.ini在哪里呢,原文说默认路径是%USERPROFILE%\.android\adb_usb.ini,是在用户目录下的。但是如果设置了ANDROID_SDK_HOME,路径应该是在%ANDROID_SDK_HOME%\.android\adb_usb.ini下,然后我就保险起见,全部都添加了Vendor ID,但是还是不行。
在网上看到一个说法,是要在Android SDK的目录下,tools文件夹里运行一句命令:

Android update adb

这样自动生成adb_usb.ini,生成的adb_usb.ini有如下内容

# ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
# USE 'android update adb' TO GENERATE.
# 1 USB VENDOR ID PER LINE.

然后就在里面添加Vendor ID,如0xFFFF。有时候.android自动生成在用户目录,有时候生成在SDK的目录下。
然后问题来了,为什么某些手机厂商在adb连接时要手动添加Vendor ID呢?看了Using Hardware Devices这个页面就知道了,很多大厂商都向Google申请一个Vendor ID,然后这些厂商的ID就集成到adb驱动中,不用再手动添加到adb_usb.ini中。例如某些手机厂家,如魅族,TCL,并没有像Google申请一个ID号,所以就算驱动能够识别,adb都连接不上这些Vendor ID的手机,除非在adb_usb.ini中添加上ID号。以上是个人猜测,因为试了很多手机,发现魅族连接不上,而且Google官网没有其Vendor ID,要在adb_usb.ini中添加Vendor ID号才能够连接。
如果需要写脚本自动获取设备的Vendor ID到adb_usb.ini中,原文提供了一个powershell命令,在cmd中执行以下就行了。

powershell "gwmi Win32_USBControllerDevice | %{[wmi]($_.Dependent)} | 
?{$_.CompatibleID -like \"USB\Class_ff^&SubClass_42^&Prot_0?\"} | 
%{write \"0x$([regex]::match($_.deviceid.tolower(), 'vid_(\w+)').groups[1].value)\"} | 
sort -u" >> %ANDROID_SDK_HOME%\.android\adb_usb.ini 

记得设相应的环境变量,如果powershell命令找不到的可以输入:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe

搞定收工。

更多