常用命令
//查看log
adb shell logcat -v time > C:\Users\jcb\Desktop\logcat.txt
//指定连接设备(b7b86f9 为device 的id)查看log
adb -s C852136460 shell logcat -v time > C:\Users\jcb\Desktop\logcat.txt
Tcp/IP连接
//adb连接ip
adb connect IP
//查看连接的设备
adb devices
//查看连接设备里面所装的应用包名
adb shell pm list packages
//卸载应用
adb shell pm uninstall --user 0 [应用包名]
输入:adb shell pm uninstall --user 0 com.vivo.shortcutcenter
//卸载已安装的应用
adb uninstall com.skype.raider //最后为应用名
//从pc端安装apk到安卓设备
adb install [apk在pc中的路径]
1.屏幕截图
指令:adb exec-out screencap -p > jietu.png
图片保存在C:\Users\Administrator\jietu.png
指令:adb devices
开始录制
指令:adb shell screenrecord /sdcard/luxiang.mp4
停止录制,默认录制时间和最长录制时间都是 180 秒。
指令:CTRL + C
导出录像
指令:adb pull /sdcard/luxiang.mp4
导出的录像保存在C:\Users\Administrator\luxiang.mp4
指令:adb shell
指令:getevent
指令:adb shell
指令:getprop
指令:
adb shell logcat -v time > C:\Users\Administrator\Desktop\logcat.txt
在桌面输出打印文件
指令:adb shell
指令:cat /proc/cmdline
参考文献
命令语法
adb 命令的基本语法如下:
adb [-d|-e|-s ]
如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s ] 这一部分,直接使用 adb 。
如果有多个设备/模拟器连接,则需要为命令指定目标设备。
参数 |
含义 |
-d |
指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e |
指定当前唯一运行的模拟器为命令目标 |
-s |
指定相应 serialNumber 号的设备/模拟器为命令目标 |
在多个设备/模拟器连接的情况下较常用的是 -s 参数,serialNumber 可以通过 adb devices 命令获取。
输出里的 C852136460、emulator-5554 即为 serialNumber。
比如这时想指定 C852136460这个设备来运行 adb 命令获取屏幕分辨率
adb -s C852136460 shell wm size
adb version
示例输出
Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android
有线连接
//adb连接tcpip
adb connect IP
确认连接状态。
adb devices
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]1
即在 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 -3
包名包含某字符串的应用
比如要查看包名包含字符串 mazhuang 的应用列表,命令:
adb shell pm list packages mazhuang
当然也可以使用 grep 来过滤:
adb shell pm list packages | grep mazhuang
安装 APK
命令格式:
adb install [-lrtsdg]
参数:
adb install 后面可以跟一些可选参数来控制安装 APK 的行为,可用参数及含义如下:
参数 |
含义 |
-l |
将应用安装到保护目录 /mnt/asec |
-r |
允许覆盖安装 |
-t |
允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用 |
-s |
将应用安装到 sdcard |
-d |
允许降级覆盖安装 |
-g |
授予所有运行时权限 |
//从pc端安装apk到安卓设备
adb install [apk在pc中的路径]
命令:
adb uninstall [-k]
//卸载应用
adb shell pm uninstall --user 0 [应用包名]
输入:adb shell pm uninstall --user 0 com.vivo.shortcutcenter
//卸载已安装的应用
adb uninstall com.skype.raider //最后为应用名
命令:
adb shell pm clear
表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
命令示例:
adb shell pm clear com.qihoo360.mobilesafe
表示清除 360 手机卫士的数据和缓存。
命令:
adb shell dumpsys activity activities | grep mFocusedActivity
命令:
adb shell dumpsys activity services []
1
参数不是必须的,指定
表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
不一定要给出完整的包名,比如运行 adb shell dumpsys activity services org.mazhuang,那么包名 org.mazhuang.demo1、org.mazhuang.demo2 和 org.mazhuang123 等相关的 Services 都会列出来。
命令:
adb shell dumpsys package
1
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
表示应用包名。
命令格式:
adb shell am startservice [options]
命令格式:
adb shell am broadcast [options]
1
可以向所有组件广播,也可以只向指定组件广播。
命令:
adb shell am force-stop
命令示例:
adb shell am force-stop com.qihoo360.mobilesafe
表示停止 360 安全卫士的一切进程与服务。
命令示例:
adb shell pm disable
-user
<packagename>
adb shell pm disable
<packagename>
adb shell pm disable
-user
[options
]<packagename>
命令示例:
adb shell pm enable
<packagename>
撤消应用程序的权限
adb shell pm grant <packagename> <PACKAGE_PERMISSION>
例如:adb -d shell pm grant packageName android.permission.BATTERY_STATS
adb shell pm revoke <packagename> <PACKAGE_PERMISSION>
选项--user user_id:要禁用的用户比如,向应用授予权限。在运行Android 6.0(API级别23)及更高版本的设备上,该权限可以是应用清单中声明的任何权限。在运行Android 5.1(API级别22)及更低版本的设备上,必须是应用程序定义的可选权限。
免责声明:以上命令为非常规命令,对于您的设备的任何损坏,强行停止等,我概不负责。您正在对您的设备执行此操作,您自己承担责任。
命令:
adb pull <
设备里的文件路径
> [
电脑上的目录
]
其中 电脑上的目录 参数可以省略,默认复制到当前目录。
例:
adb pull /sdcard/sr.mp4 ~/tmp/
*小技巧:*设备上的文件路径可能需要 root 权限才能访问,如果你的设备已经 root 过,可以先使用 adb shell 和 su 命令在 adb shell 里获取 root 权限后,先 cp /path/on/device /sdcard/filename 将文件复制到 sdcard,然后 adb pull /sdcard/filename /path/on/pc。
命令:
adb push <
电脑上的文件路径
> <
设备里的目录
>
例:
adb push ~/sr.mp4 /sdcard/
*小技巧:*设备上的文件路径普通权限可能无法直接写入,如果你的设备已经 root 过,可以先 adb push /path/on/pc /sdcard/filename,然后 adb shell 和 su 在 adb shell 里获取 root 权限后,cp /sdcard/filename /path/on/device。
db shell input keyevent 26
命令:
adb shell input keyevent 82
命令:
adb shell input keyevent 3
命令:
adb shell input keyevent 4
增加音量:
adb shell input keyevent 24
降低音量:
adb shell input keyevent 25
静音:
adb shell input keyevent 164
播放/暂停:
adb shell input keyevent 85
停止播放:
adb shell input keyevent 86
播放下一首:
adb shell input keyevent 87
播放上一首:
adb shell input keyevent 88
恢复播放:
adb shell input keyevent 126
暂停播放:
adb shell input keyevent 127
可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。
点亮屏幕:
adb shell input keyevent 224
熄灭屏幕:
adb shell input keyevent 223
如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 input swipe 来解锁。
命令(参数以机型 Nexus 5,向上滑动手势解锁举例):
adb shell input swipe 300 1000 300 500
参数 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标。
在焦点处于某文本框时,可以通过 input 命令来输入文本。
命令:
adb shell input text hello
现在 hello 出现在文本框了。
Android 日志
命令格式:
[adb] logcat [
常用用法列举如下:
按级别过滤日志
Android 的日志分为如下几个优先级(priority):
按某级别过滤日志则会将该级别及以上的日志输出。
比如,命令:
adb logcat *:W
会将 Warning、Error、Fatal 和 Silent 日志输出。
清空日志
adb logcat -c
命令:
adb shell dmesg
命令:
adb shell getprop ro.product.model
输出示例:
Nexus 5
命令:
adb shell wm size
命令:
adb shell dumpsys battery
输入示例:
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
status: 2
health: 2
present: true
level: 44
scale: 100
voltage: 3872
temperature: 280
technology: Li-poly
其中 scale 代表最大电量,level 代表当前电量。上面的输出表示还剩下 44% 的电量。
命令:
adb shell wm density
输出示例:
Physical density: 420
该设备屏幕密度为 420dpi。
如果使用命令修改过,那输出可能是:
Physical density: 480
Override density: 160
表明设备的屏幕密度原来是 480dpi,当前被修改为 160dpi。
命令:
adb shell dumpsys window displays
输出示例:
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
deferred=false layoutNeeded=false
其中 mDisplayId 为 显示屏编号,init 是初始分辨率和屏幕密度,app 的高度比 init 里的要小,表示屏幕底部有虚拟按键,高度为 1920 - 1794 = 126px 合 42dp。
命令:
adb shell settings get secure android_id
输出示例:
51b6be48bac8c569
在 Android 4.4 及以下版本可通过如下命令获取 IMEI:
adb shell dumpsys iphonesubinfo
输出示例:
Phone Subscriber Info:
Phone Type = GSM
Device ID = 860955027785041
其中的
Device ID
就是
IMEI
。
而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):
adb shell
su
service call iphonesubinfo 1
输出示例:
Result: Parcel(
0x00000000: 00000000 0000000f 00360038 00390030 '........8.6.0.9.'
0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.'
0x00000020: 00340030 00000031 '0.4.1... ')
把里面的有效内容提取出来就是 IMEI 了,比如这里的是 860955027785041。
参考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop
命令:
adb shell getprop ro.build.version.release
输出示例:
5.0.2
每次想知道设备的 IP 地址的时候都得「设置」-「关于手机」-「状态信息」-「IP地址」很烦对不对?通过 adb 可以方便地查看。
命令:
adb shell ifconfig "| grep Mask"
输出示例:
inet addr:10.130.245.230 Mask:255.255.255.252
inet addr:127.0.0.1 Mask:255.0.0.0
那么 10.130.245.230 就是设备 IP 地址。
命令:
adb shell cat /sys/class/net/wlan0/address
输出示例:
f8:a9:d0:17:42:4d
这查看的是局域网 Mac 地址,移动网络或其它连接的信息可以通过前面的小节「IP 地址」里提到的 adb shell netcfg 命令来查看。
命令:
adb shell cat /proc/cpuinfo
命令:
adb shell cat /proc/meminfo
设备的更多硬件与系统属性可以通过如下命令查看:
adb shell cat /system/build.prop
这会输出很多信息,包括前面几个小节提到的「型号」和「Android 系统版本」等。
注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。
修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。
命令:
adb shell wm size 480x1024
表示将分辨率修改为 480px * 1024px。
恢复原分辨率命令:
adb shell wm size reset
命令:
adb shell wm density 160
表示将屏幕密度修改为 160dpi。
恢复原屏幕密度命令:
adb shell wm density reset
命令:
adb shell wm overscan 0,0,0,200
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。
恢复原显示区域命令:
adb shell wm overscan reset
命令:
adb shell settings put global adb_enabled 0
恢复:
用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。
去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。
不想全屏了咋办呢?
adb shell settings put global policy_control null
截图保存到电脑:
adb exec-out screencap -p > sc.png
先截图保存到设备里:
adb shell screencap -p /sdcard/sc.png
然后将 png 文件导出到电脑:
adb pull /sdcard/sc.png
录制屏幕
录制屏幕以 mp4 格式保存到 /sdcard:
adb shell screenrecord /sdcard/filename.mp4
需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。
如果需要导出到电脑:
adb pull /sdcard/filename.mp4
可以使用 adb shell screenrecord --help 查看 screenrecord 命令的帮助信息,下面是常见参数及含义:
参数 |
含义 |
--size WIDTHxHEIGHT |
视频的尺寸,比如 1280x720,默认是屏幕分辨率。 |
--bit-rate RATE |
视频的比特率,默认是 4Mbps。 |
--time-limit TIME |
录制时长,单位秒。 |
--verbose |
输出更多信息。 |
重新挂载 system 分区为可写
注:需要 root 权限。
/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写。
步骤:
进入 shell 并切换到 root 用户权限。
命令:
adb shell
su
查看当前分区挂载情况。
命令:
mount
注:需要 root 权限。
命令:
adb shell
su
cat /data/misc/wifi/*.conf
输出示例:
network={
ssid="TP-LINK_9DFC"
scan_ssid=1
psk="123456789"
key_mgmt=WPA-PSK
group=CCMP TKIP
auth_alg=OPEN
sim_num=1
priority=13893
}
network={
ssid="TP-LINK_F11E"
psk="987654321"
key_mgmt=WPA-PSK
sim_num=1
priority=17293
}
ssid 即为我们在 WLAN 设置里看到的名称,psk 为密码,key_mgmt 为安全加密方式。
注:需要 root 权限。
命令:
adb shell
su
date -s 20160823.131500
表示将系统日期和时间更改为 2016 年 08 月 23 日 13 点 15 分 00 秒。
命令:
adb reboot
命令:
adb shell
su
此时命令行提示符是 $ 则表示没有 root 权限,是 # 则表示已 root。
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
简单用法:
adb shell monkey -p -v 500
表示向
指定的应用程序发送 500 个伪随机事件。
Monkey 的详细用法参考 官方文档。
注:需要 root 权限。
有时需要控制设备的 WiFi 状态,可以用以下指令完成。
开启 WiFi:
adb root
adb shell svc wifi enable
关闭 WiFi:
adb root
adb shell svc wifi disable
设置wifi优先,有网络和wifi情况下优先使用wifi
adb shell svc wifi prefer
若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 Killed。
svc data disable
这个命令可以关闭数据连接,就是上网流量,大家都知道控制上网的开关很多, 但是大都是通过在apn上的接入点加后缀来实现的,但是这个命令不会更改apn的任何设置,直接在底层关闭数据连接。 应该是最彻底的,而且又不影响apn的设置。这个跟apndroid有什么区别,apndroid是在关闭上网数据的时候,已经在下载的连接可能不会被强 制关闭(这个在apndroid自己的说明中也有提到)。比如你在下载一个10M的电影,下载了1M,不响下载了。用apndroid关闭连接,可能这个 下载还会继续,不会马上停掉。但是用这个命令,绝对毫不留情的咔嚓掉。
adb shell svc data enable
这个是打开上网数据连接,跟上一个命令是相反的。
adb shell svc data prefer
这个命令是控制数据连接比wifi优先。我们都知道,正常情况下,有wifi的时候,不会用到数据网络连接。但是这个命令是相反,有数据网络的话先用数据网络流量,没有数据网络的时候采用wifi .
命令:
adb reboot recovery
命令:
adb reboot
命令:
adb reboot bootloader
如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。
以 Recovery 模式下更新为例:
重启到 Recovery 模式。
命令:
adb reboot recovery
在设备的 Recovery 界面上操作进入 Apply update-Apply from ADB。
注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB。
通过 adb 上传和更新系统。
命令:
adb sideload
Android 系统是基于 Linux 内核的,所以 Linux 里的很多命令在 Android 里也有相同或类似的实现,在 adb shell 里可以调用。本文档前面的部分内容已经用到了 adb shell 命令。
adb shell ps
例:
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 8904 788 ffffffff 00000000 S /init
root 2 0 0 0 ffffffff 00000000 S kthreadd
...
u0_a71 7779 5926 1538748 48896 ffffffff 00000000 S com.sohu.inputmethod.sogou:classic
u0_a58 7963 5926 1561916 59568 ffffffff 00000000 S org.mazhuang.boottimemeasure
...
shell 8750 217 10640 740 00000000 b6f28340 R ps
各列含义:
列名 |
含义 |
USER |
所属用户 |
PID |
进程 ID |
PPID |
父进程 ID |
NAME |
进程名 |
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 shell dumpsys package org.mazhuang.guanggoo | grep userId=
userId=10394
通过 ps 命令找到对应进程的 pid 之后 adb shell cat /proc/
如:
$ adb shell
gemini:/ $ ps | grep org.mazhuang.guanggoo
u0_a394 28635 770 1795812 78736 SyS_epoll_ 0000000000 S org.mazhuang.guanggoo
gemini:/ $ cat /proc/28635/status | grep Uid
Uid: 10394 10394 10394 10394
gemini:/ $
其它
如下是其它常用命令的简单描述,前文已经专门讲过的命令不再额外说明:
命令 |
功能 |
cat |
显示文件内容 |
cd |
切换目录 |
chmod |
改变文件的存取模式/访问权限 |
df |
查看磁盘空间使用情况 |
grep |
过滤输出 |
kill |
杀死指定 PID 的进程 |
ls |
列举目录内容 |
mount |
挂载目录的查看和管理 |
mv |
移动或重命名文件 |
ps |
查看正在运行的进程 |
rm |
删除文件 |
top |
查看进程的资源占用情况 |
启用 SELinux
adb root
adb shell setenforce
1
adb root
adb shell setenforce
0
adb root
adb enable
-verity
adb root
adb disable
-verity
出错提示
error: protocol fault (couldn't read status): No error
可能原因
adb server 进程想使用的 5037 端口被占用。
解决方案
找到占用 5037 端口的进程,然后终止它。以 Windows 下为例:
netstat -ano | findstr LISTENING
TCP 0.0.0.0:5037 0.0.0.0:0 LISTENING 1548
1这里 1548 即为进程 ID,用命令结束该进程:
taskkill /PID 1548
然后再启动 adb 就没问题了。
//显示设备当前的activity信息(可以得到当前的activity所处的应用包名等信息)
adb shell dumpsys activity top