ADB (Android Debug Bridge)常用命令

ADB (Android Debug Bridge)

概述

Android中Adb源码

adb 源码分析: 待补充

ADB实现解析
Android adb实现原理

说明:下面一些命令需要有root权限才能执行成功
Windows环境下的adb
快速启动dos窗口执行adb:
1. adb.exe所在路径添加到系统环境变量中
2. 配置快捷键启动dos
进入C:\WINDOWS\system32目录下,找到cmd.exe.
右击菜单 “发送到” -> 桌面快捷方式。
在桌面上右击”快捷方式 到 cmd.exe” -> “属性” -> “快捷方式”页
-> 光标高亮”快捷键” -> 按下自定义快捷键 (如:Ctrl + Alt + Z)

任何情况下,按下Ctrl + Alt + Z启动dos窗口就可以执行adb命令了

查看设备连接状态 系列

1
2
3
adb get-serialno 获取设备的ID和序列号serialNumber  
adb devices 查询当前计算机上连接那些设备(包括模拟器和手机),输出格式: \[serialNumber\] \[state\]
adb get-state 查看模拟器/设施的当前状态.

说明:
序列号[serialNumber]——由adb创建的一个字符串,这个字符串通过自己的控制端口-
唯一地识别一个模拟器/设备实例。一个序列号的例子: emulator-5554

发送命令到设备 系列

1
2
3
4
adb \[-d|-e|-s \]  
-d 发送命令给usb连接的设备
-e 发送命令到模拟器设备
-s 发送命令到指定设备

如启动手机设备shell: adb -d shell

adb forward 发布端口,可以设置任意的端口号,
做为主机向模拟器或设备的请求端口。如:adb forward tcp:5555 tcp:8000

1
2
3
4
5
6
7
8
9
10
adb reboot 重启手机  
adb remount 将system分区重新挂载为可读写分区
adb kill-server 终止adb服务进程
adb start-server 重启adb服务进程
adb root 已root权限重启adb服务
adb wait-for-device 在模拟器/设备连接之前把命令转载在adb的命令器中
adb jdwp 查看指定的设施的可用的JDWP信息. Java Debug Wire Protocol (JDWP, Java调试线协议)是
可以用 forward jdwp: 端口映射信息来连接指定的JDWP进程.例如:
adb forward tcp:8000 jdwp:472
jdb -attach localhost:8000

adb shell am 系列

am命令可以启动应用程序
adb shell am start [options]
作用:启动一个activity
举例:adb shell am start -a com.lt.test.action.SECOND
举例:adb shell am start -n com.lt.test/.MyActivity

adb shell am startservice [options]
作用:启动一个service
举例:adb shell am startservice -a com.lt.test.action.ONESERVICE
举例:adb shell am startservice -n com.lt.test/.MyService

adb shell am force-stop
作用:强制关闭一个应用程序
举例:adb shell am force-stop com.lt.test

adb shell am broadcast [options]
作用:发送一个广播
举例:adb shell am broadcast -a “action_finish” (发送一个广播去关闭一个activity)
举例:adb shell am broadcast -a android.intent.action.MASTER_CLEAR(恢复出厂设置的方法,会清除内存所有内容)
举例:adb shell am broadcast -n com.lt.test/.MyBroadcast

adb shell pm 系列

adb shell pm list packages [options]
作用:列举出所有包含的package
举例:adb shell pm list packages com.lt
说明:[options]与参见 http://developer.android.com/tools/help/adb.html#pm

adb shell input 系列

adb shell input text 向设备输入文本(光标所在的文本框)
adb shell input keyevent 向设备发送按键事件
如:
在编辑短信时,往文本框输入文本:adb shell input text “hello”
向手机发送键值回Home:adb shell input keyevent 3

1
2
3
4
5
6
7
event\_code 参考view/KeyEvent.java中的 KEYCODE\_*  
public static final int KEYCODE\_SOFT\_LEFT = 1;
public static final int KEYCODE\_SOFT\_RIGHT = 2;
public static final int KEYCODE_HOME = 3;
public static final int KEYCODE_BACK = 4;
public static final int KEYCODE_CALL = 5;
public static final int KEYCODE_ENDCALL = 6;

