最全ADB命令手册

2025-05-25

最全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 *


Enter fullscreen mode Exit fullscreen mode

那么这里有三个问题,为什么是服务器,服务器对应的是服务端还是服务器?如果手机是客户端,那服务器是指电脑上开启的服务吗?还有这个守护进程是什么?

ADB是一个C/S架构的应用程序,由三部分组成:

  1. 在 PC 端运行的 adb 客户端:命令行程序“adb”用于从 shell 或脚本运行 adb 命令。首先,“adb”程序会尝试定位主机上的 ADB 服务器。如果找不到 ADB 服务器,则“adb”程序会自动启动一个 ADB 服务器。接下来,当设备的 adbd 与 PC 端的 adb 服务器建立连接后,adb 客户端就可以向 ADB 服务器发送服务请求;
  2. PC端运行的adb server:ADB Server是运行在主机上的后台进程,其功能是检测USB端口传感设备的连接与移除,以及模拟器实例的启动或停止。ADB Server还需要将adb client的请求通过usb或tcp发送给相应的adbd;
  3. 设备端运行的常驻进程 adb demon(adbd):程序“adbd”作为后台进程运行在Android设备或模拟器系统中,它的功能是连接ADB服务器,并为运行在主机上的客户端提供一些服务;

在这里插入图片描述

在这里插入图片描述

ADB端口被占用

有个小伙伴说希望我把Adb启动问题放在最前面,因为他经常遇到adb找不到设备的问题,那我就把它放在最前面,我想肯定不止她一个人会遇到这种情况。

5037是adb的默认端口,如果5037端口被占用,我们在使用Adb命令时就会遇到找不到设备的困扰,这个问题对于不太熟悉Adb的朋友来说经常会遇到,所以我将这个用法放在了文章的开头,方便朋友们方便找到;
解决这类端口占用问题的思路都是一样的,三步:

  1. 找到使用该端口的进程的Pid;


C:\Windows\system32>netstat -aon|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 3172


Enter fullscreen mode Exit fullscreen mode
  1. 通过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


Enter fullscreen mode Exit fullscreen mode
  1. 使用命令终止命令的运行;


C:\Users\wwx229495>taskkill /pid 3172 /f
Success: The process with PID 3172 has been terminated.


Enter fullscreen mode Exit fullscreen mode

有时候,一些流氓程序会把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


Enter fullscreen mode Exit fullscreen mode

输出中的 cf264b8f、emulator-5554 和 10.129.164.6:5555 是序列号。

例如,你想指定设备cf264b8f来运行adb命令获取屏幕分辨率:



adb -s cf264b8f shell wm size


Enter fullscreen mode Exit fullscreen mode

再比如在设备10.129.164.6:5555上安装一个应用(该形式下serialNumber的格式为:,一般是无线连接的设备或者第三方的Android模拟器如Genymotion):



adb -s 10.129.164.6:5555 install test.apk


Enter fullscreen mode Exit fullscreen mode

*在多设备/模拟器的情况下,这些参数用于指定命令的目标设备。以下仅作简化说明,不再赘述。*

开始停止

启动adb服务器命令:



adb start-server


Enter fullscreen mode Exit fullscreen mode

(一般情况下不需要手动执行该命令,如果运行adb命令时发现adb服务器没有启动,会自动启动。)

停止adb服务器命令:



adb kill-server


Enter fullscreen mode Exit fullscreen mode

查看 adb 版本



adb version


Enter fullscreen mode Exit fullscreen mode

示例输出



Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android


Enter fullscreen mode Exit fullscreen mode

以 root 身份运行 adbd

adb的运行原理是PC端的adb服务器与手机端的守护进程adbd建立连接,然后PC端的adb客户端通过adb服务器转发命令,adbd收到命令后解析并运行。

所以如果adbd以普通权限执行的话,一些需要root权限才能执行的命令是无法直接用adb xxx执行的,这时候可以先adb shell再su之后执行命令,也可以让adbd以root权限执行,这样就可以随意执行高权限的命令了。

命令:



adb root


Enter fullscreen mode Exit fullscreen mode

正常输出:



restarting adbd as root


Enter fullscreen mode Exit fullscreen mode

现在再次运行 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


Enter fullscreen mode Exit fullscreen mode

默认端口为 5037。

设备连接管理


查询已连接的设备/模拟器

命令:



adb devices


Enter fullscreen mode Exit fullscreen mode

示例输出:



List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device


Enter fullscreen mode Exit fullscreen mode

