聊一聊adb还能干点啥

126 阅读4分钟

我正在参加「掘金·启航计划」

之前有讲述过Android开发利器adb相关指令,可以理解成指令笔记(只有简单的使用),此处会结合具体场景(结合业务背景下)来讲述相关指令的应用。

一、通过adb无线连接手机调试

  1. 查询设备列表及状态 adb devices

    List of devices attached
    emulator-5554   device
    

    emulator-5554 是设备id, device是设备状态.

    获取设备连接状态 adb get-state

    device:设备正常连接
    offline:连接出现异常,设备无响应
    unknown:没有连接设备
    
  2. 查看Android设备的ip地址(Android设备与PC连接同一wifi)
    执行adb shell ip addr show wlan0 查看ip地址.
    如果当前连接多台设备,可执行adb -s 设备id shell ip addr show wlan0 ,此处的设备Id可通过adb devices查看。

  3. 开始无线连接Android设备
    adb tcpip 5555 (开启端口号),如有多台设备,需要执行adb -s deviceId tcpip 5555
    adb connect ip:5555 (Android设备IP地址)

二、通过adb打开指定应用及页面

  1. 查看当前设备上展示的页面包名和Activity
    • adb shell dumpsys activity top | grep ACTIVITY
    • adb shell dumpsys window | grep mCurrentFocus
  2. 根据包名和Activity跳转对应的页面
    adb shell am start -n packagename/.activityname

注意: 上面的方式是基于能获取应用的包名类名,该应用已经安装到设备上且能打开。
那有时候我们在不能直接打开应用的场景下(不能获取应用的包名类名),如在定制的系统设备,一般都是默认打开自己厂家的应用,不会暴露主界面,这时候我们如何打开自己安装的应用。

步骤如下:

  1. 查看已装应用列表 adb shell pm list package
  2. 根据包名打开对应的应用:
    adb shell monkey -p packagename -c android.intent.category.LAUNCHER 1

三、使用adb截图和录屏

  1. 截图命令
    adb shell screencap /sdcard/screen_shot_temp.png
    可以通过Device File Explorer查看sdcard目录下截图到的图片。
    录屏命令
    adb shell screenrecord /sdcard/demo.mp4 (后续操作如同截图操作一致)
  2. 将sdcard目录下的截图拷贝到电脑上
    adb pull /sdcard/screen_shot_temp.png ~/Downloads/
  3. 用Finder打开Downloads
    open ~/Downloads -a Finder

合并命令:

adb shell screencap /sdcard/screen_shot_temp.png && adb  pull /sdcard/screen_shot_temp.png ~/Downloads/ &&  open ~/Downloads -a Finder

命令太长不要紧,这里可以使用alias技能

alias -g ss='adb shell screencap /sdcard/screen_shot_temp.png && adb  pull /sdcard/screen_shot_temp.png ~/Downloads/ &&  open ~/Downloads -a Finder'

稍后在terminal中执行ss即可实现上述功能。

四、使用adb查看进程和线程相关信息

  1. 进程相关:

    USERPIDPPIDNAME
    进程当前用户进程ID 父进程ID进程名称

    查看进程信息:
    adb shell ps
    查看总进程数量:
    adb shell ps |wc -l
    根据pid查看相应进程信息:
    adb shell ps pid
    根据关键字搜索相应进程信息:
    adb shell ps |grep keyword,如 adb shell ps |grep 'com.imock'
    关闭进程:
    adb shell kill -9 pid
    adb shell am force-stop 包名, 如adb shell am force-stop com.imock.box

  2. 线程相关:
    查看总线程数量:
    adb shell ps -T |wc -l
    查看指定进程的线程信息:
    adb shell ps -T -A | grep PID , 如adb shell ps -T -A | grep 2022
    查看指定进程的线程数量:
    adb shell ps -T -A | grep PID |wc -l

  3. 查看系统对进程使用系统资源的相关限制
    根据关键字查看进程id
    adb shell ps | grep "key"
    查看对该进程使用系统资源的相关限制信息
    执行adb shell
    执行cat /proc/pid/limits
    pid替换成对应的进程id,即可查看系统对进程使用系统资源的相关限制。
    soft Limit 软限制:系统资源使用的上限值
    hard Limit 硬限制:不能超出的hard limits值。

五、使用adb发送广播在业务代码中调试

我们在日常开发中,可能偶尔会碰到有些场景不好模拟或者创造起来比较复杂,我们会在代码中mock固定点击事件触发页面跳转或者事件执行行为,这样对项目代码有一定的耦和,当然有解决方案,比如在项目中有专门的debug页面用来处理这样的逻辑,或者通过发送广播来处理这些事件。(注意开关控制,避免发布的安装包打开此功能

通过adb shell am broadcast [options] <INTENT> 可以发送广播。 可以向所有组件广播,也可以只向指定组件广播。

  • 例如,向所有组件发送action为com.imock.debugtools.adb.cmd的广播:

    adb shell am broadcast -a com.imock.debugtools.adb.cmd
    
  • 又例如,只向 com.imock.test/.AdbBroadcastReceiver 发送广播 :

    adb shell am broadcast -a com.imock.debugtools.adb.cmd -n com.imock.test/.AdbBroadcastReceiver
    
  • 又或者需要在广播中携带参数

    adb shell am broadcast -a com.imock.debugtools.adb.cmd --es command "adb_test"
    

    这样就可以在AdbBroadcastReceiveronReceive方法中通过intent中(intent.getStringExtra("command"))获取广播中传递的参数进行解析,然后根据不同的参数响应不同的事件。