adb命令手册大全(看这一篇就够了)


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

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


本篇文章遇到排版混乱的地方,可点击文末阅读原文或前往该地址:https://orangey.blog.csdn.net/article/details/126219781

更多关于Android安全的知识,可前往:https://blog.csdn.net/ananasorangey/category11955914.html

adb命令手册大全(看这一篇就够了)(1)

adb命令手册大全(看这一篇就够了)(2)

0x01 常用的一些ADB命令1.1 ADB 命令(主)
  • 查看当前应用的activity信息

adb shell dumpsys activity top # 把系统中所有应用运行的四大组件都会打印出来 adb shell dumpsys >> info.txt start info.txt

  • 查看指定包名应用的详细信息

adb shell dumpsys package xxx 或进入adb shell使用下面的命令 dumpsys package xxx # 清空应用数据 adb shell pm clear xxx

  • 查看指定进程名或者进程id的内存信息

adb shell dumpsys meminfo xxx

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

adb shell dumpsys dbinfo xxx

  • 安装应用包apk文件

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

  • 卸载应用

adb uninstall xxx.apk adb uninstall -k <package_name> 可选参数-k的作用为卸载软件但是保留配置和缓存文件 adb shell cd data/app rm apk包 exit adb uninstall apk包的主包名 adb install -r apk包

  • 删除系统应用

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

  • 将设备中的文件放到本地

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

  • 将本地文件放到设备中

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

  • 截屏操作

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

  • 录屏操作

adb shell screenrecord /sdcard/test.mp4

  • 输入文本内容

adb shell input text 'xxx'

  • 设备的端口转发

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

  • 查看设备中可以被调试的应用的进程号

adb jdwp

  • 查看当前日志信息

adb logcat 用法1:adb logcat -s tag 案例: adb Logcat -s fb 用法2:adb logcat |findstr pname/pid/keyword 案例: adb Logcat |findstr cn.test.demo 或进入adb shell使用下面的命令 Logcat grep tencent

  • 非root设备中查看指定debug模式的包名应用沙盒数据

run-as cn.test.demo

  • 查看设备的进程信息,或者指定进程的线程信息

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

  • 清空指定包名应用的数据

pm clear grep cn.test.demo

  • 安装设备中的apk文件

pm install /sdcard/test.apk

  • 卸载设备中的应用

pm uninstall cn.test.demo

  • 启动设备中的应用

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

  • 启动一个服务

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

  • 发送一个广播

am broadcast -a [广播动作]

  • 查看设备的ip地址

netcfg

  • 查看设备的端口号信息

netstat

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

app_process [运行代码目录] [运行主类] export CLASSPATH=/data/test.jar exec /system/bin/app_process /data/cn.test.main

  • 运行一个dex文件

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

  • 查看当前应用的CPU消耗信息

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

  • 查看系统属性值

getprop [属性值名称]

  • 用aapt操作apk命令(查看apk中的信息以及编辑apk程序包)

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

  • 用dexdump操作dex命令(查看dex文件的详细信息)

dexdump [ dex文件路径]

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

cat /proc/[pid]/maps 用法:cat /proc/663/maps

  • 查看进程的状态信息

cat /proc/[pid]/status 用法:cat /proc/663/status

  • 查看当前应用使用的端口号信息

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

1.2 ADB 命令(次)
  • 查看连接设备

adb devices

  • 获取手机root权限

adb root

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

adb remount

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

adb shell abd shell -s 模拟器编号 命令

  • 启动和关闭ADB服务

# 关闭服务 adb kill-server # 启动服务 adb start-server

  • adb帮助命令

adb help

  • 查看bug报告

adb bugreport

  • 记录无线通讯日志

adb shell logcat -b radio

  • 获取设备的ID和序列号

adb get-product adb get-serialno

  • 访问数据库SQLite3

adb shell sqlite3

  • 进入系统内指定文件夹

cd system/sd/data #ls //列表显示当前文件夹内容 #rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件 #rm xxx //删除文件xxx #rmdir xxx //删除xxx的文件夹

  • 点亮屏幕

adb shellinput keyevent 80

  • 查看adb版本

adb version

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

adb remount

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

adb reboot bootloader adb reboot recovery

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

adb shell kill pidNumber # 列出进程列表及其pid adb shell ps # 查看指定进程信息 adb shell ps -x pid

  • 查看单个应用程序的最大内存限制