输出格式为[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


Enter fullscreen mode Exit fullscreen mode

如果可以看到
xxxxxx设备则
表示连接成功。

无线连接(需要 USB 线)

除了通过 USB 连接设备和电脑来使用 adb 之外,你还可以使用无线连接——虽然连接过程中有使用 USB 的步骤,但是连接成功后你的设备就可以在一定范围内摆脱 USB 线的限制了!

步骤:
将 Android 设备和运行 adb 的电脑连接到同一个局域网,例如同一个 WiFi。
通过 USB 数据线将设备连接到电脑。
确保连接成功(可以运行 adb devices 查看设备是否被列出)。
让设备监听 5555 端口的 TCP/IP 连接:



adb tcpip 5555


Enter fullscreen mode Exit fullscreen mode

断开 USB 连接。
查找设备的 IP 地址。
通常可以在“设置”-“关于手机”-“状态信息”-“IP 地址”中找到,也可以使用 adb 命令查看,方法参考下文查看设备信息-IP 地址部分。

通过IP地址连接设备。



adb connect <device-ip-address>


Enter fullscreen mode Exit fullscreen mode

这是上一步找到的设备IP地址。

确认连接状态。



adb devices


Enter fullscreen mode Exit fullscreen mode

如果你能看到



<device-ip-address>:5555 device


Enter fullscreen mode Exit fullscreen mode

连接成功。
如果无法连接,请确认安卓设备和电脑连接到同一个WiFi,然后adb connect <device-ip-address>再次执行步骤;
如果还是不行,请通过 adb kill-server 重启 adb,然后从头再试。

断开无线连接
命令:



adb disconnect <device-ip-address>


Enter fullscreen mode Exit fullscreen mode

无线连接(无需使用 USB 线)

注意:需要root权限。

上一节“无线连接(需要 USB 数据线)”是官方文档中介绍的方法,需要借助 USB 数据线来实现无线连接。
既然我们要实现无线连接,那所有步骤都能无线吗?答案是肯定的。
在 Android 设备上安装一个终端仿真器。
已经安装好的设备可以跳过此步骤。我使用的终端仿真器的下载地址是:Terminal Emulator for Android Downloads。
将 Android 设备和要运行 adb 的电脑连接到同一个局域网,例如同一个 WiFi。
在 Android 设备上打开终端仿真器,依次运行以下命令:



su
setprop service.adb.tcp.port 5555


Enter fullscreen mode Exit fullscreen mode

查找 Android 设备的 IP 地址。

一般可以在“设置”-“关于手机”-“状态信息”-“IP地址”中找到,也可以使用adb命令按照下面查看设备信息-IP地址部分的方法查看。

通过计算机上的 adb 和 IP 地址连接 Android 设备。



adb connect <device-ip-address>


Enter fullscreen mode Exit fullscreen mode

这是上一步找到的设备IP地址。

如果可以看到输出connected to :5555,则表示连接成功。

部分注释 1:

部分设备如小米5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能需要在执行第5步之前重启adbd服务,并在设备的终端模拟器上运行:



restart adbd


Enter fullscreen mode Exit fullscreen mode

如果重启不起作用,请尝试以下命令:



stop adbd
start adbd


Enter fullscreen mode Exit fullscreen mode

应用程序管理

查看申请列表

查看应用程序列表的基本命令格式是



adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]


Enter fullscreen mode Exit fullscreen mode

即在 adb shell pm list packages 的基础上,可以添加一些参数来过滤查看不同的列表,支持的过滤参数如下:

参数 显示列表
没有任何 所有应用程序
-f 显示与应用程序关联的 apk 文件
-d 仅显示已禁用的应用程序
-e 仅显示已启用的应用程序
-s 仅显示系统应用
-3 仅显示第三方应用程序
-我 显示应用程序的安装程序
-u 包括已卸载的应用程序
<FILTER> 包名称包含<FILTER>字符串

所有应用程序

命令:



adb shell pm list packages


Enter fullscreen mode Exit fullscreen mode

示例输出:



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
...


Enter fullscreen mode Exit fullscreen mode

系统应用程序

命令:



adb shell pm list packages -s


Enter fullscreen mode Exit fullscreen mode

第三方使用

命令:



adb shell pm list packages -3


Enter fullscreen mode Exit fullscreen mode

包名包含某个字符串的应用程序
例如,查看包名包含字符串mazhuang的应用程序列表,命令:



adb shell pm list packages mazhuang


Enter fullscreen mode Exit fullscreen mode

当然也可以用grep来过滤:



adb shell pm list packages | grep mazhuang


Enter fullscreen mode Exit fullscreen mode

安装APK

命令格式:



adb install [-lrtsdg] <path_to_apk>


Enter fullscreen mode Exit fullscreen mode

范围:

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


Enter fullscreen mode Exit fullscreen mode

以上是最新版本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


Enter fullscreen mode Exit fullscreen mode

