我正在参加「掘金·启航计划」
之前有讲述过Android开发利器adb相关指令,可以理解成指令笔记(只有简单的使用),此处会结合具体场景(结合业务背景下)来讲述相关指令的应用。
一、通过adb无线连接手机调试
-
查询设备列表及状态
adb devices
List of devices attached emulator-5554 device
emulator-5554
是设备id,device
是设备状态.获取设备连接状态
adb get-state
device:设备正常连接 offline:连接出现异常,设备无响应 unknown:没有连接设备
-
查看Android设备的ip地址(Android设备与PC连接同一wifi)
执行adb shell ip addr show wlan0
查看ip地址.
如果当前连接多台设备,可执行adb -s 设备id shell ip addr show wlan0
,此处的设备Id可通过adb devices
查看。 -
开始无线连接Android设备
adb tcpip 5555
(开启端口号),如有多台设备,需要执行adb -s deviceId tcpip 5555
adb connect ip:5555
(Android设备IP地址)
二、通过adb打开指定应用及页面
- 查看当前设备上展示的页面包名和Activity
adb shell dumpsys activity top | grep ACTIVITY
adb shell dumpsys window | grep mCurrentFocus
- 根据包名和Activity跳转对应的页面
adb shell am start -n packagename/.activityname
注意:
上面的方式是基于能获取应用的包名
和类名
,该应用已经安装到设备上且能打开。
那有时候我们在不能直接打开应用的场景下(不能获取应用的包名
和类名
),如在定制的系统设备,一般都是默认打开自己厂家的应用,不会暴露主界面,这时候我们如何打开自己安装的应用。
步骤如下:
- 查看已装应用列表
adb shell pm list package
- 根据包名打开对应的应用:
adb shell monkey -p packagename -c android.intent.category.LAUNCHER 1
三、使用adb截图和录屏
- 截图命令
adb shell screencap /sdcard/screen_shot_temp.png
可以通过Device File Explorer
查看sdcard目录下截图到的图片。
录屏命令
adb shell screenrecord /sdcard/demo.mp4
(后续操作如同截图操作一致) - 将sdcard目录下的截图拷贝到电脑上
adb pull /sdcard/screen_shot_temp.png ~/Downloads/
- 用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查看进程和线程相关信息
-
进程相关:
USER PID PPID NAME 进程当前用户 进程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 -
线程相关:
查看总线程数量:
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
-
查看系统对进程使用系统资源的相关限制
根据关键字查看进程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"
这样就可以在
AdbBroadcastReceiver
的onReceive
方法中通过intent
中(intent.getStringExtra("command")
)获取广播中传递的参数进行解析,然后根据不同的参数响应不同的事件。