adb
adb logcat
adb shell dumpsys
adb shell monkey

Android 调试桥 (adb)


adb 官方文档

Android 调试桥 (adb)(需翻墙)

什么是 adb

Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。
它是一种客户端 - 服务器程序,包括以下三个组件:

  • 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令来从命令行终端调用客户端,即电脑上的命令行终端
  • 守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行,即手机上运行的后台进程 adbd
  • 服务器:管理客户端和守护进程之间的通信。服务器在开发机器上作为后台进程运行,即电脑上运行的后台 adb 进程

adb 工作原理

  1. 当启动某个 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  
  1. 然后服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器 / 设备。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接
  2. 请注意,每个模拟器 / 设备都使用一对按顺序排列的端口,偶数端口用来响应控制台的连接,奇数端口用来响应 adb 连接

常用命令

具体参数请参考官方文档或 adb --help

  1. 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

  1. adb install/uninstall
  • adb install <path_to_apk>
  • adb uninstall <package_name>
  1. adb pull/push
  • adb pull :从设备复制文件到本地
  • adb push :从本地复制文件到设备
  1. 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 官方文档

常用命令

  1. adb logcat --help:获取帮助
  2. 也可借助 android studio 查看logcat,对logcat进行一定的过滤等操作
  3. 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 官方文档

dumpsys 官方文档

常用命令

  1. adb shell dumpsys | grep -i DUMP:获取所有的 dumpsys 子命令
  2. adb shell dumpsys activity top:获取当前 activity
  3. adb shell dumpsys package com.android.dazhihui:获取特定包基本信息,其中包含权限信息
  4. adb shell dumpsys window :获取当前窗口信息
  5. adb shell dumpsys notification:获取系统通知
  6. adb shell dumpsys meminfo com.android.settings:获得内存信息
  7. adb shell dumpsys cpuinfo:获取 cpu 信息
  8. adb shell dumpsys gfxinfo com.android.settings:获取 gpu 绘制分析
  9. 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 是一个在模拟器或设备上运行的程序,可生成伪随机用户事件(例如点击、轻触或手势)流以及很多系统级事件。您可以使用 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(墙裂推荐)

参考