推荐阅读
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命令
查看当前应用的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.apkadb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡
卸载应用
adb uninstall xxx.apkadb 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
查看连接设备
adb devices
获取手机root权限
adb root
重新挂载系统分区,使系统分区重新可写
adb remount
进入到手机设备Shell界面中去
adb shellabd 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>
存在多个设备/模拟器,指定单独一个设备/模拟器并进入交互式Shell
adb 基本语法格式:adb [-d|-e|-s <serialNumber>] <command>
参数如下:
参数 | 描述 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s <serialNumber> | 指定相应 serialNumber 号的设备/模拟器为命令目标 |
注:如果有多个设备/模拟器连接,则需要命令指定目标设备。常用的是 -s 参数,设备/模拟器的serialNumber(序列号)可通过adb devices
命令获取,如下:
$ adb devicesList 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 的 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! | 已安装该应用且签名不一致 | 先卸载设备上的该应用,再安装 |
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 mResumedActivityadb 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
gamepadThe 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: 07)long格式为:[ <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 权限,如下表示将系统日期和时间更改为 2022 年 08 月 21 日 13 点 11 分 00 秒<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/
查看当前应用的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.apkadb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡
<p data-line="1627" class="sync-line" style="margin:0;"></p>
卸载应用
adb uninstall xxx.apkadb 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>
查看连接设备
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 shellabd 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>
存在多个设备/模拟器,指定单独一个设备/模拟器并进入交互式Shell
adb 基本语法格式:adb [-d|-e|-s <serialNumber>] <command>
参数如下:
参数 | 描述 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s <serialNumber> | 指定相应 serialNumber 号的设备/模拟器为命令目标 |
注:如果有多个设备/模拟器连接,则需要命令指定目标设备。常用的是 -s 参数,设备/模拟器的serialNumber(序列号)可通过adb devices
命令获取,如下:
$ adb devicesList 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 的 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! | 已安装该应用且签名不一致 | 先卸载设备上的该应用,再安装 |
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 mResumedActivityadb 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
gamepadThe 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: 07)long格式为:[ <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 权限,如下表示将系统日期和时间更改为 2022 年 08 月 21 日 13 点 11 分 00 秒
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
ADB从 Recovery 重启到 Android
adb reboot
ADB重启到 Fastboot 模式
adb reboot bootloader
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>
ADB启用 SELinux
adb root
adb shell setenforce 1
ADB禁用 SELinux
adb root
adb shell setenforce 0
注:遇到权限问题,在logcat或者kernel的log中一定会打印avc denied提示缺少什么权限,通过命令过滤出所有的avc denied,再根据这些log进行排查:
cat /proc/kmsg | grep avc
或
dmesg | grep avc
ADB启用 dm_verity
adb root
adb enable-verity
ADB禁用 dm_verity
adb root
adb disable-verity
或
fastboot --disable-verity flash vbmeta vbmeta.img
ADB设置全局代理
# adb shell settings put global http_proxy 代理IP地址:端口号adb shell settings put global http_proxy 192.168.137.1:8080adb shell settings put global https_proxy 192.168.137.1:8080
ADB关闭代理(无需重启)
adb shell settings put global http_proxy :0
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
ADB查看进程
adb shell ps
进程各列含义如下:
列名 | 含义 |
---|---|
USER | 所属用户 |
PID | 进程 ID |
PPID | 父进程 ID |
NAME | 进程名 |
ADB查看实时资源占用情况
adb shell top
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 显示帮助文档
ADB查看进程 UID
# adb shell dumpsys package <packagename> | grep userId=$ adb shell dumpsys package cn.test.main | grep userId=# 通过 ps 命令找到对应进程的 pid 之后 adb shell cat /proc/<pid>/status | grep Uid
$ ps
$ cat /proc/28635/status | grep Uid
其它一些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/
推荐阅读