欢迎关注「全栈工程师修炼指南」公众号
点击 👇 下方卡片 即可关注我哟!
设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习!
“ 花开堪折直须折,莫待无花空折枝。 ”
作者主页:[ https://www.weiyigeek.top ]
博客:[ https://blog.weiyigeek.top ]
安全运维开发从业者学习答疑交流群:请关注公众号回复【学习交流群】
0x00 快速了解
adb 是什么?
描述: Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与Android设备(移动设备、安卓手机)进行通信获取其手机相关信息,其可以用于执行各种Android设备操作,例如安装
和调试
应用, 并且adb提供对 Unix shell(可用来在设备上运行各种命令)的访问权限,我们可以通过此工具访问移动设备上的文件目录。
adb 它是一种客户端-服务器(CS)程序,包括以下三个组件:
-
守护程序 (Adbd):用于在设备上运行命令,守护程序在每个设备上作为后台进程运行。
-
服务器:用于管理客户端与守护程序之间的通信,服务器在开发机器上作为后台进程运行。
-
客户端:用于发送命令,在开发机器上运行通过发出 adb 命令从命令行终端调用客户端。
原文链接: 安卓调试|入门扫盲必备adb调试工具介绍、安装使用说明Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与Android设备(移动设备、安卓手机)进行通信获取其手机相关信息,其可以用于执行各种Android设备操作,例如安装和调试应用,并且adb提供对Shell的访问权限。https://mp.weixin.qq.com/s/DtBk6Z1IisMaOSzcJwCl-g
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 命令访问这些设备。
> .\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
。
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调试功能,此处由于手机厂商型号不同开启方法位置也有所不同,所以建议大家根据实际情况百度、谷歌,也可参照下图中手机设置方法。
这里我测试机器是华为 novi 5i手机,其打开USB调试功能流程是如下图所示,设置->关于手机->点击版本号(三~七次进入开发者模式)-> 返回上一页 -> 点击 【系统和更新】 -> 开发者选项 -> 开启【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 管理器获取该驱动程序。
5.然后选择为此硬件安装的设备驱动程序,选择【Android ADB Interface】再点击【下一页】,驱动程序安装号之后如下我们可以在设备管理器中看到如下设备信息,则为安装成功!
6.此时我们便可打开 powershel 窗口运行如下命令则会显示我们的移动设备以及设备分辨率信息
,注意如果有多个设备后续必须使用-s
参数指定设备名称。
# adb 版本信息
> .\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
原生支持无线调试。
偷偷的告诉你哟?【极客全栈修炼】微信小程序已经上线了,
可直接在微信里面直接浏览博主博客了哟,后续将上线更多有趣的小工具。
操作步骤
-
Step 1.打开设置->点击【我的设备】-> 全部参数 -> 点击 【MIUI版本】 三到五次,便可开启开发者选项。
-
Step 2.然后打开设置->点击【更多设置】-> 【开发者选项】-> 启动 无线调试 -> 点击箭头查看无线调试的详细信息,此处我们点击使用配置对码配对设备,显示设备IP地址及调试端口
192.168.1.6:43905,配对码 365029
。
-
step 3.在电脑上开到目录
D:\Tools\platform-tools_r34.0.1-windows
找到adb所在目录,按住shift+右键打开终端执行,执行如下命令,之后将会在无线调试界面显示已配对的设备。
.\adb start-server
.\adb pair 192.168.1.6:39253 224252
Successfully paired to 192.168.1.6:39253 [guid=adb-yl4pmb69lncq6tkr-5u8Omr]
-
Step 4.配置成功后我们还需重新connect一下更新的设备调试端口,例如图中的端口,此后才能通过adb devices查看到该设备。
# 连接设备调试端口,此时IP地址与端口会发生改变获取最新的调试端口并connect
.\adb connect 192.168.1.6:35399
connected to 192.168.1.6:35399# 查看连接到adb守护进程的安卓设备
.\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# 查看adb守护进程pid的所有链接
> NETSTAT.EXE -ano |findstr "1860"TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 1860TCP 127.0.0.1:53746 127.0.0.1:53747 ESTABLISHED 1860TCP 127.0.0.1:53747 127.0.0.1:53746 ESTABLISHED 1860TCP 127.0.0.1:53748 127.0.0.1:53749 ESTABLISHED 1860TCP 127.0.0.1:53749 127.0.0.1:53748 ESTABLISHED 1860TCP 192.168.1.10:53819 192.168.1.6:35399 ESTABLISHED 1860
至此,在Android 11 设备中启用无线调试及连接调试设备完毕!
温馨提示: 将Android Studio更新到Bumblebee版本后,在设备列表中有一个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连上手机。
adb pull /system/build.prop
adb remount
adb push build.prop /system/
0x02 实践使用
1.如何通过adb获取获得点击屏幕的位置坐标的方法?
Step 1.首先计算比例,我们通过命令adb shell getevent -p
获得 event 体系里宽(0035)和高(0036)。
# 以当前我使用的手机为例,上述命令会输出如下信息:
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的十六进制的值。
$ adb shell getevent > getevent.log # 我点击屏幕两处
$ grep -e "0035" -e "0036" getevent.log/dev/input/event5: 0003 0035 00000310 # 以十六进制显示 X/dev/input/event5: 0003 0036 00000203 # 以十六进制显示 Y# /dev/input/event5: 0003 0039 00000000# /dev/input/event5: 0000 0002 00000000# /dev/input/event5: 0000 0000 00000000/dev/input/event5: 0003 0035 0000006d # 以十六进制显示 X/dev/input/event5: 0003 0036 000000af # 以十六进制显示 Y
Step 3.将把0035和0036后面的位置数据从16进制转化为10进制, 这是在event体系里的位置。
printf "%d" 0x310 # 784
printf "%d" 0x203 # 515
printf "%d" 0x6d # 109
printf "%d" 0xaf # 175
Step 4.然后我们将event体系里的位置将其转化为屏幕位置,即两处点击的位置是(784,515) 以及 (109,175)。
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
错误解决办法
错误信息:
> .\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
错误解决办法
错误信息:
> 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无法正常使用,内核会有如下提示信息:
<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 参考来源
-
Android 调试桥介绍: https://developer.android.google.cn/studio/command-line/adb?hl=zh-cn
-
Google USB 驱动程序: https://developer.android.google.cn/studio/run/win-usb?hl=zh-cn
本文至此完毕,更多技术文章,尽情等待下篇好文!
原文地址: https://blog.weiyigeek.top/2019/4-16-736.html
如果此篇文章对你有帮助,请你将它分享给更多的人!
学习书籍推荐 往期发布文章
公众号回复【0008】获取【Ubuntu22.04安装与加固建脚本】
公众号回复【10001】获取【WinServer安全加固脚本】
公众号回复【0011】获取【k8S二进制安装部署教程】
公众号回复【0014】获取【Nginx学习之路汇总】
公众号回复【0015】获取【Jenkins学习之路汇总】
热文推荐
-
开源项目 | ChatGPT-Next-Web私人ChatGPT网页应用一键免费部署
-
开源项目 | DB-GPT 来了,兼职奶爸搞了个数据库创新AI工具!
-
工具推荐 | 利用开源工具查看MobaXterm远程终端工具存储的Session账号密码信息
-
企业实践 | 如何从VMWare ESXi Shell中挂载以及拷贝NTFS或者FAT32分区格式的USB闪存驱动器
-
运维实践|从ESXi中挂载拷贝NTFS或FAT32格式物理磁盘(视频)
-
Go开发学习 | 如何使用Gomail.v2模块包发送邮箱验证码消息及附件学习记录
-
网安等保-国产Linux操作系统银河麒麟KylinOS-V10SP3常规配置、系统优化与安全加固基线实践文档
欢迎长按(扫描)二维码 获取更多渠道哟!
欢迎关注 【全栈工程师修炼指南】(^U^)ノ~YO
== 全栈工程师修炼指南 ==
微信沟通交流: weiyigeeker
关注回复【学习交流群】即可加入【安全运维沟通交流小群】
温馨提示: 由于作者水平有限,本章错漏缺点在所难免,希望读者批评指正,若有问题或建议请在文章末尾留下您宝贵的经验知识,或联系邮箱地址
master@weiyigeek.top 或 关注公众号 [全栈工程师修炼指南] 留言。
[全栈工程师修炼指南] 关注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章,尽在博客站点,谢谢支持!
点个【 赞 + 在 】看吧!
点击【"阅读原文"】获取更多有趣的知识!