目录

1 adb是什么

1.1 adb组成

1.2 adb运行原理

2 adb常用命令

2.1 adb基础语法

2.2 常用命令

2.3 模拟按键输入

2.4 无线连接

2.5 dumpsys使用

2.6 应用管理

2.7 与应用交互

2.8 top命令

2.9 Android日志查看

2.10 实用功能

2.11 其他

特别说明


PS:可以通过adb shell ls /system/bin/命令获取当前设备所支持的相关命令

1 adb是什么

adb的全称为Android Debug Bridge:android调试桥梁。

1.1 adb组成

adb是一个C/S架构的应用程序,由三部分组成:

A client(运行在pc端的adb client):命令行程序”adb”用于从shell或脚本中运行adb命令。首先,“adb”程序尝试定位主机上的ADB服务器,如果找不到ADB服务器,“adb”程序自动启动一个ADB服务器。接下来,当设备的adbd和pc端的adb server建立连接后,adb client就可以向ADB servcer发送服务请求;

A Server (运行在pc端的adb server):ADB Server是运行在主机上的一个后台进程。它的作用在于检测USB端口感知设备的连接和拔除,以及模拟器实例的启动或停止,ADB Server还需要将adb client的请求通过usb或者tcp的方式发送到对应的adbd上;

A demon (运行在设备端的常驻进程adb demon (adbd)):程序“adbd”作为一个后台进程在Android设备或模拟器系统中运行。它的作用是连接ADB服务器,并且为运行在主机上的客户端提供一些服务;

daemon程序意思守护进程。通常在系统后台长时间运行,由于没有控制终端而无法与前台交互,daemon程序一般作为系统服务使用。daemon是静态的,就是某一程序,daemon运行后会提供某种服务,服务是动态的,是程序运行产生的进程。通常说的Linux守护进程就是指daemon或者服务。daemon的名称通常为相应的服务后加上一个d。如cron服务的daemon为crond,http服务的daemon为httpd。

1.2 adb运行原理

adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。

2 adb常用命令

2.1 adb基础语法

adb [-d|-e|-s ]

参数说明:

-d    指定当前唯一通过 USB 连接的 Android 设备为命令目标

-e    指定当前唯一运行的模拟器为命令目标

-s     <serialNumber> 指定相应 serialNumber 号的设备/模拟器为命令目标

在多个设备/模拟器连接的情况下较常用的是 -s 参数,serialNumber 可以通过 adb devices 命令获取。其中无线连接的设备格式:10.129.164.6:5555,usb格式示例cf264b8f

2.2 常用命令

实现目标

详细命令

查看电脑连接设备

adb devices

导出图片

adb pull <设备里的文件路径> [电脑上的目录]

adb pull /sdcard/xxx.png .

导入文件到设备 

adb push <电脑上的文件路径> <设备里的目录>

adb push ~/sr.mp4 /sdcard/

获取屏幕分辨率

adb shell wm size

adb启动

启动 adb server 命令:adb start-server

一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起。)

指定adb server的网络端口:adb -P <port> start-server(默认端口5037)

adb停止

停止 adb server 命令:adb kill-server

查看adb版本信息

adb version

以root权限执行adbd

方法一:

adb shell

su

方法二:

adb root

正常输出:restarting adbd as root

恢复非root权限:adb unroot

安装应用apk 

adb install [-lrtsdg] <path_to_apk>

内部原理adb install 实际是分三步完成:

(1)push apk 文件到 /data/local/tmp。

(2)调用 pm install 安装。

(3)删除 /data/local/tmp 下的对应 apk 文件。

卸载应用apk 

adb uninstall [-k] <packagename>

<packagename> 表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录。

查看进程

adb shell ps

开启关闭wifi(需要root权限)

开启 WiFi:

adb root

adb shell svc wifi enable

2.3 模拟按键输入

(1)单个坐标

adb shell input tap <x> <y>

(2)焦点在文本框,输入文本

adb shell input text <string>

(3)滑动解锁

adb shell input swipe <x1> <y1> <x2> <y2>

(4)按键

adb shell input keyevent <keycode>

2.4 无线连接

方法一:借助ubs线

(1)将 Android 设备与要运行 adb 的电脑连接到同一个局域网

(2)将设备与电脑通过 USB 线连接

(3)让设备在 5555 端口监听 TCP/IP 连接:adb tcpip 5555

(4) 断开 USB 连接,「设置」-「关于手机」-「状态信息」-「IP地址」查看设备ip地址,连接:adb connect <device-ip-address>

(5)确认连接状态:adb devices,可以看到<device-ip-address>:5555 device