如果状态为Failure,则安装失败,例如:



[100%] /data/local/tmp/map-20160831.apk
        pkg: /data/local/tmp/map-20160831.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]


Enter fullscreen mode Exit fullscreen mode

常见安装失败输出代码、含义及可能的解决方案如下:

解析APK文件时
输出 意义 解决方案
安装失败_已存在 应用程序已存在,或已卸载但未卸载干净 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卡不可用
签名与先前安装的版本不匹配;忽略! 应用已安装,签名不一致 先在设备上卸载该应用程序,然后再安装

参考:[PackageManager.java]

adb install 内部原理介绍

adb install其实分三步完成:

  1. 将 apk 文件推送到 /data/local/tmp。
  2. 调用pm install进行安装。
  3. 删除/data/local/tmp下对应的apk文件。

因此,在必要时,您也可以按照此步骤,手动一步步执行安装过程。

卸载应用程序

命令:



adb uninstall [-k] <packagename>


Enter fullscreen mode Exit fullscreen mode

<packagename>表示应用的包名,-k 参数可选,表示卸载应用,但保留数据和缓存目录。
命令示例:



adb uninstall com.qihoo360.mobilesafe


Enter fullscreen mode Exit fullscreen mode

意思是卸载360手机卫士。

清除应用程序数据和缓存

命令:



adb shell pm clear <packagename>


Enter fullscreen mode Exit fullscreen mode

<packagename>代表应用名称包。该命令的效果相当于在设置中的应用信息界面点击“清除缓存”和“清除数据”。

命令示例:



adb shell pm clear com.qihoo360.mobilesafe


Enter fullscreen mode Exit fullscreen mode

意思是清除360手机卫士的数据和缓存。

查看前台活动

命令:



adb shell dumpsys activity activities | grep mFocusedActivity


Enter fullscreen mode Exit fullscreen mode

示例输出:



mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}


Enter fullscreen mode Exit fullscreen mode

其中,com.cyanogenmod.trebuchet/com.android.launcher3.Launcher是当前处于前台的Activity。

查看正在运行的服务

命令:



adb shell dumpsys activity services [<packagename>]


Enter fullscreen mode Exit fullscreen mode

<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>


Enter fullscreen mode Exit fullscreen mode

输出包含很多信息,包括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]


Enter fullscreen mode Exit fullscreen mode

与应用程序交互

主要使用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>


Enter fullscreen mode Exit fullscreen mode

例如:



adb shell am start -n com.tencent.mm/.ui.LauncherUI


Enter fullscreen mode Exit fullscreen mode

表示微信主界面已激活。



adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"


Enter fullscreen mode Exit fullscreen mode

意思是调用org.mazhuang.boottimemeasure/.MainActivity,并把字符串数据键值对toast-hello,world传递给它。

接送服务

命令格式:



adb shell am startservice [options] <INTENT>


Enter fullscreen mode Exit fullscreen mode

例如:



adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService


Enter fullscreen mode Exit fullscreen mode

表示微信某项服务已经开通。

发送广播

命令格式:



adb shell am broadcast [options] <INTENT>


Enter fullscreen mode Exit fullscreen mode

它可以广播给所有组件,也可以只广播给指定的组件。

例如,向所有组件广播 BOOT_COMPLETED:



adb shell am broadcast -a android.intent.action.BOOT_COMPLETED


Enter fullscreen mode Exit fullscreen mode

再比如,只向org.mazhuang.boottimemeasure/.BootCompletedReceiver广播BOOT_COMPLETED:



adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver


Enter fullscreen mode Exit fullscreen mode

这种用法在测试的时候很实用。比如一个广播场景比较难实现,可以考虑用这种方式发送广播。
既可以发送系统预定义的广播,也可以发送自定义的广播。以下是部分系统预定义广播及正常触发时序:

行动 触发时机
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>


Enter fullscreen mode Exit fullscreen mode

命令示例:



adb shell am force-stop com.qihoo360.mobilesafe


Enter fullscreen mode Exit fullscreen mode

表示停止360安全卫士的所有进程和服务。

禁用应用程序并启动

命令示例:



adb shell pm disable-user <packagename>
adb shell pm disable <packagename>


Enter fullscreen mode Exit fullscreen mode


adb shell pm disable-user [options] <packagename>


Enter fullscreen mode Exit fullscreen mode

命令示例:



adb shell pm enable <packagename>


Enter fullscreen mode Exit fullscreen mode

撤销应用程序的权限

  1. 向应用授予权限。只能授予应用声明的可选权限


adb shell pm grant <packagename> <PACKAGE_PERMISSION>


Enter fullscreen mode Exit fullscreen mode