adb shell install 系列

安装卸载 系列

1
2
3
4
5
adb install \[-l\] \[-r\] - push this package file to the device and install it  
(‘-l’ means forward-lock the app)
(‘-r’ means reinstall the app, keeping its data)
adb uninstall \[-k\] - remove this app package from the device
(‘-k’ means keep the data and cache directories)

如:
adb shell -r install d:\hello.apk
adb shell unstall com.huawei.hello
说明:如果带-r选项重新安装apk时,安装在 /data/local/tmp/目录下,手机重启后还是使用原来的apk.

文件操作 系列

1
2
adb push - copy file/dir to device  
adb pull - copy file/dir from device

基本linux shell命令 系列

adb shell [command]

1
2
3
4
5
6
7
8
9
10
ls 列出目录下的文件和文件夹  
cd 切换目录
rm 删除目录和文件
cat 查看文件内容
ps 可以看那个进程再跑
ps -x \[PID\] 查看单个进程的状态
top 可以看那个进程的占用率最高
su 切换到root用户
kill \[pid\] 杀死一个进程
chmod 777 修改该文件为可执行权限

从framework/base/cmds中查到的一些常用的命令:

1
2
3
4
5
6
adb shell am stack list 列出AM堆栈信息
adb shell appops 应用权限授权管理框架,可以使用AppOps将其某项强制要求权限忽略掉
adb shell appwidget 主要是设置apk是否有放在窗口的权限
adb shell bmgr 备份用
adb shell content
adb shell dpm

  1. 打印某个进程中所有线程的backtrace
    1
    adb shell debuggerd -b pid

用于分析死锁

  1. 打印系统所有注册的服务
    1
    adb shell service list

用于查看service是否注册成功

  1. 查看某个应用时32位还是64位
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    adb shell ps --api
    ```

    详细使用情况可以登录一台Linux服务器在shell下查看帮助手册, man

    # 查看系统状态和信息 系列
    ``` bash
    adb shell procrank 查询各进程内存使用情况
    adb shell service list 查看services信息
    adb shell cat /proc/meminfo 查看当前的内存情况
    adb shell cat /proc/cpuinfo 查看CPU信息(硬件)
    adb shell cat /proc/iomem 查看IO内存分区

    adb shell getprop 列出系统所有属性
    adb shell getprop | findstr “gsm” 列出包含gsm的属性
    adb shell setprop 修改系统属性

    adb shell sqlite3 可以执行sql语句查看数据库信息, 具体使用情况待调查

    adb shell dmesg 查询内核缓冲区信息
    adb shell dumpstate 各类信息,比如进程信息,内存信息,进程是否异常,kernnel的log
    adb shell dumpcrash
    adb shell dumpsys 查询所有service的状态

获取屏幕大小和密度

1
2
获取屏幕大小adb shell wm size
获取屏幕密度adb shell wm density

adb shell dumpsys 系列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
adb shell dumpsys activity top //查看当前运行Activity信息
adb shell dumpsys package [pkgname] //查看指定包名应用详细信息,相当于AndroidManifest.xml中的内容
adb shell dumpsys meminfo [pname/pid] //查看指定进程名或者进程id的内存信息
adb shell dumpsys dbinfo [pkgname] //查看指定包名应用的数据库调用信息
adb shell dumpstate 各类信息,比如进程信息,内存信息,进程是否异常,kernnel的log
adb shell dumpcrash 不能用
adb shell dumpsys 列出所有的dump信息
adb shell dumpsys | grep "DUMP OF SERVICE" 列出所有dumpsys支持的命令
adb shell dumpsys service 不能用
adb shell dumpsys service list 不能用
adb shell service list 列出所有服务

adb shell dumpsys activity
adb shell dumpsys window
adb shell dumpsys cpuinfo
adb shell dumpsys battery
adb shell dumpsys package 里面有userId
adb shell dumpsys package -h
adb shell dumpsys activity –h

adb shell 截屏和录屏

1
2
adb shell screencap -p /sdcard/1.png  //截图保存
adb shell screenrecord /sdcard/1.mp4 //录屏保存

Log 系列

adb logcat [ ] - View device log

