跳到主要内容

ADB使用

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 adbdEnable 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_DEXOPTdex 优化验证失败或空间不足
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_ERROR1. sdcard 访问失败; 2. 应用签名与 ROM 签名一致,被当作内置应用。1. 确认 sdcard 可用,或者安装到内置存储; 2. 打包时不与 ROM 使用相同签名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION1. 不能安装到指定位置; 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_NAMEmanifest 文件里没有或者使用了无效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_IDmanifest 文件里指定了无效的共享用户 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_ONLYAPK 文件是使用 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: -sAndroid 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_CHANGEWiFi 连接状态发生变化
android.net.wifi.WIFI_STATE_CHANGEDWiFi 状态变为启用/关闭/正在启动/正在关闭/未知
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>

停止应用程序的所有进程和服务,以及任何正在运行的后台任务。具体来说,这个命令将执行以下操作:

  1. 终止应用程序的所有进程。
  2. 停止应用程序的所有服务。
  3. 移除应用程序的所有通知。
  4. 中止应用程序的所有后台任务。
  5. 关闭应用程序的所有窗口。

可通过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
    1. HIDDEN:应用程序的所有 UI 组件都不可见,应用程序处于后台运行状态。这个级别表示系统内存非常紧张,可能需要释放大量的内存,以便为其他应用程序留出足够的空间。
    2. RUNNING_MODERATE:应用程序在后台运行,但是不会被立即杀死。这个级别表示系统内存紧张,但是还有一些空间可以分配给其他应用程序,因此应用程序可以继续运行,但是需要释放一些内存。
    3. BACKGROUND:应用程序在后台运行,但是可能会被立即杀死。这个级别表示系统内存非常紧张,需要立即释放大量内存以避免系统崩溃。
    4. RUNNING_LOW:应用程序在前台运行,但是系统内存非常紧张。这个级别表示应用程序需要释放一些内存以避免系统崩溃。
    5. MODERATE:应用程序在前台运行,但是可能会被立即杀死。这个级别表示系统内存紧张,需要立即释放内存以避免系统崩溃。
    6. RUNNING_CRITICAL:应用程序在前台运行,并且可能会影响到其他应用程序的运行。这个级别表示系统内存非常紧张,需要立即释放内存以避免系统崩溃。
    7. 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含义
3HOME 键
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坐标,可以用如下方法来定位坐标:

  1. 查看当前正在运行的输入设备的事件流,包括触摸屏、按键和其他输入事件

    adb shell getevent -l
  2. 在设备上点击,可以看到操作,结果如下:

    /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))
  3. 模拟点击(**注意:**在模拟器上,当屏幕方向改变时,模拟器中的坐标系也会随之旋转。如果模拟器处于竖屏模式(默认为横屏),那么坐标系将会被旋转 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>格式如下:

  1. brief:简要格式,仅包含日志级别、标签和消息。
I/MyTag: This is a brief message
  1. process:进程ID和标签,用于进程级别的过滤。
1234 MyTag: This is a message from process 1234
  1. tag:标签和消息,用于标签级别的过滤。
MyTag: This is a message with tag MyTag
  1. thread:线程ID、日志级别、标签和消息,用于线程级别的过滤。
1234 D MyTag: This is a message from thread 1234
  1. raw:以原始文本形式输出日志消息,没有格式化。
This is a raw message
  1. time:时间戳、日志级别、标签和消息。
04-28 13:30:00.000 I MyTag: This is a message with timestamp
  1. threadtime:时间戳、线程ID、日志级别、标签和消息。
04-28 13:30:00.000 1234 D MyTag: This is a message from thread 1234 with timestamp
  1. 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