最全ADB命令手册
- 什么是 ADB
- ADB架构
- ADB端口被占用
- 基本用法
- 设备连接管理
- 应用程序管理
- 与应用程序交互
- 文件管理
- 模拟键/输入
- 查看日志
- 查看设备信息
- 修改设置
- 实用功能
- 闪烁相关命令
- 安全相关
- 常见问题
*本文内容整合自网络,欢迎转载。*
相信做Android开发的朋友都用过ADB命令,但是仅限于安装应用推送文件和设备重启,深层次的我就不清楚了,其实多了解一些就可以了,有些不常见的场景我们至少应该知道可以做到,比如我们知道adb install但是不知道adb shell am start。前者是用来安装软件的,后者是用来打开软件的。后者的一个使用场景让我注意到了他:公司定制Android系统,在调试屏幕的时候需要看屏幕是否满屏来验证驱动是否正常。这个做法比较麻烦,在Android开发者手里需要用eclipse或者其他ide来安装和打开,显然比接数据线用adb命令的驱动要复杂很多,所以有必要多了解一些。
以下内容可能比较繁琐,我会尽量简单,请大家耐心看完。
什么是 ADB
Adb的全称是Android Debug Bridge:Android Debug Bridge。下图是Android官方对Adb的介绍:
可以看出Android的初衷就是希望在开发android应用的过程中,能够使用adb这样的工具来辅助开发者更快更好的调试apk,所以adb具备了安装和卸载apk、复制和推送文件、查看设备硬件信息、查看应用占用资源以及在设备上执行shell命令等功能;
我们可以在android sdk安装目录的platform-tools目录下找到adb工具;
现有Android系统的权限机制越来越完善,很多希望绕过权限管理机制的操作已经无法实现了,而Adb可以实现。事实上,即使在最新版本的Android系统上,Adb在某种程度上也拥有很大的权限。由于Adb的设计初衷是为了方便开发者调试,所以需要在权限之外暴露一些接口。因此很多公司可以利用这个特性,绕过权限机制在非Root非定制的机器上进行一些操作(具体使用方法下文会提到),当然也有各种各样的方式,比如通过手机OTG连接等,这里就不再赘述。
ADB架构
为了方便理解,我们先从三个指令开始,我们常用的 adb start-server、adb devices、adb kill-server。
然后我们经常会看到这样的输出界面:
C:\Users\dell>adb devices
List of devices attached
* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *
那么这里有三个问题,为什么是服务器,服务器对应的是服务端还是服务器?如果手机是客户端,那服务器是指电脑上开启的服务吗?还有这个守护进程是什么?
ADB是一个C/S架构的应用程序,由三部分组成:
- 在 PC 端运行的 adb 客户端:命令行程序“adb”用于从 shell 或脚本运行 adb 命令。首先,“adb”程序会尝试定位主机上的 ADB 服务器。如果找不到 ADB 服务器,则“adb”程序会自动启动一个 ADB 服务器。接下来,当设备的 adbd 与 PC 端的 adb 服务器建立连接后,adb 客户端就可以向 ADB 服务器发送服务请求;
- PC端运行的adb server:ADB Server是运行在主机上的后台进程,其功能是检测USB端口传感设备的连接与移除,以及模拟器实例的启动或停止。ADB Server还需要将adb client的请求通过usb或tcp发送给相应的adbd;
- 设备端运行的常驻进程 adb demon(adbd):程序“adbd”作为后台进程运行在Android设备或模拟器系统中,它的功能是连接ADB服务器,并为运行在主机上的客户端提供一些服务;
ADB端口被占用
有个小伙伴说希望我把Adb启动问题放在最前面,因为他经常遇到adb找不到设备的问题,那我就把它放在最前面,我想肯定不止她一个人会遇到这种情况。
5037是adb的默认端口,如果5037端口被占用,我们在使用Adb命令时就会遇到找不到设备的困扰,这个问题对于不太熟悉Adb的朋友来说经常会遇到,所以我将这个用法放在了文章的开头,方便朋友们方便找到;
解决这类端口占用问题的思路都是一样的,三步:
- 找到使用该端口的进程的Pid;
C:\Windows\system32>netstat -aon|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 3172
- 通过PID找到对应的进程名(容易定位,可以跳过);
C:\Windows\system32>tasklist /fi "PID eq 3172"
Image name PID session name session# memory usage
========================= ======== ================ = ========== ============
360MobileLink.exe 3172 Console 4 40,208 K
- 使用命令终止命令的运行;
C:\Users\wwx229495>taskkill /pid 3172 /f
Success: The process with PID 3172 has been terminated.
有时候,一些流氓程序会把Adb.exe复制一份到windows环境变量中,比如C://Windows/system32,这时候我们可以用Where
Adb命令找出adb所在的路径,然后删除它。
基本用法
adb能做什么?答案是,所有手机上能进行的操作,都能用adb实现。也就是说,如果你玩6,你的触摸屏彻底坏了,显示器彻底坏了,只要给你一个主板,你依然可以完成你想做的操作。当然,一般场景下不建议这么做,效率才是首要的。
以下内容转自github上某位大牛的博客,如有侵权,请告知立即删除;
迟到
命令语法
adb命令的基本语法如下:
adb [-d|-e|-s ]
如果只连接了一个设备/模拟器,则可以省略部分 [-d|-e|-s ] 并直接使用 adb。
指定命令的目标设备
如果连接了多个设备/模拟器,则需要为命令指定目标设备。
参数 | 意义 |
---|---|
-d | 指定当前通过 USB 连接的唯一 Android 设备作为命令目标 |
-e | 指定当前正在运行的唯一模拟器作为命令目标 |
-s <serialNumber> |
指定相应 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 是序列号。
例如,你想指定设备cf264b8f来运行adb命令获取屏幕分辨率:
adb -s cf264b8f shell wm size
再比如在设备10.129.164.6:5555上安装一个应用(该形式下serialNumber的格式为:,一般是无线连接的设备或者第三方的Android模拟器如Genymotion):
adb -s 10.129.164.6:5555 install test.apk
*在多设备/模拟器的情况下,这些参数用于指定命令的目标设备。以下仅作简化说明,不再赘述。*
开始停止
启动adb服务器命令:
adb start-server
(一般情况下不需要手动执行该命令,如果运行adb命令时发现adb服务器没有启动,会自动启动。)
停止adb服务器命令:
adb kill-server
查看 adb 版本
adb version
示例输出
Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android
以 root 身份运行 adbd
adb的运行原理是PC端的adb服务器与手机端的守护进程adbd建立连接,然后PC端的adb客户端通过adb服务器转发命令,adbd收到命令后解析并运行。
所以如果adbd以普通权限执行的话,一些需要root权限才能执行的命令是无法直接用adb xxx执行的,这时候可以先adb shell再su之后执行命令,也可以让adbd以root权限执行,这样就可以随意执行高权限的命令了。
命令:
adb root
正常输出:
restarting adbd as root
现在再次运行 adb shell,看看命令行提示符是否变成#?
部分手机root后无法通过 adb root 命令以 root 权限执行,例如部分三星机型会提示 adbd cannot run as root in production builds,可以先安装adbd Insecure,然后再 adb root 尝试。
相应的,如果想将adbd恢复到非root权限,可以使用adb unroot命令。
指定adb服务器的网络端口
adb -P <port> 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如下:
离线 —— 表示设备未连接成功或者没有响应。
device - 设备已连接。注意,此状态并不代表 Android 系统已完全启动并可操作。设备实例在设备启动过程中即可连接到 adb,但系统启动后才会处于可操作状态。
无设备 —— 没有设备/模拟器连接。
以上输出显示当前连接了三个设备/模拟器,cf264b8f、emulator-5554、10.129.164.6:5555 分别是它们的 SN。从名称 emulator-5554 可以看出它是一个 Android 模拟器,而 10.129.164.6:5555(即 : 形式的 serialNumber)一般是一个无线连接的设备,或者第三方 Android 模拟器,例如 Genymotion。
常见异常输出:
未成功连接任何设备/模拟器。
附加设备列表
设备/模拟器未连接到 adb 或没有响应。
cf264b8f 离线附加设备列表
USB 连接
要通过 USB 连接正常使用 adb,您需要确保几点:
硬件状态正常。
包括Android设备处于正常启动状态,USB线和各种接口完好。
Android设备的开发者选项和USB调试模式已打开。
您可以进入“设置”-“开发者选项”-“Android调试”查看。
如果在设置里找不到开发者选项,需要用一个彩蛋来表示:在“设置”-“关于手机”里点击7次“版本号”。
设备驱动状态正常。
在 Linux 和 Mac OS X 下似乎不需要担心这个问题。在 Windows 下,你可能会遇到需要安装驱动程序的情况。为了确认这一点,你可以右键“计算机”-“属性”,进入“设备管理器”查看相关设备是否有黄色感叹号或问号,如果没有,则表示驱动器状态良好。否则,你可以下载一个手机助手程序先安装驱动程序。
通过USB线连接电脑和设备后确认状态。
adb devices
如果可以看到
xxxxxx设备则
表示连接成功。
无线连接(需要 USB 线)
除了通过 USB 连接设备和电脑来使用 adb 之外,你还可以使用无线连接——虽然连接过程中有使用 USB 的步骤,但是连接成功后你的设备就可以在一定范围内摆脱 USB 线的限制了!
步骤:
将 Android 设备和运行 adb 的电脑连接到同一个局域网,例如同一个 WiFi。
通过 USB 数据线将设备连接到电脑。
确保连接成功(可以运行 adb devices 查看设备是否被列出)。
让设备监听 5555 端口的 TCP/IP 连接:
adb tcpip 5555
断开 USB 连接。
查找设备的 IP 地址。
通常可以在“设置”-“关于手机”-“状态信息”-“IP 地址”中找到,也可以使用 adb 命令查看,方法参考下文查看设备信息-IP 地址部分。
通过IP地址连接设备。
adb connect <device-ip-address>
这是上一步找到的设备IP地址。
确认连接状态。
adb devices
如果你能看到
<device-ip-address>:5555 device
连接成功。
如果无法连接,请确认安卓设备和电脑连接到同一个WiFi,然后adb connect <device-ip-address>
再次执行步骤;
如果还是不行,请通过 adb kill-server 重启 adb,然后从头再试。
断开无线连接
命令:
adb disconnect <device-ip-address>
无线连接(无需使用 USB 线)
注意:需要root权限。
上一节“无线连接(需要 USB 数据线)”是官方文档中介绍的方法,需要借助 USB 数据线来实现无线连接。
既然我们要实现无线连接,那所有步骤都能无线吗?答案是肯定的。
在 Android 设备上安装一个终端仿真器。
已经安装好的设备可以跳过此步骤。我使用的终端仿真器的下载地址是:Terminal Emulator for Android Downloads。
将 Android 设备和要运行 adb 的电脑连接到同一个局域网,例如同一个 WiFi。
在 Android 设备上打开终端仿真器,依次运行以下命令:
su
setprop service.adb.tcp.port 5555
查找 Android 设备的 IP 地址。
一般可以在“设置”-“关于手机”-“状态信息”-“IP地址”中找到,也可以使用adb命令按照下面查看设备信息-IP地址部分的方法查看。
通过计算机上的 adb 和 IP 地址连接 Android 设备。
adb connect <device-ip-address>
这是上一步找到的设备IP地址。
如果可以看到输出connected to :5555,则表示连接成功。
部分注释 1:
部分设备如小米5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能需要在执行第5步之前重启adbd服务,并在设备的终端模拟器上运行:
restart adbd
如果重启不起作用,请尝试以下命令:
stop adbd
start adbd
应用程序管理
查看申请列表
查看应用程序列表的基本命令格式是
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
即在 adb shell pm list packages 的基础上,可以添加一些参数来过滤查看不同的列表,支持的过滤参数如下:
参数 | 显示列表 |
---|---|
没有任何 | 所有应用程序 |
-f | 显示与应用程序关联的 apk 文件 |
-d | 仅显示已禁用的应用程序 |
-e | 仅显示已启用的应用程序 |
-s | 仅显示系统应用 |
-3 | 仅显示第三方应用程序 |
-我 | 显示应用程序的安装程序 |
-u | 包括已卸载的应用程序 |
<FILTER> |
包名称包含<FILTER> 字符串 |
所有应用程序
命令:
adb shell pm list packages
示例输出:
package:com.android.smoketest
package:com.example.android.livecubes
package:com.android.providers.telephony
package:com.google.android.googlequicksearchbox
package:com.android.providers.calendar
package:com.android.providers.media
package:com.android.protips
package:com.android.documentsui
package:com.android.gallery
package:com.android.externalstorage
...
// other packages here
...
系统应用程序
命令:
adb shell pm list packages -s
第三方使用
命令:
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] <path_to_apk>
范围:
Adb install 后面可以跟一些可选参数来控制安装 APK 的行为。可用的参数及其含义如下:
参数 | 意义 |
---|---|
-l | 将应用程序安装到受保护的目录 /mnt/asec |
-r | 允许覆盖安装 |
-t | 允许安装android:testOnly="true" AndroidManifest.xml中application指定的应用程序 |
-s | 将应用程序安装到 SD 卡 |
-d | 允许降级以覆盖安装 |
-g | 授予所有运行时权限 |
运行命令后,如果看到类似如下的输出(状态为Success),则表示安装成功:
[100%] /data/local/tmp/1.apk
pkg: /data/local/tmp/1.apk
Success
以上是最新版本v1.0.36的adb的输出,会显示推送apk文件到手机的进度百分比。
使用旧版本的adb,输出如下:
12040 KB/s (22205609 bytes in 1.801s)
pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk
Success
如果状态为Failure,则安装失败,例如:
[100%] /data/local/tmp/map-20160831.apk
pkg: /data/local/tmp/map-20160831.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
常见安装失败输出代码、含义及可能的解决方案如下:
输出 | 意义 | 解决方案 |
---|---|---|
安装失败_已存在 | 应用程序已存在,或已卸载但未卸载干净 | adb install ,使用-r 参数,或者先adb uninstall <packagename> 然后安装 |
安装失败_无效_APK | APK文件无效 | |
安装失败_无效_URI | APK 文件名无效 | 确保APK文件名中没有中文 |
安装失败_存储不足 | 空间不足 | 清理空间 |
安装失败_重复_包 | 同名程序已存在 | |
安装失败_无共享用户 | 请求的共享用户不存在 | |
安装失败_更新不兼容 | 同名应用之前安装过,但卸载时数据未清除;或者应用已经安装,但签名不一致 | 首先adb uninstall <packagename> 然后安装 |
安装失败_共享_用户不兼容 | 请求的共享用户存在但签名不一致 | |
安装失败_缺少_共享库 | 安装包使用了设备上不可用的共享库 | |
安装失败_替换_无法删除 | 替换时无法删除 | |
安装失败 | dex优化验证失败或空间不足 | |
安装失败_旧_SDK | 设备系统版本低于应用要求 | |
安装失败_冲突_提供程序 | 设备中已存在与应用同名的内容提供程序 | |
安装失败_新_SDK | 设备系统版本高于应用要求 | |
仅安装失败测试 | 应用程序仅供测试,但-t 安装时未指定参数 |
|
安装失败_CPU_ABI_不兼容 | 包含不兼容设备 CPU 应用程序二进制接口的本机代码 | |
安装失败_缺少_功能 | 应用程序使用了设备上不可用的功能 | |
安装失败容器错误 | 1.sdcard访问失败; 2.应用程序签名与ROM签名一致,视为内置应用程序。 |
1.确认sdcard可用,或者安装到内置存储; 2.打包时不要使用和ROM相同的签名。 |
安装失败_安装位置无效 | 1.无法安装到指定位置; 2.应用程序签名与ROM签名一致,视为内置应用程序。 |
1.切换安装位置,增加或者删除-s 参数;2.打包时不要使用和ROM相同的签名。 |
安装失败_媒体不可用 | 安装位置不可用 | 一般是sdcard,确认sdcard可用或者安装到内置存储 |
安装失败_验证超时 | 验证安装包超时 | |
安装失败_验证失败 | 验证安装包失败 | |
安装失败_包已更改 | 应用程序不符合调用程序的期望 | |
安装失败_UID_已更改 | 该应用之前安装过,与本次分配的UID不一致 | 清理以前安装的残留文件 |
安装失败_版本降级 | 已安装此应用的较新版本 | 使用-d 参数 |
安装失败_权限模型降级 | 安装的目标SDK支持具有运行时权限的同名应用程序,而要安装的版本不支持运行时权限 | |
安装解析失败,非 APK | 指定的路径不是文件或不是以.apk |
|
安装解析失败_清单 | 无法解析 AndroidManifest.xml 文件 | |
安装解析失败_意外异常 | 解析器遇到异常 | |
安装解析失败,无证书 | 安装包未签名 | |
安装解析失败_证书不一致 | 应用已安装,签名与APK文件不一致 | 先在设备上卸载该应用程序,然后再安装 |
安装解析失败证书编码 | CertificateEncodingException |
|
安装解析失败_错误包名称 | 清单文件中不存在软件包名称或软件包名称无效 | |
安装解析失败_BAD_SHARED_USER_ID | 清单文件中指定了无效的共享用户 ID | |
安装解析失败_清单文件格式错误 | 解析清单文件时遇到结构错误 | |
安装解析失败_清单为空 | 清单文件中找不到可操作的标签(仪器或应用程序) | |
安装失败_内部错误 | 由于系统问题,安装失败 | |
安装失败_用户受限 | 限制用户安装应用程序 | |
安装失败_重复_权限 | 应用程序尝试定义现有的权限名称 | |
安装失败_没有匹配的ABIS | 应用程序包含设备应用程序二进制接口不支持的本机代码 | |
用户取消安装 | 需要在设备上确认安装App,但设备未进行操作或取消 | 同意在设备上安装 |
安装失败_ACWF_不兼容 | 该应用程序与设备不兼容 | |
不包含AndroidManifest.xml | APK文件无效 | |
不是有效的 zip 文件 | APK文件无效 | |
离线 | 设备未连接成功 | 首先将设备连接到adb成功 |
未经授权 | 该设备无权允许调试 | |
错误:未找到设备 | 没有成功连接的设备 | 首先将设备连接到adb成功 |
协议失败 | 设备已断开连接 | 首先将设备连接到adb成功 |
未知选项:-s | Android 2.2 不支持安装到 SD 卡 | 不要使用-s 参数 |
设备上没有剩余空间 | 空间不足 | 清理空间 |
权限被拒绝... SD卡... | SD卡不可用 | |
签名与先前安装的版本不匹配;忽略! | 应用已安装,签名不一致 | 先在设备上卸载该应用程序,然后再安装 |
adb install 内部原理介绍
adb install其实分三步完成:
- 将 apk 文件推送到 /data/local/tmp。
- 调用pm install进行安装。
- 删除/data/local/tmp下对应的apk文件。
因此,在必要时,您也可以按照此步骤,手动一步步执行安装过程。
卸载应用程序
命令:
adb uninstall [-k] <packagename>
<packagename>
表示应用的包名,-k 参数可选,表示卸载应用,但保留数据和缓存目录。
命令示例:
adb uninstall com.qihoo360.mobilesafe
意思是卸载360手机卫士。
清除应用程序数据和缓存
命令:
adb shell pm clear <packagename>
<packagename>
代表应用名称包。该命令的效果相当于在设置中的应用信息界面点击“清除缓存”和“清除数据”。
命令示例:
adb shell pm clear com.qihoo360.mobilesafe
意思是清除360手机卫士的数据和缓存。
查看前台活动
命令:
adb shell dumpsys activity activities | grep mFocusedActivity
示例输出:
mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}
其中,com.cyanogenmod.trebuchet/com.android.launcher3.Launcher
是当前处于前台的Activity。
查看正在运行的服务
命令:
adb shell dumpsys activity services [<packagename>]
该<packagename>
参数非必需,指定<packagename>
表示查看某个包名相关的Service,不指定表示查看所有Service。
<packagename>
不必给出完整的包名。例如,如果你运行 adb shell dumpsys activity services org.mazhuang,那么包名 org.mazhuang.demo1、org.mazhuang.demo2、org.mazhuang123 以及其他相关的服务都会被列出来。
查看应用程序详细信息
命令:
adb shell dumpsys package <packagename>
输出包含很多信息,包括ActivityResolverTable、RegisteredContentProviders、包名、userId、安装后的文件资源代码路径、版本信息、权限信息及授予状态、签名版本信息等。
<packagename>
表示应用程序包名称。
示例输出:
Activity Resolver Table:
Non-Data Actions:
android.intent.action.MAIN:
5b4cba8 org.mazhuang.guanggoo/.SplashActivity filter 5ec9dcc
Action: "android.intent.action.MAIN"
Category: "android.intent.category.LAUNCHER"
AutoVerify=false
Registered ContentProviders:
org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider:
Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}
ContentProvider Authorities:
[org.mazhuang.guanggoo.fileProvider]:
Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}
applicationInfo=ApplicationInfo{7754242 org.mazhuang.guanggoo}
Key Set Manager:
[org.mazhuang.guanggoo]
Signing KeySets: 501
Packages:
Package [org.mazhuang.guanggoo] (c1d7f):
userId=10394
pkg=Package{55f714c org.mazhuang.guanggoo}
codePath=/data/app/org.mazhuang.guanggoo-2
resourcePath=/data/app/org.mazhuang.guanggoo-2
legacyNativeLibraryDir=/data/app/org.mazhuang.guanggoo-2/lib
primaryCpuAbi=null
secondaryCpuAbi=null
versionCode=74 minSdk=15 targetSdk=25
versionName=1.1.74
splits=[base]
apkSigningVersion=2
applicationInfo=ApplicationInfo{7754242 org.mazhuang.guanggoo}
flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP]
privateFlags=[ RESIZEABLE_ACTIVITIES]
dataDir=/data/user/0/org.mazhuang.guanggoo
supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
timeStamp=2017-10-22 23:50:53
firstInstallTime=2017-10-22 23:50:25
lastUpdateTime=2017-10-22 23:50:55
installerPackageName=com.miui.packageinstaller
signatures=PackageSignatures{af09595 [53c7caa2]}
installPermissionsFixed=true installStatus=1
pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP]
requested permissions:
android.permission.READ_PHONE_STATE
android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.READ_LOGS
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE
install permissions:
android.permission.INTERNET: granted=true
android.permission.ACCESS_NETWORK_STATE: granted=true
android.permission.ACCESS_WIFI_STATE: granted=true
User 0: ceDataInode=1155675 installed=true hidden=false suspended=false stopped=true notLaunched=false enabled=0
gids=[3003]
runtime permissions:
android.permission.READ_EXTERNAL_STORAGE: granted=true
android.permission.READ_PHONE_STATE: granted=true
android.permission.WRITE_EXTERNAL_STORAGE: granted=true
User 999: ceDataInode=0 installed=false hidden=false suspended=false stopped=true notLaunched=true enabled=0
gids=[3003]
runtime permissions:
Dexopt state:
[org.mazhuang.guanggoo]
Instruction Set: arm64
path: /data/app/org.mazhuang.guanggoo-2/base.apk
status: /data/app/org.mazhuang.guanggoo-2/oat/arm64/base.odex [compilation_filter=speed-profile, status=kOatUpToDa
te]
与应用程序交互
主要使用am <command>
命令,常用的<command>
如下:
命令 | 使用 |
---|---|
start [options] <INTENT> |
启动指定的活动<INTENT> |
startservice [options] <INTENT> |
启动指定的服务<INTENT> |
broadcast [options] <INTENT> |
发送指定的广播<INTENT> |
force-stop <packagename> |
停止<packagename> 相关进程 |
<INTENT>
参数非常灵活,和编写Android程序时代码中的Intent相对应。
用于确定意图对象的选项如下:
参数 | 意义 |
---|---|
-a <ACTION> |
指定操作,例如android.intent.action.VIEW |
-c <CATEGORY> |
指定类别,例如android.intent.category.APP_CONTACTS |
-n <COMPONENT> |
指定完整的组件名称,用于明确指定启动哪个Activity,例如com.example.app/.ExampleActivity |
<INTENT>
也可以携带数据,就像写代码时的Bundle一样:
参数 | 意义 |
---|---|
--esn <EXTRA_KEY> |
空值(仅键名) |
`-e | --es <EXTRA_KEY> <EXTRA_STRING_VALUE>` |
--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> |
布尔值 |
--ei <EXTRA_KEY> <EXTRA_INT_VALUE> |
整数值 |
--el <EXTRA_KEY> <EXTRA_LONG_VALUE> |
长值 |
--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> |
浮点值 |
--eu <EXTRA_KEY> <EXTRA_URI_VALUE> |
URI |
--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE> |
组件名称 |
--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...] |
整数数据库 |
--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...] |
长储备 |
激活活动
命令格式:
adb shell am start [options] <INTENT>
例如:
adb shell am start -n com.tencent.mm/.ui.LauncherUI
表示微信主界面已激活。
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
意思是调用org.mazhuang.boottimemeasure/.MainActivity,并把字符串数据键值对toast-hello,world传递给它。
接送服务
命令格式:
adb shell am startservice [options] <INTENT>
例如:
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
表示微信某项服务已经开通。
发送广播
命令格式:
adb shell am broadcast [options] <INTENT>
它可以广播给所有组件,也可以只广播给指定的组件。
例如,向所有组件广播 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
这种用法在测试的时候很实用。比如一个广播场景比较难实现,可以考虑用这种方式发送广播。
既可以发送系统预定义的广播,也可以发送自定义的广播。以下是部分系统预定义广播及正常触发时序:
行动 | 触发时机 |
---|---|
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触发)
强制停止应用程序
命令:
adb shell am force-stop <packagename>
命令示例:
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: the user to be disabled
例如,向应用程序授予权限。在运行 Android 6.0(API 级别 23)及更高版本的设备上,该权限可以是应用程序清单中声明的任何权限。在运行 Android 5.1(API 级别 22)及更低版本的设备上,该权限必须是应用程序定义的可选权限。
免责声明:以上命令为非常规命令,本人不承担任何因操作导致您设备损坏、强制停止等责任。您是在您的设备上执行此操作,您需自行承担责任。
文件管理
将设备中的文件复制到电脑
命令:
adb pull <file path in device> [directory on computer]
其中,电脑上目录参数可以省略,默认复制到当前目录下。
例子:
adb pull /sdcard/sr.mp4 ~/tmp/
*小贴士:*设备上的文件路径可能需要root权限才能访问,如果你的设备已经root,可以在adb shell中使用adb shell和su命令获取root权限,然后cp /path/on/device /sdcard/filename将文件复制到sdcard,然后adb pull /sdcard/filename /path/on/pc。
将文件从计算机复制到设备
命令:
adb push <file path on computer> <directory in device>
例子:
adb push ~/sr.mp4 /sdcard/
*小贴士:*普通权限可能无法直接写入设备上的文件路径,如果你的设备已经root,可以先adb push /path/on/pc /sdcard/filename,然后adb shell,在adb shell中su获取root权限后,cp /sdcard/filename /path/on/device。
模拟键/输入
adb shell 中有一个非常有用的命令叫 input,通过它可以做一些有趣的事情。input
命令的完整帮助信息如下:
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
gesture
touchscreen
gamepad
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
例如模拟点击: //点击屏幕上坐标点x=50 y=250的位置。
adb shell 输入 tap 50 250
例如,使用 adb shell input keyevent 命令,不同的 keycode 可以实现不同的功能。完整的 keycode 列表请参见 KeyEvent。摘录如下:
键码 | 意义 |
---|---|
3 | HOME键 |
4 | 返回键 |
5 | 打开拨号应用程序 |
6 | 挂断电话 |
24 | 增加音量 |
二十五 | 降低音量 |
二十六 | 电源按钮 |
二十七 | 拍照(需要在相机应用程序中) |
64 | 打开浏览器 |
82 | 菜单键 |
85 | 播放/暂停 |
86 | 停止播放 |
87 | 播放下一首歌曲 |
88 | 播放上一首歌曲 |
122 | 将光标移动到行首或列表顶部 |
123 | 将光标移动到行尾或列表底部 |
126 | 继续播放 |
127 | 暂停播放 |
164 | 沉默的 |
176 | 打开系统设置 |
187 | 切换应用程序 |
207 | 打开联系人 |
208 | 打开日历 |
209 | 打开音乐 |
210 | 打开计算器 |
220 | 降低屏幕亮度 |
221 | 增加屏幕亮度 |
223 | 系统休眠 |
224 | 点亮屏幕 |
231 | 打开语音助手 |
276 | 如果没有唤醒锁,则让系统休眠 |
以下是输入命令的一些使用示例。
电源按钮
db shell input keyevent 26
其效果相当于按下电源按钮。
菜单
命令:
adb shell input keyevent 82
HOME键
命令:
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
滑动解锁
如果锁屏没有密码,并且是通过滑动手势解锁的,则可以通过输入滑动来解锁。
命令(参数基于Nexus 5型号,例如向上滑动手势解锁):
adb shell input swipe 300 1000 300 500
参数300 1000 300 500分别代表起点x坐标,起点y坐标,终点x坐标,终点y坐标。
输入文本
当焦点位于文本框上时,您可以使用输入命令输入文本。
命令:
adb shell input text hello
现在文本框中出现了“hello”。
查看日志
Android系统日志分为两部分,底层Linux内核日志输出到/proc/kmsg,Android日志输出到/dev/log。
Android 日志
命令格式:
[adb] logcat [<option>] ... [<filter-spec>] ...
常见用法如下:
按级别过滤日志
Android日志分为以下几种优先级(priority):
-V —— Verbose(最低,输出最多)
-D —— Debug I —— Info
-W —— Warning
-E —— Error
-F—— Fatal
-S —— Silent(最高,什么都不输出)
通过一定级别过滤日志,将输出该级别及以上级别的日志。
例如,命令:
adb logcat *:W
将输出警告、错误、致命和静默日志。
(注意:macOS下,需要给:W添加双引号,这样*才能作为标签参数,比如adb logcat " :W",否则会报错no matches found: *:W。)
按标签和级别过滤日志
<filter-spec>
可以由多个组成<tag>[:priority]
。
例如,命令:
adb logcat ActivityManager:I MyApp:D *:S
意思是输出ActivityManager标签Info以上的日志,输出MyApp标签Debug以上的日志,以及其他标签的Silent日志(也就是屏蔽掉其他标签的日志)。
日志格式
您可以使用adb logcat -v <format>
选项指定日志输出格式。
日志支持以下类型<format>
:
-简短的
默认格式。格式为:
/():
例子:
D/HeadsetStateMachine(1785):断开连接进程消息:10,大小:0
-过程
格式为:
()
例子:
D(1785)断开连接过程消息:10,大小:0(HeadsetStateMachine)
-标签
格式为:
/:
例子:
D/HeadsetStateMachine:断开连接进程消息:10,大小:0
至
-raw
格式为:
例子:
断开连接的进程消息:10,大小:0
-时间
格式为:
/():
例子:
08-28 22:39:39.974 D / HeadsetStateMachine(1785):断开连接的进程消息:10,大小:0
-线程时间
格式为:
:
例子:
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine:断开连接进程消息:10,大小:0
-长的
格式为:
[ : /]
例子:
[08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine] 断开连接进程消息:10,大小:0
指定格式可以与上述过滤同时使用。如:
adb logcat -v long ActivityManager:I *:S
清除日志
adb logcat -c
内核日志
命令:
adb shell dmesg
示例输出:
<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs
<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs
<6>[14201.753642] PM: resume of devices complete after 68.106 msecs
<4>[14201.755954] Restarting tasks ... done.
<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC
<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC
<6>[14201.872498] PM: Syncing filesystems ... done.
括号中的[14201.684016]表示内核启动以来的时间,以秒为单位。
通过内核日志我们可以做一些事情,比如测量内核的启动时间,在系统启动后找到内核日志中Freeing init memory行之前的时间。
查看设备信息
模型
命令:
adb shell getprop ro.product.model
示例输出:
Nexus 5
电池状态
命令:
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 size
示例输出:
Physical size: 1080x1920
设备屏幕分辨率为1080px * 1920px。
如果使用命令修改的话,输出可能是:
Physical size: 1080x1920
Override size: 480x1024
表示设备屏幕分辨率原先为1080px * 1920px,目前修改为480px * 1024px。
屏幕密度
命令:
adb shell wm density
示例输出:
物理密度:420
设备屏幕密度为420dpi。
如果使用命令修改的话,输出可能是:
物理密度:480
覆盖密度: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。
android_id
命令:
adb shell settings get secure android_id
示例输出:
51b6be48bac8c569
IMEI
在Android 4.4及以下版本中,可以通过以下命令获取IMEI:
adb shell dumpsys iphonesubinfo
示例输出:
Phone Subscriber Info:
Phone Type = GSM
Device ID = 860955027785041
The Device ID is 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 自 Android 5.0 Lollipop 起不再工作
Android系统版本
命令:
adb shell getprop ro.build.version.release
示例输出:
5.0.2
IP 地址
每次想知道设备的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地址。
此命令在某些设备上无输出,如果设备连接了WiFi,可以使用以下命令查看局域网 adb shell ifconfig wlan0 示例:
wlan0: ip 10.129.160.99 mask 255.255.240.0 flags [up broadcast running multicast]
或者
wlan0 Link encap:UNSPEC
inet addr:10.129.168.57 Bcast:10.129.175.255 Mask:255.255.240.0
inet6 addr: fe80::66cc:2eff:fe68:b6b6/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:496520 errors:0 dropped:0 overruns:0 frame:0
TX packets: 68215 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3000
RX bytes: 116266821 TX bytes: 8311736
如果上述命令仍然没有得到预期的信息,可以尝试以下命令(部分系统版本可用):
adb shell netcfg
示例输出:
wlan0 UP 10.129.160.99/20 0x00001043 f8:a9:d0:17:42:4d
lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00
p2p0 UP 0.0.0.0/0 0x00001003 fa:a9:d0:17:42:4d
sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
rmnet0 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet1 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet3 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet2 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet4 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet6 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet5 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet7 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rev_rmnet3 DOWN 0.0.0.0/0 0x00001002 4e:b7:e4:2e:17:58
rev_rmnet2 DOWN 0.0.0.0/0 0x00001002 4e:f0:c8:bf:7a:cf
rev_rmnet4 DOWN 0.0.0.0/0 0x00001002 a6:c0:3b:6b:c4:1f
rev_rmnet6 DOWN 0.0.0.0/0 0x00001002 66:bb:5d:64:2e:e9
rev_rmnet5 DOWN 0.0.0.0/0 0x00001002 0e:1b:eb:b9:23:a0
rev_rmnet7 DOWN 0.0.0.0/0 0x00001002 7a:d9:f6:81:40:5a
rev_rmnet8 DOWN 0.0.0.0/0 0x00001002 4e:e2:a9:bb:d0:1b
rev_rmnet0 DOWN 0.0.0.0/0 0x00001002 fe:65:d0:ca:82:a9
rev_rmnet1 DOWN 0.0.0.0/0 0x00001002 da:d8:e8:4f:2e:fe
可以看到网络连接名称、激活状态、IP地址、Mac地址等信息。
Mac地址
命令:
adb shell cat /sys/class/net/wlan0/address
示例输出:
f8:a9:d0:17:42:4d
这个就是局域网的Mac地址,移动网络或者其他的连接信息可以通过上一节“IP地址”中提到的adb shell netcfg命令查看。
CPU 信息
命令:
adb shell cat /proc/cpuinfo
示例输出:
Processor: ARMv7 Processor rev 0 (v7l)
processor: 0
BogoMIPS: 38.40
processor: 1
BogoMIPS: 38.40
processor: 2
BogoMIPS: 38.40
processor: 3
BogoMIPS: 38.40
Features: swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer: 0x51
CPU architecture: 7
CPU variant: 0x2
CPU part: 0x06f
CPU revision: 0
Hardware: Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)
Revision: 000b
Serial: 0000000000000000
这是 Nexus 5 的 CPU 信息,从输出中我们可以看到,使用的硬件是 Qualcomm MSM 8974,处理器编号是 0 到 3,所以是四核,使用的架构是 ARMv7 Processor rev 0 (v71)。
内存信息
命令:
adb shell cat /proc/meminfo
示例输出:
MemTotal: 1027424 kB
MemFree: 486564 kB
Buffers: 15224 kB
Cached: 72464 kB
SwapCached: 24152 kB
Active: 110572 kB
Inactive: 259060 kB
Active(anon): 79176 kB
Inactive(anon): 207736 kB
Active(file): 31396 kB
Inactive(file): 51324 kB
Unevictable: 3948 kB
Mlocked: 0 kB
HighTotal: 409600 kB
HighFree: 132612 kB
LowTotal: 617824 kB
LowFree: 353952 kB
SwapTotal: 262140 kB
SwapFree: 207572 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 265324 kB
Mapped: 47072 kB
Shmem: 1020 kB
Slab: 57372 kB
SReclaimable: 7692 kB
SUnreclaim: 49680 kB
KernelStack: 4512 kB
PageTables: 5912 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 775852 kB
Committed_AS: 13520632 kB
VmallocTotal: 385024 kB
VmallocUsed: 61004 kB
VmallocChunk: 209668 kB
其中,MemTotal为设备总内存,MemFree为当前空闲内存。
更多硬件和系统属性
可以通过以下命令查看设备更多硬件和系统属性:
adb shell cat /system/build.prop
这里会输出很多信息,包括前面提到的“型号”和“Android系统版本”。
输出还包含一些其他有用的信息,也可以通过 adb shell getprop 命令单独查看。部分属性如下所示:
属性名称 | 意义 |
---|---|
ro.build.version.sdk | SDK 版本 |
ro.build.version.release | Android系统版本 |
ro.build.version.security_patch | Android 安全补丁程序级别 |
ro.产品.型号 | 模型 |
ro.产品.品牌 | 品牌 |
ro.产品名称 | 设备名称 |
ro.product.board | 处理器型号 |
ro.product.cpu.abilist | CPU 支持的 Abi 列表 [第 1 部分] |
persist.sys.isUsbOtgEnabled | 是否支持OTG |
dalvik.vm.heapsize | 每个应用程序的最大内存限制 |
ro.sf.lcd_density | 屏幕密度 |
部分注释 1:
部分小厂定制的ROM可能修改了CPU支持的abi列表的属性名,如果用ro.product.cpu.abilist属性名找不到,可以尝试:
adb shell cat /system/build.prop | grep ro.product.cpu.abi
示例输出:
ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
修改设置
*注意:修改设置后,运行 Recovery 命令仍可能显示异常。您可以运行 ADB Reboot 重启设备,或者手动重启。*
修改settings的原理主要是通过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
关闭 USB 调试模式
命令:
adb shell 设置将全局 adb_enabled 0
恢复:
无法用命令恢复,毕竟关闭USB调试的话adb是无法连接安卓设备的。
进入设备手动恢复:“设置”-“开发者选项”-“Android调试”。
显示和隐藏状态栏和导航栏
本节提到的相关设置与Cyanogenmod中的“扩展桌面”相对应。
命令:
adb shell settings put global policy_control <key-values>
<key-values>
可以由以下键及其对应的值组成,格式为<key1>=<value1>:<key2>=<value2>
。
钥匙 | 意义 |
---|---|
沉浸式.full | 同时隐藏 |
沉浸式状态 | 隐藏状态栏 |
沉浸式导航 | 隐藏导航栏 |
沉浸式预先确认 | ? |
这些键对应的值可以用逗号组合成如下值:
价值 | 意义 |
---|---|
apps |
所有应用程序 |
* |
所有接口 |
packagename |
指定应用程序 |
-packagename |
排除特定应用程序 |
例如:
adb shell settings put global policy_control immersive.full=*
表示所有界面同时隐藏状态栏和导航栏。
adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
意思是设置在包名是com.package1和com.package2的应用中隐藏状态栏,在除了包名com.package3之外的所有应用中隐藏导航栏。
返回正常模式
如果我不想全屏怎么办?
adb shell settings put global policy_control null
实用功能
截图
保存屏幕截图到电脑:
adb exec-out screencap -p> sc.png
如果adb版本比较旧,无法使用exec-out命令,建议此时更新adb版本。如果无法更新,可以使用以下比较麻烦的方法:
首先将截图保存到设备:
adb shell screencap -p /sdcard/sc.png
然后将png文件导出到电脑:
adb pull /sdcard/sc.png
可以使用 adb shell screencap -h 查看screencap命令的帮助信息,以下是两个比较有意义的参数及其含义:
参数 | 意义 |
---|---|
-p | 指定保存文件为png格式 |
-d 显示 ID | 指定截图的屏幕编号(如果有多个屏幕) |
实际上,如果指定的文件名以 .png 结尾,则可以省略 -p 参数;否则,需要使用 -p 参数。如果不指定文件名,则截图文件的内容将直接输出到 stdout。
截取单行命令的屏幕截图并保存到计算机的另一种方法:
Linux 和 Windows
adb shell screencap -p | sed "s/\r$//"> sc.png
Mac OS X
adb shell screencap -p | gsed "s/\r$//"> sc.png
此方法需要使用 gnu sed 命令,该命令在 Linux 下直接可用,在 Windows 下位于 Git 安装目录的 bin 文件夹下。如果实在找不到该命令,可以下载 sed for Windows,并将 sed.exe 所在的文件夹添加到 PATH 环境变量中。
但是在Mac下使用系统自带的sed命令会报错:
sed: RE error: illegal byte sequence
需要安装gnu-sed,然后使用gsed命令:
brew install gnu-sed
录制屏幕
录制的屏幕以mp4格式保存到/sdcard:
adb shell screenrecord /sdcard/filename.mp4
需要停止时按Ctrl-C,默认录音时间和最大录音时间均为180秒。
如果需要导出到计算机:
adb pull /sdcard/filename.mp4
可以使用 adb shell screenrecord --help 查看 screenrecord 命令的帮助信息,以下是常用参数及其含义:
参数 | 意义 |
---|---|
--尺寸宽度x高度 | 视频的大小,如1280x720 ,默认是屏幕分辨率。 |
--比特率速率 | 视频的比特率,默认为4Mbps。 |
--time-limit 时间 | 录音时长,以秒为单位。 |
--详细 | 输出更多信息。 |
将系统分区重新挂载为可写
*注意:需要 root 权限。*
/system分区默认挂载为只读,但是有些操作比如向Android系统添加命令、删除自带的应用程序等需要写入/system,所以需要将其重新挂载为读写。
步:
进入shell并切换到root用户权限。
命令:
adb shell
su
查看当前分区挂载状态。
命令:
mount
示例输出:
rootfs / rootfs ro, relatime 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /var tmpfs rw,seclabel,relatime,mode=770,gid=1000 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
none /dev/memcg cgroup rw,relatime,memory 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
none /sys/fs/cgroup/freezer cgroup rw,relatime,freezer 0 0
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,relatime,noauto_da_alloc,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/platform/msm_sdcc.1/by-name/modem /firmware vfat ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage =cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/fuse /mnt/shell/emulated/0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
找到我们关心的 /system 行:
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
重新挂载。
命令:
mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system
这里 /dev/block/platform/msm_sdcc.1/by-name/system 是我们从上一步的输出中获得的文件路径。
如果输出没有提示错误,则操作成功,你可以对/system下的文件进行任何你想做的事情。
查看已连接的WiFi密码
*注意:需要 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年8月23日13点15分00秒。
重启手机
命令:
adb reboot
检查设备是否已 root
命令:
adb shell
su
此时命令行提示符为$,表示没有root权限,#表示已经root。
使用 Monkey 进行压力测试
Monkey可以生成伪随机用户事件来模拟点击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
简单用法:
adb shell monkey -p <packagename> -v 500
意思是向指定的应用程序发送500个伪随机事件<packagename>
。
Monkey的详细使用方法请参考官方文档。
打开/关闭 WiFi
注意:需要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
从 Recovery 重启至 Android
命令:
adb reboot
重启至 Fastboot 模式
命令:
adb reboot bootloader
通过侧载更新系统
如果我们把Android设备对应的系统更新包下载到电脑上,同样可以通过adb完成更新。
以Recovery模式下更新为例:
重新启动到恢复模式。
命令:
adb reboot recovery
在设备Recovery界面操作进入Apply update-Apply from ADB。
*注意:不同的 Recovery 菜单可能与此不同。部分一级菜单有“Apply update from ADB”(从 ADB 应用更新)。*
*通过 adb 上传并更新系统。*
命令:
adb sideload <path-to-update.zip>
更多 adb shell 命令
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
各列含义:
列名 | 意义 |
---|---|
用户 | 拥有用户 |
PID | 进程 ID |
进程标识符 | 父进程ID |
姓名 | 进程名称 |
查看实时资源使用情况
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 |
公关 | 优先事项 |
中央处理器% | 当前时刻 CPU 占用百分比 |
秒 | 进程状态(R=运行、S=睡眠、T=跟踪/停止、Z=僵尸进程) |
#THR | 线程数 |
虚拟安全系统 | Virtual Set Size虚拟内存消耗(包含共享库占用的内存) |
RSS | Resident Set Size 实际使用物理内存(包含共享库占用的内存) |
PCY | 调度策略优先级,SP_BACKGROUND/SPFOREGROUND |
唯一标识符 | 进程所有者的用户 ID |
姓名 | 进程名称 |
top命令还支持一些命令行参数,详细用法如下:
Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
-m num shows how many processes at most
-n num exit after refreshing how many times
-d num refresh interval (unit: second, default value 5)
-s col Sort by a column (available col values: cpu, vss, rss, thr)
-t display thread information
-h show help document
查看进程UID
有两个选项:
adb shell dumpsys package <packagename> | grep userId=
例如:
$ adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
userId=10394
通过ps命令找到对应进程的pid后,adb shell cat /proc/<pid>/status | grep Uid
例如:
$ 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:/$
其他
下面简单介绍一下其他常用的命令,上面已经具体提到过的命令就不再单独解释:
命令 | 特征 |
---|---|
猫 | 显示文件内容 |
光盘 | 更改目录 |
chmod | 更改文件访问模式/访问权限 |
自由度 | 检查磁盘空间使用情况 |
grep | 过滤输出 |
杀 | 杀死指定PID的进程 |
ls | 列出目录的内容 |
山 | 查看和管理挂载目录 |
MV | 移动或重命名文件 |
附言 | 查看正在运行的进程 |
室 | 删除文件 |
顶部 | 检查进程的资源使用情况 |
安全相关
启用 SELinux
启用 SELinux
adb root
adb shell setenforce 1
禁用 SELinux
adb root
adb shell setenforce 0
启用 dm_verity
adb root
adb enable-verity
禁用 dm_verity
adb root
adb disable-verity
常见问题
无法启动 adb 服务器
错误信息
error: protocol fault (couldn't read status): No error
可能的原因
adb服务器进程要使用的5037端口被占用。
解决方案
找到占用5037端口的进程,并终止该进程。以Windows系统为例:
netstat -ano | findstr LISTENING
...
TCP 0.0.0.0:5037 0.0.0.0:0 LISTENING 1548
...
这里1548是进程号,用以下命令结束该进程:
taskkill /PID 1548
然后启动adb就没问题了。
文章来源:https://dev.to/larsonzhong/most-complete-adb-commands-4pcg