查看可用日志缓冲区:

1
2
3
4
adb logcat -s tag // 查看tag的日志
adb logcat -b radio — 查看缓冲区的相关的信息.
adb logcat -b events — 查看和事件相关的的缓冲区.
adb logcat -b main — 查看主要的日志缓冲区
1
2
adb logcat -v threadtime
adb logcat -v time

过滤日志输出:

过滤器语句按照下面的格式描tag:priority … , tag 表示是标签, priority 是表示标签的报告的最低等级
adb logcat *:W 显示优先级为warning或更高的日志信息
adb logcat ActivityManager:I MyApp:D *:S

日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就是查看系统的标签).
优先级有下列集中,是按照从低到高顺利排列的:

1
2
3
4
5
6
7
V — Verbose (lowest priority)  
D — Debug
I — Info
W — Warning
E — Error
F — Fatal
S — Silent (highest priority, on which nothing is ever printed)

如果你电脑上运行logcat ,相比在远程adb shell端,你还可以为环境变量ANDROID_LOG_TAGS :输入一个参数来设置默认的过滤
export ANDROID_LOG_TAGS=”ActivityManager:I MyApp:D *:S”
需要注意的是ANDROID_LOG_TAGS 过滤器如果通过远程shell运行logcat 或用adb shell logcat 来运行模拟器/设备不能输出日志.

控制日志输出格式:

日志信息包括了许多元数据域包括标签和优先级。可以修改日志的输出格式,所以可以显示出特定的元数据域。可以通过 -v 选项得到格式化输出日志的相关信息.

1
2
3
4
5
6
7
brief — Display priority/tag and PID of originating process (the default format).  
process — Display PID only.
tag — Display the priority/tag only.
thread — Display process:thread and priority/tag only.
raw — Display the raw log message, with no other metadata fields.
time — Display the date, invocation time, priority/tag, and PID of the originating process.
long — Display all metadata fields and separate messages with a blank lines.

当启动了logcat ,你可以通过-v 选项来指定输出格式:

[adb] logcat [-v ]
下面是用 thread 来产生的日志格式:

1
adb logcat -v thread

需要注意的是你只能-v 选项来规定输出格式 option.

Logcat命令列表

1
2
3
4
5
6
7
8
9
-b 加载一个可使用的日志缓冲区供查看,比如event 和radio . 默认值是main 。具体查看Viewing Alternative Log Buffers.  
-c 清楚屏幕上的日志.
-d 输出日志到屏幕上.
-f 指定输出日志信息的 ,默认是stdout .
-g 输出指定的日志缓冲区,输出后退出.
-n 设置日志的最大数目 .,默认值是4,需要和 -r 选项一起使用。
-r 每 时输出日志,默认值为16,需要和-f 选项一起使用.
-s 设置默认的过滤级别为silent.
-v 设置日志输入格式,默认的是brief 格式,要知道更多的支持的格式,参看Controlling Log Output Format
1
2
adb bugreport - return all information from the device  
that should be included in a bug report.

———–其他 ———–

模拟器使用镜像sdcard
用SDK里的mksdcard工具来创建FAT32磁盘镜像并在模拟器启动时加载它。这样创建镜像:? mksdcard ,
比如我要创建一个64M的SD卡模拟文件,文件路径是在D:\workspace\sdcard.img
mksdcard 64000000 D:\workspace\sdcard.img

Emulator –sdcard D:\workspace\sdcard.img
或者在eclipse的run菜单的open run dialog对话框中配置启动参数。

adb shell top 系列

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Usage: top \[ -m max\_procs \] \[ -n iterations \] \[ -d delay \] \[ -s sort\_column \] \[ -t \] \[ -h \]  
-m num Maximum number of processes to display. //最多显示m个进程
-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. //显示帮助文档

**_*****_** simple selection **_*_** **_*****_** selection by list **_*_**
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE – DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
**_*****_** output format **_******_** **_\*\*\*_** long options **_*****_**
-o,o user-defined -f full –Group –User –pid –cols –ppid
-j,j job control s signal –group –user –sid –rows –info
-O,O preloaded -o v virtual memory –cumulative –format –deselect
-l,l long u user-oriented –sort –tty –forest –version
-F extra full X registers –heading –no-heading –context
**_*****_** misc options **_*_**
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> adb shell top

