也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

少走了弯路,也就错过了风景,无论如何,感谢经历


Android安全付费专栏长期更新,本篇最新内容请前往:

  • [车联网安全自学篇] Android安全之ADB命令总结「收藏版」

0x01 常用的一些ADB命令

1.1 ADB 命令(主)

  • 查看当前应用的activity信息
adb shell dumpsys activity top
# 把系统中所有应用运行的四大组件都会打印出来
adb shell dumpsys >> info.txt
start info.txt
  • 查看指定包名应用的详细信息
adb shell dumpsys package  xxx或进入adb shell使用下面的命令
dumpsys package xxx
# 清空应用数据
adb shell pm clear xxx
  • 查看指定进程名或者进程id的内存信息
adb shell dumpsys meminfo   xxx
  • 查看指定包名应用的数据库存储信息(包括存储的SQL语句)
adb shell dumpsys dbinfo xxx
  • 安装应用包apk文件
adb intall  xxx.apkadb install test.apk -r 覆盖安装,保留数据和缓存文件  -d 解决低版本version问题  -s 安装apk到sd卡
  • 卸载应用
adb uninstall  xxx.apkadb uninstall -k <package_name>可选参数-k的作用为卸载软件但是保留配置和缓存文件adb shellcd data/apprm apk包exitadb uninstall apk包的主包名adb install -r apk包
  • 删除系统应用
adb remount (重新挂载系统分区,使系统分区重新可写)adb shellcd system/apprm *.apk
  • 将设备中的文件放到本地
adb pull  目标系统中的文件路径(a.txt)  本机系统要存放取出来的路径(a.txt)
  • 将本地文件放到设备中
adb push  本机系统中的文件路径(a.txt)    目标系统中要存放的路径(a.txt)
  • 截屏操作
adb shell screencap -p /sdcard/test.png
adb pull /sdcard/test.png  D:\img\
start D:\img\test.png
  • 录屏操作
adb shell screenrecord /sdcard/test.mp4
  • 输入文本内容
adb shell input text 'xxx'
  • 设备的端口转发
adb forward [(远程端)协议:端口号] [(设备端)协议:端口号]
adb forward tcp:23946 tcp:23946
adb forward tcp:8700 jwdp:1786
  • 查看设备中可以被调试的应用的进程号
adb jdwp
  • 查看当前日志信息
adb logcat用法1:adb logcat -s tag
案例: adb Logcat -s fb用法2:adb logcat |findstr pname/pid/keyword
案例: adb Logcat |findstr cn.test.demo或进入adb shell使用下面的命令
Logcat grep tencent
  • 非root设备中查看指定debug模式的包名应用沙盒数据
run-as cn.test.demo
  • 查看设备的进程信息,或者指定进程的线程信息
ps | grep 过滤内容
ps | grep cn.test.demo
ps -t 19977
  • 清空指定包名应用的数据
pm clear  grep cn.test.demo
  • 安装设备中的apk文件
pm install /sdcard/test.apk
  • 卸载设备中的应用
pm uninstall cn.test.demo
  • 启动设备中的应用
am start -n [包(package)名]/[包名].[活动(activity)名称]
am start -n com.androidtest/com.androidtest.test
  • 启动一个服务
am startservice -n [包 (package) 名]/[包名].[服务(service)名]
am startservice -n com.androidtest2/com.androidtest.test2
  • 发送一个广播
am broadcast -a [广播动作]
  • 查看设备的ip地址
netcfg
  • 查看设备的端口号信息
netstat
  • 运行Java代码(特殊场景使用,把dx命令把dex文件转化成jar包)
app_process [运行代码目录] [运行主类]export CLASSPATH=/data/test.jar
exec /system/bin/app_process /data/cn.test.main
  • 运行一个dex文件
dalvikvm -cp [dex文件] [运行主类]
dalvikvm -cp /data/test.dex cn. Widiankong Main
  • 查看当前应用的CPU消耗信息