例如:adb -d shell pm grant packageName android.permission.BATTERY_STATS

  1. 取消应用授权


adb shell pm revoke <packagename> <PACKAGE_PERMISSION>


Enter fullscreen mode Exit fullscreen mode

选项--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]


Enter fullscreen mode Exit fullscreen mode

其中,电脑上目录参数可以省略,默认复制到当前目录下。

例子:



adb pull /sdcard/sr.mp4 ~/tmp/


Enter fullscreen mode Exit fullscreen mode

*小贴士:*设备上的文件路径可能需要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>


Enter fullscreen mode Exit fullscreen mode

例子:



adb push ~/sr.mp4 /sdcard/


Enter fullscreen mode Exit fullscreen mode

*小贴士:*普通权限可能无法直接写入设备上的文件路径,如果你的设备已经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)


Enter fullscreen mode Exit fullscreen mode

例如模拟点击: //点击屏幕上坐标点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


Enter fullscreen mode Exit fullscreen mode

其效果相当于按下电源按钮。

菜单

命令:



adb shell input keyevent 82


Enter fullscreen mode Exit fullscreen mode

HOME键

命令:



adb shell input keyevent 3


Enter fullscreen mode Exit fullscreen mode

返回键

命令:



adb shell input keyevent 4


Enter fullscreen mode Exit fullscreen mode

音量控制

增加音量:



adb shell input keyevent 24


Enter fullscreen mode Exit fullscreen mode

降低音量:



adb shell input keyevent 25


Enter fullscreen mode Exit fullscreen mode

沉默的:



adb shell input keyevent 164


Enter fullscreen mode Exit fullscreen mode

媒体控制

播放/暂停:



adb shell input keyevent 85


Enter fullscreen mode Exit fullscreen mode

停止播放:



adb shell input keyevent 86


Enter fullscreen mode Exit fullscreen mode

播放下一首歌曲:



adb shell input keyevent 87


Enter fullscreen mode Exit fullscreen mode

播放上一首歌曲:



adb shell input keyevent 88


Enter fullscreen mode Exit fullscreen mode

继续播放:



adb shell input keyevent 126


Enter fullscreen mode Exit fullscreen mode

暂停播放:



adb shell input keyevent 127


Enter fullscreen mode Exit fullscreen mode

打开/关闭屏幕

上面介绍的模拟电源按钮可以用来切换屏幕的开关,但是如果你明确想要打开或关闭屏幕,可以使用下面的方法。

点亮屏幕:



adb shell input keyevent 224


Enter fullscreen mode Exit fullscreen mode

关闭屏幕:



adb shell input keyevent 223


Enter fullscreen mode Exit fullscreen mode

滑动解锁

如果锁屏没有密码,并且是通过滑动手势解锁的,则可以通过输入滑动来解锁。

命令(参数基于Nexus 5型号,例如向上滑动手势解锁):



adb shell input swipe 300 1000 300 500


Enter fullscreen mode Exit fullscreen mode

参数300 1000 300 500分别代表起点x坐标,起点y坐标,终点x坐标,终点y坐标。

输入文本

当焦点位于文本框上时,您可以使用输入命令输入文本。

命令:



adb shell input text hello


Enter fullscreen mode Exit fullscreen mode

现在文本框中出现了“hello”。

查看日志

Android系统日志分为两部分,底层Linux内核日志输出到/proc/kmsg,Android日志输出到/dev/log。

Android 日志

命令格式:



[adb] logcat [<option>] ... [<filter-spec>] ...


Enter fullscreen mode Exit fullscreen mode

常见用法如下:

按级别过滤日志

Android日志分为以下几种优先级(priority):

-V —— Verbose(最低,输出最多)
-D —— Debug I —— Info
-W —— Warning
-E —— Error
-F—— Fatal
-S —— Silent(最高,什么都不输出)

通过一定级别过滤日志,将输出该级别及以上级别的日志。

例如,命令:



adb logcat *:W


Enter fullscreen mode Exit fullscreen mode

将输出警告、错误、致命和静默日志。

(注意:macOS下,需要给:W添加双引号,这样*才能作为标签参数,比如adb logcat " :W",否则会报错no matches found: *:W。)

按标签和级别过滤日志

<filter-spec>可以由多个组成<tag>[:priority]

例如,命令:



adb logcat ActivityManager:I MyApp:D *:S


Enter fullscreen mode Exit fullscreen mode

意思是输出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


Enter fullscreen mode Exit fullscreen mode

清除日志



adb logcat -c


Enter fullscreen mode Exit fullscreen mode

内核日志

命令:



adb shell dmesg


Enter fullscreen mode Exit fullscreen mode

示例输出:



<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.