User 13%, System 5%, IOW 0%, IRQ 0%
User 85 + Nice 0 + Sys 37 + Idle 509 + IOW 0 + IRQ 0 + SIRQ 0 = 631 //第一组数据

PID PR CPU% S #THR VSS RSS PCY UID Name //第二组数据
22205 0 13% S 56 423416K 88160K fg u0_a92 com.tmall.wireless
24310 1 2% R 1 1232K 536K root top
22600 0 1% S 46 341712K 40872K fg u0_a90 com.wandoujia.phoenix2.usbproxy
31125 1 1% S 31 319976K 33284K fg u0_a74 com.android.Chinpower
1533 0 1% S 32 67320K 20552K fg system /system/bin/surfaceflinger
1852 0 1% S 112 445876K 80304K fg system system_server
...
10 0 0% S 1 0K 0K root watchdog/0
16 1 0% S 1 0K 0K root khelper
22 1 0% S 1 0K 0K root suspend_sys_syn
23 1 0% S 1 0K 0K root suspend

第一组数据的含义:

1
2
3
4
5
6
7
User  处于用户态的运行时间,不包含优先值为负进程 
Nice 优先值为负的进程所占用的CPU时间
Sys 处于核心态的运行时间
Idle 除IO等待时间以外的其它等待时间
IOW IO等待时间
IRQ 硬中断时间
SIRQ 软中断时间

第二组数据的含义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PID   进程id
PR 优先级
CPU% 当前瞬时CPU占用率
S 进程状态:D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程
#THR 程序当前所用的线程数
VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY 调度策略优先级,SP_BACKGROUND/SP_FOREGROUND
UID 进程所有者的用户id
Name 进程的名称
PID 进程id
PR 优先级
CPU% 当前瞬时CPU占用率
S 进程状态:D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程
#THR 程序当前所用的线程数
VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY 调度策略优先级,SP_BACKGROUND/SP_FOREGROUND
UID 进程所有者的用户id
Name 进程的名称

1
2
3
4
5
adb shell procrank 查询各进程内存使用情况
adb shell service list 查看services信息
adb shell cat /proc/meminfo 查看当前的内存情况
adb shell cat /proc/cpuinfo 查看CPU信息(硬件)
adb shell cat /proc/iomem 查看IO内存分区

prop属性相关

1
2
3
4
查看build.prop文件中变量值 adb shell getprop xxx
adb shell getprop 列出系统所有属性
adb shell getprop | findstr "gsm" 列出包含gsm的属性
adb shell setprop <key> <value> 修改系统属性

查看数据库信息

adb shell sqlite3 可以执行sql语句查看数据库信息
sqlite3 /data/data/com.android.providers.settings/databases/settings.db
查询某个数据库中的所有表
sqlite> .tables
sqlite> .help 可以查看帮助
在adb shell中直接使用sqlite3命令操作数据库

adb shell netstat 网络相关

adb shell netstat //查看设备的端口号
adb shell netcfg //查看设备的IP地址

netstat -ano 查看网络连状态
显示协议统计信息和当前 TCP/IP 网络连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
NETSTAT \[-a\] \[-b\] \[-e\] \[-n\] \[-o\] \[-p proto\] \[-r\] \[-s\] \[-v\] \[interval\]
```
``` bash
-a 显示所有连接和监听端口。
-b 显示包含于创建每个连接或监听端口的可执行组件。在某些情况下已知可执行组件拥有多个独立组件,并且在这些情况下包含于创建连接或监听端口的组件序列被显示。这种情况下,可执行组件名
在底部的 \[\] 中,顶部是其调用的组件,等等,直到 TCP/IP 部分。注意此选项 可能需要很长时间,如果没有足够权限可能失败。
-e 显示以太网统计信息。此选项可以与 -s 选项组合使用。
-n 以数字形式显示地址和端口号。
-o 显示与每个连接相关的所属进程 ID。
-p proto 显示 proto 指定的协议的连接;proto 可以是
下列协议之一: TCP、UDP、TCPv6 或 UDPv6。
如果与 -s 选项一起使用以显示按协议统计信息,proto 可以是下列协议之一:
IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
-r 显示路由表。
-s 显示按协议统计信息。默认地,显示 IP、
IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息;
-p 选项用于指定默认情况的子集。
-v 与 -b 选项一起使用时将显示包含于
为所有可执行组件创建连接或监听端口的
组件。
interval 重新显示选定统计信息,每次显示之间
暂停时间间隔(以秒计)。按 CTRL+C 停止重新
显示统计信息。如果省略,netstat 显示当前
配置信息(只显示一次)

