ADB

工作原理

当启动某个adb客户端时,该客户端会先检查是否有adb服务器正在运行,如果没有启动服务器进程。服务器会在启动后与本地TCP端口 5037 绑定,并监听adb客户端 发出的命令。

服务器会与所有正在运行的设备建立连接,通过扫描 5555 - 5585 之间(该范围提供16个模拟器使用) 的奇数号端口查找模拟器,服务器一旦发现adb守护程序,便会与对应的端口建立连接

ADB原理图

  • Client 本质上就是 shell,用来发送命令Server ,默认 5037 端口.
  • ADB Server :运行在PC上的后台程序,目的是检测USB接口何时连接或者移除设备.
  • ADB Daemon : 程序adbd 作为一个后台进程在Android 设备或模拟器系统中运行。其目的是连接ADB服务器,为运行在主机上的客户端提供一些服务.

命令详解

基础命令

adb version  # 查看adb的版本

adb help  # 查看adb支持的所有命令

adb devices # 查看当前连接的设备,已连接的设备会显示

adb get-serialno # 获取设备号

adb root  # 获取 Android管理员 root 用户权限

adb reboot loader # 进入 loader 模式

adb reboot recovery # 进入 recovery 模式
  

adb shell # 登录设备shell ,该命令将登录设备的shell,登录shell后,可以使用cd ls rm等linux命令

建立连接

adb -d # 如果同时连接了 usb 又开了模拟器,连接当前唯一通过usb连接的安卓设备
adb -e shell # 指定当前连接此电脑的唯一的一个模拟器
adb -s <设备号> shell # 当电脑插入多台 手机或模拟器时,指定一个设备号进行连接
exit # 退出
adb kill-server # 杀死当前adb服务,如果连不上设备时,杀掉重启
adb start-server # 杀掉后重启

# 5037 :adb 默认端口,如果该端口被占用,
adb -p 6666 start-server  # 指定一个adb shell的端口

packages

adb shell pm list packages #列出当前设备/手机 ,所有的报名

adb shell pm list packages -f # 显示包和包相关联的文件(安装路径)

adb shell pm list packages -d  # 显示禁用的包名
adb shell pm list packages -e # 显示当前启用的包名
adb shell pm list packages -s # 显示系统应用包名
adb shell pm list packages -3 # 显示已安装第三方的包名
adb shell pm list packages xxxx # 加需要过滤的包名,如:xxx = taobao

apk操作


# 安装应用程序 apk 到手机当中
adb install <文件路径.apk> # 将本地的apk软件安装到设备(手机上) 如手机外部安装需要密码,需输入密码

adb install -r <文件路径.apk> # 覆盖安装

# 允许 降级覆盖安装
adb install -d <文件路径.apk>
# 授权/获取权限,安装软件时把所有权限都打开
adb install -g <文件路径.apk>
# 卸载apl
adb uninstall <包名>
# 如果获取包名 可以通过 adb shell pm list packages
adb shell pm uninstall -k <包名> # 虽然把此应用卸载,当仍然保留此应用的数据
adb shell am force-stop <包名>  # 强制退出该应用/app

文件操作指令

# 文件上传  将本地PC的文件或文件夹 复制到 手机设备
adb push <本地路径\文件或文件夹> <手机路径>
adb push  G:\music\ /storage/emulated/0/Music/QQMusic



# 文件下载 把设备(手机)的文件或文件夹复制到本地
adb pull <手机路径\文件或文件夹> <pc机路径>

adb pull /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins 


adb pull /storage/emulated/0/Music/QQMusic G:\music\


adb pull /data/user_de/0/com.android.shell/files/bugreports/bugreport-meizu_21_CN-UKQ1.230917.001-2024-12-31-18-54-35.zip G:\music\

数据备份与恢复

adb backup -all

日志操作

  • logcat : 打印的内容只与应用程序相关,打印用户态log信息
  • dmesg: 指令打印的内容只与kernel相关,它的log源于内核缓冲区,可以用来调试内核相关的驱动程序。
Adb logcat



# 输出到 日志文件
adb logcat > log 
# 查看日志文件
more log

adb logcat -v time

