基本用法
基本命令
adb基本命令,基本语法如下:
-
adb [-d|-e|-s <serialNumber>] <command>
-
复制代码
如果当前连接只有一个设备,可以直接省略掉[-d|-e|-s <serialNumber>]
这一部分,直接使用 adb <comman
。
为命令行指定目标设备
如果有多台设备或模拟器连接,需要指定目标设备
参数 | 含义 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s <serialNumber> | 指定相应 serialNumber 号的设备/模拟器为命令目标 |
在多个设备/模拟器连接的情况下较常用的是 -s 参数,serialNumber 可以通过 adb devices 命令获取。如:
-
$ adb devices
-
List of devices attached
-
cf668fa device
-
emulator-555 device
-
196.168.1.150:5555 device
-
复制代码
这里的cf668fa
以及emulator-555
和196.168.1.150:5555
都称为serialNumber。
停止/启动
-
adb start-server
-
复制代码
启动adb,但是由于系统会自动启动,无需主动调用
-
adb kill-server
-
复制代码
停止adb,多用于PC存在多个adb时,全部关闭
查看adb的版本
-
adb version
-
复制代码
运行后结果如下:
可见版本为1.0.40. 安装地址在D:\SDK\platform-tools\adb.exe
.但是需要在环境变量中配置adb的path路径。
root权限
adb虽然可以用来做一些Root操作,但是前提是设备必须具备root权限,学习可以考虑用虚拟机。 命令:
-
adb root
-
复制代码
恢复root:
-
adb unroot
-
复制代码
设置adb的网络端口
命令:
-
adb -P <port> start-server
-
复制代码
这个几乎很少使用,不知到具体用处,之后补充记录
设备连接
查询设备
查询当前adb连接的设备信息
-
adb devices
-
复制代码
-
List of devices attached
-
0000119030001002 device
-
复制代码
输出的组成格式为[serialNumber] [state]
,其中0000119030001002
为设备编号SN
,device
为设备的状态。设备的状态可以分为以下几种:
-
offline
—— 表示设备未连接成功或无响应。 -
device
—— 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。 -
no device
—— 没有设备/模拟器连接。
该命令为常用命令,多会使用。
USB连接
USB连接就是通过USB线,以及adb来连接Android设备,也是开发工作中使用得最多的连接方式。一般手机需要打开[ 设置」-「开发者选项」-「Android 调试」。如果没有该选项,可以到「设置」-「关于手机」连续点击「版本号」可以打开开发者选项。
USB无线
其实除了USB连接设备外,还可以通过无线网的方式连接,虽然开始需要USB线连接,但是想想可以离开USB线的限制,是不是也有一点小激动呢。操作步骤如下
- 首先,确认PC和设备是处于同一局域网下,比如同一个路由下的wiffi。这是非常重要的。
- 其次,将PC和设备通过USB连接在一起,通过
adb devices
确认是否连接成功. - 然后,让设备在555端口监听TCP/IP 连接,当然部分特殊设备端口不是555,酌情调整:
-
adb tcpip 555
-
复制代码
- 之后,断开USB线连接
- 通过手机自身的设置」-「关于手机」-「状态信息」-「IP地址」或者(推荐后者)通过adb命令去获取设备的ip地址
adb shell ifconfig | grep Mask
. - 使用命令行和得到的IP地址连接设备
-
adb connect <device-ip-address>
-
复制代码
<device-ip-address>
也就是之前找到的ip地址.
- 最后,使用
adb devices
检测是否成功连接设备
无线连接(root)
无线连接的首要条件就是需要root权限.所以一开始就是adb root
开启root权限。然后操作步骤与USB一样,但是无需连接USB线。 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
- 首先,打开 Android 设备上的终端模拟器,在里面依次运行命令:
-
su
-
setprop service.adb.tcp.port 5555
-
复制代码
-
再者,通过手机自身的设置」-「关于手机」-「状态信息」-「IP地址」或者(推荐后者)通过adb命令去获取设备的ip地址
adb shell ifconfig | grep Mask
. -
最后,在电脑上通过 adb 和 IP 地址连接 Android 设备。
-
adb connect <device-ip-address>
-
复制代码
这里的<device-ip-address>
就是上一步中找到的设备 IP 地址。
如果能看到 connected to <device-ip-address>:
端口 这样的输出则表示连接成功。
Package管理
查阅应用列表
查阅应用列表的adb命令行模式如下:
-
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
-
复制代码
前部分adb shell pm list packages
为获取当前设备中所有应用的package信息,后面为过滤符。其中支持的过滤参数列表整理如下:
参数 | 显示列表 |
---|---|
无 | 所有应用 |
-f | 显示应用关联的 apk 文件 |
-d | 只显示 disabled 的应用 |
-e | 只显示 enabled 的应用 |
-s | 只显示系统应用 |
-3 | 只显示第三方应用 |
-i | 显示应用的 installer |
-u | 包含已卸载应用 |
<FILTER> | 包名包含 <FILTER> 字符串 |
ps:<FILTER>
除了直接可以过滤外,还可以使用grep做筛选 比如:
-
adb shell pm list packages clouwalk
-
复制代码
与
-
adb shell pm list packages |grep cloudwalk
-
复制代码
(部分设备不支持)
安装应用
安装应用为常用的adb命令行,其格式如下:
-
adb install [-xxx] <apk_path>
-
复制代码
其中xxx为修饰参数,用来指定应用apk的安装方式,具体可以有以下几种修饰方式:
参数 | 含义 |
---|---|
-l | 将应用安装到保护目录 /mnt/asec |
-r | 允许覆盖安装 |
-t | 允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用 |
-s | 将应用安装到 sdcard |
-d | 允许降级覆盖安装 |
-g | 授予所有运行时权限 |
出现如Success
标识,代表安装成功。出现Failure [xxx]
,代表失败.常见的失败选项如下:
输出 | 含义 | 解决方法 |
---|---|---|
INSTALL_FAILED_ALREADY_EXISTS | 应用已经存在,或卸载了但没卸载干净 | adb install 时使用 -r 参数,或者先 adb uninstall <packagename> 再安装 |
INSTALL_FAILED_INVALID_APK | 无效的 APK 文件 | 检查apk文件的完整性和有效性 |
INSTALL_FAILED_INVALID_URI | 无效的 APK 文件名 | 确保 APK 命名文件名里无中文或特殊字符 |
INSTALL_FAILED_INSUFFICIENT_STORAGE | 空间不足 | 清理空间 |
INSTALL_FAILED_DUPLICATE_PACKAGE | 已经存在同名程序 | 更改应用名或adb uninstall <packagename> 再安装 |
INSTALL_FAILED_NO_SHARED_USER | 请求的共享用户不存在 | |
INSTALL_FAILED_UPDATE_INCOMPATIBLE | 以前安装过同名应用,但卸载时数据没有移除;或者已安装该应用,但签名不一致 | 先 adb uninstall <packagename> 再安装 |
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE | 请求的共享用户存在但签名不一致 | |
INSTALL_FAILED_MISSING_SHARED_LIBRARY | 安装包使用了设备上不可用的共享库 | |
INSTALL_FAILED_REPLACE_COULDNT_DELETE | 替换时无法删除 | |
INSTALL_FAILED_DEXOPT | dex 优化验证失败或空间不足 | |
INSTALL_FAILED_OLDER_SDK | 设备系统版本低于应用要求 | |
INSTALL_FAILED_CONFLICTING_PROVIDER | 设备里已经存在与应用里同名的 content provider | |
INSTALL_FAILED_NEWER_SDK | 设备系统版本高于应用要求 | |
INSTALL_FAILED_TEST_ONLY | 应用是 test-only 的,但安装时没有指定 -t 参数 | |
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE | 包含不兼容设备 CPU 应用程序二进制接口的 native code | |
INSTALL_FAILED_MISSING_FEATURE | 应用使用了设备不可用的功能 | |
INSTALL_FAILED_CONTAINER_ERROR | 1. sdcard 访问失败; 2. 应用签名与 ROM 签名一致,被当作内置应用。 | 1. 确认 sdcard 可用,或者安装到内置存储; 2. 打包时不与 ROM 使用相同签名。 |
INSTALL_FAILED_INVALID_INSTALL_LOCATION | 1. 不能安装到指定位置; 2. 应用签名与 ROM 签名一致,被当作内置应用。 | 1. 切换安装位置,添加或删除 -s 参数;2. 打包时不与 ROM 使用相同签名。 |
INSTALL_FAILED_MEDIA_UNAVAILABLE | 安装位置不可用 | 一般为 sdcard,确认 sdcard 可用或安装到内置存储 |
INSTALL_FAILED_VERIFICATION_TIMEOUT | 验证安装包超时 | |
INSTALL_FAILED_VERIFICATION_FAILURE | 验证安装包失败 | |
INSTALL_FAILED_PACKAGE_CHANGED | 应用与调用程序期望的不一致 | |
INSTALL_FAILED_UID_CHANGED | 以前安装过该应用,与本次分配的 UID 不一致 | 清除以前安装过的残留文件 |
INSTALL_FAILED_VERSION_DOWNGRADE | 已经安装了该应用更高版本 | 使用 -d 参数 |
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE | 已安装 target SDK 支持运行时权限的同名应用,要安装的版本不支持运行时权限 | |
INSTALL_PARSE_FAILED_NOT_APK | 指定路径不是文件,或不是以 .apk 结尾 | |
INSTALL_PARSE_FAILED_BAD_MANIFEST | 无法解析的 AndroidManifest.xml 文件 | |
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION | 解析器遇到异常 | |
INSTALL_PARSE_FAILED_NO_CERTIFICATES | 安装包没有签名 | |
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES | 已安装该应用,且签名与 APK 文件不一致 | 先卸载设备上的该应用,再安装 |
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING | 解析 APK 文件时遇到 CertificateEncodingException | |
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME | manifest 文件里没有或者使用了无效的包名 | |
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID | manifest 文件里指定了无效的共享用户 ID | |
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED | 解析 manifest 文件时遇到结构性错误 | |
INSTALL_PARSE_FAILED_MANIFEST_EMPTY | 在 manifest 文件里找不到找可操作标签(instrumentation 或 application) | |
INSTALL_FAILED_INTERNAL_ERROR | 因系统问题安装失败 | |
INSTALL_FAILED_USER_RESTRICTED | 用户被限制安装应用 | 在开发者选项里将「USB安装」打开,如果已经打开了,那先关闭再打开。 |
INSTALL_FAILED_DUPLICATE_PERMISSION | 应用尝试定义一个已经存在的权限名称 | |
INSTALL_FAILED_NO_MATCHING_ABIS | 应用包含设备的应用程序二进制接口不支持的 native code | |
INSTALL_CANCELED_BY_USER | 应用安装需要在设备上确认,但未操作设备或点了取消 | 在设备上同意安装 |
INSTALL_FAILED_ACWF_INCOMPATIBLE | 应用程序与设备不兼容 | |
INSTALL_FAILED_TEST_ONLY | APK 文件是使用 Android Studio 直接 RUN 编译出来的文件 | 通过 Gradle 的 assembleDebug 或 assembleRelease 重新编译,或者 Generate Signed APK |
does not contain AndroidManifest.xml | 无效的 APK 文件 | |
is not a valid zip file | 无效的 APK 文件 | |
Offline | 设备未连接成功 | 先将设备与 adb 连接成功 |
unauthorized | 设备未授权允许调试 | |
error: device not found | 没有连接成功的设备 | 先将设备与 adb 连接成功 |
protocol failure | 设备已断开连接 | 先将设备与 adb 连接成功 |
Unknown option: -s | Android 2.2 以下不支持安装到 sdcard | 不使用 -s 参数 |
No space left on device | 空间不足 | 清理空间 |
Permission denied ... sdcard ... | sdcard 不可用 | |
signatures do not match the previously installed version; ignoring! | 已安装该应用且签名不一致 | 先卸载设备上的该应用,再安装 |
参考:PackageManager.java adb install 实际是分三步完成:
push 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>
-
复制代码
例如:
-
adb shell pm clear com.tecent.mobleqq
-
复制代码
这个命令就可以清除掉手机QQ上所有的本地缓存数据和应用数据。这个命令为常用命令
查看正在运行的service
-
adb shell dumpsys activity services [<packagename>]
-
复制代码
<packagename>
参数不是必须的,指定<packagename>
表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
<packagename>
不一定要给出完整的包名
查看应用详细信息
-
adb shell dumpsys package <packagename>
-
复制代码
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
<packagename>
表示应用包名。
查看应用安装途径
-
adb shell pm path <PACKAGE>
-
复制代码
输出应用安装路径.效果如下:
应用交互
与应用交互的关键字为am <command>
命令,常用的command
命令如下:
command | 用途 |
---|---|
start [options] <INTENT> | 启动 <INTENT> 指定的 Activity |
startservice [options] <INTENT> | 启动 <INTENT> 指定的 Service |
broadcast [options] <INTENT> | 发送 <INTENT> 指定的广播 |
force-stop <packagename> | 停止 <packagename> 相关的进程 |
<INTENT>
参数很灵活,和写 Android 程序时代码里的 Intent 相对应。 用于决定 intent 对象的选项如下:
参数 | 含义 |
---|---|
-a <ACTION> | 指定 action,比如 android.intent.action.VIEW |
-c <CATEGORY> | 指定 category,比如 android.intent.category.APP_CONTACTS |
-n <COMPONENT> | 指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity |
启动应用/ 调起 Activity
-
adb shell am start [options] <INTENT>
-
复制代码
例如:
-
adb shell am start -n com.tencent.mm/.ui.LauncherUI
-
复制代码
该命令可以启动微信
启动service
-
adb shell am startservice [options] <INTENT>
-
复制代码
例如:
-
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
-
复制代码
表示调起微信的某 Service。
另外一个典型的用例是如果设备上原本应该显示虚拟按键但是没有显示,可以试试这个:
-
adb shell am startservice -n com.android.systemui/.SystemUIService
-
复制代码
停止service
-
adb shell am stopservice [options] <INTENT>
-
复制代码
发送广播
-
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/.BootCompletedReceive
-
复制代码
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。 既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:
action | 触发时机 |
---|---|
android.net.conn.CONNECTIVITY_CHANGE | 网络连接发生变化 |
android.intent.action.SCREEN_ON | 屏幕点亮 |
android.intent.action.SCREEN_OFF | 屏幕熄灭 |
android.intent.action.BATTERY_LOW | 电量低,会弹出电量低提示框 |
android.intent.action.BATTERY_OKAY | 电量恢复了 |
android.intent.action.BOOT_COMPLETED | 设备启动完毕 |
android.intent.action.DEVICE_STORAGE_LOW | 存储空间过低 |
android.intent.action.DEVICE_STORAGE_OK | 存储空间恢复 |
android.intent.action.PACKAGE_ADDED | 安装了新的应用 |
android.net.wifi.STATE_CHANGE | WiFi 连接状态发生变化 |
android.net.wifi.WIFI_STATE_CHANGED | WiFi 状态变为启用/关闭/正在启动/正在关闭/未知 |
android.intent.action.BATTERY_CHANGED | 电池电量发生变化 |
android.intent.action.INPUT_METHOD_CHANGED | 系统输入法发生变化 |
android.intent.action.ACTION_POWER_CONNECTED | 外部电源连接 |
android.intent.action.ACTION_POWER_DISCONNECTED | 外部电源断开连接 |
android.intent.action.DREAMING_STARTED | 系统开始休眠 |
android.intent.action.DREAMING_STOPPED | 系统停止休眠 |
android.intent.action.WALLPAPER_CHANGED | 壁纸发生变化 |
android.intent.action.HEADSET_PLUG | 插入耳机 |
android.intent.action.MEDIA_UNMOUNTED | 卸载外部介质 |
android.intent.action.MEDIA_MOUNTED | 挂载外部介质 |
android.os.action.POWER_SAVE_MODE_CHANGED | 省电模式开启 |
(以上广播均可使用 adb 触发)
强制停止应用
命令:
adb shell am force-stop 命令示例:
adb shell am force-stop com.qihoo360.mobilesafe 表示停止 360 安全卫士的一切进程与服务
文件管理
复制设备里的文件到本地
该命令为常用命令,多用于导出log日志和一些关键文件。
-
adb pull <设备里的文件路径> [电脑上的目录]
-
复制代码
其中 电脑上的目录 参数可以省略,默认复制到当前目录。
复制电脑上的文件到设备
-
adb push <电脑上的文件路径> <设备里的目录>
-
复制代码
其中电脑上的文件路径既可以是绝对路径也可以是相对路径。
模拟按键输入
在某些测试情况下,可以通过编写bat命令行来做相应的测试,这就需要模拟按键输入。并且在一些特殊的设备,没有物理按键的情况下,也需要模拟按键输入。该命令在adb shell
命令下的input
下,在adb下使用help可以得到如下的信息:
-
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)
-
复制代码
比如使用 adb shell input keyevent 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,其中摘录部分比较常用的命令:
keycode | 含义 |
---|---|
3 | HOME 键 |
4 | 返回键 |
5 | 打开拨号应用 |
6 | 挂断电话 |
24 | 增加音量 |
25 | 降低音量 |
26 | 电源键 |
27 | 拍照(需要在相机应用里) |
64 | 打开浏览器 |
82 | 菜单键 |
85 | 播放/暂停 |
86 | 停止播放 |
87 | 播放下一首 |
88 | 播放上一首 |
122 | 移动光标到行首或列表顶部 |
123 | 移动光标到行末或列表底部 |
126 | 恢复播放 |
127 | 暂停播放 |
164 | 静音 |
176 | 打开系统设置 |
187 | 切换应用 |
207 | 打开联系人 |
208 | 打开日历 |
209 | 打开音乐 |
210 | 打开计算器 |
220 | 降低屏幕亮度 |
221 | 提高屏幕亮度 |
223 | 系统休眠 |
224 | 点亮屏幕 |
231 | 打开语音助手 |
276 | 如果没有 wakelock 则让系统休眠 |
下面是 input
命令的一些用法举例。
电源键
命令:
-
adb 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
-
复制代码
滑动解锁
如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 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日志查看
从Android日志方面分为底层的 Linux 内核和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
-
复制代码
会将 Warning、Error、Fatal 和 Silent 日志输出。 (注: 在 macOS 下需要给 *:W
这样以 *
作为 tag 的参数加双引号,如 adb logcat "*:W"
,不然会报错 no matches found: *:W
。)
按照tag和级别过滤日志
<filter-spec>
可以由多个 <tag>[:priority]
组成。
比如,命令:
-
adb logcat ActivityManager:I MyApp:D *:S
-
复制代码
表示输出 tag ActivityManager
的 Info 以上级别日志,输出 tag MyApp
的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
日志格式
清空日志
-
adb logcat -c
-
复制代码
内核日志
-
adb shell dmesg
-
复制代码
我这里运行结果如下:
-
[ 826.802773] init: Service 'mediacodec' (pid 241) killed by signal 6
-
[ 826.802849] init: Service 'mediacodec' (pid 241) killing any children in process group
-
[ 826.805858] init: Starting service 'mediacodec'...
-
[ 826.806083] rk-vcodec ff650000.vpu_service: closed
-
[ 826.808325] binder: send failed reply for transaction 291855 to 232:745
-
[ 826.866578] binder: 219:219 transaction failed 29189/0, size 96-0 line 2880
-
[ 2962.286136] hrtimer: interrupt took 228959 ns
-
复制代码
[]
中为运行的内核开始启动后的时间,单位为秒。
查看设备信息
设备型号
-
adb shell getprop ro.product.model
-
复制代码
我的为:
-
XiaoMi Note 3
-
复制代码
设备电池状态
-
adb shell dumpsys battery
-
复制代码
该命令可以获取设备的电池信息,结果如下:
-
Current Battery Service state:
-
AC powered: true
-
USB powered: false
-
Wireless powered: false
-
Max charging current: 0
-
Max charging voltage: 0
-
Charge counter: 0
-
status: 2
-
health: 2
-
present: true
-
level: 100
-
scale: 100
-
voltage: 0
-
temperature: 424
-
technology:
-
复制代码
其中 scale
代表最大电量,level
代表当前电量,这里代表电量为满电。
屏幕分辨率
-
adb shell wm size
-
复制代码
设备结果:
-
Physical size: 1920x1080
-
复制代码
该设备的物理分辨率为1920x1080.
屏幕密度
-
adb shell wm density
-
复制代码
这个在定制开发的时候常用的参数,用来决定dp和px之间的参数比.结果格式:
-
Physical density: 320
-
复制代码
该屏幕的密度为320dpi(Android设备基础dpi为160dpi)
显示屏参数
-
adb shell dumpsys window displays
-
复制代码
结果:
-
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
-
Display: mDisplayId=0
-
init=1920x1080 320dpi cur=1920x1080 app=1824x1080 rng=1080x1032-1824x1776
-
deferred=false layoutNeeded=false
-
复制代码
mDisplayId为屏幕显示id,init为屏幕分辨率,init 是初始分辨率和屏幕密度,app为可用界面,相当于排除非物理按键后的屏幕分辨率。
android_id
-
adb shell settings get secure android_id
-
复制代码
结果:7b666149274fbd13
什么是android_id?google 原文 A hardware serial number, if available.(一个硬件的序列码,如果有效的话)
IMEI(Device ID)
android 4.4及以下版本可以通过以下命令获取IMEI值:
-
adb shell dumpsys iphonesubinfo
-
复制代码
其中的 Device ID
就是IMEI
。
而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):
-
adb shell
-
su
-
service call iphonesubinfo 1
-
复制代码
运行结果: Result: Parcel( 0x00000000: 00000000 0000000f 00360038 00370039 '........8.6.9.7.' 0x00000010: 00360035 00340030 00300033 00380030 '5.6.0.4.3.0.0.8.' 0x00000020: 00380037 00000035 '7.8.5... ') 其中有效数字就是IMEI值:869756043008785
Android系统版本
-
adb shell getprop ro.build.version.release
-
复制代码
结果:7.1.2
,这就是系统版本号
IP地址
每次想知道设备的 IP 地址的时候都得「设置」-「关于手机」-「状态信息」-「IP地址」很烦对不对?通过 adb 可以方便地查看。
-
adb shell ifconfig
-
复制代码
结果:
-
lo Link encap:Local Loopback
-
inet addr:127.0.0.1 Mask:255.0.0.0
-
inet6 addr: ::1/128 Scope: Host
-
UP LOOPBACK RUNNING MTU:65536 Metric:1
-
RX packets:709503 errors:0 dropped:0 overruns:0 frame:0
-
TX packets:709503 errors:0 dropped:0 overruns:0 carrier:0
-
collisions:0 txqueuelen:1
-
RX bytes:75473583 TX bytes:75473583
-
复制代码
这里的设备地址为:127.0.0.1(loacal地址)
Mac 地址
-
adb shell
-
cat /sys/class/net/wlan0/address
-
复制代码
当然部分设备无法成功获取
CPU 信息
-
adb shell
-
cat /proc/cpuinfo
-
复制代码
结果:
-
processor : 0
-
BogoMIPS : 48.00
-
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
-
CPU implementer : 0x41
-
CPU architecture: 8
-
CPU variant : 0x0
-
CPU part : 0xd03
-
CPU revision : 4
-
processor : 1
-
BogoMIPS : 48.00
-
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
-
CPU implementer : 0x41
-
CPU architecture: 8
-
CPU variant : 0x0
-
CPU part : 0xd03
-
CPU revision : 4
-
processor : 2
-
BogoMIPS : 48.00
-
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
-
CPU implementer : 0x41
-
CPU architecture: 8
-
CPU variant : 0x0
-
CPU part : 0xd03
-
CPU revision : 4
-
processor : 3
-
BogoMIPS : 48.00
-
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
-
CPU implementer : 0x41
-
CPU architecture: 8
-
CPU variant : 0x0
-
CPU part : 0xd03
-
CPU revision : 4
-
processor : 4
-
BogoMIPS : 48.00
-
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
-
CPU implementer : 0x41
-
CPU architecture: 8
-
CPU variant : 0x0
-
CPU part : 0xd08
-
CPU revision : 2
-
processor : 5
-
BogoMIPS : 48.00
-
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
-
CPU implementer : 0x41
-
CPU architecture: 8
-
CPU variant : 0x0
-
CPU part : 0xd08
-
CPU revision : 2
-
Serial : d59a3c2fc7c848c4
-
复制代码
可以分析出设备为6核。
内存信息
-
adb shell
-
cat /proc/meminfo
-
复制代码
结果:
-
MemTotal: 2021484 kB
-
MemFree: 65888 kB
-
MemAvailable: 784708 kB
-
Buffers: 284 kB
-
Cached: 923468 kB
-
SwapCached: 196 kB
-
Active: 1154216 kB
-
Inactive: 526232 kB
-
Active(anon): 690720 kB
-
Inactive(anon): 229288 kB
-
Active(file): 463496 kB
-
Inactive(file): 296944 kB
-
Unevictable: 256 kB
-
Mlocked: 256 kB
-
SwapTotal: 520908 kB
-
SwapFree: 475536 kB
-
Dirty: 1764 kB
-
Writeback: 0 kB
-
AnonPages: 756924 kB
-
Mapped: 246860 kB
-
Shmem: 163312 kB
-
Slab: 92916 kB
-
SReclaimable: 41080 kB
-
SUnreclaim: 51836 kB
-
KernelStack: 13760 kB
-
PageTables: 16476 kB
-
NFS_Unstable: 0 kB
-
Bounce: 0 kB
-
WritebackTmp: 0 kB
-
CommitLimit: 1531648 kB
-
Committed_AS: 63485416 kB
-
VmallocTotal: 258867136 kB
-
VmallocUsed: 0 kB
-
VmallocChunk: 0 kB
-
CmaTotal: 16384 kB
-
CmaFree: 13800 kB
-
复制代码
其中,MemTotl
就是设备的总内存,MemFree
是当前空闲内存。
修改设置
注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 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
-
复制代码
关闭USB调试模式
-
adb shell settings put global adb_enabled 0
-
复制代码
但是关闭后就无法恢复了,需要到【开发者模式】去开启
实用功能
屏幕截图
截图保存到电脑:
-
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 display-id | 指定截图的显示屏编号(有多显示屏的情况下) |
实测如果指定文件名以.png
结尾时可以省略-p
参数;否则需要使用 -p
参数。如果不指定文件名,截图文件的内容将直接输出到 stdout。
录制屏幕
录制屏幕以 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 | 输出更多信息。 |
查看连接过的 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 年 08 月 23 日 13 点 15 分 00 秒。
重启设备
-
adb reboot
-
复制代码
检测设备是否已 root
命令:
-
adb shell
-
su
-
复制代码
此时命令行提示符是$
则表示没有 root 权限,是 #
则表示已 root。
使用Monkey调试设备
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
简单用法:
-
adb shell monkey -p <packagename> -v 500
-
复制代码
表示向<packagename>
指定的应用程序发送 500 个伪随机事件。 Monkey 的详细用法参考官方文档,当然需要翻墙。
开启/关闭 WiFi
注:需要 root 权限。 有时需要控制设备的 WiFi 状态,可以用以下指令完成。
开启 WiFi:
-
adb root
-
adb shell svc wifi enable
-
复制代码
关闭 WiFi:
-
adb root
-
adb shell svc wifi disable
-
复制代码
若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 Killed。
刷机相关命令
重启到Recovery模式
命令:
-
adb reboot recovery
-
复制代码
从 Recovery 重启到 Android
命令:
-
adb reboot
-
复制代码
重启到 Fastboot 模式
命令:
-
adb reboot bootloader
-
复制代码
通过 sideload 更新系统
如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。
以 Recovery 模式下更新为例:
1.重启到 Recovery 模式。
命令:
-
adb reboot recovery
-
复制代码
2.在设备的 Recovery 界面上操作进入 Apply update-Apply from ADB。
注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB。
3.通过 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 10628 2192 0 0000000000 S /init
-
root 2 0 0 0 0 0000000000 S kthreadd
-
root 3 2 0 0 0 0000000000 S ksoftirqd/0
-
root 4 2 0 0 0 0000000000 S kworker/0:0
-
root 5 2 0 0 0 0000000000 S kworker/0:0H
-
root 6 2 0 0 0 0000000000 S kworker/u12:0
-
root 7 2 0 0 0 0000000000 S rcu_preempt
-
...
-
复制代码
其中各个列表的含义如下:
列名 | 含义 |
---|---|
USER | 应用所属用户 |
PID | 进程ID |
PPID | 父进程ID |
NAME | 进程名 |
查看实时资源占用情况
-
adb shell top
-
复制代码
结果:
-
User 15%, System 6%, IOW 0%, IRQ 2%
-
User 70 + Nice 198 + Sys 119 + Idle 1328 + IOW 0 + IRQ 0 + SIRQ 53 = 1768
-
PID USER PR NI CPU% S #THR VSS RSS PCY Name
-
1675 system 10 -10 15% S 67 3692336K 586336K ta cn.cloudwalk.app
-
231 camerase 20 0 4% S 15 111520K 40072K fg /system/bin/cameraserver
-
214 system -2 -8 2% S 30 296260K 22412K unk /system/bin/surfaceflinger
-
442 system 18 -2 0% S 88 3773608K 199724K fg system_server
-
2034 shell 20 0 0% R 1 9112K 3180K fg top
-
3 root 20 0 0% S 1 0K 0K fg ksoftirqd/0
-
649 radio 20 0 0% S 31 2825084K 110728K fg com.android.phone
-
720 media_rw 20 0 0% S 4 13868K 3344K fg /system/bin/sdcard
-
50 root RT 0 0% S 1 0K 0K fg cfinteractive
-
164 root -2 0 0% S 1 0K 0K fg mmcqd/1
-
7 root 20 0 0% S 1 0K 0K fg rcu_preempt
-
160 root 0 -20 0% S 1 0K 0K fg kworker/u13:1
-
8 root 20 0 0% S 1 0K 0K fg rcu_sched
-
159 root 0 -20 0% S 1 0K 0K fg kworker/u13:0
-
18 root RT 0 0% S 1 0K 0K fg migration/2
-
19 root 20 0 0% S 1 0K 0K fg ksoftirqd/2
-
20 root 20 0 0% S 1 0K 0K fg kworker/2:0
-
21 root 0 -20 0% S 1 0K 0K fg kworker/2:0H
-
22 root RT 0 0% S 1 0K 0K fg watchdog/3
-
...
-
复制代码
其中各个列的含义如下:
列名 | 含义 |
---|---|
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 显示帮助文档
-
复制代码
查看进程的UID
该任务有两种实现方式:
adb shell dumpsys package <packagename> | grep userId=
在高版本可能会提醒grep不可用,可以将grep换成findstr,
adb shell dumpsys package <packagename> | findstr userId
结果:
-
userId=1000
-
userId=1000
-
userId=1000
-
复制代码
2.通过 ps 命令找到对应进程的 pid 之后adb shell cat /proc/<pid>/status | grep Uid
结果:
-
D:\work\206cwmenjyuny-master>adb shell
-
rk3399_mid:/ $ ps|grep cn.cloudwalk.app
-
system 1409 229 3689804 580168 0 0000000000 S cn.cloudwalk.app
-
rk3399_mid:/ $ cat /proc/1409/status | grep Uid
-
Uid: 1000 1000 1000 1000
-
rk3399_mid:/ $
-
复制代码
其它
如下是其它常用命令的简单描述,前文已经专门讲过的命令不再额外说明:
命令 | 功能 |
---|---|
cat | 显示文件内容 |
cd | 切换目录 |
chmod | 改变文件的存取模式/访问权限 |
df | 查看磁盘空间使用情况 |
grep | 过滤输出 |
kill | 杀死指定 PID 的进程 |
ls | 列举目录内容 |
mount | 挂载目录的查看和管理 |
mv | 移动或重命名文件 |
ps | 查看正在运行的进程 |
rm | 删除文件 |
top | 查看进程的资源占用情况 |
参考目录:
- ADB Usage Complete / ADB 用法大全
- Android Debug Bridge
- ADB Shell Commands
- logcat Command-line Tool
- Android ADB命令大全
- adb 命令行的使用记录
- Android ADB命令大全(通过ADB命令查看wifi密码、MAC地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装APK等)
- 那些做Android开发必须知道的ADB命令
- adb shell top
- 像高手一样使用ADB命令行(2)
转载于:https://juejin.im/post/5cb93bf0f265da03937863b8