adb使用技巧和usb通信原理探索
一、adb使用的技巧
1. 查詢當前展示的Activity
adb shell dumpsys activity top | head -n 10
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
腳本:
疑惑, 第7行通過包名查詢apk安裝路徑時, 在命令最後添加一個&字元, 不添加無法正常找出所有apk路徑, 不知道什麼原由。
3. adb調試wifi模式和usb模式切換
手機端(root)
安裝terminal
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
usb_device_info記錄ID,訪問網站查看usb設備類型(設備是什麼)http://www.linux-usb.org可以確實設備的Vendors和設備類型(印表機/Mass Storage等)
2. Linux內核識別設備
udevadm monitor --kernel
usb_kernel_monitor接著去查詢一下device的信息udevadm info -q all -p
usb_kernel_info
3. adbs 訪問的device文件
啟動adbs,查看一下進程訪問的device文件adb start-server ps -ef | grep adb lsof -p $pid
adb_access_device_file
4. adbs源代碼分析
調用棧
從usb_vendors.c文件中,可以知道vendor信息是被"固化"adbs裡面。(那是否就可以解釋為啥linux不需要adb驅動呢)
adbs_init_vendorsusb_linux.c文件的函數列表
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
adbd_access_file
6. adbd源代碼分析
調用棧
usb_adb_init的內容, 可以確定adbd確實訪問了/dev/android_adb文件(設備結點)
usb_linux_client.c文件定義讀取函數,從實現上看它主要通過/dev/android_adb文件與外界通信。
adbd_usb_linux_client_function
7. 串聯adbs和adbd(android kernel)
android.c和f_adb.c代碼所在路徑是/drivers/usb/gadget/ 注意:這裡的代碼是kernel的源代碼,不是Android的源代碼(aosp)。如果你也下載了linux kernel, 會發現沒有這兩個文件的。
TAG:Mob開發者服務平台 |