adb
adb logcat
adb shell dumpsys
adb shell monkey
Android 调试桥 (adb)
adb 官方文档
Android 调试桥 (adb)(需翻墙)
什么是 adb
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。
它是一种客户端 - 服务器程序,包括以下三个组件:
- 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令来从命令行终端调用客户端,即电脑上的命令行终端
- 守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行,即手机上运行的后台进程 adbd
- 服务器:管理客户端和守护进程之间的通信。服务器在开发机器上作为后台进程运行,即电脑上运行的后台 adb 进程
adb 工作原理
- 当启动某个 adb 客户端时,客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令,所有 adb 客户端均通过端口 5037 与 adb 服务器通信
$ adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
FJH5T18A10012174 device
# 查看电脑上5037端口的占用的进程PID
$ netstat -ano | grep 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 19384
# 查看该进程的名称
$ tasklist | grep 19384
adb.exe 19384 Console 2 9,432 K
# 查看设备上的adbd后台进程
$ adb shell ps -ef | grep adbd
shell 8859 1 0 15:50:20 ? 00:00:00 adbd --root_seclabel=u:r:su:s
- 然后服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器 / 设备。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接
- 请注意,每个模拟器 / 设备都使用一对按顺序排列的端口,偶数端口用来响应控制台的连接,奇数端口用来响应 adb 连接
常用命令
具体参数请参考官方文档或 adb --help
- adb 设备相关
- adb tcpip
- adb connect <device_ip_addr>
- adb kill-server
- adb start-server
- adb devices -l
# adb connect 连接手机(手机与电脑在同一网络下)
# 查看手机的ip:设置-系统-关于手机-状态信息(华为手机)192.168.2.8
# 手机先用线连接,adb connect后就可以拔掉了
# 默认端口是5555
$ adb tcpip 5557
restarting in TCP mode port: 5557
$ adb connect 192.168.2.8:5557
connected to 192.168.2.8:5557
# 拔掉手机后
$ adb devices
List of devices attached
192.168.2.8:5557 device
# 断开连接
$ adb disconnect 192.168.2.8:5557
- adb install/uninstall
- adb install <path_to_apk>
- adb uninstall <package_name>
- adb pull/push
- adb pull :从设备复制文件到本地
- adb push :从本地复制文件到设备
- adb shell
-
adb shell <shell_command> : <shell_command > 大多数常见的 Unix 命令
- adb shell ls /system/bin:查看可用的命令
$ adb shell ls /system/bin acpi am app_process app_process32 app_process64 applypatch appops appwidget atrace awk .....
-
adb shell -P 5037 getprop ro.build.version.release : 获取安卓系统版本
-
am:(activity manager) 模拟各种系统的行为,如去启动一个 activity,强制停止进程,发送广播进程,修改设备屏幕属性等
# 如启动应用 # -W:等待启动完成, -S:在启动Activity前强行停止目标应用 $ adb shell am start -W -n com.android.dazhihui/.dzh.dzh -S Stopping: com.android.dazhihui Starting: Intent { cmp=com.android.dazhihui/.dzh.dzh } Status: ok Activity: com.android.dazhihui/.dzh.dzh ThisTime: 435 TotalTime: 435 WaitTime: 460 Complete
- pm:(package manager) 对设备上安装的应用软件包执行操作和查询,授权
# 1. clear <package_name> 删除与软件包关联的所有数据 $ adb shell pm clear com.android.dazhihui Success # 2. 查看设备上安装应用的包名 $ adb shell pm list packages|grep dazhihui package:com.android.dazhihui
app授权
需要的权限,可以由adb shell dumpsys package com.android.dazhihui获取,权限信息包含在其中
# 3. 给app授权 adb shell pm grant com.android.dazhihui android.permission.READ_EXTERNAL_STORAGE adb shell pm grant com.android.dazhihui android.permission.READ_PHONE_STATE adb shell pm grant com.android.dazhihui android.permission.WRITE_EXTERNAL_STORAGE adb shell pm grant com.android.dazhihui android.permission.RECORD_AUDIO adb shell pm grant com.android.dazhihui android.permission.CAMERA
获取对应包的版本
adb shell pm dump com.android.dazhihui | grep "versionName"
- ime:输入法相关
# 1. 获取手机上输入法列表 $ adb shell ime list -s com.baidu.input_huawei/.ImeService com.iflytek.inputmethod.google/com.iflytek.inputmethod.FlyIME com.android.adbkeyboard/.AdbIME # 2. 激活输入法 $ adb shell ime enable com.android.adbkeyboard/.AdbIME Input method com.android.adbkeyboard/.AdbIME: already enabled # 3. 设置输入法 $ adb shell ime set com.android.adbkeyboard/.AdbIME Input method com.android.adbkeyboard/.AdbIME selected
adb logcat
Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及应用中使用 Log 类写入的消息
adb logcat 官方文档
常用命令
- adb logcat --help:获取帮助
- 也可借助 android studio 查看logcat,对logcat进行一定的过滤等操作
- adb logcat | grep -i displayed:可以用于查看 app 的入口
# 执行如下命令并启动app,如大智慧的app的入口即为.dzh.dzh $ adb logcat| grep -i displayed 03-29 22:11:20.774 1204 1599 V WindowManager: Check opening app=AppWindowToken{8789c05 token=Token{e2cb7c ActivityRecord{b58c26f u0 com.android.dazhihui/.dzh.dzh t11110}}}: allDrawn=false startingDisplayed=true startingMoved=false isRelaunching()=false startingWindow=Window{e9499fe u0 Splash Screen com.android.dazhihui} 03-29 22:11:21.392 1204 1367 D ActivityManager: EVENT_APP_ACTIVITY_DISPLAYED_FINISH reportData: com.android.dazhihui/.dzh.dzh 26024 662
adb shell dumpsys
可提供有关系统服务的信息,获取在连接的设备上运行的所有系统服务的诊断输出
dumpsys 官方文档
常用命令
- adb shell dumpsys | grep -i DUMP:获取所有的 dumpsys 子命令
- adb shell dumpsys activity top:获取当前 activity
- adb shell dumpsys package com.android.dazhihui:获取特定包基本信息,其中包含权限信息
- adb shell dumpsys window :获取当前窗口信息
- adb shell dumpsys notification:获取系统通知
- adb shell dumpsys meminfo com.android.settings:获得内存信息
- adb shell dumpsys cpuinfo:获取 cpu 信息
- adb shell dumpsys gfxinfo com.android.settings:获取 gpu 绘制分析
- adb shell dumpsys activity broadcasts | grep senderName=:获取短信
$ adb shell dumpsys window | grep mCurrent
mCurrentAppOrientation=SCREEN_ORIENTATION_PORTRAIT
mCurrentRotation=ROTATION_0
mCurrentUserId=0
mCurrent=[0,88][1080,2340]
mCurrentFocus=Window{fa9a454 u0 com.android.dazhihui/com.android.dazhihui.ui.screen.stock.MainScreen}
$ adb shell dumpsys window w | grep / | grep name=
mSurface=Surface(name=PointerLocation)/@0x28b88fb
mSurface=Surface(name=GestureNavBottom)/@0x97c00b0
mSurface=Surface(name=GestureNavRight)/@0xa221b29
mSurface=Surface(name=GestureNavLeft)/@0xf823eae
mAnimationIsEntrance=true mSurface=Surface(name=StatusBar)/@0xce4e222
mSurface=Surface(name=com.android.dazhihui/com.android.dazhihui.ui.screen.stock.MainScreen)/@0x221e44f
mSurface=Surface(name=com.android.systemui.HwImageWallpaper)/@0x96bf634
$ adb shell dumpsys window w | grep mCurrent
mCurrentFocus=Window{1bd5097 u0 com.tencent.mm/com.tencent.mm.ui.chatting.ChattingUI}
$ adb shell dumpsys package com.android.dazhihui>d:/apkinfo.txt
# 其中就包含包相关的权限信息,便于进一步写app授予权限命令
.....
declared permissions:
com.android.dazhihui.permission.RECEIVE_MSG: prot=signature, INSTALLED
com.android.dazhihui.permission.MIPUSH_RECEIVE: prot=signature, INSTALLED
com.android.dazhihui.permission.PROCESS_PUSH_MSG: prot=signature|privileged, INSTALLED
requested permissions:
android.permission.FOREGROUND_SERVICE
android.permission.RECEIVE_SMS
android.permission.GET_TASKS
.....
adb shell monkey
monkey 官方文档
什么是 monkey
Monkey 是一个在模拟器或设备上运行的程序,可生成伪随机用户事件(例如点击、轻触或手势)流以及很多系统级事件。您可以使用 Monkey 以随机且可重复的方式对正在开发的应用进行压力测试 (You can use the Monkey to stress-test applications that you are developing, in a random yet repeatable manner.)
示例及几个参数说明
-v:日志级别即详细程度
-s :伪随机数生成器的种子值。如果您使用相同的种子值重新运行 Monkey,它将会生成相同的事件序列
--throttle :在事件之间插入固定的延迟时间。您可以使用此选项减慢 Monkey 速度。 如果未指定,则不延迟,系统会尽快地生成事件
--pct-touch :调整轻触事件所占百分比(轻触事件是指屏幕上的单个位置上的按下 / 释放事件)
--pct-motion :调整动作事件所占百分比(动作事件包括屏幕上某个位置的按下事件,一系列伪随机动作和一个释放事件)
--ignore-crashes 通常,当应用崩溃或遇到任何类型的未处理异常时,Monkey 将会停止。如果您指定此选项,Monkey 会继续向系统发送事件,直到计数完成为止
--ignore-timeouts 通常情况下,如果应用遇到任何类型的超时错误(例如 “应用无响应” 对话框),Monkey 将会停止。如果您指定此选项,Monkey 会继续向系统发送事件,直到计数完成为止
# 一个简单示例
adb -s 44a188f9 shell monkey -p com.android.dazhihui --throttle 500 --ignore-crashes --ignore-timeouts -s 20 -v -v -v 1000 > D:\monkey.log
强制中断 monkey 执行
$ adb shell ps | grep monkey
shell 2763 2420 4135112 56612 futex_wait_queue_me 0 S com.android.commands.monkey
$ adb shell kill 2763
扩展阅读
monkey 用法总结
awesome-adb(墙裂推荐)