Enter fullscreen mode Exit fullscreen mode

括号中的[14201.684016]表示内核启动以来的时间,以秒为单位。

通过内核日志我们可以做一些事情,比如测量内核的启动时间,在系统启动后找到内核日志中Freeing init memory行之前的时间。

查看设备信息

模型

命令:



adb shell getprop ro.product.model


Enter fullscreen mode Exit fullscreen mode

示例输出:

Nexus 5

电池状态

命令:



adb shell dumpsys battery


Enter fullscreen mode Exit fullscreen mode

输入示例:



  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


Enter fullscreen mode Exit fullscreen mode

其中scale代表最大电量,level代表当前电量。上面的输出表示剩余电量44%。

屏幕分辨率

命令:



adb shell wm size


Enter fullscreen mode Exit fullscreen mode

示例输出:



Physical size: 1080x1920


Enter fullscreen mode Exit fullscreen mode

设备屏幕分辨率为1080px * 1920px。

如果使用命令修改的话,输出可能是:



Physical size: 1080x1920
Override size: 480x1024


Enter fullscreen mode Exit fullscreen mode

表示设备屏幕分辨率原先为1080px * 1920px,目前修改为480px * 1024px。

屏幕密度

命令:

adb shell wm density
示例输出:

物理密度:420
设备屏幕密度为420dpi。

如果使用命令修改的话,输出可能是:

物理密度:480
覆盖密度:160
表示设备的屏幕密度原来是480dpi,现在修改为160dpi。

显示参数

命令:



adb shell dumpsys window displays


Enter fullscreen mode Exit fullscreen mode

示例输出:



WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
  Display: mDisplayId=0
    init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
    deferred=false layoutNeeded=false


Enter fullscreen mode Exit fullscreen mode

其中,mDisplayId为显示屏编号,init为初始分辨率和屏幕密度。app的高度比init中小一些,代表屏幕底部有虚拟按键。高度为1920-1794=126px,42dp。

android_id

命令:



adb shell settings get secure android_id


Enter fullscreen mode Exit fullscreen mode

示例输出:



51b6be48bac8c569


Enter fullscreen mode Exit fullscreen mode

IMEI

在Android 4.4及以下版本中,可以通过以下命令获取IMEI:



adb shell dumpsys iphonesubinfo


Enter fullscreen mode Exit fullscreen mode

示例输出:



Phone Subscriber Info:
  Phone Type = GSM
  Device ID = 860955027785041
The Device ID is IMEI.


Enter fullscreen mode Exit fullscreen mode

在Android 5.0及以上版本中,此命令输出为空,必须通过其他方式获取(需要root权限):



adb shell
su
service call iphonesubinfo 1


Enter fullscreen mode Exit fullscreen mode

示例输出:



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...')


Enter fullscreen mode Exit fullscreen mode

提取里面的有效内容就是IMEI,比如这里是860955027785041。

参考:adb shell dumpsys iphonesubinfo 自 Android 5.0 Lollipop 起不再工作

Android系统版本

命令:



adb shell getprop ro.build.version.release


Enter fullscreen mode Exit fullscreen mode

示例输出:

5.0.2

IP 地址

每次想知道设备的IP地址,都要“设置”-“关于手机”-“状态信息”-“IP地址”,很烦吧?其实通过adb就可以轻松查看。

命令:



adb shell ifconfig "| grep Mask"


Enter fullscreen mode Exit fullscreen mode

示例输出:



inet addr:10.130.245.230 Mask:255.255.255.252
inet addr: 127.0.0.1 Mask: 255.0.0.0


Enter fullscreen mode Exit fullscreen mode

那么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]


Enter fullscreen mode Exit fullscreen mode

或者



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


Enter fullscreen mode Exit fullscreen mode

如果上述命令仍然没有得到预期的信息,可以尝试以下命令(部分系统版本可用):



adb shell netcfg


Enter fullscreen mode Exit fullscreen mode

示例输出:



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


Enter fullscreen mode Exit fullscreen mode

可以看到网络连接名称、激活状态、IP地址、Mac地址等信息。

Mac地址

命令:



adb shell cat /sys/class/net/wlan0/address


Enter fullscreen mode Exit fullscreen mode

示例输出:



f8:a9:d0:17:42:4d


Enter fullscreen mode Exit fullscreen mode

这个就是局域网的Mac地址,移动网络或者其他的连接信息可以通过上一节“IP地址”中提到的adb shell netcfg命令查看。

CPU 信息

命令:



adb shell cat /proc/cpuinfo


Enter fullscreen mode Exit fullscreen mode

示例输出:



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


Enter fullscreen mode Exit fullscreen mode