top [-n/-m/-d/-s/-t]-m // 最多显示多少个进程
-n // 刷新次数
-d // 刷新间隔时间(默认5 秒)
-s // 按哪列排序
-t // 显示线程信息而不是进程
  • 查看系统属性值
getprop [属性值名称]
  • 用aapt操作apk命令(查看apk中的信息以及编辑apk程序包)
aapt dump xmltree [apk包] [需要查看的资源文件xml ]
  • 用dexdump操作dex命令(查看dex文件的详细信息)
dexdump [ dex文件路径]
  • 查看当前进程的内存加载情况(查看当前进程的内存映射信息,比如加载了哪些so文件,dex文件等)
cat /proc/[pid]/maps用法:cat /proc/663/maps
  • 查看进程的状态信息
cat /proc/[pid]/status用法:cat /proc/663/status
  • 查看当前应用使用的端口号信息
cat /proc/[pid]/net/tcp/tcp6/udp/udp6用法:cat /proc/663/net/tcp/tcp6/udp/udp6

1.2 ADB 命令(次)

  • 查看连接设备
adb devices
  • 获取手机root权限
adb root
  • 重新挂载系统分区,使系统分区重新可写
adb remount
  • 进入到手机设备Shell界面中去
adb 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>

0x02 ADB常用命令总结

  • 存在多个设备/模拟器,指定单独一个设备/模拟器并进入交互式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    device
10.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# adb
adb 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/tmp
2)调用 pm install 安装
3)删除 /data/local/tmp 下的对应 apk 文件

参数及含义如下:

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

常见APK安装失败输出代码、含义及可能的解决办法如下:

输出 含义 解决办法
INSTALL_FAILED_ALREADY_EXISTS 应用已经存在,或卸载了但没卸载干净 adb install 时使用 -r 参数,或者先adb uninstall <packagename>再安装
INSTALL_FAILED_INVALID_APK 无效的 APK 文件
INSTALL_FAILED_INVALID_URI 无效的 APK 文件名 确保 APK 文件名里无中文
INSTALL_FAILED_INSUFFICIENT_STORAGE 空间不足 清理空间
INSTALL_FAILED_DUPLICATE_PACKAGE 已经存在同名程序
INSTALL_FAILED_NO_SHARED_USER 请求的共享用户不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE 以前安装过同名应用,但卸载时数据没有移除;或者已安装该应用,但签名不一致 adb uninstall <packagename> 再安装
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 请求的共享用户存在但签名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY 安装包使用了设备上不可用的共享库
INSTALL_FAILED_REPLACE_COULDNT_DELETE 替换时无法删除
INSTALL_FAILED_DEXOPT dex 优化验证失败或空间不足
INSTALL_FAILED_OLDER_SDK 设备系统版本低于应用要求
INSTALL_FAILED_CONFLICTING_PROVIDER 设备里已经存在与应用里同名的content provider
INSTALL_FAILED_NEWER_SDK 设备系统版本高于应用要求
INSTALL_FAILED_TEST_ONLY 应用是 test-only 的,但安装时没有指定 -t 参数
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE 包含不兼容设备 CPU 应用程序二进制接口的 native code
INSTALL_FAILED_MISSING_FEATURE 应用使用了设备不可用的功能
INSTALL_FAILED_CONTAINER_ERROR 1. sdcard 访问失败;
2. 应用签名与 ROM 签名一致,被当作内置应用
1. 确认 sdcard 可用,或者安装到内置存储
2. 打包时不与 ROM 使用相同签名
INSTALL_FAILED_INVALID_INSTALL_LOCATION 1. 不能安装到指定位置
2. 应用签名与 ROM 签名一致,被当作内置应用
1. 切换安装位置,添加或删除 -s 参数
2. 打包时不与 ROM 使用相同签名
INSTALL_FAILED_MEDIA_UNAVAILABLE 安装位置不可用 一般为 sdcard,确认 sdcard 可用或安装到内置存储
INSTALL_FAILED_VERIFICATION_TIMEOUT 验证安装包超时
INSTALL_FAILED_VERIFICATION_FAILURE 验证安装包失败
INSTALL_FAILED_PACKAGE_CHANGED 应用与调用程序期望的不一致
INSTALL_FAILED_UID_CHANGED 以前安装过该应用,与本次分配的 UID 不一致 清除以前安装过的残留文件
INSTALL_FAILED_VERSION_DOWNGRADE 已经安装了该应用更高版本 使用 -d 参数
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE 已安装target SDK支持运行时权限的同名应用,要安装的版本不支持运行时权限
INSTALL_PARSE_FAILED_NOT_APK 指定路径不是文件,或不是以 .apk 结尾
INSTALL_PARSE_FAILED_BAD_MANIFEST 无法解析的 AndroidManifest.xml 文件
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 解析器遇到异常
INSTALL_PARSE_FAILED_NO_CERTIFICATES 安装包没有签名
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES 已安装该应用,且签名与 APK 文件不一致 先卸载设备上的该应用,再安装
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING 解析 APK 文件时遇到 CertificateEncodingException
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME manifest 文件里没有或者使用了无效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID manifest 文件里指定了无效的共享用户 ID
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 解析 manifest 文件时遇到结构性错误
INSTALL_PARSE_FAILED_MANIFEST_EMPTY 在 manifest 文件里找不到找可操作标签(instrumentation 或 application)
INSTALL_FAILED_INTERNAL_ERROR 因系统问题安装失败
INSTALL_FAILED_USER_RESTRICTED 用户被限制安装应用 在开发者选项里将「USB安装」打开,如果已经打开了,那先关闭再打开
INSTALL_FAILED_DUPLICATE_PERMISSION 应用尝试定义一个已经存在的权限名称
INSTALL_FAILED_NO_MATCHING_ABIS 应用包含设备的应用程序二进制接口不支持的native code
INSTALL_CANCELED_BY_USER 应用安装需要在设备上确认,但未操作设备或点了取消 在设备上同意安装
INSTALL_FAILED_ACWF_INCOMPATIBLE 应用程序与设备不兼容
INSTALL_FAILED_TEST_ONLY APK 文件是使用Android Studio 直接 RUN 编译出来的文件 通过 Gradle 的 assembleDebugassembleRelease 重新编译,或者Generate Signed APK
does not contain AndroidManifest.xml 无效的 APK 文件
is not a valid zip file 无效的 APK 文件
Offline 设备未连接成功 先将设备与 adb 连接成功
unauthorized 设备未授权允许调试
error: device not found 没有连接成功的设备 先将设备与 adb 连接成功
protocol failure 设备已断开连接 先将设备与 adb 连接成功
Unknown option: -s Android 2.2 以下不支持安装到 sdcard 不使用 -s 参数
No space left on device 空间不足 清理空间
Permission denied … sdcard … sdcard 不可用
signatures do not match the previously installed version; ignoring! 已安装该应用且签名不一致 先卸载设备上的该应用,再安装
  • ADB卸载应用程序

命令格式如下:

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

命令格式如下:

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