adb shell pm 包相关

https://blog.csdn.net/yelangjueqi/article/details/52575233

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
usage: pm \[list|path|install|uninstall\]  
pm list packages \[-f\]
pm list permission-groups
pm list permissions \[-g\] \[-f\] \[-d\] \[-u\] \[GROUP\]
pm list instrumentation \[-f\] \[TARGET-PACKAGE\]
pm list features
pm path PACKAGE
pm dump PACKAGE
pm install \[-l\] \[-r\] \[-t\] \[-i INSTALLER\_PACKAGE\_NAME\] PATH
pm uninstall \[-k\] PACKAGE
pm enable PACKAGE\_OR\_COMPONENT
pm disable PACKAGE\_OR\_COMPONENT
```

``` bash
The list packages command prints all packages. Options:
-f: see their associated file.

The list permission-groups command prints all known
permission groups.

The list permissions command prints all known
permissions, optionally only those in GROUP. Options:
-g: organize by group.
-f: print all information.
-s: short summary.
-d: only list dangerous permissions.
-u: list only the permissions users will see.

The list instrumentation command prints all instrumentations,
or only those that target a specified package. Options:
-f: see their associated file.

The list features command prints all features of the system.

The path command prints the path to the .apk of a package.

The install command installs a package to the system. Options:
-l: install the package with FORWARD_LOCK.
-r: reinstall an exisiting app, keeping its data.
-t: allow test .apks to be installed.
-i: specify the installer package name.

The uninstall command removes a package from the system. Options:
-k: keep the data and cache directories around.
after the package removal.

The enable and disable commands change the enabled state of
a given package or component (written as “package/class”).

查看stdout 和stderr
在默认状态下,Android系统有stdout 和 stderr (System.out和System.err )输出到/dev/null ,
在运行Dalvik VM的进程中,有一个系统可以备份日志文件。在这种情况下,系统会用stdout 和stderr 和优先级 I.来记录日志信息

通过这种方法指定输出的路径,停止运行的模拟器/设备,然后通过用setprop 命令远程输入日志

adbshellstop adb shell stop adb shell setprop log.redirect-stdio true
$ adb shell start系统直到你关闭模拟器/设备前设置会一直保留,可以通过添加/data/local.prop 可以使用模拟器/设备上的默认设置

UI/软件 试验程序 Monkey
当Monkey程序在模拟器或设备运行的时候,如果用户出发了比如点击,触摸,手势或一些系统级别的事件的时候,
它就会产生随机脉冲,所以可以用Monkey用随机重复的方法去负荷测试你开发的软件.
最简单的方法就是用用下面的命令来使用Monkey,这个命令将会启动你的软件并且触发500个事件.

adb shell am 相关

1
2
3
adb shell am start ...
adb shell am startservice ...
adb shell am broadcast ...

adb shel monkey Monkey相关

1
2
3
4
5
$ adb shell monkey -v -p your.package.name 500  
跑MonKey
adb shell monkey -v -p com.android.settings --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --ignore-native-crashes 10000000 > monkey-log.txt

adb shell monkey -v -p com.android.settings --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --ignore-native-crashes --throttle 100 -v 10000000 > monkey-log.txt

更多的关于命令Monkey的命令的信息,可以查看UI/Application Exerciser Monkey documentation page.

adb shell ps 系列

1
2
ps -e | grep -rn systemui
ps -e | grep -rn system_server

adb 可用的命令

在system/bin下面的所有的bin文件,几乎都可以使用adb bin文件名的方式来调用,应该说是大部分吧,有些还不能使用
adb shell进入后,执行如下命令
atrace:

#