【adb使用技巧和usb通信原理探索】

来源:Mob开发者服务平台

转自:https://www.toutiao.com/a6521214397996597773/?tt_from=weixin&utm_campaign=client_share&timestamp=1518356434&app=news_article&utm_source=weixin&iid=25917020432&utm_medium=toutiao_android&wxshare_count=1


一、adb使用的技巧

1. 查询当前展示的Activity

adb shell dumpsys activity top | head -n 10

【adb使用技巧和usb通信原理探索】

dumpactivity

2. 备份和还原所有安装的apk

  • 找出设备上安装的第三方apk包名: adb shell pm list packages -3

  • 依据apk包名找出apk: adb shell pm path $pkg

  • 导出apk文件: adb shell pull $path

  • 把导出的apk文件安装到新设备里: adb install -r $file

脚本:

#!/bin/shecho -n "" > apksadb shell pm list packages -3 | sed -E "s/ $//" | while read linedo pkg=${line#*:} line=$(adb shell pm path "$pkg"&) path=${line#*:} echo $pkg:$path >> apksdonecat apkscat apks | sed -E "s/ $//" | while read linedo pkg=${line%:*} path=${line#*:} adb pull "$path" "$pkg.apk" echo $pathdonerm apks#echo $apks;

疑惑, 第7行通过包名查询apk安装路径时, 在命令最后添加一个&字符, 不添加无法正常找出所有apk路径, 不知道什么原由。

3. adb调试wifi模式和usb模式切换

手机端(root)

  • 安装terminal

  • 切wifi: setprop service.adb.tcp.port 5555

  • 切wifi重启依然生效:setprop persist.adb.tcp.port 5555

  • 切usb: setprop service.adb.tcp.port -1

  • stop adbd

  • start adbd

电脑上切换wifi

  • 切wifi: adb tcpip 5555

  • 切usb: adb usb

电脑端连接设备

  • wifi模式: adb connect 手机ip:5555

  • usb模式: 通过usb连接手机

二、adbs端和adbd端,usb通信原理探索

1. 识别usb设备, 找到USB设备信息

lsusb

【adb使用技巧和usb通信原理探索】

usb_device_info

记录ID,访问网站查看usb设备类型(设备是什么)

http://www.linux-usb.org

可以确实设备的Vendors和设备类型(打印机/Mass Storage等)

2. Linux内核识别设备

udevadm monitor --kernel

【adb使用技巧和usb通信原理探索】

usb_kernel_monitor

接着去查询一下device的信息

udevadm info -q all -p

【adb使用技巧和usb通信原理探索】

usb_kernel_info

3. adbs 访问的device文件

启动adbs,查看一下进程访问的device文件

adb start-server ps -ef | grep adb lsof -p $pid

【adb使用技巧和usb通信原理探索】

adb_access_device_file

4. adbs源代码分析

调用栈

main(adb.c)main_adb(adb.c)[usb_vendors_init(usb_vendors.c)usb_init(usb_linux.c)]-----new thread----device_poll_thread(usb_linux.c)find_usb_device(usb_linux.c)kick_disconnected_devices(usb_linux.c)

从usb_vendors.c文件中,可以知道vendor信息是被"固化"adbs里面。(那是否就可以解释为啥linux不需要adb驱动呢)

【adb使用技巧和usb通信原理探索】

adbs_init_vendors

usb_linux.c文件的函数列表

【adb使用技巧和usb通信原理探索】

adbs_usb_linux_functions

里面读取函数,主要封装linux usb 通用的访问device的方式。

5. adbd 访问的device文件

adb shell su (root权限) lsof > /sdcard/lsof.data adb pull /sdcard/lsof.data less lsof.data

【adb使用技巧和usb通信原理探索】

adbd_access_file

6. adbd源代码分析

调用栈

main(adb.c)main_adb(adb.c)usb_init(usb_linux_client.c)usb_adb_init(usb_linux_client.c)

usb_adb_init的内容, 可以确定adbd确实访问了/dev/android_adb文件(设备结点)

【adb使用技巧和usb通信原理探索】

usb_linux_client.c文件定义读取函数,从实现上看它主要通过/dev/android_adb文件与外界通信。

【adb使用技巧和usb通信原理探索】

adbd_usb_linux_client_function

7. 串联adbs和adbd(android kernel)

init(android.c)usb_composite_register[&android_usb_driver](android.c)android_bind(android.c)usb_add_config[cdev, &android_config_driver](android.c)android_bind_config(android.c)adb_function_add(f_adb.c)misc_deregister[&adb_device](f_adb.c)static struct miscdevice adb_device = {.minor = MISC_DYNAMIC_MINOR,.name = shortname,.fops = &adb_fops,};static const char shortname[] = "android_adb";

android.c和f_adb.c代码所在路径是/drivers/usb/gadget/ 注意:这里的代码是kernel的源代码,不是Android的源代码(aosp)。如果你也下载了linux kernel, 会发现没有这两个文件的。


【adb使用技巧和usb通信原理探索】

【adb使用技巧和usb通信原理探索】


相关文章:

  • 2021-09-03
  • 2021-04-15
  • 2022-02-07
  • 2022-12-23
  • 2023-03-09
  • 2021-04-06
猜你喜欢
  • 2021-06-27
  • 2021-06-28
  • 2022-12-23
  • 2022-01-03
  • 2022-02-06
  • 2022-12-23
  • 2021-05-14
相关资源
相似解决方案