进入recovery后,执行adb devices,提示device offline。
说明设备的USB口是device role了,但adb server跟device通信不上。
对比了网上很多文章,各种修改都无法解决。
于是,将adb和adbd和adb driver的log打开。
//kernel-3.18/drivers/usb/gadget/f_adb.c
发现adb driver的读写都没有调用,于是在adb代码里寻找打开adb driver “/dev/android_adb”的地方,一步步跟踪,到了问题点:
system\core\adb\usb_linux_client.cpp
void usb_init()
{
if (access(USB_FFS_ADB_EP0, F_OK) == 0)
usb_ffs_init();
else
usb_adb_init();
}
能正常连接adb的走usb_adb_init();,而不能正常连接的走usb_ffs_init();
#define USB_FFS_ADB_PATH "/dev/usb-ffs/adb/"
#define USB_FFS_ADB_EP(x) USB_FFS_ADB_PATH#x
#define USB_FFS_ADB_EP0 USB_FFS_ADB_EP(ep0)
也就是说,不能正常连接adb的是因为access(USB_FFS_ADB_EP0, F_OK)成功了,
经过对比,recovery下的bootable/recovery/etc/init.rc 多了下面几行:
on fs
write /proc/bootprof "start mobicore (on fs)"
//....
mkdir /dev/usb-ffs 0770 shell shell
mkdir /dev/usb-ffs/adb 0770 shell shell
mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000
这就导致设备的adbd执行的是ffs初始化,而不是adb初始化的原因。
屏蔽上面几行,连接adb成功。显示:
$ adb devices
List of devices attached
0123456789ABCDEF recovery