这是 Nexus 5 的 CPU 信息,从输出中我们可以看到,使用的硬件是 Qualcomm MSM 8974,处理器编号是 0 到 3,所以是四核,使用的架构是 ARMv7 Processor rev 0 (v71)。

内存信息

命令:



adb shell cat /proc/meminfo


Enter fullscreen mode Exit fullscreen mode

示例输出:



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


Enter fullscreen mode Exit fullscreen mode

其中,MemTotal为设备总内存,MemFree为当前空闲内存。

更多硬件和系统属性

可以通过以下命令查看设备更多硬件和系统属性:



adb shell cat /system/build.prop


Enter fullscreen mode Exit fullscreen mode

这里会输出很多信息,包括前面提到的“型号”和“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


Enter fullscreen mode Exit fullscreen mode

示例输出:



ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi


Enter fullscreen mode Exit fullscreen mode

修改设置

*注意:修改设置后,运行 Recovery 命令仍可能显示异常。您可以运行 ADB Reboot 重启设备,或者手动重启。*

修改settings的原理主要是通过settings命令来修改/data/data/com.android.providers.settings/databases/settings.db中存储的设置值。

解决

命令:



adb shell wm size 480x1024


Enter fullscreen mode Exit fullscreen mode

意思是将分辨率修改为480px*1024px。

恢复原分辨率命令:



adb shell wm size reset


Enter fullscreen mode Exit fullscreen mode

屏幕密度

命令:



adb shell wm density 160


Enter fullscreen mode Exit fullscreen mode

意思是修改屏幕密度为160dpi。

恢复原屏幕密度命令:



adb shell wm density reset


Enter fullscreen mode Exit fullscreen mode

显示区域

命令:



adb shell wm overscan 0,0,0,200


Enter fullscreen mode Exit fullscreen mode

四个数字分别表示距离左、上、右、下边缘的边距像素。上述命令的意思是,在屏幕底部留出 200px 的空白。

恢复原显示区域命令:



adb shell wm overscan reset


Enter fullscreen mode Exit fullscreen mode

关闭 USB 调试模式

命令:

adb shell 设置将全局 adb_enabled 0
恢复:

无法用命令恢复,毕竟关闭USB调试的话adb是无法连接安卓设备的。

进入设备手动恢复:“设置”-“开发者选项”-“Android调试”。

显示和隐藏状态栏和导航栏

本节提到的相关设置与Cyanogenmod中的“扩展桌面”相对应。

命令:



adb shell settings put global policy_control <key-values>


Enter fullscreen mode Exit fullscreen mode

<key-values>可以由以下键及其对应的值组成,格式为<key1>=<value1>:<key2>=<value2>

钥匙 意义
沉浸式.full 同时隐藏
沉浸式状态 隐藏状态栏
沉浸式导航 隐藏导航栏
沉浸式预先确认

这些键对应的值可以用逗号组合成如下值:

价值 意义
apps 所有应用程序
* 所有接口
packagename 指定应用程序
-packagename 排除特定应用程序

例如:



adb shell settings put global policy_control immersive.full=*


Enter fullscreen mode Exit fullscreen mode

表示所有界面同时隐藏状态栏和导航栏。



adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3


Enter fullscreen mode Exit fullscreen mode

意思是设置在包名是com.package1和com.package2的应用中隐藏状态栏,在除了包名com.package3之外的所有应用中隐藏导航栏。

返回正常模式

如果我不想全屏怎么办?



adb shell settings put global policy_control null


Enter fullscreen mode Exit fullscreen mode

实用功能

截图

保存屏幕截图到电脑:



adb exec-out screencap -p> sc.png


Enter fullscreen mode Exit fullscreen mode

如果adb版本比较旧,无法使用exec-out命令,建议此时更新adb版本。如果无法更新,可以使用以下比较麻烦的方法:

首先将截图保存到设备:



adb shell screencap -p /sdcard/sc.png


Enter fullscreen mode Exit fullscreen mode

然后将png文件导出到电脑:



adb pull /sdcard/sc.png


Enter fullscreen mode Exit fullscreen mode

可以使用 adb shell screencap -h 查看screencap命令的帮助信息,以下是两个比较有意义的参数及其含义:

参数 意义
-p 指定保存文件为png格式
-d 显示 ID 指定截图的屏幕编号(如果有多个屏幕)

实际上,如果指定的文件名以 .png 结尾,则可以省略 -p 参数;否则,需要使用 -p 参数。如果不指定文件名,则截图文件的内容将直接输出到 stdout。

截取单行命令的屏幕截图并保存到计算机的另一种方法:

Linux 和 Windows



adb shell screencap -p | sed "s/\r$//"> sc.png


Enter fullscreen mode Exit fullscreen mode