# 过滤项解析
# <tag>[:priority] ,标签 :日志等级,默认的日志过滤项是 "*:I"

-- V : Verbose (明细);

-- D : Debug (调试);

-- I : Info (信息);

-- W : Warn (警告);

-- E : Error (错误);

-- F : Fatal (严重错误);

-- S : Silent(Super all output) (最高的优先级, 可能不会记载东西);

# 显示Error以上 级别的日志
adb logcat *:E

# 使用 管 道 过滤 日志
adb shell  # 先进入到shell当中,不然会找不到 grep 指令
logcat | grep Wifi


# 筛选 Tag标签
# -s : 用来赛选 日志 标签,和 日志优先级的选项
logcat -s Test
# 筛选 日志级别的 Debug的,显示日志级别不低于DEBUG
logcat -s Test:D

# 搜索文本内容工具,过滤 包含 WIFI字符串的日志行
# logcat -s Test:D | grep WIFI



# dmesg

系统操作指令

adb shell getprop ro.product.model # 获取设备型号
adb shell getprop ro.build.version.release # 获取Android系统版本
adb get-serialno # 获取设备的序列号
adb shell wm size #获取设备屏幕分辨率
adb shell wm size 1920x1080 # 设置分辨率

adb shell screencap -p /storage/emulated/0/Music/1.png  # 屏幕截图
# Android 5之后 可以字节使用adb exec-out 命令将文件保存到PC
adb exec-out screencap -p > D:\test.png 


# 获取前台应用程序包名  ??? 暂时 没有获取 到
adb shell dumpsys activity | find "mResumedActivity"  

# 获取手机内存信息
adb shell cat /proc/meminfo

# 获取手机存储信息
adb shell df

打开浏览器

# 使用系统浏览器 打开网页
adb shell am start -a android.intent.action.VIEW -d https://www.baidu.com
adb shell am start -a android.intent.action.VIEW -d  https://webcamtests.com/

adb shell am start -a android.intent.action.VIEW -d https://music.163.com/m/playlist?id=2623733209&creatorId=329357891

模拟键盘

adb shell input keyevent 3 # 按下HOME 键
adb shell input keyevent 4 # 按下返回键

adb shell input keyevent 26 # 按下电源键
adb shell input keyevent 82 # 按下菜单键

adb shell input keyevent 223 # 熄灭屏幕
adb shell input keyevent 224 # 点亮屏幕

adb shell input keyevent 67 # 删除

文本框输入

adb  shell input text "yu"

点击

adb shell input tap 458 573 # 根据坐标点击

滑动

input swipe <x1> <y1> <x2> <y2>  
# 手机屏幕 源点

(0,0)————————→ X轴  
  |  
  |  
  
Y轴

adb shell input swipe 550 1200 550 375 # 滑动解锁 
adb shell input swipe 700 200 100 200 # 左翻页
adb shell input swipe 100 200 1000 200 # 右翻页

录制屏幕

# 没有加入 --time-limit 限制录制时间时,默认 180s
adb shell screenrecord /sdcard/filename22.mp4
adb pull /sdcard/filename22.mp4
adb shell rm /sdcard/filename22.mp4  # 删除录制的文件
# 时间限制单位 为 s
adb shell screenrecord  --time-limit 10 /sdcard/demo.mp4
# 设置分辨率大小 
adb shell screenrecord --size 1280*720 /sdcard/demo.mp4
# 指定视频的比特率为 6Mbps,如果不指定 默认为 4 Mbps
# 可以增加比特率提高视频质量或者为了文件更小降低质量
adb shell screenrecord --bit-rate 6000000 /sdcard/demo.mp4
# 在命令行显示log
adb shell screenrecord --time-limit 10 --verbose /sdcard/demo.mp4

录屏时同时显示Log

联网控制

adb shell svc wifi enable # 打开WIFI
adb shell svc wifi disable # 关闭 WIFI

