[TOC]
0x00 快速了解 adb 是什么? 描述: Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与Android设备(移动设备、安卓手机)进行通信获取其手机相关信息,其可以用于执行各种Android设备操作,例如安装
和调试
应用, 并且adb提供对 Unix shell(可用来在设备上运行各种命令)的访问权限,我们可以通过此工具访问移动设备上的文件目录。
adb 它是一种客户端-服务器(CS)程序,包括以下三个组件:
adb 工作原理 描述: 当您启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程已在运行。如果没有,它会启动服务器进程,服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令。
然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号
端口查找模拟器,服务器一旦发现 adb 守护程序 (adbd)
,便会与相应的端口建立连接。
每个模拟器都使用一对按顺序排列的端口:一个用于控制台连接的偶数号端口,另一个用于 adb 连接的奇数号端口。例如:
模拟器 1,控制台:5554 ,adb:5555 ,adbd:5037 模拟器 2,控制台:5556 ,adb:5557 ,adbd:5037 依此类推。
如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个,且都与adb 服务器进程 5037 连接, 服务器与所有设备均建立连接后,您便可以使用 adb 命令访问这些设备。
[TOC]
0x00 快速了解 adb 是什么? 描述: Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与Android设备(移动设备、安卓手机)进行通信获取其手机相关信息,其可以用于执行各种Android设备操作,例如安装
和调试
应用, 并且adb提供对 Unix shell(可用来在设备上运行各种命令)的访问权限,我们可以通过此工具访问移动设备上的文件目录。
adb 它是一种客户端-服务器(CS)程序,包括以下三个组件:
adb 工作原理 描述: 当您启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程已在运行。如果没有,它会启动服务器进程,服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令。
然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号
端口查找模拟器,服务器一旦发现 adb 守护程序 (adbd)
,便会与相应的端口建立连接。
每个模拟器都使用一对按顺序排列的端口:一个用于控制台连接的偶数号端口,另一个用于 adb 连接的奇数号端口。例如:
模拟器 1,控制台:5554 ,adb:5555 ,adbd:5037 模拟器 2,控制台:5556 ,adb:5557 ,adbd:5037 依此类推。
如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个,且都与adb 服务器进程 5037 连接, 服务器与所有设备均建立连接后,您便可以使用 adb 命令访问这些设备。
1 2 3 4 5 6 > .\adb start-server * daemon not running; starting now at tcp:5037 * daemon started successfully > netstat -ano | findstr "5037" TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 13408
由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此您可以从任意客户端或从某个脚本控制任意设备。
温馨提示: 所有 adb 客户端均使用端口 5037 与 adb 服务器通信。 温馨提示: 如果您在 macOS 或 Linux 上进行开发,则不需要安装 USB 驱动程序,所以说开发者们Linux、Unix系统换起来, 如何安装驱动程序请查看下述安装调试。
0x01 安装调试 描述: adb 包含在 Android SDK 平台工具软件包中,您可以使用 SDK 管理器( https://developer.android.google.cn/studio/intro/update?hl=zh-cn#sdk-manager )下载此软件包(即 Android Studio IDE 中进行配置 SDK Manager
),该管理器会将其安装在android_sdk/platform-tools/
下。 如果您需要独立的 Android SDK 平台工具软件包,请访问此链接( https://developer.android.google.cn/studio/releases/platform-tools?hl=zh-cn )进行下载(推荐),Android SDK Platform-Tools 是 Android SDK 的一个组件,它包含与 Android 平台进行交互的工具,主要是 adb 和 fastboot, 前置就是本节主人公主要用于安卓设备的调试,而后者主要用于解锁设备的引导加载程序并为其刷入新的系统映像
。
调试依赖
Windows、Linux、Mac 系统
安卓手机一部(此处作者:华为 novi 5i手机)
原装 USB 数据线一根
Android SDK Platform-Tools
Google usb_driver_r13-windows 驱动程序(Windows 必须)
通过 USB 连接进行 adb 调试 安装步骤 1.访问 Android SDK Platform-Tools
上述中的下载链接,根据自己平台下载对应版本,下述链接始终指向最新版本的工具,此处由于作者是windows所以下载第一个platform-tools_r34.0.1-windows.zip
。
weiyigeek.top-下载适用于 Windows 的 SDK Platform-Tools图
2.下载完成后使用Powershell命令Expand-Archive platform-tools_r34.0.1-windows.zip D:\Tools\
解压在D盘tool目录中,访问adb.exe所在的目录,执行.\adb.exe devices
命令查看安卓设备,此时肯定是看不设备的,我们还需将手机通过USB线链接到客户端PC电脑上。
3.在将手机通过USB接入到电脑后我们需要开到手机的USB调试功能,此处由于手机厂商型号不同开启方法位置也有所不同,所以建议大家根据实际情况百度、谷歌,也可参照下图中手机设置方法。
weiyigeek.top-启用开发者选项图
这里我测试机器是华为 novi 5i手机,其打开USB调试功能流程是如下图所示,设置->关于手机->点击版本号(三~七次进入开发者模式)-> 返回上一页 -> 点击 【系统和更新】 -> 开发者选项 -> 开启【USB】调试功能。
weiyigeek.top-开启【USB】调试功能图
4.如果您要在 Windows 系统上对 Google 设备执行 adb 调试,必须安装 Google USB 驱动程序。其他所有设备的 Windows 驱动程序都由各自的硬件制造商提供,如安装原始设备制造商 (OEM) USB 驱动程序中所列。通常情况下,你会在计算机中设备管理器查看是不是有未识别的设备,右键属性更新驱动程序,首次安装时我们还需要安装一个 Google USB 驱动程序,官网中提示到我们可以通过以下两种方式为 Windows 下载 Google USB 驱动程序:
一是、下载 Google USB 驱动程序 ZIP 文件 (ZIP),Powershell解压命令: Expand-Archive usb_driver_r13-windows.zip D:\Tools\
二是、通过 Android SDK 管理器获取该驱动程序。
weiyigeek.top-从磁盘安卓驱动设备图
5.然后选择为此硬件安装的设备驱动程序,选择【Android ADB Interface】再点击【下一页】,驱动程序安装号之后如下我们可以在设备管理器中看到如下设备信息,则为安装成功!
weiyigeek.top-Android ADB Interface图
6.此时我们便可打开 powershel 窗口运行如下命令则会显示我们的移动设备以及设备分辨率信息
,注意如果有多个设备后续必须使用-s
参数指定设备名称。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 > .\adb.exe version Android Debug Bridge version 1.0.41 Version 34.0.1-9680074 Installed as D:\Tools\android\platform-tools\adb.exe PS D:\Tools\platform-tools_r34.0.1-windows> .\adb.exe devices List of devices attached PWHUT20423010562 device PS D:\Tools\platform-tools_r34.0.1-windows> .\adb.exe shell wm size Physical size: 1080x2310
至此,我们安卓设备已经成功的连接到adb上,我们便可使用adb命令操作设备了。
通过 WIFI 无线连接进行 adb 调试 描述: 根据 Google Android 开发文档可知当USB口不够或者没有USB线时可以通过wifi进行无线adb调试,这样就可以避免常见的 USB 连接问题,例如驱动程序安装方面的问题,但此处值得注意的是Android版本不同则操作有所区别。
Android 10 及更低版本,通常在开发者选项中没有【无线调试】选项,需要先通过USB进行初始化操作开启目标设备监听端口,然后再通过
Android 11(API 级别 30)及更高版本,支持使用 Android 调试桥 (adb) 从工作站以无线方式部署和调试应用。
Android 11(API 级别 30)及更高版本 通过无线调试,您可以将可调试应用部署到多台远程设备,而无需通过 USB 实际连接设备。
在开始使用无线调试功能之前,请执行以下操作:
确保您的工作站和设备已连接到同一无线网络。
确保您的设备搭载的是 Android 11(API 级别 30)或更高版本(针对手机),或者 Android 13(API 级别 33)或更高版本(针对 TV 和 WearOS
已下载安装 platform-tools (请看第一章)或者已安装最新版本的 Android Studio
此处测试实践的手机型号及安卓版本 Readmi Note 8 pro、MIUI 12.5.6、Android 11
原生支持无线调试。
操作步骤
weiyigeek.top-用配置对码配对设备图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 .\adb connect 192.168.1.6:35399 connected to 192.168.1.6:35399 .\adb devices -l List of devices attached 192.168.1.6:35399 device product:begonia model:Redmi_Note_8_Pro device:begonia transport_id:1 > NETSTAT.EXE -ano |findstr "1860" TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 1860 TCP 127.0.0.1:53746 127.0.0.1:53747 ESTABLISHED 1860 TCP 127.0.0.1:53747 127.0.0.1:53746 ESTABLISHED 1860 TCP 127.0.0.1:53748 127.0.0.1:53749 ESTABLISHED 1860 TCP 127.0.0.1:53749 127.0.0.1:53748 ESTABLISHED 1860 TCP 192.168.1.10:53819 192.168.1.6:35399 ESTABLISHED 1860
weiyigeek.top-使用adb链接无线调试设备图
至此,在Android 11 设备中启用无线调试及连接调试设备完毕!
温馨提示: 将Android Studio更新到Bumblebee版本后,在设备列表中有一个Pair Device Using Wi-Fi的选项,点击会弹出一个二维码,然后打开手机开发者选项中的无线调试设置页面,里面有个使用二维码配对设备的选项,点击即可打开相机进行扫码,稍等片刻后就会自动连接成功,比上面的方法简单多了.
weiyigeek.top-Pair Device Using Wi-Fi图
Android 10 及更低版本 描述: 一般情况下,adb 通过 USB 与设备进行通信,但您也可以通过 Wi-Fi 使用 adb。若要连接到搭载 Android 10(API 级别 29)或更低版本的设备,请通过 USB 执行以下初始步骤:
Step 1.将 Android 设备和 adb 主机连接到同一 Wi-Fi 网络。 Step 2.使用 USB 线将设备连接到主机。 Step 3.设置目标设备以监听端口 5555 上的 TCP/IP 连接:adb tcpip 5555
Step 4.拔掉连接目标设备的 USB 线。 Step 5.找到 Android 设备的 IP 地址。例如,对于 Nexus 设备,您可以在设置 > 关于平板电脑(或关于手机)> 状态 > IP 地址下找到 IP 地址。 Step 6.通过 IP 地址连接到设备:$ adb connect device_ip_address:5555
Step 7.确认主机已连接到目标设备:$ adb devices
Step 7.设备的 adb 连接断开:$ adb disconnect device_ip_address:5555
补充: 上述方法需要每次先将手机通过USB连接到PC,使用adb tcpip命令开启网络调试功能,一旦手机重启,又要重复这些步骤,比较麻烦。 解决办法: 先将手机中的 /system/build.prop
文件pull出来,修改或增加一行配置 service.adb.tcp.port=5555
,实现开机就支持网络调试,不需要先USB连上手机。1 2 3 adb pull /system/build.prop adb remount adb push build.prop /system/
0x02 实践使用 1.如何通过adb获取获得点击屏幕的位置坐标的方法? Step 1.首先计算比例,我们通过命令adb shell getevent -p
获得 event 体系里宽(0035)和高(0036)。1 2 3 4 5 6 7 0035 : value 0, min 0, max 1079, fuzz 0, flat 0, resolution 0 0036 : value 0, min 0, max 2309, fuzz 0, flat 0, resolution 0 .\adb shell wm size Physical size: 1080x2310
计算比例: rateW = 1080(手机屏幕的宽) / 1079 (event里0035的max) = 1 rateH = 2310(手机屏幕的高) / 2309 (event里0036的max) = 1
Step 2.点击屏幕计算点击位置的坐标, 我们通过adb shell getevent
命令获取ABS_MT_POSITION_X、ABS_MT_POSITION_Y的十六进制的值。1 2 3 4 5 6 7 8 9 $ adb shell getevent > getevent.log $ grep -e "0035" -e "0036" getevent.log /dev/input/event5: 0003 0035 00000310 /dev/input/event5: 0003 0036 00000203 /dev/input/event5: 0003 0035 0000006d /dev/input/event5: 0003 0036 000000af
Step 3.将把0035和0036后面的位置数据从16进制转化为10进制, 这是在event体系里的位置。1 2 3 4 printf "%d" 0x310 printf "%d" 0x203 printf "%d" 0x6d printf "%d" 0xaf
Step 4.然后我们将event体系里的位置将其转化为屏幕位置,即两处点击的位置是(784,515) 以及 (109,175)。1 2 screenW = width*rateW = 784*1 = 784 screenH = height*rateH = 515*1 = 515
至此,通过event获得点击屏幕位置坐标实践完毕,由上可知屏幕的坐标位置与手机的显示尺寸是息息相关的,但是通常是1:1的比例。
0x03 入坑出坑 问题1.执行点击屏幕时显示Injecting to another application requires INJECT_EVENTS permission
错误解决办法 错误信息:1 2 > .\adb shell input tap 720 1080 java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission
错误原因: 未开启USB调试(安全设置) 解决办法: 在开发者选项里面,打开USB调试(安全设置)
问题2.在执行adb devices
查看设备时只显示List of devices attached
的错误解决办法 原因排查: 第一个是确认adb.exe的版本,第二个是确认adb驱动是否正常 问题解决:
步骤01.在命令行输入adb version,查看adb版本,若版本为1.0.31或以下,建议升级adb,安卓版本在4.x上的版本要求在1.0.31以上;
步骤02.手机连接USB的情况下,进入电脑设备管理器页面,查看ADBInterface或者便携设备中是否有黄色感叹号,如果有则表示adb驱动有问题,简单处理方法:下载360手机助手,安装成功后连接手机,会自动安装驱动,结束后即可使用。
问题3.执行adh install
命令时显示adb: error: failed to get feature set
错误解决办法 错误信息:1 2 3 4 > adh install "release.apk" error: no devices/emulators found Performing Push Installadh: adb: error: failed to get feature set : no devices/emulators found
错误原因: 电脑没有Android手机驱动程序 解决办法: 将安卓数据线连接好电脑,并按照文章头部的驱动安装步骤进行相应安装。
问题4.调试时APK无法正常使用报avc: denied { write } for pid=2502
错误解决办法 错误信息: 在调试展讯平台的tp驱动,有时候我们调试用的APK无法正常使用,内核会有如下提示信息:1 2 <36>[ 93.437866] c0 type =1400 audit(1325376121.928:24): avc: denied { write } for pid=2502 comm=”com.chm.tstools” name =”chm_ts” dev=”proc” ino=4026533105 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:proc:s0 tclass=file permissive=0
错误原因: 即当前应用程序”com.chm.tstools”无法往名为”chm_ts”的proc设备节点上写入数据,因此可见是一个权限的为。可以使用以下命令解决:
解决办法: adb shell setenforce 0
0x0n 参考来源