(6)断开无线连接:adb disconnect <device-ip-address>

方法二:不借助ubs线,需要 root 权限

(1)Android 设备上安装一个终端模拟器:Terminal Emulator for Android Downloads

(2)将 Android 设备与要运行 adb 的电脑连接到同一个局域网

(3)打开 Android 设备上的终端模拟器,在里面依次运行命令:

su
setprop service.adb.tcp.port 5555

(4)「设置」-「关于手机」-「状态信息」-「IP地址」找到ip地址,连接:adb connect <device-ip-address>

2.5 dumpsys使用

adb shell dumpsys,默认打印出当前系统所有service信息,在后面可加上具体的服务名需要列出当前运行的服务

(1)获取activity信息

adb shell dumpsys activity
加上-h可以获取帮助信息
获取当前处于前台的activity信息:
adb shell dumpsys activity activities
获取当前界面的UI信息,可以用:
adb shell dumpsys activity top
要获取当前界面的Activity:
adb shell dumpsys activity top | grep <activity>

(2)查看应用详细信息

adb shell dumpsys package <packagename>

(3)电池状况

adb shell dumpsys battery(可以获取到当前设备电量情况)

(4)获取设备分辨率

adb shell dumpsys display | grep DisplayDeviceInfo

(5)获取cpu信息

adb shell dumpsys cpuinfo

(6)获取内存信息

adb shell dumpsys meminfo
要获取具体应用的内存信息,可加上包名
adb shell dumpsys meminfo <packagename>

(7)获取package信息

adb shell dumpsys package
加上-h可以获取帮助信息
获取某个包的信息:
adb shell dumpsys package <pakagename>

(8)获取通知信息

adb shell dumpsys notification

(9)获取wifi信息

adb shell dumpsys wifi
可以获取到当前连接的wifi名、搜索到的wifi列表、wifi强度等

(10)获取电源管理信息

adb shell dumpsys power

(11)获取电话信息

adb shell dumpsys telephony.registry

更多命令参考:

2.6 应用管理

基本命令格式:

adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]

-s显示系统应用

-3显示第三方应用

grep 过滤指定字符串包名应用

显示所有应用:adb shell pm list packages

2.7 与应用交互

基础命令格式:

adb shell am <command>

command说明:

command

用途

start [options] <INTENT>

启动 <INTENT> 指定的 Activity

startservice [options] <INTENT>

启动 <INTENT> 指定的 Service

broadcast [options] <INTENT>

发送 <INTENT> 指定的广播

force-stop <packagename>

停止 <packagename> 相关的进程

intent示例:

参数

含义

-a <ACTION>

指定 action,比如 android.intent.action.VIEW

-c <CATEGORY>

指定 category,比如 android.intent.category.APP_CONTACTS

-n <COMPONENT>

指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity

实际使用示例:

调起activity
adb shell am start [options] <INTENT>
启动Activity
adb shell am start -n com.baidu.searchbox/com.baidu.searchbox.MainActivity
启动Activity并打开url
adb shell am start -n com.baidu.searchbox/com.baidu.searchbox.MainActivity -a android.intent.action.VIEW -d url
强制停止应用
adb shell am force-stop <packagename>
清除应用数据与缓存
adb shell pm clear <packagename>

2.8 top命令

top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。该命令可以按CPU使用、内存使用和执行时间对任务进行排序。

基础命令格式:

adb shell top -h
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [-t ] [ -h ]
    -m num  Maximum number of processes to display. 最多显示多少个进程
    -n num  Updates to show before exiting.  刷新次数 
    -d num  Seconds to wait between updates. 刷新间隔时间(默认5秒)
    -s col  Column to sort by (cpu,vss,rss,thr). 按哪列排序 
    -t      Show threads instead of processes. 显示线程信息而不是进程
    -h      Display this help screen.  显示帮助文档

作用:可获取CPU、VSS、RSS数据

CPU% 当前瞬时CPU占用率
VSS  Virtual Set Size  虚拟耗用内存(包含共享库占用的内存)
RSS  Resident Set Size 实际使用物理内存(包含共享库占用的内存)

经常用于Android端查看设备cpu和内存占用情况,监测单个应用,例如针对百度app的CPU占用率~

监测一次手百的CPU占用情况:

adb shell top -n 1 | grep com.baidu.searchbox

10秒刷新一次显示CPU占用情况:

adb shell top -d 10 | grep com.baidu.searchbox

实时监测微博的CPU占用情况:

adb shell top | grep com.baidu.searchbox

2.9 Android日志查看

Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。

命令格式:

