adb使用技巧和usb通信原理

关于adb上的使用技巧和新的发现还会在后面继续更新,这篇将会长期更新的

一、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

脚本:

 

    
#!/bin/sh
echo -n "" > apks
adb shell pm list packages -3 | sed -E "s/\r$//" \
| while read line
do
    pkg=${line#*:}
    line=$(adb shell pm path "$pkg"&)
    path=${line#*:}
    echo $pkg:$path >> apks
done
cat apks
cat apks | sed -E "s/\r$//" | while read line
do
    pkg=${line%:*}
    path=${line#*:}
    adb pull "$path" "$pkg.apk"
    echo $path
done
rm 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

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源代码分析

调用栈

 

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驱动呢)

 

 

adbs_init_vendors
usb_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源代码分析

调用栈

 

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文件(设备结点)

 

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

 

 

 

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, 会发现没有这两个文件的。

 

1,内存

进入该设备的shell环境:

adb -s [设备序列号] shell

获取当前目标包的进程号:

ps | grep com.xxx.xxx

查看当前进程的内存信息:

dumpsys meminfo 进程号/包

查看单个应用最大内存限制:

getprop | grep heapgrowthlimit

2,  CPU

显示当前进程的CPU信息:

top -n 10 -d 5 | grep [PID]  [注]:-n表示刷新次数,-d表示刷新间隔

显示当前进程总的CPU占有率:

dumpsys cpuinfo 进程号/包

启动一个activity,显示启动时间:

am start -W [包/Activity]  [注]:e.g. com.xxx.xxx/com.xxx.xxx.xxx.activity

    WaitTime: 包括前一个应用Activity pause的时间和新Activity启动的时间

    TotalTime:新应用启动的耗时,包括进程的启动和Activity的启动

    ThisTime:表示一连串启动Activity的最后一个Activity的启动耗时

3,  流量

获取当前目标包的进程号:

ps | grep com.xxx.xxx

根据PID得到UID【1】

cat /proc/PID/status

获取下载流量

cat /proc/uid_stat /UID/tcp_rcv

获取上传流量

cat /proc/uid_stat/UID/tcp_snd

Android为每个应用都分配了不同的UID,这里UID和Linux的UID有所不同。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值