常用的一些ADB命令 1.1 ADB 命令(主)
1 2 3 4 adb shell dumpsys activity top # 把系统中所有应用运行的四大组件都会打印出来 adb shell dumpsys >> info.txt start info.txt
1 2 3 4 5 6 adb shell dumpsys package xxx 或进入adb shell使用下面的命令 dumpsys package xxx # 清空应用数据 adb shell pm clear xxx
1 adb shell dumpsys meminfo xxx
查看指定包名应用的数据库存储信息(包括存储的SQL语句)
1 adb shell dumpsys dbinfo xxx
1 2 3 adb intall xxx.apk adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡
1 2 3 4 5 6 7 8 9 10 11 12 adb uninstall xxx.apk adb uninstall -k 可选参数-k的作用为卸载软件但是保留配置和缓存文件 adb shell cd data/app rm apk包 exit adb uninstall apk包的主包名 adb install -r apk包
1 2 3 4 adb remount (重新挂载系统分区,使系统分区重新可写) adb shell cd system/app rm *.apk
1 adb pull 目标系统中的文件路径(a.txt) 本机系统要存放取出来的路径(a.txt)
1 adb push 本机系统中的文件路径(a.txt) 目标系统中要存放的路径(a.txt)
1 2 3 adb shell screencap -p /sdcard/test.png adb pull /sdcard/test.png D:\img\ start D:\img\test.png
1 adb shell screenrecord /sdcard/test.mp4
1 adb shell input text 'xxx'
1 2 3 adb forward [(远程端)协议:端口号] [(设备端)协议:端口号] adb forward tcp:23946 tcp:23946 adb forward tcp:8700 jwdp:1786
1 2 3 4 5 6 7 8 9 10 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模式的包名应用沙盒数据
1 2 3 ps | grep 过滤内容 ps | grep cn.test.demo ps -t 19977
1 pm clear grep cn.test.demo
1 pm install /sdcard/test.apk
1 pm uninstall cn.test.demo
1 2 am start -n [包(package)名]/[包名].[活动(activity)名称] am start -n com.androidtest/com.androidtest.test
1 2 am startservice -n [包 (package) 名]/[包名].[服务(service)名] am startservice -n com.androidtest2/com.androidtest.test2
运行Java代码(特殊场景使用,把dx命令把dex文件转化成jar包)
1 2 3 4 app_process [运行代码目录] [运行主类] export CLASSPATH=/data/test.jar exec /system/bin/app_process /data/cn.test.main
1 2 dalvikvm -cp [dex文件] [运行主类] dalvikvm -cp /data/test.dex cn. Widiankong Main
1 2 3 4 5 6 7 top [-n/-m/-d/-s/-t] -m // 最多显示多少个进程 -n // 刷新次数 -d // 刷新间隔时间(默认5 秒) -s // 按哪列排序 -t // 显示线程信息而不是进程
用aapt操作apk命令(查看apk中的信息以及编辑apk程序包)
1 aapt dump xmltree [apk包] [需要查看的资源文件xml ]
用dexdump操作dex命令(查看dex文件的详细信息)
查看当前进程的内存加载情况(查看当前进程的内存映射信息,比如加载了哪些so文件,dex文件等)
1 2 3 cat /proc/[pid]/maps 用法:cat /proc/663/maps
1 2 3 cat /proc/[pid]/status 用法:cat /proc/663/status
1 2 3 cat /proc/[pid]/net/tcp/tcp6/udp/udp6 用法:cat /proc/663/net/tcp/tcp6/udp/udp6
1.2 ADB 命令(次)
1 2 3 adb shell abd shell -s 模拟器编号 命令
1 2 3 4 5 # 关闭服务 adb kill-server # 启动服务 adb start-server
1 2 adb shell logcat -b radio
1 2 adb get-product adb get-serialno
1 2 3 4 5 6 cd system/sd/data #ls //列表显示当前文件夹内容 #rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件 #rm xxx //删除文件xxx #rmdir xxx //删除xxx的文件夹
1 adb shellinput keyevent 80
将system分区重新挂在为可读写分区,此命令在操作系统目录时很重要
重启设备,可选参数进入bootloader(刷机模式)或recovery(恢复模式)
1 2 adb reboot bootloader adb reboot recovery
1 2 3 4 5 6 7 adb shell kill pidNumber # 列出进程列表及其pid adb shell ps # 查看指定进程信息 adb shell ps -x pid
1 2 3 4 5 adb shell getprop | grep heapgrowthlimit 得到的结果为128M: [dalvik.vm.heapgrowthlimit]: [128m] 这就是说Dalvik Heap size的最大值超过了128M,就很可能发生OOM
1 adb shell getprop | grep version
1 adb shell getprop | grep product
1 2 3 获取到的序列号即为adb devices列出来的序列号 adb get-serialno
1 adb shell cat data/misc/wifi/*.conf
1 adb shell cat /sys/class/net/wlan0/address
1 adb shell screenrecord /sdcard/test.mp4
1 2 3 4 5 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”
1 2 adb shell mv /sdcard/1.txt /sdcard/2.text 移动同一目录下文件相当于重命名文件
1 2 3 adb shell screencap /sdcard/Test.png adb pull /sdcard/Test.png adb open Test.png
1 adb shell dumpsys meminfo <pakagename>
1 2 adb shell top adb shell dumpsys cpuinfo
1 adb shell dumpsys battery
1 adb shell cat /proc/stat
1 adb shell cat /proc/<PID>/stat
1 adb shell cat /proc/meminfo | head -n 4
1 adb shell dumpsys meminfo| grep "Free RAM"
1 adb shell dumpsys meminfo <packagename>adb shell dumpsys meminfo <PID>
1 adb shell cat proc/self/net/dev
1 adb shell cat /proc/uid_stat/2000/tcp_snd
1 adb shell cat /proc/uid_stat/2000/tcp_rcv
1 adb logcat threadtime -b events>d:\log\events.txt
1 adb logcat -v threadtime | grep ActivityManager
1 adb shell am start -W -n <某activity>
0x02 ADB常用命令总结
存在多个设备/模拟器,指定单独一个设备/模拟器并进入交互式Shell
adb 基本语法格式:adb [-d|-e|-s ]
参数如下:
参数
描述
-d
指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e
指定当前唯一运行的模拟器为命令目标
-s
指定相应 serialNumber号的设备/模拟器为命令目标
注 :如果有多个设备/模拟器连接,则需要命令指定目标设备。常用的是 -s 参数,设备/模拟器的serialNumber(序列号)可通过adb devices命令获取,如下:
1 2 3 4 5 $ 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 输出格式为[serialNumber] [state],serialNumber 即我们常说的 SN,state 有如下几种:
参数
描述
offline
表示设备未连接成功或无响应
device
设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态
no device
没有设备/模拟器连接
List of devices attached
没有设备/模拟器连接成功
List of devices attached 【序列号】 offline
设备/模拟器未连接到 adb 或无响应
1 2 # 启动adb adb start-server# adbadb kill-server
1 2 3 4 5 restart adbd # 或分开使用停止和启动命令来重启adbd服务 stop adbd start adbd
1 adb -P <port> start-server
查看应用列表的基本命令格式:adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
1 2 3 4 5 6 7 8 9 10 11 # 显示所有应用 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
包含已卸载应用
``
包名包含 字符串
格式:adb install [-lrtsdg]
adb install 安装步骤如下:
1 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 再安装
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 再安装
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!
已安装该应用且签名不一致
先卸载设备上的该应用,再安装
命令格式如下:
1 2 # <packagename> 表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录 adb uninstall [-k] <packagename>
1 adb uninstall android.uid.sysytem
命令格式如下:
1 2 # <packagename> 表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」 adb shell pm clear <packagename>
1 adb shell pm clear android.uid.sysytem
1 adb shell dumpsys activity activities | grep mResumedActivity
或
1 2 3 adb shell dumpsys activity activities | findstr mResumedActivity adb shell "dumpsys activity activities | grep mResumedActivity"
命令格式如下:
1 2 # <packagename> 参数不是必须的,指定 <packagename> 表示查看与某个包名相关的 Services,不指定表示查看所有 Services adb shell dumpsys activity services [<packagename>]
输出中包含很多信息,包括Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等
命令格式如下:
1 adb shell dumpsys package <packagename>
命令格式如下:
1 adb shell pm path <PACKAGE>
启动应用/调起Activity(指定Activity名称启动)
主要是使用am 命令,常用的 ``如下:
command
用途
start [options]
启动``指定的 Activity
startservice [options]
启动``指定的 Service
broadcast [options]
发送``指定的广播
force-stop
停止``相关的进程
``参数很灵活,和写 Android 程序时代码里的 Intent 相对应
用于决定 intent 对象的选项如下:
参数
含义
-a
指定 action,比如android.intent.action.VIEW
-c
指定 category,比如android.intent.category.APP_CONTACTS
-n
指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity
``里还能带数据,就像写代码时的 Bundle 一样:
参数
含义
--esn
null 值(只有 key 名)
`-e
–es`
--ez
boolean 值
--ei
integer 值
--el
long 值
--ef
float 值
--eu
URI
--ecn
component name
--eia [,
integer 数组
--ela [,
long 数组
命令格式如下:
1 adb shell am start [options] <INTENT>
1 2 # 调起微信主界面 adb shell am start -n com.tencent.mm/.ui.LauncherUI
1 2 # 表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
启动应用/调起Activity(不指定Activity名称启动【启动主Activity】)
命令格式如下:
1 adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER
1 2 # 调起微信主界面 adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER 1
命令格式如下:
1 adb shell am startservice [options] <INTENT>
1 2 # 调起微信的某 Service adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
命令格式如下:
1 adb shell am stopservice [options] <INTENT>
命令格式如下:既能发送系统预定义的广播,也能发送自定义广播
1 adb shell am broadcast [options] <INTENT>
1 2 3 4 5 # 向所有组件广播 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
省电模式开启
命令格式如下:
1 adb shell am force-stop <packagename>
命令格式如下:
1 adb shell am send-trim-memory <pid> <level>
1 # HOME 键adb shell input keyevent 3
1 2 level: 1)HIDDEN 2)RUNNING_MODERATE 3)BACKGROUND 4)RUNNING_LOW 5)MODERATE 6)RUNNING_CRITICAL 7)COMPLETE
1 2 # 表示向 pid=986 的进程,发出 level=RUNNING_LOW 的收紧内存命令 adb shell am send-trim-memory 986 RUNNING_LOW
命令格式如下:
1 adb pull <设备里的文件路径> [电脑上的目录]
命令格式如下:
1 adb push <电脑上的文件路径> <设备里的目录>
在 adb shell 里有个很实用的命令叫 input,input 命令的完整 help 信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Usage: input [<source>] <command> [<arg>...]The sources are: mouse keyboard joystick touchnavigation touchpad trackball stylus dpad gesture touchscreen gamepad The commands and default sources are: text <string> (Default: touchscreen) keyevent [--longpress] <key code number or name> ... (Default: keyboard) tap <x> <y> (Default: touchscreen) swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen) press (Default: trackball) roll <dx> <dy> (Default: trackball)
使用adb shell input keyevent 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,部分内容如下:
keycode
含义
3
HOME 键
4
返回键
5
打开拨号应用
6
挂断电话
24
增加音量
25
26
电源键
27
拍照(需要在相机应用里)
64
打开浏览器
82
菜单键
85
播放/暂停
86
停止播放
87
播放下一首
88
播放上一首
122
移动光标到行首或列表顶部
123
移动光标到行末或列表底部
126
恢复播放
127
暂停播放
164
静音
176
打开系统设置
187
切换应用
207
打开联系人
208
打开日历
209
打开音乐
210
打开计算器
220
降低屏幕亮度
221
提高屏幕亮度
223
系统休眠
224
点亮屏幕
231
打开语音助手
276
如果没有 wakelock 则让系统休眠
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到/proc/kmsg,Android 的日志输出到 /dev/log
命令格式如下:
1 [adb] logcat [<option>] ... [<filter-spec>] ...
按级别过滤日志:
1 2 3 4 5 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 和级别过滤日志:
1 2 3 # <filter-spec> 可以由多个 <tag>[:priority] 组成 # 下面表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志) adb logcat ActivityManager:I MyApp:D *:S
日志格式:可以用adb logcat -v 选项指定日志输出格式
1 2 日志支持按以下几种 <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
1 adb shell getprop ro.product.model
1 adb shell settings get secure android_id
1 2 3 4 5 6 7 # 在 Android 4.4 及以下版本可通过如下命令获取 IMEI,其中的 Device ID 就是 IMEI: adb shell dumpsys iphonesubinfo # 在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限),把里面的有效内容提取出来就是 IMEI : adb shell su service call iphonesubinfo 1
1 adb shell getprop ro.build.version.release
手动查看IP地址:「设置」-「关于手机」-「状态信息」-「IP地址」,下面是通过ADB查看IP地址
或
1 2 # 网络连接名称、启用状态、IP 地址和 Mac 地址等信息 adb shell netcfg
1 adb shell cat /sys/class/net/wlan0/address
1 adb shell cat /proc/cpuinfo
1 2 # 注意,在命令执行后展示的信息中MemTotal 就是设备的总内存,MemFree 是当前空闲内存 adb shell cat /proc/meminfo
1 2 3 4 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 属性名查找不到,尝试如下命令:
1 adb shell cat /system/build.prop | grep ro.product.cpu.abi
注:用命令关闭后,只能手动恢复,步骤:「设置」-「开发者选项」-「Android 调试」
1 adb shell settings put global adb_enabled 0
1 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
禁止调用黑名单中的接口,但允许调用深灰名单中的接口
1 2 adb shell settings delete global hidden_api_policy_pre_p_apps adb shell settings delete global hidden_api_policy_p_apps
1 adb shell settings put global policy_control <key-values>
``可由如下几种键及其对应的值组成,格式为 =:=,如下:
key
含义
immersive.full
同时隐藏
immersive.status
隐藏状态栏
immersive.navigation
隐藏导航栏
immersive.preconfirms
?
这些键对应的值可则如下值用逗号组合:
value
含义
apps
所有应用
*
所有界面
packagename
指定应用
-packagename
排除指定应用
例如表示设置在所有界面下都同时隐藏状态栏和导航栏:
1 <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>
1 <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
其它方式截图并保存到电脑的方法:
1 # 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
1 2 3 4 5 # 录制屏幕以 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
输出更多信息
注 :需要root权限,因为/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写
1 2 3 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>
1 2 3 <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
需要注意 Android O 或以后,WiFi 密码保存的地址有变化,是在 WifiConfigStore.xml 里面,如下:
1 2 3 <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>
1 2 3 <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>
1 adb reboot<p data-line="1335" class="sync-line" style="margin:0;"></p>
1 2 adb shell su<p data-line="1342" class="sync-line" style="margin:0;"></p>
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试,如下:
1 <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>
1 2 adb root adb shell svc wifi enable<p data-line="1358" class="sync-line" style="margin:0;"></p>
1 2 adb root adb shell svc wifi disable<p data-line="1365" class="sync-line" style="margin:0;"></p>
1 lld --version<p data-line="1371" class="sync-line" style="margin:0;"></p>
用 adb forward tcp:port jdwp:在PC上做端口映射, 然后在PC上通过端口连接手机,进行调试。命令如下:
1 jdb -attach locaohost:8000jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000<p data-line="1378" class="sync-line" style="margin:0;"></p>
1 adb reboot recovery<p data-line="1384" class="sync-line" style="margin:0;"></p>
ADB从 Recovery 重启到 Android
1 adb reboot<p data-line="1390" class="sync-line" style="margin:0;"></p>
1 adb reboot bootloader<p data-line="1396" class="sync-line" style="margin:0;"></p>
如果下载了 Android 设备对应的系统更新包到电脑上,那么可通过 adb 来完成更新,以 Recovery 模式下更新为例:
1 2 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>
1 2 adb root adb shell setenforce 1<p data-line="1413" class="sync-line" style="margin:0;"></p>
1 2 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进行排查:
1 2 3 cat /proc/kmsg | grep avc 或 dmesg | grep avc<p data-line="1427" class="sync-line" style="margin:0;"></p>
1 2 adb root adb enable-verity<p data-line="1434" class="sync-line" style="margin:0;"></p>
1 2 3 4 adb root adb disable-verity 或 fastboot --disable-verity flash vbmeta vbmeta.img<p data-line="1443" class="sync-line" style="margin:0;"></p>
1 <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>
1 adb shell settings put global http_proxy :0<p data-line="1457" class="sync-line" style="margin:0;"></p>
1 2 3 4 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>
1 adb shell ps<p data-line="1472" class="sync-line" style="margin:0;"></p>
进程各列含义如下:
列名
含义
USER
所属用户
PID
进程 ID
PPID
父进程 ID
NAME
进程名
1 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 命令还支持一些命令行参数,详细用法如下:
1 2 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>
1 2 3 4 5 <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>
命令
功能
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 命令(主)
1 2 3 4 5 6 7 8 9 10 adb shell dumpsys activity top # 把系统中所有应用运行的四大组件都会打印出来 adb shell dumpsys >> info.txt start info.txt
1 2 3 4 5 6 7 8 9 10 11 12 adb shell dumpsys package xxx 或进入adb shell使用下面的命令 dumpsys package xxx # 清空应用数据 adb shell pm clear xxx
1 adb shell dumpsys meminfo xxx
查看指定包名应用的数据库存储信息(包括存储的SQL语句)
1 adb shell dumpsys dbinfo xxx
1 2 3 adb intall xxx.apk adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡
1 2 3 4 5 6 7 8 9 10 11 12 adb uninstall xxx.apk adb uninstall -k 可选参数-k的作用为卸载软件但是保留配置和缓存文件 adb shell cd data/app rm apk包 exit adb uninstall apk包的主包名 adb install -r apk包
1 2 3 4 adb remount (重新挂载系统分区,使系统分区重新可写) adb shell cd system/app rm *.apk
1 adb pull 目标系统中的文件路径(a.txt) 本机系统要存放取出来的路径(a.txt)
1 adb push 本机系统中的文件路径(a.txt) 目标系统中要存放的路径(a.txt)
1 2 3 adb shell screencap -p /sdcard/test.png adb pull /sdcard/test.png D:\img\ start D:\img\test.png
1 adb shell screenrecord /sdcard/test.mp4
1 adb shell input text 'xxx'
1 2 3 adb forward [(远程端)协议:端口号] [(设备端)协议:端口号] adb forward tcp:23946 tcp:23946 adb forward tcp:8700 jwdp:1786
1 2 3 4 5 6 7 8 9 10 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模式的包名应用沙盒数据
1 2 3 ps | grep 过滤内容 ps | grep cn.test.demo ps -t 19977
1 pm clear grep cn.test.demo
1 pm install /sdcard/test.apk
1 pm uninstall cn.test.demo
1 2 am start -n [包(package)名]/[包名].[活动(activity)名称] am start -n com.androidtest/com.androidtest.test
1 2 am startservice -n [包 (package) 名]/[包名].[服务(service)名] am startservice -n com.androidtest2/com.androidtest.test2
运行Java代码(特殊场景使用,把dx命令把dex文件转化成jar包)
1 2 3 4 app_process [运行代码目录] [运行主类] export CLASSPATH=/data/test.jar exec /system/bin/app_process /data/cn.test.main
1 2 dalvikvm -cp [dex文件] [运行主类] dalvikvm -cp /data/test.dex cn. Widiankong Main
1 2 3 4 5 6 7 top [-n/-m/-d/-s/-t] -m // 最多显示多少个进程 -n // 刷新次数 -d // 刷新间隔时间(默认5 秒) -s // 按哪列排序 -t // 显示线程信息而不是进程
用aapt操作apk命令(查看apk中的信息以及编辑apk程序包)
1 aapt dump xmltree [apk包] [需要查看的资源文件xml ]
用dexdump操作dex命令(查看dex文件的详细信息)
查看当前进程的内存加载情况(查看当前进程的内存映射信息,比如加载了哪些so文件,dex文件等)
1 2 3 cat /proc/[pid]/maps 用法:cat /proc/663/maps
1 2 3 cat /proc/[pid]/status 用法:cat /proc/663/status
1 2 3 cat /proc/[pid]/net/tcp/tcp6/udp/udp6 用法:cat /proc/663/net/tcp/tcp6/udp/udp6
1.2 ADB 命令(次)
1 2 3 adb shell abd shell -s 模拟器编号 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 # 关闭服务 adb kill-server # 启动服务 adb start-server
1 2 adb shell logcat -b radio
1 2 adb get-product adb get-serialno
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 cd system/sd/data # ls //列表显示当前文件夹内容 # rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件 # rm xxx //删除文件xxx # rmdir xxx //删除xxx的文件夹
1 adb shellinput keyevent 80
将system分区重新挂在为可读写分区,此命令在操作系统目录时很重要
重启设备,可选参数进入bootloader(刷机模式)或recovery(恢复模式)
1 2 adb reboot bootloader adb reboot recovery
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 adb shell kill pidNumber # 列出进程列表及其pid adb shell ps # 查看指定进程信息 adb shell ps -x pid
1 2 3 4 5 adb shell getprop | grep heapgrowthlimit 得到的结果为128M: [dalvik.vm.heapgrowthlimit]: [128m] 这就是说Dalvik Heap size的最大值超过了128M,就很可能发生OOM
1 adb shell getprop | grep version
1 adb shell getprop | grep product
1 2 3 获取到的序列号即为adb devices列出来的序列号 adb get-serialno
1 adb shell cat data/misc/wifi/*.conf
1 adb shell cat /sys/class/net/wlan0/address
1 adb shell screenrecord /sdcard/test.mp4
1 2 3 4 5 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”
1 2 adb shell mv /sdcard/1.txt /sdcard/2.text 移动同一目录下文件相当于重命名文件
1 2 3 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>
1 adb shell dumpsys meminfo <pakagename><p data-line="2003" class="sync-line" style="margin:0;"></p>
1 2 adb shell top adb shell dumpsys cpuinfo<p data-line="2009" class="sync-line" style="margin:0;"></p>
1 adb shell dumpsys battery<p data-line="2015" class="sync-line" style="margin:0;"></p>
1 adb shell cat /proc/stat<p data-line="2021" class="sync-line" style="margin:0;"></p>
1 adb shell cat /proc/<PID>/stat<p data-line="2026" class="sync-line" style="margin:0;"></p>
1 adb shell cat /proc/meminfo | head -n 4<p data-line="2032" class="sync-line" style="margin:0;"></p>
1 adb shell dumpsys meminfo| grep "Free RAM"<p data-line="2038" class="sync-line" style="margin:0;"></p>
1 adb shell dumpsys meminfo <packagename>adb shell dumpsys meminfo <PID><p data-line="2045" class="sync-line" style="margin:0;"></p>
1 adb shell cat proc/self/net/dev<p data-line="2051" class="sync-line" style="margin:0;"></p>
1 adb shell cat /proc/uid_stat/2000/tcp_snd<p data-line="2057" class="sync-line" style="margin:0;"></p>
1 adb shell cat /proc/uid_stat/2000/tcp_rcv<p data-line="2063" class="sync-line" style="margin:0;"></p>
1 adb logcat threadtime -b events>d:\log\events.txt<p data-line="2069" class="sync-line" style="margin:0;"></p>
1 adb logcat -v threadtime | grep ActivityManager<p data-line="2075" class="sync-line" style="margin:0;"></p>
1 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 ]
参数如下:
参数
描述
-d
指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e
指定当前唯一运行的模拟器为命令目标
-s
指定相应 serialNumber号的设备/模拟器为命令目标
注 :如果有多个设备/模拟器连接,则需要命令指定目标设备。常用的是 -s 参数,设备/模拟器的serialNumber(序列号)可通过adb devices命令获取,如下:
1 2 3 4 5 $ 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模拟器,输入如下命令:
1 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 或无响应
1 <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>
1 2 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>
1 adb version<p data-line="2149" class="sync-line" style="margin:0;"></p>
1 adb root<p data-line="2155" class="sync-line" style="margin:0;"></p>
1 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]
1 2 3 <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
包含已卸载应用
``
包名包含 字符串
格式:adb install [-lrtsdg]
adb install 安装步骤如下:
1 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 再安装
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 再安装
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!
已安装该应用且签名不一致
先卸载设备上的该应用,再安装
命令格式如下:
1 2 <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>
命令格式如下:
1 2 <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>
1 adb shell dumpsys activity activities | grep mResumedActivity<p data-line="2310" class="sync-line" style="margin:0;"></p>
或
1 2 3 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>
命令格式如下:
1 <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、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等
命令格式如下:
1 adb shell dumpsys package <packagename><p data-line="2334" class="sync-line" style="margin:0;"></p>
命令格式如下:
1 adb shell pm path <PACKAGE><p data-line="2341" class="sync-line" style="margin:0;"></p>
启动应用/调起Activity(指定Activity名称启动)
主要是使用am 命令,常用的 ``如下:
command
用途
start [options]
启动``指定的 Activity
startservice [options]
启动``指定的 Service
broadcast [options]
发送``指定的广播
force-stop
停止``相关的进程
``参数很灵活,和写 Android 程序时代码里的 Intent 相对应
用于决定 intent 对象的选项如下:
参数
含义
-a
指定 action,比如android.intent.action.VIEW
-c
指定 category,比如android.intent.category.APP_CONTACTS
-n
指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity
``里还能带数据,就像写代码时的 Bundle 一样:
参数
含义
--esn
null 值(只有 key 名)
`-e
–es`
--ez
boolean 值
--ei
integer 值
--el
long 值
--ef
float 值
--eu
URI
--ecn
component name
--eia [,
integer 数组
--ela [,
long 数组
命令格式如下:
1 2 3 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】)
命令格式如下:
1 2 3 4 5 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>
命令格式如下:
1 2 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>
命令格式如下:
1 adb shell am stopservice [options] <INTENT><p data-line="2426" class="sync-line" style="margin:0;"></p>
命令格式如下:既能发送系统预定义的广播,也能发送自定义广播
1 2 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
省电模式开启
命令格式如下:
1 adb shell am force-stop <packagename><p data-line="2475" class="sync-line" style="margin:0;"></p>
命令格式如下:
1 2 3 4 5 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>
命令格式如下:
1 adb pull <设备里的文件路径> [电脑上的目录]<p data-line="2510" class="sync-line" style="margin:0;"></p>
命令格式如下:
1 adb push <电脑上的文件路径> <设备里的目录><p data-line="2517" class="sync-line" style="margin:0;"></p>
在 adb shell 里有个很实用的命令叫 input,input 命令的完整 help 信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 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 列表详见 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 则让系统休眠
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到/proc/kmsg,Android 的日志输出到 /dev/log
命令格式如下:
1 [adb] logcat [<option>] ... [<filter-spec>] ...<p data-line="2593" class="sync-line" style="margin:0;"></p>
按级别过滤日志:
1 2 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 和级别过滤日志:
1 <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 选项指定日志输出格式
1 日志支持按以下几种 <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>
1 adb logcat -c<p data-line="2650" class="sync-line" style="margin:0;"></p>
1 adb shell dmesg<p data-line="2656" class="sync-line" style="margin:0;"></p>
1 adb shell getprop ro.product.model<p data-line="2662" class="sync-line" style="margin:0;"></p>
1 adb shell settings get secure android_id<p data-line="2668" class="sync-line" style="margin:0;"></p>
1 2 3 <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>
1 adb shell getprop ro.build.version.release<p data-line="2686" class="sync-line" style="margin:0;"></p>
手动查看IP地址:「设置」-「关于手机」-「状态信息」-「IP地址」,下面是通过ADB查看IP地址
1 adb shell ifconfig<p data-line="2694" class="sync-line" style="margin:0;"></p>
或
1 <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>
1 adb shell cat /sys/class/net/wlan0/address<p data-line="2706" class="sync-line" style="margin:0;"></p>
1 adb shell cat /proc/cpuinfo<p data-line="2712" class="sync-line" style="margin:0;"></p>
1 <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>
1 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 属性名查找不到,尝试如下命令:
1 adb shell cat /system/build.prop | grep ro.product.cpu.abi<p data-line="2750" class="sync-line" style="margin:0;"></p>
注:用命令关闭后,只能手动恢复,步骤:「设置」-「开发者选项」-「Android 调试」
1 adb shell settings put global adb_enabled 0<p data-line="2758" class="sync-line" style="margin:0;"></p>
1 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
禁止调用黑名单中的接口,但允许调用深灰名单中的接口
1 2 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>
1 adb shell settings put global policy_control <key-values><p data-line="2787" class="sync-line" style="margin:0;"></p>
``可由如下几种键及其对应的值组成,格式为 =:=,如下:
key
含义
immersive.full
同时隐藏
immersive.status
隐藏状态栏
immersive.navigation
隐藏导航栏
immersive.preconfirms
?
这些键对应的值可则如下值用逗号组合:
value
含义
apps
所有应用
*
所有界面
packagename
指定应用
-packagename
排除指定应用
例如表示设置在所有界面下都同时隐藏状态栏和导航栏:
1 2 # 表示设置在包名为 com.package1 和 com.package2 的应用里隐藏状态栏,在除了包名为 com.package3 的所有应用里隐藏导航栏 adb shell settings put global policy_control immersive.full=*
1 2 3 4 # 先截图保存到设备的/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
其它方式截图并保存到电脑的方法:
1 <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
1 <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
输出更多信息
注 :需要root权限,因为/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写
1 2 3 4 5 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
1 2 3 4 # 需Root 权限,全部命令执行完后展示的内容中ssid 即为 WLAN 设置里看到的名称,psk 为密码,key_mgmt 为安全加密方式 adb shell su cat /data/misc/wifi/*.conf
需要注意 Android O 或以后,WiFi 密码保存的地址有变化,是在 WifiConfigStore.xml 里面,如下:
1 2 3 4 # 需Root 权限,全部命令执行完后展示的内容中的 ConfigKey为WiFi 名字、PreSharedKey为WiFi 密码 adb shell su cat /data/misc/wifi/WifiConfigStore.xml
1 2 3 4 # 需Root 权限,如下表示将系统日期和时间更改为 2022 年 08 月 21 日 13 点 11 分 00 秒 adb shell su date -s 20220821.131100
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试,如下:
1 2 # 表示向 <packagename> 指定的应用程序发送 500 个伪随机事件 adb shell monkey -p <packagename> -v 500
1 2 adb root adb shell svc wifi enable
1 2 adb root adb shell svc wifi disable
用 adb forward tcp:port jdwp:在PC上做端口映射, 然后在PC上通过端口连接手机,进行调试。命令如下:
1 jdb -attach locaohost:8000jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000
ADB从 Recovery 重启到 Android
如果下载了 Android 设备对应的系统更新包到电脑上,那么可通过 adb 来完成更新,以 Recovery 模式下更新为例:
1 2 1)重启到 Recovery 模式。命令:adb reboot recovery2)在设备的 Recovery 界面上操作进入 Apply update–Apply from ADB 注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB3)通过 adb 上传和更新系统。命令:adb sideload <path-to-update.zip>
1 2 adb root adb shell setenforce 1
1 2 adb root adb shell setenforce 0
注 :遇到权限问题,在logcat或者kernel的log中一定会打印avc denied提示缺少什么权限,通过命令过滤出所有的avc denied,再根据这些log进行排查:
1 2 3 cat /proc/kmsg | grep avc 或 dmesg | grep avc
1 2 adb root adb enable-verity
1 2 3 4 adb root adb disable-verity 或 fastboot --disable-verity flash vbmeta vbmeta.img
1 # 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
1 adb shell settings put global http_proxy :0
1 2 3 4 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
进程各列含义如下:
列名
含义
USER
所属用户
PID
进程 ID
PPID
父进程 ID
NAME
进程名
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 命令还支持一些命令行参数,详细用法如下:
1 2 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 显示帮助文档
1 2 3 # 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
命令
功能
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/