adb shell getprop | grep heapgrowthlimit 得到的结果为128M: [dalvik.vm.heapgrowthlimit]: [128m] 这就是说Dalvik Heap size的最大值超过了128M,就很可能发生OOM

  • 查看sdk版本

adb shell getprop | grep version

  • 查看设备型号信息

adb shell getprop | grep product

  • 获取序列号

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

  • 查看wifi密码(需要root权限)

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

  • 查看wifi_mac

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

  • 查看后台services信息

adb shell service list

  • ADB 录制屏幕命令

adb shell screenrecord /sdcard/test.mp4

  • 打电话

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

  • 移动文件

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

  • 手机或模拟器当前屏幕进行截屏

adb shell screencap /sdcard/Test.png adb pull /sdcard/Test.png adb open Test.png

  • 获取手机内存使用率

adb shell dumpsys meminfo <pakagename>

  • 获取手机cpu占有率

adb shell top adb shell dumpsys cpuinfo

  • 获取手机功耗

adb shell dumpsys battery

  • 查看总体的cpu占用

adb shell cat /proc/stat

  • 查看进程的cpu占用

adb shell cat /proc/<PID>/stat

  • 查看总体的RAM

adb shell cat /proc/meminfo | head -n 4

  • 查看剩余的RAM

adb shell dumpsys meminfo| grep "Free RAM"

  • 查看进程的RAM

adb shell dumpsys meminfo <packagename> adb shell dumpsys meminfo <PID>

  • 开机后的总流量(字节数)

adb shell cat proc/self/net/dev

  • 获取手机上传流量

adb shell cat /proc/uid_stat/2000/tcp_snd

  • 获取手机下载流量

adb shell cat /proc/uid_stat/2000/tcp_rcv

  • 输出日志

adb logcat threadtime -b events>d:\log\events.txt

  • 打印页面的日志

adb logcat -v threadtime | grep ActivityManager

  • 启动时间

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

0x02 ADB常用命令总结
  • 存在多个设备/模拟器,指定单独一个设备/模拟器并进入交互式Shell

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

参数如下:

参数

描述

-d

指定当前唯一通过 USB 连接的 Android 设备为命令目标

-e

指定当前唯一运行的模拟器为命令目标

-s <serialNumber>

指定相应 serialNumber 号的设备/模拟器为命令目标

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

$ adb devices List of devices attached cf33328f device emulator-5554 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 的 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 mResumedActivity adb shell "dumpsys activity activities | grep mResumedActivity"

  • 查看正在运行的 Services

命令格式如下:

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

  • 查看应用详细信息

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

命令格式如下:

adb shell dumpsys package <packagename>

  • ADB查看应用安装路径

命令格式如下:

adb shell pm path <PACKAGE>

  • 启动应用/调起Activity(指定Activity名称启动)

主要是使用am <command>命令,常用的 <command> 如下:

command

用途

start [options] <INTENT>

启动<INTENT> 指定的 Activity

startservice [options] <INTENT>

启动<INTENT> 指定的 Service

broadcast [options] <INTENT>

发送<INTENT> 指定的广播

force-stop <packagename>

停止<packagename>相关的进程

<INTENT>参数很灵活,和写 Android 程序时代码里的 Intent 相对应

用于决定 intent 对象的选项如下:

参数

含义

-a <ACTION>

指定 action,比如android.intent.action.VIEW

-c <CATEGORY>

指定 category,比如android.intent.category.APP_CONTACTS

-n <COMPONENT>

指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity

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

参数

含义

--esn <EXTRA_KEY>

null 值(只有 key 名)

```-e

--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ```

--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>

boolean 值

--ei <EXTRA_KEY> <EXTRA_INT_VALUE>

integer 值

--el <EXTRA_KEY> <EXTRA_LONG_VALUE>

long 值

--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE>

float 值

--eu <EXTRA_KEY> <EXTRA_URI_VALUE>

URI

--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>

component name

--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]

integer 数组

--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]

long 数组

命令格式如下:

adb shell am start [options] <INTENT>

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

# 表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"

  • 启动应用/调起Activity(不指定Activity名称启动【启动主Activity】)

命令格式如下:

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

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

  • ADB调起Service

命令格式如下:

adb shell am startservice [options] <INTENT>

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

  • ADB停止Service

命令格式如下:

adb shell am stopservice [options] <INTENT>

  • ADB发送广播

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

adb shell am broadcast [options] <INTENT>

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

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

action

触发时机

android.net.conn.CONNECTIVITY_CHANGE

网络连接发生变化

android.intent.action.SCREEN_ON

屏幕点亮

android.intent.action.SCREEN_OFF

屏幕熄灭

android.intent.action.BATTERY_LOW

电量低,会弹出电量低提示框

android.intent.action.BATTERY_OKAY

电量恢复了

android.intent.action.BOOT_COMPLETED

设备启动完毕

android.intent.action.DEVICE_STORAGE_LOW

存储空间过低

android.intent.action.DEVICE_STORAGE_OK

存储空间恢复

android.intent.action.PACKAGE_ADDED

安装了新的应用

android.net.wifi.STATE_CHANGE

WiFi 连接状态发生变化

android.net.wifi.WIFI_STATE_CHANGED

WiFi 状态变为启用/关闭/正在启动/正在关闭/未知

android.intent.action.BATTERY_CHANGED

电池电量发生变化

android.intent.action.INPUT_METHOD_CHANGED

系统输入法发生变化

android.intent.action.ACTION_POWER_CONNECTED

外部电源连接

android.intent.action.ACTION_POWER_DISCONNECTED

外部电源断开连接

android.intent.action.DREAMING_STARTED

系统开始休眠

android.intent.action.DREAMING_STOPPED

系统停止休眠

android.intent.action.WALLPAPER_CHANGED

壁纸发生变化

android.intent.action.HEADSET_PLUG

插入耳机

android.intent.action.MEDIA_UNMOUNTED

卸载外部介质

android.intent.action.MEDIA_MOUNTED

挂载外部介质

android.os.action.POWER_SAVE_MODE_CHANGED

省电模式开启

  • ADB强制停止应用

命令格式如下:

adb shell am force-stop <packagename>

  • ADB收紧内存

命令格式如下:

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

# HOME 键 adb shell input keyevent 3

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

# 表示向 pid=986 的进程,发出 level=RUNNING_LOW 的收紧内存命令 adb shell am send-trim-memory 986 RUNNING_LOW

  • ADB复制设备里的文件到电脑

命令格式如下:

adb pull <设备里的文件路径> [电脑上的目录]

  • ADB复制电脑里的文件到设备

命令格式如下:

adb push <电脑上的文件路径> <设备里的目录>

  • ADB模拟按键/输入

在 adb shell 里有个很实用的命令叫 input,input 命令的完整 help 信息如下:

Usage: input [<source>] <command> [<arg>...] The sources are: mouse keyboard joystick touchnavigation touchpad trackball stylus dpad gesture touchscreen gamepad The commands and default sources are: text <string> (Default: touchscreen) keyevent [--longpress] <key code number or name> ... (Default: keyboard) tap <x> <y> (Default: touchscreen) swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen) press (Default: trackball) roll <dx> <dy> (Default: trackball)

使用adb shell input keyevent <keycode>命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,部分内容如下:

keycode

含义

3

HOME 键

4

返回键

5

打开拨号应用

6

挂断电话

24

增加音量

25

26

电源键

27

拍照(需要在相机应用里)

64

打开浏览器

82

菜单键

85

播放/暂停

86

停止播放

87

播放下一首

88

播放上一首

122

移动光标到行首或列表顶部

123

移动光标到行末或列表底部

126

恢复播放

127

暂停播放

164

静音

176

打开系统设置

187

切换应用

207

打开联系人

208

打开日历

209

打开音乐

210

打开计算器

220

降低屏幕亮度

221

提高屏幕亮度

223

系统休眠

224

点亮屏幕

231

打开语音助手

276

如果没有 wakelock 则让系统休眠

  • ADB显示Android 日志

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

命令格式如下:

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

按级别过滤日志:

Android 的日志分为如下几个优先级(priority): 1)V :Verbose(最低,输出得最多) 2)D :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: 0 2)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: 0 4)raw格式为:<message> 示例:Disconnected process message: 10, size: 0 5)time格式为:<datetime> <priority>/<tag>(<pid>): <message> 示例:08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0 6)threadtime格式为:<datetime> <pid> <tid> <priority> <tag>: <message> 示例:08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0 7)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/java/android/content/pm/PackageManager.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/


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


,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页