ADB的全称为Android Debug Bridge,它作为调试桥,方便调试设备或调试开发的Android APP。
下载 platform-tools_r31.0.3-windows.zip 安装包,放到某目录并解压。
进入adb.exe的同级目录,CMD进入命令行模式。
拿本人的一台中兴AXON天机手册测试,执行命令
adb version
查看adb是否可以正常使用
D:\softwaretmp\platform-tools_r31.0.3-windows\platform-tools>adb version
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133
Installed as D:\softwaretmp\platform-tools_r31.0.3-windows\platform-tools\adb.exe
打开需要被调试的安卓设备,进入开发者模式(系统-开发者选项 ps:没有的话,系统-版本号七连击,USB调试打开),插入计算机USB口。
执行命令
adb devices
查找设备
D:\softwaretmp\platform-tools_r31.0.3-windows\platform-tools>adb devices
List of devices attached
8773d466 device
执行命令
adb shell
进入设备
D:\softwaretmp\platform-tools_r31.0.3-windows\platform-tools>adb shell
shell@orchid:/
如果有多台设备则执行命令:
adb -s device-name shell
Android 的日志分为如下几个优先级(priority):
V —— Verbose(最低,输出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F—— Fatal
S —— Silent(最高,啥也不输出)
按某级别过滤日志则会将该级别及以上的日志输出。
执行命令
adb logcat *:W
执行命令
adb logcat l findstr ***> F:\log.txt
执行命令
adb logcat -c
执行命令
adb logcat -c && adb logcat -s ActivityManager l grep "Displayed”
执行命令
adb logcat -v time> F:\log.txt
日志支持按以下几种 :默认格式brief、process、tag、raw、time、long
执行命令
adb logcat l findstr ***
执行命令
adb logcat l findstr ***> F:\log.txt
执行 命令
adb logcat ActivityManager:I MyApp:D *:S
表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
执行命令
adb shell dmesg >D:/Kernel.log
可以用 adb logcat -v
选项指定日志输出格式。
日志支持按以下几种
:
brief
默认格式。格式为
/():
示例:
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
process
默认格式。格式为
()
示例:
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
tag
默认格式。格式为
/:
示例:
D/HeadsetStateMachine: Disconnected process message: 10, size: 0
raw
默认格式。格式为
示例:
Disconnected process message: 10, size: 0
time
默认格式。格式为
/():
示例:
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
threadtime
默认格式。格式为
:
示例:
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
long
默认格式。格式为
[ : / ]
示例:
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ]
Disconnected process message: 10, size: 0
执行命令
adb shell netstat
执行命令
adb shell -c 4 www.baidu.com
adb shell ping 127.0.0.1
执行命令
adb shell netcfg
执行命令
adb shell ip -f inet addr
adb shell ip -f inet addr show eth1
adb shell ip -f inet addr | grep eth1
3.3.1 截图保存到电脑
执行命令
adb exec-out screencap -p > sc.png
执行命令
adb pull /sdcard/sc.png
执行命令
adb shell screenrecord /sdcard/filename.mp4
录制屏幕以 mp4 格式保存到 /sdcard, 需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。如果需要使用"adb pull"导出到电脑。
执行命令
adb shell dumpsys activity activities | findstr “packagename”
执行命令
adb shell dumpsys activity services “packagename”
执行命令
adb shell dumpsys package “packagename”
执行命令
adb shell am start [options]
例如表示调起微信主界面
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
执行命令表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world。
adb shell am startservice [options]
调起微信的某 Service
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
执行命令
adb shell am broadcast [options]
可以向所有组件广播,也可以只向指定组件广播。
例如,向所有组件广播 BOOT_COMPLETED
:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver
广播 BOOT_COMPLETED
:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。
既能发送系统预定义的广播,也能发送自定义广播。
如下是部分系统预定义广播及正常触发时机:
action | 触发时机 |
---|---|
android.net.conn.CONNECTIVITY_CHANGE | 网络连接发生变化 |
android.intent.action.SCREEN_ON | 屏幕点亮 |
android.intent.action.SCREEN_OFF | 屏幕熄灭 |
android.intent.action.BATTERY_LOW | 电量低,会弹出电量低提示框 |
android.intent.action.BATTERY_OKAY | 电量恢复了 |
android.intent.action.BOOT_COMPLETED | 设备启动完毕 |
android.intent.action.DEVICE_STORAGE_LOW | 存储空间过低 |
android.intent.action.DEVICE_STORAGE_OK | 存储空间恢复 |
android.intent.action.PACKAGE_ADDED | 安装了新的应用 |
android.net.wifi.STATE_CHANGE | WiFi 连接状态发生变化 |
android.net.wifi.WIFI_STATE_CHANGED | WiFi 状态变为启用/关闭/正在启动/正在关闭/未知 |
android.intent.action.BATTERY_CHANGED | 电池电量发生变化 |
android.intent.action.INPUT_METHOD_CHANGED | 系统输入法发生变化 |
android.intent.action.ACTION_POWER_CONNECTED | 外部电源连接 |
android.intent.action.ACTION_POWER_DISCONNECTED | 外部电源断开连接 |
android.intent.action.DREAMING_STARTED | 系统开始休眠 |
android.intent.action.DREAMING_STOPPED | 系统停止休眠 |
android.intent.action.WALLPAPER_CHANGED | 壁纸发生变化 |
android.intent.action.HEADSET_PLUG | 插入耳机 |
android.intent.action.MEDIA_UNMOUNTED | 卸载外部介质 |
android.intent.action.MEDIA_MOUNTED | 挂载外部介质 |
android.os.action.POWER_SAVE_MODE_CHANGED | 省电模式开启 |
执行命令
adb shell am force-stop “packagename”
执行命令
adb shell input keyevent keycode
不同的 keycode有不同的功能
keycode 含义:
3 HOME 键
4 返回键
5 打开拨号应用
6 挂断电话
26 电源键
27 拍照(需要在相机应用里)
61 Tab键
64 打开浏览器
67 退格键
80 拍照对焦键
82 菜单键
85 播放/暂停
86 停止播放
92 向上翻页键
93 向下翻页键
111 ESC键
112 删除键
122 移动光标到行首或列表顶部
123 移动光标到行末或列表底部
124 插入键
164 静音
176 打开系统设置
207 打开联系人
208 打开日历
209 打开音乐
220 降低屏幕亮度
221 提高屏幕亮度
223 系统休眠
224 点亮屏幕
231 打开语音助手
276 如果没有 wakelock 则让系统休眠
执行命令
adb shell getprop ro.product.model
执行命令
adb shell dumpsys battery
执行命令
adb shell wm siz
输出举例:
Physical size: 1080x1920
Override size: 480x1024
表明设备的屏幕分辨率原本是 1080px * 1920px,当前被修改为 480px * 1024px。
执行命令
adb shell settings get secure android_id
执行命令
adb shell getprop ro.build.version.release
执行命令
adb shell ifconfig | grep Mask
或
adb shell netcfg
执行
adb shell cat /proc/cpuinfo
执行
adb shell cat /proc/meminfo
执行
adb shell cat /system/build.prop
执行
adb shell getprop <属性名>
常见属性名和含义
属性名 含义
ro.build.version.sdk SDK 版本
ro.build.version.release Android 系统版本
ro.product.model 型号
ro.product.brand 品牌
ro.product.name 设备名
ro.product.board 处理器型号
persist.sys.isUsbOtgEnabled 是否支持 OTG
dalvik.vm.heapsize 每个应用程序的内存上限
ro.sf.lcd_density 屏幕密度
rro.build.version.security_patch Android 安全补丁程序级别
执行命令
adb shell ps
执行命令
adb shell top
输出示例:
User 0%, System 6%, IOW 0%, IRQ 0%
User 3 + Nice 0 + Sys 21 + Idle 280 + IOW 0 + IRQ 0 + SIRQ 3 = 307
PID PR CPU% S #THR VSS RSS PCY UID Name
8763 0 3% R 1 10640K 1064K fg shell top
131 0 3% S 1 0K 0K fg root dhd_dpc
6144 0 0% S 115 1682004K 115916K fg system system_server
132 0 0% S 1 0K 0K fg root dhd_rxf
1731 0 0% S 6 20288K 788K fg root /system/bin/mpdecision
217 0 0% S 6 18008K 356K fg shell /sbin/adbd
...
7779 2 0% S 19 1538748K 48896K bg u0_a71 com.sohu.inputmethod.sogou:classic
7963 0 0% S 18 1561916K 59568K fg u0_a58 org.mazhuang.boottimemeasure
...
各列含义:
列名 | 含义 |
---|---|
PID | 进程 ID |
PR | 优先级 |
CPU% | 当前瞬间占用 CPU 百分比 |
S | 进程状态(R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) |
THR | 线程数 |
VSS | Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) |
RSS | Resident Set Size 实际使用物理内存(包含共享库占用的内存) |
PCY | 调度策略优先级,SP_BACKGROUND/SPFOREGROUND |
UID | 进程所有者的用户 ID |
NAME | 进程名 |
top还支持一些命令行,如下:
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num 最多显示多少个进程
-n num 刷新多少次后退出
-d num 刷新时间间隔(单位秒,默认值 5)
-s col 按某列排序(可用 col 值:cpu, vss, rss, thr)
-t 显示线程信息
-h 显示帮助文档
执行命令
adb shell dumpsys package | grep userId=
adb [-d|-e|-s ]
如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s
这一部分,直接使用 adb
如果有多个设备/模拟器连接,则需要为命令指定目标设备。
参数 | 含义 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s |
指定相应 serialNumber 号的设备/模拟器为命令目标 |
在多个设备/模拟器连接的情况下较常用的是 -s
参数,serialNumber 可以通过 adb devices
命令获取。如:
$ adb devices
List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device
输出里的 cf264b8f
、emulator-5554
和 10.129.164.6:5555
即为 serialNumber。
比如这时想指定 cf264b8f
这个设备来运行 adb 命令获取屏幕分辨率:
adb -s cf264b8f shell wm size
又如想给 10.129.164.6:5555
这个设备安装应用(这种形式的 serialNumber 格式为
,一般为无线连接的设备或 Genymotion 等第三方 Android 模拟器):
adb -s 10.129.164.6:5555 install test.apk
启动 adb server 命令:一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起。)
adb start-server
停止 adb server 命令:
adb kill-server
执行命令
adb root
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
所以如果 adbd 以普通权限执行,有些需要 root 权限才能执行的命令无法直接用 adb xxx
执行。这时可以 adb shell
然后 su
后执行命令,也可以让 adbd 以 root 权限执行,这个就能随意执行高权限命令了。
执行命令后,再运行 adb shell
,看看命令行提示符是不是变成 #
了。
有些手机 root 后也无法通过 adb root
命令让 adbd 以 root 权限执行,比如三星的部分机型,会提示 adbd cannot run as root in production builds
,此时可以先安装 adbd Insecure,然后 adb root
试试。
相应地,如果要恢复 adbd 为非 root 权限的话,可以使用命令:
adb unroot
执行命令
adb -P start-server
默认端口为 5037。
查询命令
adb devices
输出实例:
List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device
输出格式为 [serialNumber] [state]
,serialNumber 即我们常说的 SN,state 有如下几种:
offline
—— 表示设备未连接成功或无响应。
device
—— 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。
no device
—— 没有设备/模拟器连接。
以上输出显示当前已经连接了三台设备/模拟器,cf264b8f
、emulator-5554
和 10.129.164.6:5555
分别是它们的 SN。从 emulator-5554
这个名字可以看出它是一个 Android 模拟器,而 10.129.164.6:5555
这种形为
的 serialNumber 一般是无线连接的设备或 Genymotion 等第三方 Android 模拟器。
执行命令
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
即在 adb shell pm list packages
的基础上可以加一些参数进行过滤查看不同的列表,支持的过滤参数如下:
参数 | 显示列表 |
---|---|
无 | 所有应用 |
-f | 显示应用关联的 apk 文件 |
-d | 只显示 disabled 的应用 |
-e | 只显示 enabled 的应用 |
-s | 只显示系统应用 |
-3 | 只显示第三方应用 |
-i | 显示应用的 installer |
-u | 包含已卸载应用 |
|
包名包含 字符串 |
使用举例:
查看所有应用列表:
adb shell pm list packages
查看系统应用列表:
adb shell pm list packages -s
查看第三方应用列表:
adb shell pm list packages -3
查看名字里有dev的应用所在位置:
pm list packages -f | grep dev
执行命令
adb install “-lrtsdg” “path_to_apk”
命令可选参数:
“-lrtsdg”:
-l:将应用安装到保护目录 /mnt/asec;
-r:允许覆盖安装;
-t:允许安装 AndroidManifest.xml 里 application 指定 android:testOnly=“true” 的应用;
-s:将应用安装到 sdcard;
-d:允许降级覆盖安装;
-g:授予所有运行时权限;
path_to_apk:apk的绝对路径。
示例安装淘宝apk:
adb install -t C:data/local/tmp/taobao.apk
安装CPU信息显示的CPU-Z apk:
D:\softwarework\platform-tools_r31.0.3-windows\platform-tools>adb install "CPU Z_v1.41.apk"
Performing Push Install
CPU Z_v1.41.apk: 1 file pushed, 0 skipped. 58.3 MB/s (2398480 bytes in 0.039s)
pkg: /data/local/tmp/CPU Z_v1.41.apk
Success
执行命令
adb shell pm uninstall -k “packagename”
命令参数:
-k 参数可选,表示卸载应用但保留数据和缓存目录。
示例卸载手机淘宝:
adb uninstall com.taobao.taobao
执行命令
adb shell pm clear “packagename”
相当于在设置里的应用信息界面点击「清除缓存」和「清除数据」。
示例表示清除 手机淘宝数据和缓存:
adb shell pm clear com.taobao.taobao
如下是其它常用命令的简单描述
命令 | 功能 |
---|---|
cat | 显示文件内容 |
cd | 切换目录 |
chmod | 改变文件的存取模式/访问权限 |
df | 查看磁盘空间使用情况 |
grep | 过滤输出 |
kill | 杀死指定 PID 的进程 |
ls | 列举目录内容 |
mount | 挂载目录的查看和管理 |
mv | 移动或重命名文件 |
ps | 查看正在运行的进程 |
rm | 删除文件 |
top | 查看进程的资源占用情况 |
4. 其他
4.1 Android中的UID GID PID
UID用于标识Android系统中的每个应用程序,uid在应用安装时被分配,并且在应用存在于手机上期间,都不会改变。一个应用程序只能有一个uid,多个应用可以使用sharedUserId 方式共享同一个uid,前提是这些应用的签名要相同。
PID即进程ID,因为Android内核也是Linux的,所以跟Linux程序一样,运行时分配,代表一个运行的APP进程。
GID对应于linux中用户组的概念,android 中 GID 等于UID
1. 先查出APP对应的PID(以"com.android.setting"为例子说明)。
$ adb shell
$ ps -A | grep "com.android.setting"
u10_system 12700 748 5319112 104536 do_epoll_wait 0 S com.android.settings:SettingsExProvider
u10_system 14292 748 5996892 207196 do_epoll_wait 0 S com.android.settings
从上面可以看到PID为14292
2. 根据PID获取UID:
$ cat /proc/14292/status | grep Uid
Uid: 1001000 1001000 1001000 1001000
可以看到UID为1001000
参考:
Android中UID、GID和PID_闽农的博客-CSDN博客_android app uid