0%

如何制作一个windows下真正通用的adb驱动

转载,英文原文链接 网上很多人宣称可以给windows系统提供一个通用adb驱动,但他们通常只是重新打包一下Google提供给亲儿子Nexus设备的USB驱动包,通过修改android_winusb_inf文件,添加大量USB的Vendor IDProduct ID进去。为什么这样还做不到真正的通用呢?因为如果你设备的ID信息没有添加进去,这样的驱动并不能驱动你的设备。
然而微软的系统提供一种实现通用的驱动的方法。给一个设备寻找相应驱动的时候,windows系统可以通过硬件ID(例如:USB的Vendor IDProduct ID),也可以通过兼容ID(例如:InterfaceClassClassIDInterfaceSubClassID和InterfaceProtocolID)。幸运的是,所有安卓adb驱动的接口ID都是一样的。
在几年前,我曾经做了一个这样的adb驱动,并已经在很多不同的安卓设备上试验成功。

如下面步骤所述,你也可以自己制作一个安卓的adb驱动:

  1. 通过官网下载最新的Google USB driver
  2. 解压到usb_driver文件夹
  3. 使用文档编辑器(例如Notepad++)打开usb_driver\\android_winusb.inf文件
  4. [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
  5. 保存文件,这样你就有了一个真正的通用adb驱动。 如果需要的话,不要忘了更新文件.android\\adb_usb.ini。 在安装完这个驱动的时候,可以通过一下命令测试驱动是否在运行,可以顺便测试一下是否加载到之前的驱动。
    1
    2
    powershell "gwmi Win32_USBControllerDevice | %{[wmi]($_.Dependent)} | 
    ?{$_.CompatibleID -like \"USB\Class_ff^&SubClass_42^&Prot_0?\"} | fl Name,DeviceID,Service"
    修改后的inf文件如下所示:
    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
2
3
# 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 IDadb_usb.ini中,原文提供了一个powershell命令,在cmd中执行以下就行了。

1
2
3
4
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

搞定收工。