# 查看连结果的WIFI密码 需要权限
adb shell cat /data/misc/wifi/*.conf

# 开启飞行模式
adb shell settings put global airplane_mode_on 1
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true


# 关闭飞行模型

adb shell settings put global airplane_mode_on 0
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false

svc 命令

SVC 用来控制电源管理 WIFI开关数据开关(上网流量) 注意需要root 权限

# 控制USB插入时 屏幕常亮
svc power stayon [true|false|usb|ac]



# 关闭 或开启数据连接
svc data [enable|disable]

# 关闭 与 打开 WIFI
svc wifi [enable|disable]
# 打开 与 关闭 nfc
svc nfc [enable|disable]
# 打开与关闭蓝牙设备
svc bluetooth [enable|disable]
# 控制 开关机
# 重启
svc power reboot
# 关机
svc power shutdown
# 设置挂起
svc power forcesuspend

svc power

svc power stayon [true|false|usb|ac|wireless] #对应的意义:[长亮|长暗|usb接入长亮|充电长亮|连接wifi长亮]
svc power reboot [reason] /#[reason] 可以随便写或者不写,底层估计是会记录
svc power shutdown #关机
svc power forcesuspend [time]# 定时关机,其实也是关机,time 是多久后关机,单位是毫秒。未设置time,就是马上关机。

SVC Power

svc usb

svc usb setFunctions [function] //设置充电,还是文件等模式
svc usb setScreenUnlockedFunctions [function]
svc usb resetUsbGadget
svc usb getUsbSpeed
svc usb getGadgetHalVersion
svc usb getUsbHalVersion
svc usb resetUsbPort [port number]


# 调用源码位置

framework\base\cmds\svc\src\com\android\commands\svc\UsbCommand.java
framework\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java

image-20250222173907034

SVC WIFI

SVC WIFI控制

# 相关Framework
packages\modules\Wifi\service\java\com\android\server\wifi\WifiShellCommand.java

SVC Bluetooth

蓝牙控制

svc data

  • 开启启动 数据流量打开关闭

svc data

svc源码解析

  • 查找源码

查找

查看链接

  • 对应的 FrameWork层
  • /system/framework/svc.jar 对应 源码位置 framework\base\cmds\svc\svc

重启指令

  • 重启设备adb reboot
  • 重启到 Recovery 模式 : adb reboot recovery
  • 重启到 Bootloader 模式 : adb reboot bootloader

更改SELinux运行模式

# 查看 当前 SELinux 运行模式
adb shell getenforce
# 临时禁用,重启生效 设置为 Permissive
adb shell setenforce 0
# 设置为 Enforcing
adb shell setenforce 1

修改Linux配置文件 待验证

修改 /etc/sysconfig/selinux 配置文件

SELINUX=enforcing | permissive | disabled
#可以修改成三种模式中的其中一个,修改完配置文件后,reboot重启后才能生效

永久修改工作模式

控制屏幕大小

# 可修改为 任何 大小 或 reset
adb shell wm size 1280x800 
adb shell wm size 800x600 
adb shell wm size 2340x1080 
# 设置 密度 
abd shell wm density 200

修改系统分区

# 进入 root 模式
adb root 
# 用于将Android设备的系统分区(通常为只读)重新挂载为可读写模式,允许用户在Android设备上修改系统分区的内容
# 例如 替换系统文件或者安装 应用
adb remount 

ADB卸载APK

通过ADB命令卸载 APK 参考阅读 : https://blog.csdn.net/c19344881x/article/details/121400095#

adb install -r -t xxx.apk # 覆盖安装
adb install -d xxx.apk # 安装低版本apk
# 直接执行卸载
adb install pm list packages
# 指定报名卸载
adb uninstall 包名
# root权限卸载
adb root # 获取root权限
adb remount # 获取读写权限
# 查找文件位置
adb shell pm list packages
adb shell pm path 包名
# 删除应用
adb shell rm 包名地址
# 设备重启

查看系统属性

/system/build.prop 
Or
/vendor/build.prop
Or
/vendor/odm/build.prop

获取内存信息

# 获取内存使用的详细信息,
adb shell dumpsys meminfo
# 获取具体的包的
adb shell dumpsys meminfo com.RealBom.RBTest
# 进程的内存情况
adb shell procrank
# 查看zoneinfo
cat /proc/zoneinfo
# 查看一个进程的memory占用情况。
adb shell dumpsys meminfo pid

参考资料

解析adb shell svc源码

Android adb shell svc 知识详解