Mac OS X



adb shell screencap -p | gsed "s/\r$//"> sc.png


Enter fullscreen mode Exit fullscreen mode

此方法需要使用 gnu sed 命令,该命令在 Linux 下直接可用,在 Windows 下位于 Git 安装目录的 bin 文件夹下。如果实在找不到该命令,可以下载 sed for Windows,并将 sed.exe 所在的文件夹添加到 PATH 环境变量中。

但是在Mac下使用系统自带的sed命令会报错:



sed: RE error: illegal byte sequence


Enter fullscreen mode Exit fullscreen mode

需要安装gnu-sed,然后使用gsed命令:



brew install gnu-sed


Enter fullscreen mode Exit fullscreen mode

录制屏幕

录制的屏幕以mp4格式保存到/sdcard:



adb shell screenrecord /sdcard/filename.mp4


Enter fullscreen mode Exit fullscreen mode

需要停止时按Ctrl-C,默认录音时间和最大录音时间均为180秒。

如果需要导出到计算机:



adb pull /sdcard/filename.mp4


Enter fullscreen mode Exit fullscreen mode

可以使用 adb shell screenrecord --help 查看 screenrecord 命令的帮助信息,以下是常用参数及其含义:

参数 意义
--尺寸宽度x高度 视频的大小,如1280x720,默认是屏幕分辨率。
--比特率速率 视频的比特率,默认为4Mbps。
--time-limit 时间 录音时长,以秒为单位。
--详细 输出更多信息。

将系统分区重新挂载为可写

*注意:需要 root 权限。*

/system分区默认挂载为只读,但是有些操作比如向Android系统添加命令、删除自带的应用程序等需要写入/system,所以需要将其重新挂载为读写。

步:

进入shell并切换到root用户权限。

命令:



adb shell
su


Enter fullscreen mode Exit fullscreen mode

查看当前分区挂载状态。

命令:



mount


Enter fullscreen mode Exit fullscreen mode

示例输出:



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


Enter fullscreen mode Exit fullscreen mode

找到我们关心的 /system 行:



/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0


Enter fullscreen mode Exit fullscreen mode

重新挂载。

命令:



mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system


Enter fullscreen mode Exit fullscreen mode

这里 /dev/block/platform/msm_sdcc.1/by-name/system 是我们从上一步的输出中获得的文件路径。

如果输出没有提示错误,则操作成功,你可以对/system下的文件进行任何你想做的事情。

查看已连接的WiFi密码

*注意:需要 root 权限。*

命令:



adb shell
su
cat /data/misc/wifi/*.conf


Enter fullscreen mode Exit fullscreen mode

示例输出:



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
}


Enter fullscreen mode Exit fullscreen mode

ssid是我们在WLAN设置中看到的名称,psk是密码,key_mgmt是安全加密方式。

设置系统日期和时间

*注意:需要 root 权限。*

命令:



adb shell
su
date -s 20160823.131500


Enter fullscreen mode Exit fullscreen mode

意思是将系统日期时间修改为2016年8月23日13点15分00秒。

重启手机

命令:



adb reboot


Enter fullscreen mode Exit fullscreen mode

检查设备是否已 root

命令:



adb shell
su


Enter fullscreen mode Exit fullscreen mode

此时命令行提示符为$,表示没有root权限,#表示已经root。

使用 Monkey 进行压力测试

Monkey可以生成伪随机用户事件来模拟点击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。

简单用法:



adb shell monkey -p <packagename> -v 500


Enter fullscreen mode Exit fullscreen mode

意思是向指定的应用程序发送500个伪随机事件<packagename>

Monkey的详细使用方法请参考官方文档。

打开/关闭 WiFi

注意:需要root权限。

有时需要控制设备的WiFi状态,可以使用以下命令来完成。

打开WiFi:



adb root
adb shell svc wifi enable


Enter fullscreen mode Exit fullscreen mode

关闭WiFi:



adb root
adb shell svc wifi disable


Enter fullscreen mode Exit fullscreen mode

设置wifi优先级,有网络和wifi时优先使用wifi



adb shell svc wifi prefer


Enter fullscreen mode Exit fullscreen mode

如果执行成功,则输出为空;如果没有root权限执行该命令,则执行失败,输出为Killed。

打开/关闭数据流量



svc data disable


Enter fullscreen mode Exit fullscreen mode

这个命令可以关闭数据连接,也就是网络流量。大家都知道控制网络的开关有很多,但大部分都是在apn上加接入点后缀来实现的,但是这个命令不会改变apn的任何设置,底层关闭数据连接应该是最彻底的,并且不影响apn的设置。这个和apndroid有什么区别?apndroid关闭网络数据的时候,不一定强制关闭正在下载的连接(这个apndroid自己的说明里也有提到)。比如你正在下载一个10M的电影,你下载1M的时候,下载是没有声音的。用apndroid关闭连接,可能下载还会继续,不是立刻。但是用这个命令,它就毫不留情地咔嚓一声关掉了。



adb shell svc data enable


Enter fullscreen mode Exit fullscreen mode

这是打开互联网数据连接,与上一个命令相反。



adb shell svc data prefer


Enter fullscreen mode Exit fullscreen mode

这个命令是控制数据连接优先于 wifi。我们都知道,正常情况下,有 wifi 的情况下,不会使用数据网络连接。但这个命令则相反,有数据网络的情况下,优先使用数据网络流量,没有数据网络的情况下才使用 wifi。

闪烁相关命令

重启至恢复模式

命令:



adb reboot recovery


Enter fullscreen mode Exit fullscreen mode

从 Recovery 重启至 Android

命令:



adb reboot


Enter fullscreen mode Exit fullscreen mode

重启至 Fastboot 模式

命令:



adb reboot bootloader


Enter fullscreen mode Exit fullscreen mode

通过侧载更新系统

如果我们把Android设备对应的系统更新包下载到电脑上,同样可以通过adb完成更新。

以Recovery模式下更新为例:

重新启动到恢复模式。

命令:



adb reboot recovery


Enter fullscreen mode Exit fullscreen mode

在设备Recovery界面操作进入Apply update-Apply from ADB。

*注意:不同的 Recovery 菜单可能与此不同。部分一级菜单有“Apply update from ADB”(从 ADB 应用更新)。*

*通过 adb 上传并更新系统。*

命令:



adb sideload <path-to-update.zip>


Enter fullscreen mode Exit fullscreen mode

更多 adb shell 命令

Android 系统基于 Linux 内核,因此 Linux 中的很多命令在 Android 中都有相同或相似的实现,可以在 adb shell 中调用。adb shell 命令在本文档前面部分已经使用过。

查看进程



adb shell ps


Enter fullscreen mode Exit fullscreen mode

例子:



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


Enter fullscreen mode Exit fullscreen mode

各列含义:

列名 意义
用户 拥有用户
PID 进程 ID
进程标识符 父进程ID
姓名 进程名称

查看实时资源使用情况



adb shell top


Enter fullscreen mode Exit fullscreen mode

例子:



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
 ...


Enter fullscreen mode Exit fullscreen mode

各列含义:

列名 意义
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


Enter fullscreen mode Exit fullscreen mode

查看进程UID

有两个选项:



adb shell dumpsys package <packagename> | grep userId=


Enter fullscreen mode Exit fullscreen mode

例如:



$ adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
   userId=10394


Enter fullscreen mode Exit fullscreen mode

通过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:/$


Enter fullscreen mode Exit fullscreen mode

其他

下面简单介绍一下其他常用的命令,上面已经具体提到过的命令就不再单独解释:

命令 特征
显示文件内容
光盘 更改目录
chmod 更改文件访问模式/访问权限
自由度 检查磁盘空间使用情况
grep 过滤输出
杀死指定PID的进程
ls 列出目录的内容
查看和管理挂载目录
MV 移动或重命名文件
附言 查看正在运行的进程
删除文件
顶部 检查进程的资源使用情况

安全相关

启用 SELinux

启用 SELinux



adb root
adb shell setenforce 1


Enter fullscreen mode Exit fullscreen mode

禁用 SELinux



adb root
adb shell setenforce 0


Enter fullscreen mode Exit fullscreen mode

启用 dm_verity



adb root
adb enable-verity


Enter fullscreen mode Exit fullscreen mode

禁用 dm_verity



adb root
adb disable-verity


Enter fullscreen mode Exit fullscreen mode

常见问题

无法启动 adb 服务器

错误信息



error: protocol fault (couldn't read status): No error


Enter fullscreen mode Exit fullscreen mode

可能的原因

adb服务器进程要使用的5037端口被占用。

解决方案

找到占用5037端口的进程,并终止该进程。以Windows系统为例:



netstat -ano | findstr LISTENING

...
TCP 0.0.0.0:5037 0.0.0.0:0 LISTENING 1548
...


Enter fullscreen mode Exit fullscreen mode

这里1548是进程号,用以下命令结束该进程:



taskkill /PID 1548


Enter fullscreen mode Exit fullscreen mode

然后启动adb就没问题了。

文章来源:https://dev.to/larsonzhong/most-complete-adb-commands-4pcg
PREV
Node.js 中使用 TypeScript 的路径别名
NEXT
20+ 免费初创企业和商业登陆页面模板