adb shell dumpsys activity activities | findstr 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> ```
--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)HIDDEN2)RUNNING_MODERATE3)BACKGROUND4)RUNNING_LOW5)MODERATE6)RUNNING_CRITICAL7)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:mousekeyboardjoysticktouchnavigationtouchpadtrackballstylusdpadgesturetouchscreengamepadThe 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 :Debug
3)I : Info
4)W :Warning
5)E : Error
6)F : Fatal
7)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 1
adb 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 排除指定应用

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

# 表示设置在包名为 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

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

# Linux 和 Windows
adb shell screencap -p | sed "s/\r$//" > test.png# Mac OS X
adb 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# 或使用如下步骤:
1)进入 shell 并切换到 root 用户权限,执行命令:adb shell su
2)查看当前分区挂载情况,执行命令: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:8000
jdb -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 recovery
2)在设备的 Recovery 界面上操作进入 Apply update–Apply from ADB
注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB
3)通过 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:8080
adb 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%20%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%9A%84%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.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%E5%91%BD%E4%BB%A4%E6%95%B4%E7%90%86/

http://blog.csdn.net/kittyboy0001/article/details/38562515

https://cabins.github.io/2016/03/25/UseAdbLikeAPro-2/


你以为你有很多路可以选择,其实你只有一条路可以走


[免费专栏] Android安全之ADB命令总结「收藏版」相关推荐

  1. [车联网安全自学篇] Android安全之ADB命令总结「收藏版」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 0x01 常用的一些ADB命令 1.1 ADB 命令(主) ...

  2. Android 开发常用ADB命令集合

    Android开发常用ADB命令: 1. 安装apk adb install -r apk路径(注:-r表示覆盖) 2. 启动应用 adb shell am start -n package_name ...

  3. Android网络相关adb命令

    文章目录 Android网络相关adb命令 Android 查看网络使用情况主要的adb命令: 1.adb shell ifconfig 2.adb shell dumpsys connectivit ...

  4. [免费专栏] Android安全之Android奇淫run-as命令,调用系统受UID限制的API

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知 ...

  5. [免费专栏] Android安全之数据存储与数据安全「详解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  6. [免费专栏] Android安全之检测APK中调试代码是否暴露敏感信息

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  7. [免费专栏] Android安全之Android APP应用程序的汉化功能 (修改so中的字符串内容)

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  8. Android开发中adb命令的常用方法

    Android的SDK中提供了很多有用的工具,在开发过程中如果能熟练使用这些工具,会让我们的开发事半功倍.adb是SDK提供的一个常用的命令行工具,全称为Android Debug Bridge,用于 ...

  9. Android开发之adb命令安装apk的问题

    众所周知,有时候我们只有apk安装包不一定可以直接在AS跑起来,所以有了adb命令安装 使用adb命令的前提: 1.你的首先配置adb的环境变量查看环境变量配置方法 2.配置好后请检查是否配置成功?如 ...

最新文章

  1. 机器学习-数据科学库(第六天)
  2. java正三角形程序怎么写,java实现正三角形和到正三角形
  3. 怎样判断RadioButtonList控件是否有选择
  4. 创建springmvc配置
  5. 一人之力也能抬起一辆大型箱车?
  6. 系统架构师学习笔记-数据库系统
  7. 2019.7.20js基础知识整理
  8. Android Notification通知详解
  9. java 用户名不为空_[Java教程]【关于JavaScript】常见表单用户名、密码不能为空
  10. Vue 中是如何解析 template 字符串为 VNode 的?
  11. 1006. Sign In and Sign Out (25)-PAT甲级真题
  12. 【Python实例第7讲】真实数据集的异常检测
  13. ipad连接电脑显示不在充电_笔记本电脑和投影仪连接后为什么投影仪不能显示电脑内容?...
  14. Golang 之协程详解
  15. #{}不自动改参数类型_C++笔记——参数传递中的指针传递和引用传递
  16. atitit.thumb生成高质量缩略图 php .net c++ java
  17. JavaScript特效—滚动公告
  18. 18.ARP报文格式详解
  19. 阿里云的服务器、腾讯云的域名,域名解析失败的解决方案
  20. Java下变量大小写驼峰、大小写下划线、大小写连线转换

热门文章

  1. 李弘毅机器学习笔记:第十三章—CNN
  2. uniapp或微信小程序修改swiper指示点样式
  3. Java面试宝典(问题史上最全,总结最好)
  4. Unity - 微信小游戏
  5. FOJ Problem 2257 Saya的小熊饼干
  6. 使input文本框不可编辑的3种方法
  7. javax.swing的基本组成
  8. MATLAB软件复习
  9. 零基础自学Python,你也可以实现经济独立!
  10. 有时,接受生活的起伏,你会发现一…