Android adb命令总结

admin 2022年8月28日19:38:33移动安全Android adb命令总结已关闭评论31 views60869字阅读202分53秒阅读模式

推荐阅读

Android adb常用命令

玩转Android adb命令(adb降级)

Android NDK Crash定位分析思路

编译Windows平台adb和fastboot工具

免Magisk使用adb命令安装Edxposed

Android系统run-as命令原理(权限访问)

Android NDK开发中快速定位Crash问题

检测车机中ADB远程调试控制Android系统攻击

Android ANR/Crash Log日志分析技巧总结(建议收藏)

Android高级开发中ANR/Native Crash问题的解决方法

干货|Android系统中run-as和su命令的源码解析(升降权限)

Riru&Edxposed学习研究(三)免Magisk使用adb命令安装Edxposed

Android系统定制/测试(Crash/ANR等Bug/性能分析必备技巧)

Android系统定制之Android.mk和Android.bp语法详解(精通版)


哆啦安全

0x01 常用的一些ADB命令

1.1 ADB 命令(主)

  • 查看当前应用的activity信息

adb shell dumpsys activity top
# 把系统中所有应用运行的四大组件都会打印出来
adb shell dumpsys >> info.txt
start info.txt
  • 查看指定包名应用的详细信息

adb shell dumpsys package  xxx

或进入adb shell使用下面的命令
dumpsys package xxx
# 清空应用数据
adb shell pm clear xxx
  • 查看指定进程名或者进程id的内存信息

adb shell dumpsys meminfo   xxx
  • 查看指定包名应用的数据库存储信息(包括存储的SQL语句)

adb shell dumpsys dbinfo xxx
  • 安装应用包apk文件

adb intall  xxx.apk

adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡
  • 卸载应用

adb uninstall  xxx.apk

adb uninstall -k <package_name>

可选参数-k的作用为卸载软件但是保留配置和缓存文件

adb shell
cd data/app
rm apk包
exit
adb uninstall apk包的主包名
adb install -r apk包
  • 删除系统应用

adb remount (重新挂载系统分区,使系统分区重新可写)
adb shell
cd system/app
rm *.apk
  • 将设备中的文件放到本地

adb pull  目标系统中的文件路径(a.txt)  本机系统要存放取出来的路径(a.txt)
  • 将本地文件放到设备中

adb push  本机系统中的文件路径(a.txt)    目标系统中要存放的路径(a.txt)
  • 截屏操作

adb shell screencap -p /sdcard/test.png
adb pull /sdcard/test.png D:\img\
start D:\img\test.png
  • 录屏操作

adb shell screenrecord /sdcard/test.mp4
  • 输入文本内容

adb shell input text 'xxx'
  • 设备的端口转发

adb forward [(远程端)协议:端口号] [(设备端)协议:端口号]
adb forward tcp:23946 tcp:23946
adb forward tcp:8700 jwdp:1786
  • 查看设备中可以被调试的应用的进程号

adb jdwp
  • 查看当前日志信息

adb logcat

用法1:adb logcat -s tag
案例: adb Logcat -s fb

用法2:adb logcat |findstr pname/pid/keyword
案例: adb Logcat |findstr cn.test.demo

或进入adb shell使用下面的命令
Logcat grep tencent
  • 非root设备中查看指定debug模式的包名应用沙盒数据

run-as cn.test.demo
  • 查看设备的进程信息,或者指定进程的线程信息

ps | grep 过滤内容
ps | grep cn.test.demo
ps -t 19977
  • 清空指定包名应用的数据

pm clear  grep cn.test.demo
  • 安装设备中的apk文件

pm install /sdcard/test.apk
  • 卸载设备中的应用

pm uninstall cn.test.demo
  • 启动设备中的应用

am start -n [包(package)名]/[包名].[活动(activity)名称]
am start -n com.androidtest/com.androidtest.test
  • 启动一个服务

am startservice -n [包 (package) 名]/[包名].[服务(service)名]
am startservice -n com.androidtest2/com.androidtest.test2
  • 发送一个广播

am broadcast -a [广播动作]
  • 查看设备的ip地址

netcfg
  • 查看设备的端口号信息

netstat
  • 运行Java代码(特殊场景使用,把dx命令把dex文件转化成jar包)

app_process [运行代码目录] [运行主类]

export CLASSPATH=/data/test.jar
exec /system/bin/app_process /data/cn.test.main
  • 运行一个dex文件

dalvikvm -cp [dex文件] [运行主类]
dalvikvm -cp /data/test.dex cn. Widiankong Main
  • 查看当前应用的CPU消耗信息

top [-n/-m/-d/-s/-t]

-m // 最多显示多少个进程
-n // 刷新次数
-d // 刷新间隔时间(默认5 秒)
-s // 按哪列排序
-t // 显示线程信息而不是进程
  • 查看系统属性值

getprop [属性值名称]
  • 用aapt操作apk命令(查看apk中的信息以及编辑apk程序包)

aapt dump xmltree [apk包] [需要查看的资源文件xml ]
  • 用dexdump操作dex命令(查看dex文件的详细信息)

dexdump [ dex文件路径]
  • 查看当前进程的内存加载情况(查看当前进程的内存映射信息,比如加载了哪些so文件,dex文件等)

cat /proc/[pid]/maps

用法:cat /proc/663/maps
  • 查看进程的状态信息

cat /proc/[pid]/status

用法:cat /proc/663/status
  • 查看当前应用使用的端口号信息

cat /proc/[pid]/net/tcp/tcp6/udp/udp6

用法:cat /proc/663/net/tcp/tcp6/udp/udp6

1.2 ADB 命令(次)

  • 查看连接设备

adb devices
  • 获取手机root权限

adb root
  • 重新挂载系统分区,使系统分区重新可写

adb remount
  • 进入到手机设备Shell界面中去

adb shell

abd shell -s 模拟器编号 命令
  • 启动和关闭ADB服务

# 关闭服务
adb kill-server

# 启动服务
adb start-server
  • adb帮助命令

adb help
  • 查看bug报告

adb bugreport
  • 记录无线通讯日志

adb shell
logcat -b radio
  • 获取设备的ID和序列号

adb get-product
adb get-serialno
  • 访问数据库SQLite3

adb shell
sqlite3
  • 进入系统内指定文件夹

cd system/sd/data

#ls //列表显示当前文件夹内容
#rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件
#rm xxx //删除文件xxx
#rmdir xxx //删除xxx的文件夹
  • 点亮屏幕

adb shellinput keyevent 80
  • 查看adb版本

adb version
  • 将system分区重新挂在为可读写分区,此命令在操作系统目录时很重要

adb remount
  • 重启设备,可选参数进入bootloader(刷机模式)或recovery(恢复模式)

adb reboot bootloader
adb reboot recovery
  • 杀掉某个进程,一般用于模拟某个bug复现

adb shell kill pidNumber

# 列出进程列表及其pid
adb shell ps

# 查看指定进程信息
adb shell ps -x pid
  • 查看单个应用程序的最大内存限制

adb shell getprop | grep heapgrowthlimit

得到的结果为128M: [dalvik.vm.heapgrowthlimit]: [128m]

这就是说Dalvik Heap size的最大值超过了128M,就很可能发生OOM
  • 查看sdk版本

adb shell getprop | grep version
  • 查看设备型号信息

adb shell getprop | grep product
  • 获取序列号

获取到的序列号即为adb devices列出来的序列号

adb get-serialno
  • 查看wifi密码(需要root权限)

