与应用交互
主要是使用am<command>命令,常用的<command>如下
command | 用途 |
---|---|
start [options] <INTENT> | 启动 <INTENT> 指定的 Activity |
startservice [options] <INTENT> | 启动 <INTENT> 指定的 Service |
broadcast [options] <INTENT> | 发送 <INTENT> 指定的广播 |
force-stop <packagename> | 停止 <packagename> 相关的进程 |
<INTENT> 参数很灵活,和写 Android 程序时代码里的 Intent 相对应。
用于决定intent对象的选项如下:
参数 | 含义 |
---|---|
-a <ACTION> | 指定 action,比如 android.intent.action.VIEW |
-c <CATEGORY> | 指定 category,比如 android.intent.category.APP_CONTACTS |
-n <COMPONENT> | 指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity |
<INTENT> 里还能带数据,就像写代码时的 Bundle 一样:
参数 | 含义 |
---|---|
--esn <EXTRA_KEY> | null 值(只有 key 名) |
--es <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> | string 值 |
--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> | boolean 值 |
--ei <EXTRA_KEY> <EXTRA_INT_VALUE> | integer 值 |
--el <EXTRA_KEY> <EXTRA_LONG_VALUE> | long 值 |
--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> | float 值 |
--eu <EXTRA_KEY> <EXTRA_URI_VALUE> | URI |
--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE> | component name |
--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...] | integer 数组 |
--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...] | long 数组 |
启动应用/调起Activity
指定Activity名称启动
命令格式:
adb shell am start [options] <INTENT>
调起微信并传给它 string 数据键值对 toast - hello, world
。
不指定Activity名称启动(启动主Activity)
命令格式:
adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER 1
启动QQ
调起Service
命令格式:
adb shell am startservice [options] <INTENT>
例如:
调起微信的某Service
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
另外一个典型的用例是如果设备上原本应该显示虚拟按键但是没有显示,可以试试这个:
adb shell am startservice -n com.android.systemui/.SystemUIService
停止Service
命令格式:
adb shell am stopservice [options] <INTENT>
发送广播
命令格式:
adb shell am broadcast [options] <INTENT>
可以向所有组件广播,也可以向指定组件广播
例如,向所有组件广播:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
又例如,只向org.mazhuang.boottimemeasure/.BootCompletedReceiver
广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。
既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:
(均可使用adb触发)
action | 触发时机 |
---|---|
android.net.conn.CONNECTIVITY_CHANGE | 网络连接发生变化 |
android.intent.action.SCREEN_ON | 屏幕点亮 |
android.intent.action.SCREEN_OFF | 屏幕熄灭 |
android.intent.action.BATTERY_LOW | 电量低,会弹出电量低提示框 |
android.intent.action.BATTERY_OKAY | 电量恢复了 |
android.intent.action.BOOT_COMPLETED | 设备启动完毕 |
android.intent.action.DEVICE_STORAGE_LOW | 存储空间过低 |
android.intent.action.DEVICE_STORAGE_OK | 存储空间恢复 |
android.intent.action.PACKAGE_ADDED | 安装了新的应用 |
android.net.wifi.STATE_CHANGE | WiFi 连接状态发生变化 |
android.net.wifi.WIFI_STATE_CHANGED | WiFi 状态变为启用/关闭/正在启动/正在关闭/未知 |
android.intent.action.BATTERY_CHANGED | 电池电量发生变化 |
android.intent.action.INPUT_METHOD_CHANGED | 系统输入法发生变化 |
android.intent.action.ACTION_POWER_CONNECTED | 外部电源连接 |
android.intent.action.ACTION_POWER_DISCONNECTED | 外部电源断开连接 |
android.intent.action.DREAMING_STARTED | 系统开始休眠 |
android.intent.action.DREAMING_STOPPED | 系统停止休眠 |
android.intent.action.HEADSET_PLUG | 插入耳机 |
android.intent.action.MEDIA_UNMOUNTED | 卸载外部介质 |
android.intent.action.MEDIA_MOUNTED | 挂载外部介质 |
android.os.action.POWER_SAVE_MODE_CHANGED | 省电模式开启 |
强制停止应用
命令:
adb shell am force-stop <packagename>
命令示例:
收紧内存
adb shell am send-trim-memory <pid> <level>
pid: 进程 ID level: HIDDEN、RUNNING_MODERATE、BACKGROUND、 RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE
命令示例:
adb shell am send-trim-memory 12345 RUNNING_LOW
表示向 pid=12345 的进程,发出 level=RUNNING_LOW 的收紧内存命令。
修改设置
注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。
修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。
分辨率
adb shell wm size 480x1024
表示将分辨率修改为 480px * 1024px。
恢复:
adb shell wm size reset
屏幕密度
adb shell wm density 160
表示将屏幕密度修改为 160dpi。
恢复:
adb shell wm density reset
显示区域
adb shell wm overscan 0,0,0,200
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。
恢复:
adb shell wm overscan reset
关闭USB调试
adb shell settings put global adb_enabled 0
恢复:
用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。
去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。
允许/禁止访问非 SDK API:
不需要设备获得Root权限。
允许访问非 SDK API:
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
禁止访问非 SDK API
adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
命令最后的数字的含义:
值 | 含义 |
---|---|
0 | 禁止检测非 SDK 接口的调用。该情况下,日志记录功能被禁用,并且令 strict mode API,即 detectNonSdkApiUsage() 无效。不推荐。 |
1 | 仅警告——允许访问所有非 SDK 接口,但保留日志中的警告信息,可继续使用 strick mode API。 |
2 | 禁止调用深灰名单和黑名单中的接口。 |
3 | 禁止调用黑名单中的接口,但允许调用深灰名单中的接口。 |
实用功能
屏幕截图
注:未指定路径则,默认为adb所在的文件夹
截图保存到电脑:
adb exec-out screencap -p > sc.png
如果 adb 版本较老,无法使用 exec-out 命令,这时候建议更新 adb 版本。无法更新的话可以使用以下麻烦点的办法:
先截图保存到设备里:
adb shell screencap -p /sdcard/sc.png
然后将 png 文件导出到电脑:
adb pull /sdcard/sc.png
可以使用adb shell screencap -h
查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义:
参数 | 含义 |
---|---|
-p | 指定保存文件为 png 格式(如果指定文件后缀png,则可省略) |
-d display-id | 指定截图的显示屏编号(有多显示屏的情况下) |
录制屏幕
录制屏幕以mp4格式保存到 /sdcard:
adb shell screenrecord /sdcard/filename.mp4
需要停止时按 Ctrl-C
,默认录制时间和最长录制时间都是 180 秒。
如果需要导出到电脑:
adb pull /sdcard/filename.mp4
可以使用 adb shell screenrecord --help
查看 screenrecord 命令的帮助信息,下面是常见参数及含义:
参数 | 含义 |
---|---|
--size WIDTHxHEIGHT | 视频的尺寸,比如 1280x720,默认是屏幕分辨率。 |
--bit-rate RATE | 视频的比特率,默认是 4Mbps。 |
--time-limit TIME | 录制时长,单位秒。 |
--verbose | 输出更多信息。 |
开启/关闭wifi
开启
adb shell svc wifi enable
关闭
adb shell svc wifi disable
使用Monkey进行压力测试
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
简单用法:
adb shell monkey -p <packagename> -v 500
表示向 <packagename>
指定的应用程序发送 500 个伪随机事件。
更多内容可见monkey官网