adb logcat -h
Usage: logcat [options] [filterspecs]
options include:
  -s              Set default filter to silent. Equivalent to filterspec '*:S'
  -f <file>, --file=<file>               Log to file. Default is stdout
  -r <kbytes>, --rotate-kbytes=<kbytes>
                  Rotate log every kbytes. Requires -f option
  -n <count>, --rotate-count=<count>
                  Sets max number of rotated logs to <count>, default 4
  --id=<id>       If the signature id for logging to file changes, then clear
                  the fileset and continue
  -v <format>, --format=<format>
                  Sets log print format verb and adverbs, where <format> is:
                    brief help long process raw tag thread threadtime time
                  and individually flagged modifying adverbs can be added:
                    color descriptive epoch monotonic printable uid
                    usec UTC year zone
                  Multiple -v parameters or comma separated list of format and
                  format modifiers are allowed.
  -D, --dividers  Print dividers between each log buffer
  -c, --clear     Clear (flush) the entire log and exit
                  if Log to File specified, clear fileset instead
  -d              Dump the log and then exit (don't block)
  -e <expr>, --regex=<expr>
                  Only print lines where the log message matches <expr>
                  where <expr> is a Perl-compatible regular expression
  -m <count>, --max-count=<count>
                  Quit after printing <count> lines. This is meant to be
                  paired with --regex, but will work on its own.
  --print         Paired with --regex and --max-count to let content bypass
                  regex filter but still stop at number of matches.
  -t <count>      Print only the most recent <count> lines (implies -d)
  -t '<time>'     Print most recent lines since specified time (implies -d)
  -T <count>      Print only the most recent <count> lines (does not imply -d)
  -T '<time>'     Print most recent lines since specified time (not imply -d)
                  count is pure numerical, time is 'MM-DD hh:mm:ss.mmm...'
                  'YYYY-MM-DD hh:mm:ss.mmm...' or 'sssss.mmm...' format
  -g, --buffer-size                      Get the size of the ring buffer.
  -G <size>, --buffer-size=<size>
                  Set size of log ring buffer, may suffix with K or M.
  -L, --last      Dump logs from prior to last reboot
  -b <buffer>, --buffer=<buffer>         Request alternate ring buffer, 'main',
                  'system', 'radio', 'events', 'crash', 'default' or 'all'.
                  Additionally, 'kernel' for userdebug and eng builds, and
                  'security' for Device Owner installations.
                  Multiple -b parameters or comma separated list of buffers are
                  allowed. Buffers interleaved. Default -b main,system,crash.
  -B, --binary    Output the log in binary.
  -S, --statistics                       Output statistics.
  -p, --prune     Print prune white and ~black list. Service is specified as
                  UID, UID/PID or /PID. Weighed for quicker pruning if prefix
                  with ~, otherwise weighed for longevity if unadorned. All
                  other pruning activity is oldest first. Special case ~!
                  represents an automatic quicker pruning for the noisiest
                  UID as determined by the current statistics.
  -P '<list> ...', --prune='<list> ...'
                  Set prune white and ~black list, using same format as
                  listed above. Must be quoted.
  --pid=<pid>     Only prints logs from the given pid.
  --wrap          Sleep for 2 hours or when buffer about to wrap whichever
                  comes first. Improves efficiency of polling by providing
                  an about-to-wrap wakeup.

filterspecs are a series of
  <tag>[:priority]

where <tag> is a log component tag (or * for all) and priority is:
  V    Verbose (default for <tag>)
  D    Debug (default for '*')
  I    Info
  W    Warn
  E    Error
  F    Fatal
  S    Silent (suppress all output)

使用示例:adb logcat *:W

Android 的日志分为如下几个优先级(priority):

  1. V —— Verbose(最低,输出得最多)
  2. D —— Debug I —— Info
  3. W —— Warning
  4. E —— Error
  5. F—— Fatal
  6. S —— Silent(最高,啥也不输出)

日志格式:

adb logcat -v <format>

Format示例如下:

1. brief—— <priority>/<tag>(<pid>): <message>
2. process—— <priority>(<pid>) <message>
3. tag—— <priority>/<tag>: <message>
4. raw—— <message>
5. time—— <datetime> <priority>/<tag>(<pid>): <message>
6. threadtime—— <datetime> <pid> <tid> <priority> <tag>: <message>
7. long—— [ <datetime> <pid>:<tid> <priority>/<tag> ]  <message>

清除日志:adb logcat -c

2.10 实用功能

(1)屏幕截图

截图保存到电脑:

adb exec-out screencap -p > sc.png

截图保存到设备:

adb shell screencap -p /sdcard/sc.png

-p参数:指定保存文件为 png 格式

(2)录制屏幕

录制屏幕以mp4格式保存到/sdcard(默认录制时间和最长录制时间都是180秒):

adb shell screenrecord /sdcard/filename.mp4

(3)刷机相关命令

重启手机:adb reboot

重启到Recovery模式:adb shell recovery

重启到 Fastboot 模式:adb reboot bootloader

通过 sideload 更新系统:adb sideload <path-to-update.zip>

(4)使用Monkey进行压力测试

Monkey可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试

基础命令格式:

adb shell monkey -c <main-category>  <event-count>

详细参数说明:

基本参数

说明

-p <allowed-package-name>

指定一个或多个包

-s <seed>

指定一个随机数生成器的seed值

--throttle <milliseconds>

指定事件之间的固定延迟(ms)

-v

指定反馈信息级别(信息级别就是日志的详细程度)

-c <main-category>

指定一个或多个类别名

-f <scriptfile>

运行指定的monkey脚本

事件参数

说明

--pct-touch <percent>

指定触摸事件百分比

--pct-motion <percent>

指定动作事件百分比

--pct-trackball <percent>

指定轨迹事件百分比

--pct-syskeys <percent>

指定系统按键事件百分比

--pct-nav <percent>

指定基本导航事件百分比

--pct-majornav <percent>

指定主要导航事件百分比

--pct-appswitch <percent>

指定应用启动事件百分比

--pct-flip <percent>

指定flip(弹)事件的百分比

--pct-anyevent <percent>

指定其他类型事件百分比

--pct-pinchzoom <percent>

指定缩放(捏)事件百分比

--pct-permission <percent>

指定权限许可事件百分比

禁止命令:adb shell settings put global policy_control immersive.full=*为防止执行向下滑动的命令时,容易打开通知栏,进行其他无关操作,我们需要在执行monkey命令之前,先执行禁用通知栏的命令

解禁命令:adb shell settings put global policy_control null

monkey使用示例

adb shell monkey -p com.xiaomi.sc -v -v -v --throttle 200 -s 1 --ignore-crashes --ignore-timeouts --ignore-native-crashes --pct-touch 30 100000 2>/Users/admin/Desktop/error.txt 1>/Users/admin/Desktop/info.txt

参数说明如下:

参数

说明

-p com.xiaomi.sc

测试app对象包名

-v -v -v

打印日志level0:-v 缺省值,仅提供启动结束信息level1:-v -v 表示打印较详细日志,包括发送到activity的信息level2:-v -v -v 表示打印最详细日志,包括测试未选中的activity信息

--throttle 200

事件之间间隔200ms

-s 1    

伪随机数生成器,seed值为1,相同seed值再次执行monkey将产生相同的时间序列

--ignore-crashes    

忽略应用程序崩溃,继续发送执行事件直到事件数执行完成

--ignore-timeouts   

忽略应用程序发生的anr错误,直到事件数执行完成

--ignore-native-crashes 

忽略android native-code引起的崩溃,直到事件数执行完成

--pct-touch 30  

指定触摸事件占比30%

100000

执行100000次事件

2>/Users/admin/Desktop/error.txt  

level2错误日志保存到桌面的error.txt文件

1>/Users/admin/Desktop/info.txt 

level1信息日志保存到桌面的info.txt文件

monkey日志抓取

  • 保存在PC中:
adb shell monkey [option] <count> > d:\monkey.txt
  • 保存在手机中:
adb shell monkey [option] <count> > /mnt/sdcard/monkey.txt  // 日志会保存在手机SD卡上的一个monkey.txt文件中
  • 标注流与错误留分开保存:
Monkey [option] <count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt // Monkey 的运行日志和异常日志被开保存

monkey日志分析

  • 程序无响应的情况:搜索关键字 ANR
  • 进入 adb shell: adb shell
  • 进入 anr 目录: cd data/anr
  • 查看 traces.txt
  • 提取 traces.txt 文件: adb pull /data/anr/traces.txt
  • 崩溃、闪退的情况 1:搜索关键字 CRASH
  • 崩溃、闪退的情况 2:搜索关键字 Exception
  • 内存溢出的情况:搜索关键字 OOM
  • 测试成功的情况:搜索关键字 Monkey finished

2.11 其他

内核日志:adb shell dmesg

查看设备信息:adb shell getprop

查看设备信息型号:adb shell getprop ro.product.model

android系统版本:adb shell getprop ro.build.version.release

CPU信息:adb shell cat /proc/cpuinfo

内存信息:adb shell cat /proc/meminfo


特别说明

本文整合自网络,仅供学习使用!