adb shell cat data/misc/wifi/*.conf
  • 查看wifi_mac

adb shell cat /sys/class/net/wlan0/address
  • 查看后台services信息

adb shell service list
  • ADB 录制屏幕命令

adb shell screenrecord /sdcard/test.mp4
  • 打电话

adb shell am start -a android.intent.action.CALL -d tel:10086
停止应用
adb shell am force-stop package
查看当前 Activity 名称
adb shell dumpsys activity | findstr “mFocusedActivity”
  • 移动文件

adb shell mv /sdcard/1.txt /sdcard/2.text
移动同一目录下文件相当于重命名文件
  • 手机或模拟器当前屏幕进行截屏

adb shell screencap /sdcard/Test.png
adb pull /sdcard/Test.png
adb open Test.png
  • 获取手机内存使用率

adb shell dumpsys meminfo <pakagename>
  • 获取手机cpu占有率

adb shell top
adb shell dumpsys cpuinfo
  • 获取手机功耗

adb shell dumpsys battery
  • 查看总体的cpu占用

adb shell cat /proc/stat
  • 查看进程的cpu占用

adb shell cat /proc/<PID>/stat
  • 查看总体的RAM

adb shell cat /proc/meminfo | head -n 4
  • 查看剩余的RAM

adb shell dumpsys meminfo| grep "Free RAM"
  • 查看进程的RAM

adb shell dumpsys meminfo <packagename>adb shell dumpsys meminfo <PID>
  • 开机后的总流量(字节数)

adb shell cat proc/self/net/dev
  • 获取手机上传流量

adb shell cat /proc/uid_stat/2000/tcp_snd
  • 获取手机下载流量

adb shell cat /proc/uid_stat/2000/tcp_rcv
  • 输出日志

adb logcat threadtime -b events>d:\log\events.txt
  • 打印页面的日志

adb logcat -v threadtime | grep ActivityManager
  • 启动时间

adb shell am start -W -n <某activity>

0x02 ADB常用命令总结

  • 存在多个设备/模拟器,指定单独一个设备/模拟器并进入交互式Shell

adb 基本语法格式:adb [-d|-e|-s <serialNumber>] <command>

参数如下:

参数 描述
-d 指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e 指定当前唯一运行的模拟器为命令目标
-s <serialNumber> 指定相应 serialNumber号的设备/模拟器为命令目标

:如果有多个设备/模拟器连接,则需要命令指定目标设备。常用的是 -s 参数,设备/模拟器的serialNumber(序列号)可通过adb devices命令获取,如下:

$ adb devices

List of devices attached
cf33328f device
emulator-5554 device10.1.2.6:5555 device

上述案例表示电脑连接了三个设备/模拟器,输出里的cf33328f、emulator-5554 和 10.1.2.6:5555均为设备/模拟器的序列号,想连接emulator-5554模拟器,输入如下命令:

adb  -s  emulator-5554

adb 输出格式为[serialNumber] [state],serialNumber 即我们常说的 SN,state 有如下几种:

参数 描述
offline 表示设备未连接成功或无响应
device 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态
no device 没有设备/模拟器连接
List of devices attached 没有设备/模拟器连接成功
List of devices attached 【序列号】 offline 设备/模拟器未连接到 adb 或无响应
  • ADB 启动/停止的命令

# 启动adb
adb start-server# adbadb kill-server
  • 重启adbd 服务

restart adbd

# 或分开使用停止和启动命令来重启adbd服务
stop adbd
start adbd
  • ADB版本信息

adb version
  • root 权限运行 adbd

adb root
  • 指定 adb server 的网络端口

adb -P <port> start-server
  • 查看应用列表

查看应用列表的基本命令格式:adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]

# 显示所有应用
adb shell pm list packages

# 显示系统应用
adb shell pm list packages -s

# 显示第三方应用
adb shell pm list packages -3# 包名包含某字符串的应用,比如要查看包名包含字符串 test 的应用列表
adb shell pm list packages tesr
或使用 grep 来过滤
adb shell pm list packages | grep test

上面的参数如下:

参数名 描述
默认 所有应用
-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用
<FILTER> 包名包含 <FILTER> 字符串
  • ADB安装APK

格式:adb install [-lrtsdg] <path_to_apk>

adb install 安装步骤如下:

1)push apk 文件到 /data/local/tmp2)调用 pm install 安装3)删除 /data/local/tmp 下的对应 apk 文件

参数及含义如下:

参数 含义
-l 将应用安装到保护目录 /mnt/asec
-r 允许覆盖安装
-t 允许安装 AndroidManifest.xml里 application 指定android:testOnly="true"的应用
-s 将应用安装到 sdcard
-d 允许降级覆盖安装
-g 授予所有运行时权限
–abi abi-identifier 为特定 ABI 强制安装 apk,abi-identifier可以是 armeabi-v7a、arm64-v8a、v86、x86_64

常见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 的 assembleDebugassembleRelease重新编译,或者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! 已安装该应用且签名不一致 先卸载设备上的该应用,再安装
  • ADB卸载应用程序

命令格式如下:

# <packagename> 表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录
adb uninstall [-k] <packagename>
adb uninstall android.uid.sysytem
  • ADB清除应用数据与缓存

命令格式如下:

# <packagename> 表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」
adb shell pm clear <packagename>
adb shell pm clear android.uid.sysytem
  • 查看当前前台 Activity

adb shell dumpsys activity activities | grep mResumedActivity

adb shell dumpsys activity activities | findstr mResumedActivity

adb shell "dumpsys activity activities | grep mResumedActivity"
  • 查看正在运行的 Services

命令格式如下:

# <packagename> 参数不是必须的,指定 <packagename> 表示查看与某个包名相关的 Services,不指定表示查看所有 Services
adb shell dumpsys activity services [<packagename>]
  • 查看应用详细信息

输出中包含很多信息,包括Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等

命令格式如下:

adb shell dumpsys package <packagename>
  • ADB查看应用安装路径

命令格式如下:

adb shell pm path <PACKAGE>
  • 启动应用/调起Activity(指定Activity名称启动)

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

<INTENT>里还能带数据,就像写代码时的 Bundle 一样:

参数 含义
--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 数组

命令格式如下:

adb shell am start [options] <INTENT>

# 调起微信主界面
adb shell am start -n com.tencent.mm/.ui.LauncherUI

# 表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
  • 启动应用/调起Activity(不指定Activity名称启动【启动主Activity】)

命令格式如下:

adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER

# 调起微信主界面
adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER 1
  • ADB调起Service

命令格式如下:

adb shell am startservice [options] <INTENT>

# 调起微信的某 Service
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
  • ADB停止Service

命令格式如下:

adb shell am stopservice [options] <INTENT>
  • ADB发送广播

命令格式如下:既能发送系统预定义的广播,也能发送自定义广播

adb shell am broadcast [options] <INTENT>

# 向所有组件广播 BOOT_COMPLETED
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

# 只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver

如下是部分系统预定义广播及正常触发时机:

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 <packagename>
  • ADB收紧内存

命令格式如下:

adb shell am send-trim-memory  <pid> <level>

# HOME 键adb shell input keyevent 3

 level: 
1)HIDDEN 2)RUNNING_MODERATE 3)BACKGROUND 4)RUNNING_LOW 5)MODERATE 6)RUNNING_CRITICAL 7)COMPLETE

# 表示向 pid=986 的进程,发出 level=RUNNING_LOW 的收紧内存命令
adb shell am send-trim-memory 986 RUNNING_LOW
  • ADB复制设备里的文件到电脑

命令格式如下:

adb pull <设备里的文件路径> [电脑上的目录]
  • ADB复制电脑里的文件到设备

命令格式如下:

adb push <电脑上的文件路径> <设备里的目录>
  • ADB模拟按键/输入

在 adb shell 里有个很实用的命令叫 input,input 命令的完整 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 能实现不同的功能,完整的 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显示Android 日志

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

命令格式如下:

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

按级别过滤日志:

Android 的日志分为如下几个优先级(priority):1)V :Verbose(最低,输出得最多)2)D :Debug3)I :Info4)W :Warning5)E :Error6)F :Fatal7)S :Silent(最高,啥也不输出)
按某级别过滤日志则会将该级别及以上的日志输出

# 比如如下命令会将Warning、Error、Fatal 和 Silent 日志输出
adb logcat *:W

按 tag 和级别过滤日志:

# <filter-spec> 可以由多个 <tag>[:priority] 组成
# 下面表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)
adb logcat ActivityManager:I MyApp:D *:S

日志格式:可以用adb logcat -v <format>选项指定日志输出格式

日志支持按以下几种 <format>1)brief默认格式。格式为:<priority>/<tag>(<pid>): <message> 示例:D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 02)process格式为:<priority>(<pid>) <message> 示例:D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)3)tag格式为:<priority>/<tag>: <message> 示例:D/HeadsetStateMachine: Disconnected process message: 10, size: 04)raw格式为:<message> 示例:Disconnected process message: 10, size: 05)time格式为:<datetime> <priority>/<tag>(<pid>): <message> 示例:08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 06)threadtime格式为:<datetime> <pid> <tid> <priority> <tag>: <message> 示例:08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 07long格式为:[ <datetime> <pid>:<tid> <priority>/<tag> ] <message> 示例:[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0# 指定格式可与上面的过滤同时使用,如下:
adb logcat -v long ActivityManager:I *:S
  • ADB清空日志

adb logcat -c
  • ADB显示内核日志

adb shell dmesg
  • ADB查看设备型号

adb shell getprop ro.product.model
  • ADB查看设备android_id

adb shell settings get secure android_id
  • ADB查看设备IMEI

# 在 Android 4.4 及以下版本可通过如下命令获取 IMEI,其中的 Device ID 就是 IMEI:
adb shell dumpsys iphonesubinfo

# 在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限),把里面的有效内容提取出来就是 IMEI :
adb shell
su
service call iphonesubinfo 1
  • ADB查看Android 系统版本

adb shell getprop ro.build.version.release
  • ADB查看IP 地址

手动查看IP地址:「设置」-「关于手机」-「状态信息」-「IP地址」,下面是通过ADB查看IP地址

adb shell ifconfig

# 网络连接名称、启用状态、IP 地址和 Mac 地址等信息
adb shell netcfg
  • ADB 查看Mac 地址

adb shell cat /sys/class/net/wlan0/address
  • ADB查看CPU 信息

adb shell cat /proc/cpuinfo
  • ADB查看内存信息

# 注意,在命令执行后展示的信息中MemTotal 就是设备的总内存,MemFree 是当前空闲内存
adb shell cat /proc/meminfo
  • ADB查看更多硬件与系统属性

adb shell cat /system/build.prop

# 或通过 adb shell getprop <属性名>,比如查看SDK版本
adb shell getprop ro.build.version.sdk

部分系统属性如下:

属性名 含义
ro.build.version.sdk SDK 版本
ro.build.version.release Android 系统版本
ro.build.version.security_patch Android 安全补丁程序级别
ro.product.model 型号
ro.product.brand 品牌
ro.product.name 设备名
ro.product.board 处理器型号
ro.product.cpu.abilist CPU 支持的 abi 列表
persist.sys.isUsbOtgEnabled 是否支持 OTG
dalvik.vm.heapsize 每个应用程序的内存上限
ro.sf.lcd_density 屏幕密度

:一些定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist 属性名查找不到,尝试如下命令:

adb shell cat /system/build.prop | grep ro.product.cpu.abi
  • ADB关闭 USB 调试模式

注:用命令关闭后,只能手动恢复,步骤:「设置」-「开发者选项」-「Android 调试」

adb shell settings put global adb_enabled 0
  • 允许访问非 SDK API

adb shell settings put global hidden_api_policy_pre_p_apps 1adb shell settings put global hidden_api_policy_p_apps 1

数字的含义如下:

含义
0 禁止检测非 SDK 接口的调用。该情况下,日志记录功能被禁用,并且令strict mode API,即 detectNonSdkApiUsage()无效,不推荐
1 仅警告——允许访问所有非 SDK 接口,但保留日志中的警告信息,可继续使用strick mode API
2 禁止调用深灰名单和黑名单中的接口
3 禁止调用黑名单中的接口,但允许调用深灰名单中的接口
  • 禁止访问非 SDK API

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
  • ADB显示隐藏状态栏和导航栏

adb shell settings put global policy_control <key-values>

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

key 含义
immersive.full 同时隐藏
immersive.status 隐藏状态栏
immersive.navigation 隐藏导航栏
immersive.preconfirms ?

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

value 含义
apps 所有应用
* 所有界面
packagename 指定应用
-packagename 排除指定应用

例如表示设置在所有界面下都同时隐藏状态栏和导航栏:

<p data-line="1234" class="sync-line" style="margin:0;"></p>#  表示设置在包名为 com.package1 和 com.package2 的应用里隐藏状态栏,在除了包名为 com.package3 的所有应用里隐藏导航栏<p class="mume-header " id="表示设置在包名为-compackage1-和-compackage2-的应用里隐藏状态栏在除了包名为-compackage3-的所有应用里隐藏导航栏"></p>adb shell settings put global policy_control immersive.full=*<p data-line="1236" class="sync-line" style="margin:0;"></p>
  • ADB屏幕截图

<p data-line="1241" class="sync-line" style="margin:0;"></p>#  先截图保存到设备的/sdcard/<p class="mume-header " id="先截图保存到设备的sdcard下"></p>adb exec-out screencap -p > /sdcard/test.png<p data-line="1243" class="sync-line" style="margin:0;"></p>#  将 png 文件导出到电脑<p class="mume-header " id="将-png-文件导出到电脑"></p>adb pull /sdcard/test.png<p data-line="1245" class="sync-line" style="margin:0;"></p>

adb shell screencap -h查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义:

参数 含义
-p 指定保存文件为 png 格式
-d display-id 指定截图的显示屏编号(有多显示屏的情况下)

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

其它方式截图并保存到电脑的方法:

# Linux 和 Windowsadb shell screencap -p | sed "s/\r$//" > test.png# Mac OS Xadb shell screencap -p | gsed "s/\r$//" > test.png

:使用其它方式截图并保存到电脑的方法,需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安装目录的 bin 文件夹下也有,并将sed.exe 所在文件夹添加到 PATH 环境变量里;Mac 下使用系统自带的 sed 命令会报错,需要安装 gnu-sed,使用该命令进行安装brew install gnu-sed

  • ADB录制屏幕

# 录制屏幕以 mp4 格式保存到 /sdcard,默认录制时间和最长录制时间都是 180
adb shell screenrecord /sdcard/filename.mp4

# 导出mp4到电脑
adb pull /sdcard/filename.mp4

adb shell screenrecord --help查看 screenrecord 命令的帮助信息,下面是常见参数及含义:

参数 含义
–size WIDTHxHEIGHT 视频的尺寸,比如 1280x720,默认是屏幕分辨率
–bit-rate RATE 视频的比特率,默认是 4Mbps
–time-limit TIME 录制时长,单位秒
–verbose 输出更多信息
  • ADB重新挂载 system 分区为可写

:需要root权限,因为/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写

adb remount<p data-line="1293" class="sync-line" style="margin:0;"></p>#  或使用如下步骤:<p class="mume-header " id="或使用如下步骤"></p>1)进入 shell 并切换到 root 用户权限,执行命令:adb shell su2)查看当前分区挂载情况,执行命令:mount | grep system   会输出如下内容:/dev/block/platform/mstar_mci.0/by-name/system /system ext4 ro,relatime,data=ordered 0 0设备:/dev/block/platform/mstar_mci.0/by-name/system
挂载点:/system
权限:ro,即只读3)以读写方式(rw)重新挂载/system分区,执行命令:mount -o remount,rw /dev/block/platform/mstar_mci.0/by-name/system /system 或mount -o remount /system<p data-line="1302" class="sync-line" style="margin:0;"></p>
  • ADB查看连接过的 WiFi 密码

<p data-line="1307" class="sync-line" style="margin:0;"></p>#  需Root 权限,全部命令执行完后展示的内容中ssid 即为 WLAN 设置里看到的名称,psk 为密码,key_mgmt 为安全加密方式<p class="mume-header " id="需root-权限全部命令执行完后展示的内容中ssid-即为-wlan-设置里看到的名称psk-为密码key_mgmt-为安全加密方式"></p>adb shell
su
cat /data/misc/wifi/*.conf


<p data-line="1311" class="sync-line" style="margin:0;"></p>

需要注意 Android O 或以后,WiFi 密码保存的地址有变化,是在 WifiConfigStore.xml 里面,如下:

<p data-line="1316" class="sync-line" style="margin:0;"></p>#  需Root 权限,全部命令执行完后展示的内容中的 ConfigKey为WiFi 名字、PreSharedKey为WiFi 密码<p class="mume-header " id="需root-权限全部命令执行完后展示的内容中的-configkey为wifi-名字-presharedkey为wifi-密码"></p>adb shell
su
cat /data/misc/wifi/WifiConfigStore.xml<p data-line="1320" class="sync-line" style="margin:0;"></p>
  • ADB设置系统日期和时间

<p data-line="1325" class="sync-line" style="margin:0;"></p>#  需Root 权限,如下表示将系统日期和时间更改为 20220821131100<p class="mume-header " id="需root-权限如下表示将系统日期和时间更改为-2022-年-08-月-21-日-13-点-11-分-00-秒"></p>adb shell
su
date -s 20220821.131100<p data-line="1329" class="sync-line" style="margin:0;"></p>
  • ADB重启设备

adb reboot<p data-line="1335" class="sync-line" style="margin:0;"></p>
  • ADB检测设备是否已 root

adb shell
su<p data-line="1342" class="sync-line" style="margin:0;"></p>
  • ADB使用 Monkey 进行压力测试

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

<p data-line="1349" class="sync-line" style="margin:0;"></p>#  表示向 <packagename> 指定的应用程序发送 500 个伪随机事件<p class="mume-header " id="表示向-packagename-指定的应用程序发送-500-个伪随机事件"></p>adb shell monkey -p <packagename> -v 500<p data-line="1351" class="sync-line" style="margin:0;"></p>
  • ADB开启WiFi

adb root
adb shell svc wifi enable<p data-line="1358" class="sync-line" style="margin:0;"></p>
  • ADB关闭WiFi

adb root
adb shell svc wifi disable<p data-line="1365" class="sync-line" style="margin:0;"></p>
  • ADB查看GLIBC版本

lld  --version<p data-line="1371" class="sync-line" style="margin:0;"></p>
  • 用 adb forward tcp:port jdwp:<pid>在PC上做端口映射, 然后在PC上通过端口连接手机,进行调试。命令如下:

jdb -attach locaohost:8000jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000<p data-line="1378" class="sync-line" style="margin:0;"></p>
  • ADB重启到 Recovery 模式

adb reboot recovery<p data-line="1384" class="sync-line" style="margin:0;"></p>
  • ADB从 Recovery 重启到 Android

adb reboot<p data-line="1390" class="sync-line" style="margin:0;"></p>
  • ADB重启到 Fastboot 模式

adb reboot bootloader<p data-line="1396" class="sync-line" style="margin:0;"></p>
  • ADB通过 sideload 更新系统

如果下载了 Android 设备对应的系统更新包到电脑上,那么可通过 adb 来完成更新,以 Recovery 模式下更新为例:

1)重启到 Recovery 模式。命令:adb reboot recovery2)在设备的 Recovery 界面上操作进入 Apply update–Apply from ADB
注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB3)通过 adb 上传和更新系统。命令:adb sideload <path-to-update.zip><p data-line="1406" class="sync-line" style="margin:0;"></p>
  • ADB启用 SELinux

adb root
adb shell setenforce 1<p data-line="1413" class="sync-line" style="margin:0;"></p>
  • ADB禁用 SELinux

adb root
adb shell setenforce 0<p data-line="1420" class="sync-line" style="margin:0;"></p>

:遇到权限问题,在logcat或者kernel的log中一定会打印avc denied提示缺少什么权限,通过命令过滤出所有的avc denied,再根据这些log进行排查:

cat /proc/kmsg | grep avc 

dmesg | grep avc<p data-line="1427" class="sync-line" style="margin:0;"></p>
  • ADB启用 dm_verity

adb root
adb enable-verity<p data-line="1434" class="sync-line" style="margin:0;"></p>
  • ADB禁用 dm_verity

adb root
adb disable-verity

fastboot --disable-verity flash vbmeta vbmeta.img<p data-line="1443" class="sync-line" style="margin:0;"></p>
  • ADB设置全局代理

<p data-line="1448" class="sync-line" style="margin:0;"></p>#  adb shell settings put global http_proxy 代理IP地址:端口号<p class="mume-header " id="adb-shell-settings-put-global-http_proxy-代理ip地址端口号"></p>adb shell settings put global http_proxy 192.168.137.1:8080adb shell settings put global https_proxy 192.168.137.1:8080<p data-line="1451" class="sync-line" style="margin:0;"></p>
  • ADB关闭代理(无需重启)

adb shell settings put global http_proxy :0<p data-line="1457" class="sync-line" style="margin:0;"></p>
  • ADB移除代理(需要重启)

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
adb reboot<p data-line="1466" class="sync-line" style="margin:0;"></p>
  • ADB查看进程

adb shell ps<p data-line="1472" class="sync-line" style="margin:0;"></p>

进程各列含义如下:

列名 含义
USER 所属用户
PID 进程 ID
PPID 父进程 ID
NAME 进程名
  • ADB查看实时资源占用情况

adb shell top<p data-line="1488" class="sync-line" style="margin:0;"></p>

top命令展示内容的各列含义如下:

列名 含义
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 显示帮助文档<p data-line="1513" class="sync-line" style="margin:0;"></p>
  • ADB查看进程 UID

<p data-line="1518" class="sync-line" style="margin:0;"></p>#  adb shell dumpsys package <packagename> | grep userId=<p class="mume-header " id="adb-shell-dumpsys-package-packagename-grep-userid"></p>$ adb shell dumpsys package cn.test.main | grep userId=<p data-line="1521" class="sync-line" style="margin:0;"></p>#  通过 ps 命令找到对应进程的 pid 之后 adb shell cat /proc/<pid>/status | grep Uid<p class="mume-header " id="通过-ps-命令找到对应进程的-pid-之后-adb-shell-cat-procpidstatus-grep-uid"></p>$ ps
$ cat /proc/28635/status | grep Uid


<p data-line="1524" class="sync-line" style="margin:0;"></p>
  • 其它一些ADB常用的Linux shell 命令

命令 功能
cat 显示文件内容
cd 切换目录
chmod 改变文件的存取模式/访问权限
df 查看磁盘空间使用情况
grep 过滤输出
kill 杀死指定 PID 的进程
ls 列举目录内容
mount 挂载目录的查看和管理
mv 移动或重命名文件
ps 查看正在运行的进程
rm 删除文件
top 查看进程的资源占用情况

参考链接

https://cloud.tencent.com/developer/article/1797357
https://zhuanlan.zhihu.com/p/43731848
https://github.com/android/platform_frameworks_base/blob/master/core%2Fjava%2Fandroid%2Fcontent%2Fpm%2FPackageManager.java
https://developer.android.com/studio/command-line/adb.html
https://developer.android.com/studio/command-line/shell.html
https://developer.android.com/studio/command-line/logcat.html
https://zmywly8866.github.io/2015/01/24/all-adb-command.html
https://github.com/ZQiang94/StudyRecords/blob/master/other/src/main/java/com/other/adb 命令行的使用记录.md
https://www.jianshu.com/p/860bc2bf1a6a
https://stackoverflow.com/questions/27002663/adb-shell-dumpsys-iphonesubinfo-not-working-since-android-5-0-lollipop
http://yifeiyuan.me/2016/06/30/ADB命令整理/
http://blog.csdn.net/kittyboy0001/article/details/38562515
https://cabins.github.io/2016/03/25/UseAdbLikeAPro-2/

0x01 常用的一些ADB命令

1.1 ADB 命令(主)

  • 查看当前应用的activity信息

adb shell dumpsys activity top


<p data-line="1597" class="sync-line" style="margin:0;"></p>

# 把系统中所有应用运行的四大组件都会打印出来
<p class="mume-header " id="把系统中所有应用运行的四大组件都会打印出来"></p>

adb shell dumpsys >> info.txt
start info.txt


<p data-line="1600" class="sync-line" style="margin:0;"></p>
  • 查看指定包名应用的详细信息

adb shell dumpsys package  xxx

或进入adb shell使用下面的命令
dumpsys package xxx


<p data-line="1608" class="sync-line" style="margin:0;"></p>

# 清空应用数据
<p class="mume-header " id="清空应用数据"></p>

adb shell pm clear xxx


<p data-line="1610" class="sync-line" style="margin:0;"></p>
  • 查看指定进程名或者进程id的内存信息

adb shell dumpsys meminfo   xxx


<p data-line="1615" class="sync-line" style="margin:0;"></p>
  • 查看指定包名应用的数据库存储信息(包括存储的SQL语句)

adb shell dumpsys dbinfo xxx


<p data-line="1620" class="sync-line" style="margin:0;"></p>
  • 安装应用包apk文件

adb intall  xxx.apk

adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡


<p data-line="1627" class="sync-line" style="margin:0;"></p>
  • 卸载应用

adb uninstall  xxx.apk

adb uninstall -k <package_name>

可选参数-k的作用为卸载软件但是保留配置和缓存文件

adb shell
cd data/app
rm apk包
exit
adb uninstall apk包的主包名
adb install -r apk包


<p data-line="1643" class="sync-line" style="margin:0;"></p>
  • 删除系统应用

adb remount (重新挂载系统分区,使系统分区重新可写)
adb shell
cd system/app
rm *.apk


<p data-line="1651" class="sync-line" style="margin:0;"></p>
  • 将设备中的文件放到本地

adb pull  目标系统中的文件路径(a.txt)  本机系统要存放取出来的路径(a.txt)   


<p data-line="1658" class="sync-line" style="margin:0;"></p>
  • 将本地文件放到设备中

adb push  本机系统中的文件路径(a.txt)    目标系统中要存放的路径(a.txt)   


<p data-line="1663" class="sync-line" style="margin:0;"></p>
  • 截屏操作

adb shell screencap -p /sdcard/test.png
adb pull /sdcard/test.png D:\img\
start D:\img\test.png


<p data-line="1670" class="sync-line" style="margin:0;"></p>
  • 录屏操作

adb shell screenrecord /sdcard/test.mp4


<p data-line="1675" class="sync-line" style="margin:0;"></p>
  • 输入文本内容

adb shell input text 'xxx'


<p data-line="1680" class="sync-line" style="margin:0;"></p>
  • 设备的端口转发

adb forward [(远程端)协议:端口号] [(设备端)协议:端口号]
adb forward tcp:23946 tcp:23946
adb forward tcp:8700 jwdp:1786


<p data-line="1687" class="sync-line" style="margin:0;"></p>
  • 查看设备中可以被调试的应用的进程号

adb jdwp


<p data-line="1692" class="sync-line" style="margin:0;"></p>
  • 查看当前日志信息

adb logcat

用法1:adb logcat -s tag
案例: adb Logcat -s fb

用法2:adb logcat |findstr pname/pid/keyword
案例: adb Logcat |findstr cn.test.demo

或进入adb shell使用下面的命令
Logcat grep tencent


<p data-line="1706" class="sync-line" style="margin:0;"></p>
  • 非root设备中查看指定debug模式的包名应用沙盒数据

run-as cn.test.demo


<p data-line="1712" class="sync-line" style="margin:0;"></p>
  • 查看设备的进程信息,或者指定进程的线程信息

ps | grep 过滤内容
ps | grep cn.test.demo
ps -t 19977


<p data-line="1720" class="sync-line" style="margin:0;"></p>
  • 清空指定包名应用的数据

pm clear  grep cn.test.demo


<p data-line="1725" class="sync-line" style="margin:0;"></p>
  • 安装设备中的apk文件

pm install /sdcard/test.apk


<p data-line="1730" class="sync-line" style="margin:0;"></p>
  • 卸载设备中的应用

pm uninstall cn.test.demo


<p data-line="1735" class="sync-line" style="margin:0;"></p>
  • 启动设备中的应用

am start -n [包(package)名]/[包名].[活动(activity)名称]
am start -n com.androidtest/com.androidtest.test


<p data-line="1741" class="sync-line" style="margin:0;"></p>
  • 启动一个服务

am startservice -n [包 (package) 名]/[包名].[服务(service)名]
am startservice -n com.androidtest2/com.androidtest.test2


<p data-line="1747" class="sync-line" style="margin:0;"></p>
  • 发送一个广播

am broadcast -a [广播动作]


<p data-line="1752" class="sync-line" style="margin:0;"></p>
  • 查看设备的ip地址

netcfg


<p data-line="1757" class="sync-line" style="margin:0;"></p>
  • 查看设备的端口号信息

netstat


<p data-line="1762" class="sync-line" style="margin:0;"></p>
  • 运行Java代码(特殊场景使用,把dx命令把dex文件转化成jar包)

app_process [运行代码目录] [运行主类]

export CLASSPATH=/data/test.jar
exec /system/bin/app_process /data/cn.test.main


<p data-line="1770" class="sync-line" style="margin:0;"></p>
  • 运行一个dex文件

dalvikvm -cp [dex文件] [运行主类]
dalvikvm -cp /data/test.dex cn. Widiankong Main


<p data-line="1777" class="sync-line" style="margin:0;"></p>
  • 查看当前应用的CPU消耗信息

top [-n/-m/-d/-s/-t]

-m // 最多显示多少个进程
-n // 刷新次数
-d // 刷新间隔时间(默认5 秒)
-s // 按哪列排序
-t // 显示线程信息而不是进程


<p data-line="1788" class="sync-line" style="margin:0;"></p>
  • 查看系统属性值

getprop [属性值名称]


<p data-line="1793" class="sync-line" style="margin:0;"></p>
  • 用aapt操作apk命令(查看apk中的信息以及编辑apk程序包)

aapt dump xmltree [apk包] [需要查看的资源文件xml ]


<p data-line="1798" class="sync-line" style="margin:0;"></p>
  • 用dexdump操作dex命令(查看dex文件的详细信息)

dexdump [ dex文件路径]


<p data-line="1803" class="sync-line" style="margin:0;"></p>
  • 查看当前进程的内存加载情况(查看当前进程的内存映射信息,比如加载了哪些so文件,dex文件等)

cat /proc/[pid]/maps

用法:cat /proc/663/maps


<p data-line="1810" class="sync-line" style="margin:0;"></p>
  • 查看进程的状态信息

cat /proc/[pid]/status

用法:cat /proc/663/status


<p data-line="1817" class="sync-line" style="margin:0;"></p>
  • 查看当前应用使用的端口号信息

cat /proc/[pid]/net/tcp/tcp6/udp/udp6

用法:cat /proc/663/net/tcp/tcp6/udp/udp6


<p data-line="1824" class="sync-line" style="margin:0;"></p>

1.2 ADB 命令(次)

  • 查看连接设备

adb devices


<p data-line="1832" class="sync-line" style="margin:0;"></p>
  • 获取手机root权限

adb root


<p data-line="1837" class="sync-line" style="margin:0;"></p>
  • 重新挂载系统分区,使系统分区重新可写

adb remount


<p data-line="1842" class="sync-line" style="margin:0;"></p>
  • 进入到手机设备Shell界面中去

adb shell

abd shell -s 模拟器编号 命令


<p data-line="1849" class="sync-line" style="margin:0;"></p>
  • 启动和关闭ADB服务

<p data-line="1853" class="sync-line" style="margin:0;"></p>

# 关闭服务
<p class="mume-header " id="关闭服务"></p>

adb kill-server



<p data-line="1856" class="sync-line" style="margin:0;"></p>

# 启动服务
<p class="mume-header " id="启动服务"></p>

adb start-server


<p data-line="1858" class="sync-line" style="margin:0;"></p>
  • adb帮助命令

adb help


<p data-line="1863" class="sync-line" style="margin:0;"></p>
  • 查看bug报告

adb bugreport


<p data-line="1868" class="sync-line" style="margin:0;"></p>
  • 记录无线通讯日志

adb shell
logcat -b radio


<p data-line="1874" class="sync-line" style="margin:0;"></p>
  • 获取设备的ID和序列号

adb get-product
adb get-serialno


<p data-line="1880" class="sync-line" style="margin:0;"></p>
  • 访问数据库SQLite3

adb shell
sqlite3


<p data-line="1886" class="sync-line" style="margin:0;"></p>
  • 进入系统内指定文件夹

cd system/sd/data



<p data-line="1892" class="sync-line" style="margin:0;"></p>

# ls //列表显示当前文件夹内容
<p class="mume-header " id="ls-列表显示当前文件夹内容"></p>



<p data-line="1893" class="sync-line" style="margin:0;"></p>

# rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件
<p class="mume-header " id="rm-r-xxx-删除名字为xxx的文件夹及其里面的所有文件"></p>



<p data-line="1894" class="sync-line" style="margin:0;"></p>

# rm xxx //删除文件xxx
<p class="mume-header " id="rm-xxx-删除文件xxx"></p>



<p data-line="1895" class="sync-line" style="margin:0;"></p>

# rmdir xxx //删除xxx的文件夹
<p class="mume-header " id="rmdir-xxx-删除xxx的文件夹"></p>



<p data-line="1896" class="sync-line" style="margin:0;"></p>
  • 点亮屏幕

adb shellinput keyevent 80


<p data-line="1901" class="sync-line" style="margin:0;"></p>
  • 查看adb版本

adb version


<p data-line="1906" class="sync-line" style="margin:0;"></p>
  • 将system分区重新挂在为可读写分区,此命令在操作系统目录时很重要

adb remount


<p data-line="1911" class="sync-line" style="margin:0;"></p>
  • 重启设备,可选参数进入bootloader(刷机模式)或recovery(恢复模式)

adb reboot bootloader
adb reboot recovery


<p data-line="1917" class="sync-line" style="margin:0;"></p>
  • 杀掉某个进程,一般用于模拟某个bug复现

adb shell kill pidNumber



<p data-line="1923" class="sync-line" style="margin:0;"></p>

# 列出进程列表及其pid
<p class="mume-header " id="列出进程列表及其pid"></p>

adb shell ps



<p data-line="1926" class="sync-line" style="margin:0;"></p>

# 查看指定进程信息
<p class="mume-header " id="查看指定进程信息"></p>

adb shell ps -x pid


<p data-line="1928" class="sync-line" style="margin:0;"></p>
  • 查看单个应用程序的最大内存限制

adb shell getprop | grep heapgrowthlimit

得到的结果为128M: [dalvik.vm.heapgrowthlimit]: [128m]

这就是说Dalvik Heap size的最大值超过了128M,就很可能发生OOM


<p data-line="1937" class="sync-line" style="margin:0;"></p>
  • 查看sdk版本

adb shell getprop | grep version


<p data-line="1942" class="sync-line" style="margin:0;"></p>
  • 查看设备型号信息

adb shell getprop | grep product


<p data-line="1947" class="sync-line" style="margin:0;"></p>
  • 获取序列号

获取到的序列号即为adb devices列出来的序列号

adb get-serialno


<p data-line="1954" class="sync-line" style="margin:0;"></p>
  • 查看wifi密码(需要root权限)

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


<p data-line="1959" class="sync-line" style="margin:0;"></p>
  • 查看wifi_mac

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


<p data-line="1964" class="sync-line" style="margin:0;"></p>
  • 查看后台services信息

adb shell service list


<p data-line="1969" class="sync-line" style="margin:0;"></p>
  • ADB 录制屏幕命令

adb shell screenrecord /sdcard/test.mp4


<p data-line="1974" class="sync-line" style="margin:0;"></p>
  • 打电话

adb shell am start -a android.intent.action.CALL -d tel:10086
停止应用
adb shell am force-stop package
查看当前 Activity 名称
adb shell dumpsys activity | findstr “mFocusedActivity”


<p data-line="1983" class="sync-line" style="margin:0;"></p>
  • 移动文件

adb shell mv /sdcard/1.txt /sdcard/2.text
移动同一目录下文件相当于重命名文件


<p data-line="1989" class="sync-line" style="margin:0;"></p>
  • 手机或模拟器当前屏幕进行截屏

adb shell screencap /sdcard/Test.png
adb pull /sdcard/Test.png
adb open Test.png<p data-line="1997" class="sync-line" style="margin:0;"></p>
  • 获取手机内存使用率

adb shell dumpsys meminfo <pakagename><p data-line="2003" class="sync-line" style="margin:0;"></p>
  • 获取手机cpu占有率

adb shell top
adb shell dumpsys cpuinfo<p data-line="2009" class="sync-line" style="margin:0;"></p>
  • 获取手机功耗

adb shell dumpsys battery<p data-line="2015" class="sync-line" style="margin:0;"></p>
  • 查看总体的cpu占用

adb shell cat /proc/stat<p data-line="2021" class="sync-line" style="margin:0;"></p>
  • 查看进程的cpu占用

adb shell cat /proc/<PID>/stat<p data-line="2026" class="sync-line" style="margin:0;"></p>
  • 查看总体的RAM

adb shell cat /proc/meminfo | head -n 4<p data-line="2032" class="sync-line" style="margin:0;"></p>
  • 查看剩余的RAM

adb shell dumpsys meminfo| grep "Free RAM"<p data-line="2038" class="sync-line" style="margin:0;"></p>
  • 查看进程的RAM

adb shell dumpsys meminfo <packagename>adb shell dumpsys meminfo <PID><p data-line="2045" class="sync-line" style="margin:0;"></p>
  • 开机后的总流量(字节数)

adb shell cat proc/self/net/dev<p data-line="2051" class="sync-line" style="margin:0;"></p>
  • 获取手机上传流量

adb shell cat /proc/uid_stat/2000/tcp_snd<p data-line="2057" class="sync-line" style="margin:0;"></p>
  • 获取手机下载流量

adb shell cat /proc/uid_stat/2000/tcp_rcv<p data-line="2063" class="sync-line" style="margin:0;"></p>
  • 输出日志

adb logcat threadtime -b events>d:\log\events.txt<p data-line="2069" class="sync-line" style="margin:0;"></p>
  • 打印页面的日志

adb logcat -v threadtime | grep ActivityManager<p data-line="2075" class="sync-line" style="margin:0;"></p>
  • 启动时间

adb shell am start -W -n <某activity><p data-line="2080" class="sync-line" style="margin:0;"></p>

0x02 ADB常用命令总结

  • 存在多个设备/模拟器,指定单独一个设备/模拟器并进入交互式Shell

adb 基本语法格式:adb [-d|-e|-s <serialNumber>] <command>

参数如下:

参数 描述
-d 指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e 指定当前唯一运行的模拟器为命令目标
-s <serialNumber> 指定相应 serialNumber号的设备/模拟器为命令目标

:如果有多个设备/模拟器连接,则需要命令指定目标设备。常用的是 -s 参数,设备/模拟器的serialNumber(序列号)可通过adb devices命令获取,如下:

$ adb devices

List of devices attached
cf33328f device
emulator-5554 device10.1.2.6:5555 device<p data-line="2106" class="sync-line" style="margin:0;"></p>

上述案例表示电脑连接了三个设备/模拟器,输出里的cf33328f、emulator-5554 和 10.1.2.6:5555均为设备/模拟器的序列号,想连接emulator-5554模拟器,输入如下命令:

adb  -s  emulator-5554<p data-line="2112" class="sync-line" style="margin:0;"></p>

adb 输出格式为[serialNumber] [state],serialNumber 即我们常说的 SN,state 有如下几种:

参数 描述
offline 表示设备未连接成功或无响应
device 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态
no device 没有设备/模拟器连接
List of devices attached 没有设备/模拟器连接成功
List of devices attached 【序列号】 offline 设备/模拟器未连接到 adb 或无响应
  • ADB 启动/停止的命令

<p data-line="2128" class="sync-line" style="margin:0;"></p>#  启动adb<p class="mume-header " id="启动adb"></p>adb start-server<p data-line="2131" class="sync-line" style="margin:0;"></p>#  adb<p class="mume-header " id="adb"></p>adb kill-server<p data-line="2133" class="sync-line" style="margin:0;"></p>
  • 重启adbd 服务

restart adbd<p data-line="2140" class="sync-line" style="margin:0;"></p>#  或分开使用停止和启动命令来重启adbd服务<p class="mume-header " id="或分开使用停止和启动命令来重启adbd服务"></p>stop adbd
start adbd<p data-line="2143" class="sync-line" style="margin:0;"></p>
  • ADB版本信息

adb version<p data-line="2149" class="sync-line" style="margin:0;"></p>
  • root 权限运行 adbd

adb root<p data-line="2155" class="sync-line" style="margin:0;"></p>
  • 指定 adb server 的网络端口

adb -P <port> start-server<p data-line="2161" class="sync-line" style="margin:0;"></p>
  • 查看应用列表

查看应用列表的基本命令格式:adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]

<p data-line="2168" class="sync-line" style="margin:0;"></p>#  显示所有应用<p class="mume-header " id="显示所有应用"></p>adb shell pm list packages<p data-line="2171" class="sync-line" style="margin:0;"></p>#  显示系统应用<p class="mume-header " id="显示系统应用"></p>adb shell pm list packages -s<p data-line="2174" class="sync-line" style="margin:0;"></p>#  显示第三方应用<p class="mume-header " id="显示第三方应用"></p>adb shell pm list packages -3<p data-line="2177" class="sync-line" style="margin:0;"></p>#  包名包含某字符串的应用,比如要查看包名包含字符串 test 的应用列表<p class="mume-header " id="包名包含某字符串的应用比如要查看包名包含字符串-test-的应用列表"></p>adb shell pm list packages tesr
或使用 grep 来过滤
adb shell pm list packages | grep test<p data-line="2181" class="sync-line" style="margin:0;"></p>

上面的参数如下:

参数名 描述
默认 所有应用
-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用
<FILTER> 包名包含 <FILTER> 字符串
  • ADB安装APK

格式:adb install [-lrtsdg] <path_to_apk>

adb install 安装步骤如下:

1)push apk 文件到 /data/local/tmp2)调用 pm install 安装3)删除 /data/local/tmp 下的对应 apk 文件<p data-line="2209" class="sync-line" style="margin:0;"></p>

参数及含义如下:

参数 含义
-l 将应用安装到保护目录 /mnt/asec
-r 允许覆盖安装
-t 允许安装 AndroidManifest.xml里 application 指定android:testOnly="true"的应用
-s 将应用安装到 sdcard
-d 允许降级覆盖安装
-g 授予所有运行时权限
–abi abi-identifier 为特定 ABI 强制安装 apk,abi-identifier可以是 armeabi-v7a、arm64-v8a、v86、x86_64

常见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 的 assembleDebugassembleRelease重新编译,或者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! 已安装该应用且签名不一致 先卸载设备上的该应用,再安装
  • ADB卸载应用程序

命令格式如下:

<p data-line="2286" class="sync-line" style="margin:0;"></p>#  <packagename> 表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录<p class="mume-header " id="packagename-表示应用的包名-k-参数可选表示卸载应用但保留数据和缓存目录"></p>adb uninstall [-k] <packagename><p data-line="2288" class="sync-line" style="margin:0;"></p>
adb uninstall android.uid.sysytem<p data-line="2292" class="sync-line" style="margin:0;"></p>
  • ADB清除应用数据与缓存

命令格式如下:

<p data-line="2298" class="sync-line" style="margin:0;"></p>#  <packagename> 表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」<p class="mume-header " id="packagename-表示应用名包这条命令的效果相当于在设置里的应用信息界面点击了清除缓存和清除数据"></p>adb shell pm clear <packagename><p data-line="2300" class="sync-line" style="margin:0;"></p>
adb shell pm clear android.uid.sysytem<p data-line="2304" class="sync-line" style="margin:0;"></p>
  • 查看当前前台 Activity

adb shell dumpsys activity activities | grep mResumedActivity<p data-line="2310" class="sync-line" style="margin:0;"></p>

adb shell dumpsys activity activities | findstr mResumedActivity

adb shell "dumpsys activity activities | grep mResumedActivity"<p data-line="2317" class="sync-line" style="margin:0;"></p>
  • 查看正在运行的 Services

命令格式如下:

<p data-line="2323" class="sync-line" style="margin:0;"></p>#  <packagename> 参数不是必须的,指定 <packagename> 表示查看与某个包名相关的 Services,不指定表示查看所有 Services<p class="mume-header " id="packagename-参数不是必须的指定-packagename-表示查看与某个包名相关的-services不指定表示查看所有-services"></p>adb shell dumpsys activity services [<packagename>]<p data-line="2325" class="sync-line" style="margin:0;"></p>
  • 查看应用详细信息

输出中包含很多信息,包括Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等

命令格式如下:

adb shell dumpsys package <packagename><p data-line="2334" class="sync-line" style="margin:0;"></p>
  • ADB查看应用安装路径

命令格式如下:

adb shell pm path <PACKAGE><p data-line="2341" class="sync-line" style="margin:0;"></p>
  • 启动应用/调起Activity(指定Activity名称启动)

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

<INTENT>里还能带数据,就像写代码时的 Bundle 一样:

参数 含义
--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 数组

命令格式如下:

adb shell am start [options] <INTENT><p data-line="2385" class="sync-line" style="margin:0;"></p>
<p data-line="2388" class="sync-line" style="margin:0;"></p>#  调起微信主界面<p class="mume-header " id="调起微信主界面"></p>adb shell am start -n com.tencent.mm/.ui.LauncherUI<p data-line="2390" class="sync-line" style="margin:0;"></p>
<p data-line="2393" class="sync-line" style="margin:0;"></p>#  表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world<p class="mume-header " id="表示调起-orgmazhuangboottimemeasuremainactivity-并传给它-string-数据键值对-toast-hello-world"></p>adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"<p data-line="2395" class="sync-line" style="margin:0;"></p>
  • 启动应用/调起Activity(不指定Activity名称启动【启动主Activity】)

命令格式如下:

adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER 


<p data-line="2402" class="sync-line" style="margin:0;"></p>
<p data-line="2405" class="sync-line" style="margin:0;"></p>#  调起微信主界面<p class="mume-header " id="调起微信主界面-1"></p>adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER 1<p data-line="2407" class="sync-line" style="margin:0;"></p>
  • ADB调起Service

命令格式如下:

adb shell am startservice [options] <INTENT><p data-line="2414" class="sync-line" style="margin:0;"></p>
<p data-line="2417" class="sync-line" style="margin:0;"></p>#  调起微信的某 Service<p class="mume-header " id="调起微信的某-service"></p>adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService<p data-line="2419" class="sync-line" style="margin:0;"></p>
  • ADB停止Service

命令格式如下:

adb shell am stopservice [options] <INTENT><p data-line="2426" class="sync-line" style="margin:0;"></p>
  • ADB发送广播

命令格式如下:既能发送系统预定义的广播,也能发送自定义广播

adb shell am broadcast [options] <INTENT><p data-line="2433" class="sync-line" style="margin:0;"></p>
<p data-line="2436" class="sync-line" style="margin:0;"></p>#  向所有组件广播 BOOT_COMPLETED<p class="mume-header " id="向所有组件广播-boot_completed"></p>adb shell am broadcast -a android.intent.action.BOOT_COMPLETED<p data-line="2439" class="sync-line" style="margin:0;"></p>#  只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED<p class="mume-header " id="只向-orgmazhuangboottimemeasurebootcompletedreceiver-广播-boot_completed"></p>adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver<p data-line="2441" class="sync-line" style="margin:0;"></p>

如下是部分系统预定义广播及正常触发时机:

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 <packagename><p data-line="2475" class="sync-line" style="margin:0;"></p>
  • ADB收紧内存

命令格式如下:

adb shell am send-trim-memory  <pid> <level><p data-line="2482" class="sync-line" style="margin:0;"></p>
<p data-line="2485" class="sync-line" style="margin:0;"></p>#  HOME 键<p class="mume-header " id="home-键"></p>adb shell input keyevent 3<p data-line="2487" class="sync-line" style="margin:0;"></p>
 level: 
1)HIDDEN 2)RUNNING_MODERATE 3)BACKGROUND 4)RUNNING_LOW 5)MODERATE 6)RUNNING_CRITICAL 7)COMPLETE<p data-line="2498" class="sync-line" style="margin:0;"></p>
<p data-line="2501" class="sync-line" style="margin:0;"></p>#  表示向 pid=986 的进程,发出 level=RUNNING_LOW 的收紧内存命令<p class="mume-header " id="表示向-pid986-的进程发出-levelrunning_low-的收紧内存命令"></p>adb shell am send-trim-memory  986 RUNNING_LOW<p data-line="2503" class="sync-line" style="margin:0;"></p>
  • ADB复制设备里的文件到电脑

命令格式如下:

adb pull <设备里的文件路径> [电脑上的目录]<p data-line="2510" class="sync-line" style="margin:0;"></p>
  • ADB复制电脑里的文件到设备

命令格式如下:

adb push <电脑上的文件路径> <设备里的目录><p data-line="2517" class="sync-line" style="margin:0;"></p>
  • ADB模拟按键/输入

在 adb shell 里有个很实用的命令叫 input,input 命令的完整 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)<p data-line="2546" class="sync-line" style="margin:0;"></p>

使用adb shell input keyevent <keycode>命令,不同的 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 则让系统休眠
  • ADB显示Android 日志

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

命令格式如下:

[adb] logcat [<option>] ... [<filter-spec>] ...<p data-line="2593" class="sync-line" style="margin:0;"></p>

按级别过滤日志:

Android 的日志分为如下几个优先级(priority):1)V :Verbose(最低,输出得最多)2)D :Debug3)I :Info4)W :Warning5)E :Error6)F :Fatal7)S :Silent(最高,啥也不输出)
按某级别过滤日志则会将该级别及以上的日志输出<p data-line="2607" class="sync-line" style="margin:0;"></p># 比如如下命令会将Warning、Error、Fatal 和 Silent 日志输出<p class="mume-header " id="比如如下命令会将warning-error-fatal-和-silent-日志输出"></p>adb logcat *:W<p data-line="2609" class="sync-line" style="margin:0;"></p>

按 tag 和级别过滤日志:

<p data-line="2613" class="sync-line" style="margin:0;"></p>#  <filter-spec> 可以由多个 <tag>[:priority] 组成<p class="mume-header " id="filter-spec-可以由多个-tagpriority-组成"></p><p data-line="2614" class="sync-line" style="margin:0;"></p>#  下面表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)<p class="mume-header " id="下面表示输出-tag-activitymanager-的-info-以上级别日志输出-tag-myapp-的-debug-以上级别日志及其它-tag-的-silent-级别日志即屏蔽其它-tag-日志"></p>adb logcat ActivityManager:I MyApp:D *:S<p data-line="2616" class="sync-line" style="margin:0;"></p>

日志格式:可以用adb logcat -v <format>选项指定日志输出格式

日志支持按以下几种 <format>1)brief默认格式。格式为:<priority>/<tag>(<pid>): <message> 示例:D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 02)process格式为:<priority>(<pid>) <message> 示例:D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)3)tag格式为:<priority>/<tag>: <message> 示例:D/HeadsetStateMachine: Disconnected process message: 10, size: 04)raw格式为:<message> 示例:Disconnected process message: 10, size: 05)time格式为:<datetime> <priority>/<tag>(<pid>): <message> 示例:08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 06)threadtime格式为:<datetime> <pid> <tid> <priority> <tag>: <message> 示例:08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 07long格式为:[ <datetime> <pid>:<tid> <priority>/<tag> ] <message> 示例:[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0<p data-line="2642" class="sync-line" style="margin:0;"></p>#  指定格式可与上面的过滤同时使用,如下:<p class="mume-header " id="指定格式可与上面的过滤同时使用如下"></p>adb logcat -v long ActivityManager:I *:S<p data-line="2644" class="sync-line" style="margin:0;"></p>
  • ADB清空日志

adb logcat -c<p data-line="2650" class="sync-line" style="margin:0;"></p>
  • ADB显示内核日志

adb shell dmesg<p data-line="2656" class="sync-line" style="margin:0;"></p>
  • ADB查看设备型号

adb shell getprop ro.product.model<p data-line="2662" class="sync-line" style="margin:0;"></p>
  • ADB查看设备android_id

adb shell settings get secure android_id<p data-line="2668" class="sync-line" style="margin:0;"></p>
  • ADB查看设备IMEI

<p data-line="2673" class="sync-line" style="margin:0;"></p>#  在 Android 4.4 及以下版本可通过如下命令获取 IMEI,其中的 Device ID 就是 IMEI:<p class="mume-header " id="在-android-44-及以下版本可通过如下命令获取-imei其中的-device-id-就是-imei"></p>adb shell dumpsys iphonesubinfo<p data-line="2676" class="sync-line" style="margin:0;"></p>#  在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限),把里面的有效内容提取出来就是 IMEI :<p class="mume-header " id="在-android-50-及以上版本里这个命令输出为空得通过其它方式获取了需要-root-权限把里面的有效内容提取出来就是-imei"></p>adb shell
su
service call iphonesubinfo 1<p data-line="2680" class="sync-line" style="margin:0;"></p>
  • ADB查看Android 系统版本

adb shell getprop ro.build.version.release<p data-line="2686" class="sync-line" style="margin:0;"></p>
  • ADB查看IP 地址

手动查看IP地址:「设置」-「关于手机」-「状态信息」-「IP地址」,下面是通过ADB查看IP地址

adb shell ifconfig<p data-line="2694" class="sync-line" style="margin:0;"></p>

<p data-line="2698" class="sync-line" style="margin:0;"></p>#  网络连接名称、启用状态、IP 地址和 Mac 地址等信息<p class="mume-header " id="网络连接名称-启用状态-ip-地址和-mac-地址等信息"></p>adb shell netcfg<p data-line="2700" class="sync-line" style="margin:0;"></p>
  • ADB 查看Mac 地址

adb shell cat /sys/class/net/wlan0/address<p data-line="2706" class="sync-line" style="margin:0;"></p>
  • ADB查看CPU 信息

adb shell cat /proc/cpuinfo<p data-line="2712" class="sync-line" style="margin:0;"></p>
  • ADB查看内存信息

<p data-line="2717" class="sync-line" style="margin:0;"></p>#  注意,在命令执行后展示的信息中MemTotal 就是设备的总内存,MemFree 是当前空闲内存<p class="mume-header " id="注意在命令执行后展示的信息中memtotal-就是设备的总内存memfree-是当前空闲内存"></p>adb shell cat /proc/meminfo<p data-line="2719" class="sync-line" style="margin:0;"></p>
  • ADB查看更多硬件与系统属性

adb shell cat /system/build.prop<p data-line="2726" class="sync-line" style="margin:0;"></p>#  或通过 adb shell getprop <属性名>,比如查看SDK版本<p class="mume-header " id="或通过-adb-shell-getprop-属性名比如查看sdk版本"></p>adb shell getprop   ro.build.version.sdk<p data-line="2728" class="sync-line" style="margin:0;"></p>

部分系统属性如下:

属性名 含义
ro.build.version.sdk SDK 版本
ro.build.version.release Android 系统版本
ro.build.version.security_patch Android 安全补丁程序级别
ro.product.model 型号
ro.product.brand 品牌
ro.product.name 设备名
ro.product.board 处理器型号
ro.product.cpu.abilist CPU 支持的 abi 列表
persist.sys.isUsbOtgEnabled 是否支持 OTG
dalvik.vm.heapsize 每个应用程序的内存上限
ro.sf.lcd_density 屏幕密度

:一些定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist 属性名查找不到,尝试如下命令:

adb shell cat /system/build.prop | grep ro.product.cpu.abi<p data-line="2750" class="sync-line" style="margin:0;"></p>
  • ADB关闭 USB 调试模式

注:用命令关闭后,只能手动恢复,步骤:「设置」-「开发者选项」-「Android 调试」

adb shell settings put global adb_enabled 0<p data-line="2758" class="sync-line" style="margin:0;"></p>
  • 允许访问非 SDK API

adb shell settings put global hidden_api_policy_pre_p_apps 1adb shell settings put global hidden_api_policy_p_apps 1<p data-line="2765" class="sync-line" style="margin:0;"></p>

数字的含义如下:

含义
0 禁止检测非 SDK 接口的调用。该情况下,日志记录功能被禁用,并且令strict mode API,即 detectNonSdkApiUsage()无效,不推荐
1 仅警告——允许访问所有非 SDK 接口,但保留日志中的警告信息,可继续使用strick mode API
2 禁止调用深灰名单和黑名单中的接口
3 禁止调用黑名单中的接口,但允许调用深灰名单中的接口
  • 禁止访问非 SDK API

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps<p data-line="2781" class="sync-line" style="margin:0;"></p>
  • ADB显示隐藏状态栏和导航栏

adb shell settings put global policy_control <key-values><p data-line="2787" class="sync-line" style="margin:0;"></p>

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

key 含义
immersive.full 同时隐藏
immersive.status 隐藏状态栏
immersive.navigation 隐藏导航栏
immersive.preconfirms ?

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

value 含义
apps 所有应用
* 所有界面
packagename 指定应用
-packagename 排除指定应用

例如表示设置在所有界面下都同时隐藏状态栏和导航栏:

# 表示设置在包名为 com.package1 和 com.package2 的应用里隐藏状态栏,在除了包名为 com.package3 的所有应用里隐藏导航栏
adb shell settings put global policy_control immersive.full=*
  • ADB屏幕截图

# 先截图保存到设备的/sdcard/
adb exec-out screencap -p > /sdcard/test.png
# 将 png 文件导出到电脑
adb pull /sdcard/test.png

adb shell screencap -h查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义:

参数 含义
-p 指定保存文件为 png 格式
-d display-id 指定截图的显示屏编号(有多显示屏的情况下)

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

其它方式截图并保存到电脑的方法:

<p data-line="2834" class="sync-line" style="margin:0;"></p>#  Linux 和 Windows<p class="mume-header " id="linux-和-windows"></p>adb shell screencap -p | sed "s/\r$//" > test.png<p data-line="2837" class="sync-line" style="margin:0;"></p>#  Mac OS X<p class="mume-header " id="mac-os-x"></p>adb shell screencap -p | gsed "s/\r$//" > test.png<p data-line="2839" class="sync-line" style="margin:0;"></p>

:使用其它方式截图并保存到电脑的方法,需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安装目录的 bin 文件夹下也有,并将sed.exe 所在文件夹添加到 PATH 环境变量里;Mac 下使用系统自带的 sed 命令会报错,需要安装 gnu-sed,使用该命令进行安装brew install gnu-sed

  • ADB录制屏幕

<p data-line="2846" class="sync-line" style="margin:0;"></p>#  录制屏幕以 mp4 格式保存到 /sdcard,默认录制时间和最长录制时间都是 180<p class="mume-header " id="录制屏幕以-mp4-格式保存到-sdcard默认录制时间和最长录制时间都是-180-秒"></p>adb shell screenrecord /sdcard/filename.mp4<p data-line="2849" class="sync-line" style="margin:0;"></p>#  导出mp4到电脑<p class="mume-header " id="导出mp4到电脑"></p>adb pull /sdcard/filename.mp4<p data-line="2851" class="sync-line" style="margin:0;"></p>

adb shell screenrecord --help查看 screenrecord 命令的帮助信息,下面是常见参数及含义:

参数 含义
–size WIDTHxHEIGHT 视频的尺寸,比如 1280x720,默认是屏幕分辨率
–bit-rate RATE 视频的比特率,默认是 4Mbps
–time-limit TIME 录制时长,单位秒
–verbose 输出更多信息
  • ADB重新挂载 system 分区为可写

:需要root权限,因为/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写

adb remount

# 或使用如下步骤:1)进入 shell 并切换到 root 用户权限,执行命令:adb shell su2)查看当前分区挂载情况,执行命令:mount | grep system 会输出如下内容:/dev/block/platform/mstar_mci.0/by-name/system /system ext4 ro,relatime,data=ordered 0 0设备:/dev/block/platform/mstar_mci.0/by-name/system
挂载点:/system
权限:ro,即只读3)以读写方式(rw)重新挂载/system分区,执行命令:mount -o remount,rw /dev/block/platform/mstar_mci.0/by-name/system /system 或mount -o remount /system
  • ADB查看连接过的 WiFi 密码

# 需Root 权限,全部命令执行完后展示的内容中ssid 即为 WLAN 设置里看到的名称,psk 为密码,key_mgmt 为安全加密方式
adb shell
su
cat /data/misc/wifi/*.conf

需要注意 Android O 或以后,WiFi 密码保存的地址有变化,是在 WifiConfigStore.xml 里面,如下:

# 需Root 权限,全部命令执行完后展示的内容中的 ConfigKey为WiFi 名字、PreSharedKey为WiFi 密码
adb shell
su
cat /data/misc/wifi/WifiConfigStore.xml
  • ADB设置系统日期和时间

# 需Root 权限,如下表示将系统日期和时间更改为 20220821131100
adb shell
su
date -s 20220821.131100
  • ADB重启设备

adb reboot
  • ADB检测设备是否已 root

adb shell
su
  • ADB使用 Monkey 进行压力测试

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

# 表示向 <packagename> 指定的应用程序发送 500 个伪随机事件
adb shell monkey -p <packagename> -v 500
  • ADB开启WiFi

adb root
adb shell svc wifi enable
  • ADB关闭WiFi

adb root
adb shell svc wifi disable
  • ADB查看GLIBC版本

lld  --version
  • 用 adb forward tcp:port jdwp:<pid>在PC上做端口映射, 然后在PC上通过端口连接手机,进行调试。命令如下:

jdb -attach locaohost:8000jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000
  • ADB重启到 Recovery 模式

adb reboot recovery