ADB (Android Debug Bridge)
概述
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 | adb get-serialno 获取设备的ID和序列号serialNumber |
说明:
序列号[serialNumber]——由adb创建的一个字符串,这个字符串通过自己的控制端口-
唯一地识别一个模拟器/设备实例。一个序列号的例子: emulator-5554
发送命令到设备 系列
1 | adb \[-d|-e|-s \] |
如启动手机设备shell: adb -d shell
adb forward 发布端口,可以设置任意的端口号,
做为主机向模拟器或设备的请求端口。如:adb forward tcp:5555 tcp:8000
1 | adb reboot 重启手机 |
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]
作用:列举出所有包含
举例:adb shell pm list packages com.lt
说明:[options]与
adb shell input 系列
adb shell input text 向设备输入文本(光标所在的文本框)
adb shell input keyevent 向设备发送按键事件
如:
在编辑短信时,往文本框输入文本:adb shell input text “hello”
向手机发送键值回Home:adb shell input keyevent 31
2
3
4
5
6
7event\_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
5adb 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 | adb push - copy file/dir to device |
基本linux shell命令 系列
adb shell [command]1
2
3
4
5
6
7
8
9
10ls 列出目录下的文件和文件夹
cd 切换目录
rm 删除目录和文件
cat 查看文件内容
ps 可以看那个进程再跑
ps -x \[PID\] 查看单个进程的状态
top 可以看那个进程的占用率最高
su 切换到root用户
kill \[pid\] 杀死一个进程
chmod 777 修改该文件为可执行权限
从framework/base/cmds中查到的一些常用的命令:1
2
3
4
5
6adb shell am stack list 列出AM堆栈信息
adb shell appops 应用权限授权管理框架,可以使用AppOps将其某项强制要求权限忽略掉
adb shell appwidget 主要是设置apk是否有放在窗口的权限
adb shell bmgr 备份用
adb shell content
adb shell dpm
- 打印某个进程中所有线程的backtrace
1
adb shell debuggerd -b pid
用于分析死锁
- 打印系统所有注册的服务
1
adb shell service list
用于查看service是否注册成功
- 查看某个应用时32位还是64位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23adb 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 | 获取屏幕大小adb shell wm size |
adb shell dumpsys 系列
1 | adb shell dumpsys activity top //查看当前运行Activity信息 |
adb shell 截屏和录屏
1 | adb shell screencap -p /sdcard/1.png //截图保存 |
Log 系列
adb logcat [ ] - View device log
查看可用日志缓冲区:
1 | adb logcat -s tag // 查看tag的日志 |
1 | adb logcat -v threadtime |
过滤日志输出:
过滤器语句按照下面的格式描tag:priority … , tag 表示是标签, priority 是表示标签的报告的最低等级
adb logcat *:W 显示优先级为warning或更高的日志信息
adb logcat ActivityManager:I MyApp:D *:S
日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就是查看系统的标签).
优先级有下列集中,是按照从低到高顺利排列的:1
2
3
4
5
6
7V — 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 | brief — Display priority/tag and PID of originating process (the default format). |
当启动了logcat ,你可以通过-v 选项来指定输出格式:
[adb] logcat [-v ]
下面是用 thread 来产生的日志格式:
1 | adb logcat -v thread |
需要注意的是你只能-v 选项来规定输出格式 option.
Logcat命令列表
1 | -b 加载一个可使用的日志缓冲区供查看,比如event 和radio . 默认值是main 。具体查看Viewing Alternative Log Buffers. |
1 | adb bugreport - return all information from the device |
———–其他 ———–
模拟器使用镜像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
30Usage: 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 | > adb shell top |
第一组数据的含义:1
2
3
4
5
6
7User 处于用户态的运行时间,不包含优先值为负进程
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
20PID 进程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 | adb shell procrank 查询各进程内存使用情况 |
prop属性相关
1 | 查看build.prop文件中变量值 adb shell getprop xxx |
查看数据库信息
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
24NETSTAT \[-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 | usage: pm \[list|path|install|uninstall\] |
查看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 | adb shell am start ... |
adb shel monkey Monkey相关
1 | $ adb shell monkey -v -p your.package.name 500 |
更多的关于命令Monkey的命令的信息,可以查看UI/Application Exerciser Monkey documentation page.
adb shell ps 系列
1 | ps -e | grep -rn systemui |
adb 可用的命令
在system/bin下面的所有的bin文件,几乎都可以使用adb bin文件名的方式来调用,应该说是大部分吧,有些还不能使用
adb shell进入后,执行如下命令
atrace:
#