转载,英文原文链接 网上很多人宣称可以给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驱动:
- 通过官网下载最新的Google USB driver。
- 解压到
usb_driver
文件夹 - 使用文档编辑器(例如Notepad++)打开
usb_driver\\android_winusb.inf
文件 - 把
[Google.Ntx86]
和[Google.NTamd64]
的内容修改成如下所示:1
2
3
4
5
6
7[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 - 保存文件,这样你就有了一个真正的通用adb驱动。 如果需要的话,不要忘了更新文件
.android\\adb_usb.ini
。 在安装完这个驱动的时候,可以通过一下命令测试驱动是否在运行,可以顺便测试一下是否加载到之前的驱动。修改后的inf文件如下所示:1
2powershell "gwmi Win32_USBControllerDevice | %{[wmi]($_.Dependent)} |
?{$_.CompatibleID -like \"USB\Class_ff^&SubClass_42^&Prot_0?\"} | fl Name,DeviceID,Service"1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94;
; 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
有如下内容
1 | # ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT. |
然后就在里面添加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中执行以下就行了。
1 | powershell "gwmi Win32_USBControllerDevice | %{[wmi]($_.Dependent)} | |
记得设相应的环境变量,如果powershell
命令找不到的可以输入:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
搞定收工。