ADB介绍
adb(Android Debug Bridge)是一种用于在 Android 设备和计算机之间通信的命令行工具。它可以用于调试应用程序、安装应用程序、备份和恢复设备数据、在设备和计算机之间复制文件等。使用 adb,开发人员可以在连接到设备时运行各种命令来执行各种任务。adb 是 Android SDK(Software Development Kit)的一部分。
安装:
brew cask install android-platform-tools
推荐文档:
测试环境
网易mumu 1.9.55 (20211206)
基础使用
基本语法
adb [-d|-e|-s <serialNumber>] <command>
如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s <serialNumber>]
这一部分,直接使用 adb <command>
。
连接指定设备
如果有多个设备/模拟器连接,则需要为命令指定目标设备。
参数 | 含义 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标(表示连接的是安卓开发者模式的设备) |
-e | 指定当前唯一运行的模拟器为命令目标(表示连接的是模拟器) |
-s <serialNumber> |
指定相应 serialNumber 号的设备/模拟器为命令目标 |
一般用-s
来指定目标连接
先用如下命令获取设备列表:
$ adb devices
List of devices attached
emulator-5554 device
然后-s
指定即可
adb -s 'emulator-5554' shell whoami
启动/停止
一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起。
adb kill-server && adb start-server
版本
adb version
以root权限运行adbd
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
adbd代表“Android Debug Bridge Daemon”,是运行在Android设备上的后台进程,它与Android Debug Bridge(ADB)客户端通信,允许开发人员以调试模式与设备进行通信。
adbd在Android系统中扮演着非常重要的角色,它允许开发人员访问设备的shell,传输文件,安装和调试应用程序,以及访问各种诊断和性能分析工具。
# 切换root权限执行
adb root
# 切换非root权限执行
adb unroot
如果提示adbd cannot run as root in production builds
,那么下载adbd-Insecure.apk
下载地址:https://github.com/wuxianlin/android_tools/blob/master/adbd-Insecure-v2.00.apk
下载安装好后打开,勾选Enable insecure adbd
和Enable at boot
即可。
还是不能解决建议放弃,坑太多了,改debug配置文件改了也没用。
指定adb server的网络端口
默认端口为 5037。
adb -P <port> start-server
应用管理
查看应用列表
adb shell pm list packages
pm
是一个缩写词,代表“包管理器(package manager)”。包管理器是一个系统级服务,它负责管理应用程序的安装、卸载、更新、清除和查询等操作。adb shell pm help
上面的结果返回所有的应用,可以通过特定参数添加一些过滤条件
参数 | 说明 |
---|---|
-f |
显示应用程序的安装位置。 |
-d |
只列出已禁用的应用程序。 |
-e |
只列出已启用的应用程序。 |
-s |
只列出系统应用程序。 |
-3 |
只列出第三方应用程序。 |
-i |
显示应用的 installer。 |
-u |
包含已卸载应用。 |
<FILTER> |
包名包含 <FILTER> 字符串 |
举例如下:
查询设备上所有已启用的第三方应用程序的包名列表
adb shell pm list packages -e -3
查询带有
shadow
的包名adb shell pm list packages shadow
查看应用安装路径
adb shell pm path <PACKAGE>
<PACKAGE>
为包名
清除应用数据与缓存
adb shell pm clear <packagename>
<packagename>
表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
安装APK
adb install [-lrtsdg] [--instant] PACKAGE
也可以通过一些参数来控制安装 APK 的行为
参数 | 说明 |
---|---|
-l |
将应用安装到保护目录 /mnt/asec |
-r |
重新安装已经安装的应用程序,保留其数据。(覆盖安装) |
-t |
允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用。(在安装应用程序时允许测试 APK) |
-s |
将应用程序安装到 SD 卡上(仅适用于 Android 2.2 及更高版本)。 |
-d |
允许降级覆盖安装。 |
-g |
授予所有运行时权限。 |
--instant |
作为临时应用安装 |
例如:
adb install -r xxx.apk
安装的一些常见错误情况和说明如下:
输出 | 含义 | 解决办法 |
---|---|---|
INSTALL_FAILED_ALREADY_EXISTS | 应用已经存在,或卸载了但没卸载干净 | adb install 时使用 -r 参数,或者先 adb uninstall <packagename> 再安装 |
INSTALL_FAILED_INVALID_APK | 无效的 APK 文件 | |
INSTALL_FAILED_INVALID_URI | 无效的 APK 文件名 | 确保 APK 文件名里无中文 |
INSTALL_FAILED_INSUFFICIENT_STORAGE | 空间不足 | 清理空间 |
INSTALL_FAILED_DUPLICATE_PACKAGE | 已经存在同名程序 | |
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! | 已安装该应用且签名不一致 | 先卸载设备上的该应用,再安装 |
卸载APK
adb uninstall [-k] PACKAGE
PACKAGE
表示应用的包名-k
参数可选,表示卸载应用但保留数据和缓存目录。
例如:
adb uninstall com.chehejia.oc.m01
查看前台Activity
adb shell dumpsys activity activities | grep mResumedActivity
就是设备当前展示的用户界面,结果如
# 微信启动页面
mResumedActivity: ActivityRecord{1ce38af u0 com.tencent.mm/.plugin.account.ui.WelcomeActivity t349}
查看正在运行的Services
adb shell dumpsys activity services [<packagename>]
[<packagename>]
为可选参数,主要用来过滤哪一个package的,不然默认是输出所有的services[<packagename>]
写个关键词也可以匹配,比如qihoo360
查看应用详细信息
adb shell dumpsys package <packagename>
<packagename>
表示应用包名- 输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
获取包中的所有activity
adb shell dumpsys package <packagename> | grep -E 'Activity|filter'
获取包中的所有service
adb shell dumpsys package <packagename> | grep -E 'Service|filter'
应用交互
主要是使用 am <command>
命令,参数很多,可以am
查看
Activity Manager (am)是Android系统的一个核心组件,用于管理Activity、Service、Broadcast Receiver等组件的生命周期,以及进程间通信、权限管理等操作。通过adb shell am命令,可以向Activity Manager发送各种命令,以控制Android应用的行为。
常用的 <command>
如下:
command | 用途 |
---|---|
start [options] <INTENT> |
启动 <INTENT> 指定的 Activity |
startservice [options] <INTENT> |
启动 <INTENT> 指定的 Service |
stopservice [options] <INTENT> |
停止 <INTENT> 指定的 Service |
broadcast [options] <INTENT> |
发送 <INTENT> 指定的广播 |
force-stop <packagename> |
停止 <packagename> 相关的进程 |
<INTENT>
参数很灵活,和写 Android 程序时代码里的 Intent 相对应。
在Android中,Intent是一种消息传递机制,用于在应用程序组件之间传递数据、启动Activity、启动服务、发送广播等。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 |
<INTENT>
里还能带数据,就像写代码时的 Bundle 一样(类似传参给activity):
参数 | 含义 |
---|---|
--esn <EXTRA_KEY> |
null 值(只有 key 名) |
-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> |
string 值 |
--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> |
boolean 值 |
--ei <EXTRA_KEY> <EXTRA_INT_VALUE> |
integer 值 |
--el <EXTRA_KEY> <EXTRA_LONG_VALUE> |
long 值 |
--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> |
float 值 |
--eu <EXTRA_KEY> <EXTRA_URI_VALUE> |
URI |
--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE> |
component name |
--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...] |
integer 数组 |
--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...] |
long 数组 |
启动应用/ 调起 Activity
指定Activity名称启动
adb shell am start [options] <INTENT>
如:
可以从此处获取APK中的所有activity,也可以通过此处获取前台activity,还可以通过
logcat
过滤日志的方式来获取。
adb shell am start -n com.tencent.mm/.plugin.account.ui.ContactsSyncUI
传递数据
adb shell am start -n com.tencent.mm/.plugin.account.ui.ContactsSyncUI --es "aaa" "12345"
不指定Activity名称启动
adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER 1
如:
adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER 1
adb shell monkey
:使用adb shell启动monkey测试工具。-p com.tencent.mm
:指定要测试的应用程序的包名,即微信的包名。-c android.intent.category.LAUNCHER
:指定要启动的Activity组件的类别,即通过“启动器”(Launcher)启动应用程序。在Android系统中,Activity组件通常通过其Intent过滤器中的类别来标识自己,其中包括android.intent.category.LAUNCHER
,用于表示该组件是应用程序的主入口点。1
:指定要执行的随机事件数量,即在启动微信应用程序后,将模拟执行一个随机操作。
调用Service
adb shell am startservice [options] <INTENT>
如:
adb shell am startservice -n com.tencent.mm/.plugin.account.model.ContactsSyncService
停止 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
向指定组件广播
BOOT_COMPLETED
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.tencent.mm/.booter.BluetoothReceiver
部分系统预定义广播及正常触发时机
action | 触发时机 |
---|---|
android.net.conn.CONNECTIVITY_CHANGE | 网络连接发生变化 |
android.intent.action.SCREEN_ON | 屏幕点亮 |
android.intent.action.SCREEN_OFF | 屏幕熄灭 |
android.intent.action.BATTERY_LOW | 电量低,会弹出电量低提示框 |
android.intent.action.BATTERY_OKAY | 电量恢复了 |
android.intent.action.BOOT_COMPLETED | 设备启动完毕 |
android.intent.action.DEVICE_STORAGE_LOW | 存储空间过低 |
android.intent.action.DEVICE_STORAGE_OK | 存储空间恢复 |
android.intent.action.PACKAGE_ADDED | 安装了新的应用 |
android.net.wifi.STATE_CHANGE | WiFi 连接状态发生变化 |
android.net.wifi.WIFI_STATE_CHANGED | WiFi 状态变为启用/关闭/正在启动/正在关闭/未知 |
android.intent.action.BATTERY_CHANGED | 电池电量发生变化 |
android.intent.action.INPUT_METHOD_CHANGED | 系统输入法发生变化 |
android.intent.action.ACTION_POWER_CONNECTED | 外部电源连接 |
android.intent.action.ACTION_POWER_DISCONNECTED | 外部电源断开连接 |
android.intent.action.DREAMING_STARTED | 系统开始休眠 |
android.intent.action.DREAMING_STOPPED | 系统停止休眠 |
android.intent.action.WALLPAPER_CHANGED | 壁纸发生变化 |
android.intent.action.HEADSET_PLUG | 插入耳机 |
android.intent.action.MEDIA_UNMOUNTED | 卸载外部介质 |
android.intent.action.MEDIA_MOUNTED | 挂载外部介质 |
android.os.action.POWER_SAVE_MODE_CHANGED | 省电模式开启 |
强制停止应用
adb shell am force-stop <packagename>
停止应用程序的所有进程和服务,以及任何正在运行的后台任务。具体来说,这个命令将执行以下操作:
- 终止应用程序的所有进程。
- 停止应用程序的所有服务。
- 移除应用程序的所有通知。
- 中止应用程序的所有后台任务。
- 关闭应用程序的所有窗口。
可通过
adb shell ps
获取正在运行的进程
如
adb shell am force-stop com.tencent.mm
收紧内存
adb shell am send-trim-memory <pid> <level>
- pid: 进程 ID
- level: HIDDEN、RUNNING_MODERATE、BACKGROUND、 RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE
HIDDEN
:应用程序的所有 UI 组件都不可见,应用程序处于后台运行状态。这个级别表示系统内存非常紧张,可能需要释放大量的内存,以便为其他应用程序留出足够的空间。RUNNING_MODERATE
:应用程序在后台运行,但是不会被立即杀死。这个级别表示系统内存紧张,但是还有一些空间可以分配给其他应用程序,因此应用程序可以继续运行,但是需要释放一些内存。BACKGROUND
:应用程序在后台运行,但是可能会被立即杀死。这个级别表示系统内存非常紧张,需要立即释放大量内存以避免系统崩溃。RUNNING_LOW
:应用程序在前台运行,但是系统内存非常紧张。这个级别表示应用程序需要释放一些内存以避免系统崩溃。MODERATE
:应用程序在前台运行,但是可能会被立即杀死。这个级别表示系统内存紧张,需要立即释放内存以避免系统崩溃。RUNNING_CRITICAL
:应用程序在前台运行,并且可能会影响到其他应用程序的运行。这个级别表示系统内存非常紧张,需要立即释放内存以避免系统崩溃。COMPLETE
:应用程序即将被杀死。这个级别表示应用程序需要释放所有的内存,以便为其他应用程序留出空间。
如
adb shell am send-trim-memory 12345 RUNNING_LOW
文件管理
设备 -> 电脑
adb pull <设备里的文件路径> [电脑上的目录]
电脑 -> 设备
adb push <电脑里的文件路径> <设备上的目录>
模拟按键/输入
主要是用input
命令
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
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 text "hello\ world"
模拟按键
adb shell input keyevent <keycode>
# 如:按下HOME键
adb shell input keyevent 3
完整的 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 则让系统休眠 |
模拟点击
adb shell input tap <x> <y>
需要知道x、y坐标,可以用如下方法来定位坐标:
查看当前正在运行的输入设备的事件流,包括触摸屏、按键和其他输入事件
adb shell getevent -l
在设备上点击,可以看到操作,结果如下:
/dev/input/event5: EV_ABS ABS_MT_TRACKING_ID 00000001 /dev/input/event5: EV_KEY BTN_TOUCH DOWN /dev/input/event5: EV_ABS ABS_MT_POSITION_X 00000064 /dev/input/event5: EV_ABS ABS_MT_POSITION_Y 00000184 /dev/input/event5: EV_SYN SYN_REPORT 00000000 /dev/input/event5: EV_ABS ABS_MT_TRACKING_ID ffffffff /dev/input/event5: EV_KEY BTN_TOUCH UP /dev/input/event5: EV_SYN SYN_REPORT 00000000
ABS_MT_POSITION_X
表示X坐标值,ABS_MT_POSITION_Y
表示Y坐标值,不过都是16进制,可以通过如下命令转换为十进制。echo $((0xFF))
模拟点击(注意:在模拟器上,当屏幕方向改变时,模拟器中的坐标系也会随之旋转。如果模拟器处于竖屏模式(默认为横屏),那么坐标系将会被旋转 90 度,因此需要交换 x 和 y 值)
adb shell input tap 388 100
模拟拖动
adb shell input swipe <起点x坐标> <起点y坐标> <终点x坐标> <终点y坐标> [滑动时间ms]
定位坐标方式参考模拟点击
adb shell input swipe 510 636 556 343
adb shell input swipe 510 636 556 343 2000
输入中文
上方直接输入会报错,需要安装ADBKeyboard
# 列举输入法
adb shell ime list -s
# 切换键盘
adb shell ime set com.android.adbkeyboard/.AdbIME
# 输入中文
adb shell am broadcast -a ADB_INPUT_TEXT --es msg '中文测试'
日志
adb logcat
默认结果举例如下:
03-13 13:08:53.217 604 1081 I ActivityManager: Start proc 4307:com.tencent.mm/u0a50 for activity com.tencent.mm/.ui.LauncherUI
日志格式解析:
[时间戳] [进程ID] [线程ID] [日志级别] [标签]: 日志消息
日志级别如下:
- V (Verbose):最低级别,用于调试目的,记录大量详细信息。
- D (Debug):用于调试和开发目的。
- I (Info):用于记录设备信息、状态和事件。
- W (Warning):用于记录潜在的问题和错误。
- E (Error):用于记录错误和异常。
- F (Fatal):用于记录致命错误,这些错误可能导致应用程序崩溃。
- S(Silent): 最高级别,抑制所有输出
按级别过滤日志
- 输出>=W级别的日志(将 Warning、Error、Fatal 和 Silent 日志输出)
adb logcat "*:W"
按照指定格式输出滤日志
adb logcat -v <format>
<format>
格式如下:
- brief:简要格式,仅包含日志级别、标签和消息。
I/MyTag: This is a brief message
- process:进程ID和标签,用于进程级别的过滤。
1234 MyTag: This is a message from process 1234
- tag:标签和消息,用于标签级别的过滤。
MyTag: This is a message with tag MyTag
- thread:线程ID、日志级别、标签和消息,用于线程级别的过滤。
1234 D MyTag: This is a message from thread 1234
- raw:以原始文本形式输出日志消息,没有格式化。
This is a raw message
- time:时间戳、日志级别、标签和消息。
04-28 13:30:00.000 I MyTag: This is a message with timestamp
- threadtime:时间戳、线程ID、日志级别、标签和消息。
04-28 13:30:00.000 1234 D MyTag: This is a message from thread 1234 with timestamp
- long:包含时间戳、日志级别、标签和消息,以及可选的附加信息(如进程ID、线程ID、包名等)。
04-28 13:30:00.000 1234 5678 I MyTag: This is a message with additional information
如:
adb logcat -v long
按 tag 和级别过滤日志
- 输出
ActivityManager
标签的信息,且仅输出信息级别为Info或更高的日志记录。
adb logcat "ActivityManager:I" "*:S"
清空日志
adb logcat -c
设备信息
型号
adb shell getprop ro.product.model
屏幕分辨率
adb shell wm size
安卓系统版本
adb shell getprop ro.build.version.release
IP地址
adb shell ifconfig | grep Mask
MAC地址
adb shell cat /sys/class/net/wlan0/address
内存信息
adb shell cat /proc/meminfo
设置信息
adb shell settings list system
adb shell settings list secure
adb shell settings list global
实用功能
截屏
截屏保存到电脑本地:
adb exec-out screencap -p > sc.png
exec-out
用于从设备中执行 shell 命令并将其输出作为二进制数据传输回计算机。它可以将设备上的输出流转换为本地文件,也可以将其直接输出到控制台。
截屏保存到设备本地:
adb shell screencap -p /sdcard/sc.png
录屏
adb shell screenrecord /sdcard/filename.mp4
通过Ctrl + C
手动停止,默认录制时间和最长录制时间都是 180 秒,可以通过adb pull
传递到电脑上。
查看WI-FI密码
# root权限
adb shell cat "/data/misc/wifi/*.conf"
# or
adb shell cat /data/misc/wifi/WifiConfigStore.xml
开启/关闭WI-FI
# root权限
adb shell svc wifi enable
adb shell svc wifi disable
设置系统时间
# root权限
adb shell date -s 20160823.131500
有的可能会提示没有-s
参数,可以使用如下方法:
# 关闭自动时间更新
adb shell settings put global auto_time 0
# 修改时间 date $(date +%m%d%H%M%Y.%S)
adb shell date 031313012023.13
重启
adb reboot
查看进程
adb shell ps
设置全局代理
# 设置代理
adb shell settings put global http_proxy 10.8.165.14:7890
# 去掉代理
adb shell settings delete global http_proxy
adb shell settings delete global global_http_proxy_host
adb shell settings delete global global_http_proxy_port