如何通过ADB精准定位设置项并提取坐标实现程序化点击
ADB稳定定位Android设置项的实现方法
现有基础方案
目前常规的操作步骤如下:
- 执行
adb shell am start -a android.settings.SETTINGS打开系统设置首页 - 执行
adb exec-out uiautomator dump /dev/tty导出当前页面的UI层级结构 - 从导出的XML结构中匹配目标设置项节点,提取
bounds属性的坐标后执行点击操作
示例目标节点(密码与账户选项):
<node index="0" text="Passwords & accounts" resource-id="android:id/title" class="android.widget.TextView" package="com.android.settings" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[198,1361][752,1441]" />
现有方案的问题
直接依赖bounds坐标点击的方案稳定性极差,不同分辨率设备、不同系统版本的设置项排布位置不统一,也没有全局唯一的id标识,无法跨设备通用。
稳定精准识别的实现方案
按优先级从高到低选择以下方案:
- 优先调用系统原生Intent直接跳转,跳过点击流程
大多数常用设置页都有官方定义的隐式Intent Action,不需要进入设置首页再点击对应选项,这是最稳定的方案。
比如要打开账户列表/添加账户页面,直接执行:
adb shell am start -a android.settings.ACCOUNT_SETTINGS
其他常见设置项也有对应Action,比如开发者选项、WiFi设置等,都可以直接检索对应Action调用。
- 多属性组合匹配定位节点,不依赖坐标
如果确实没有对应Action的冷门设置项,就通过多属性组合的方式匹配节点,不要只靠坐标:
- 先过滤包名:系统设置的包名固定为
com.android.settings,先筛掉其他包的所有节点 - 再过滤资源ID:设置项的标题控件ID统一为
android:id/title,进一步缩小匹配范围 - 匹配文本属性:根据当前系统语言,匹配设置项的
text或者content-desc属性值,多语言场景可以同时兼容中英文等常用文本 - 校验父节点属性:你匹配到的title节点本身
clickable属性为false,实际可点击的是它的上层父布局,匹配到title节点后取父节点的bounds坐标执行点击,避免点错位置
- 适配滚动场景
如果当前页面没有找到匹配的节点,自动执行上下滚动操作后重新查找,直到滚动到页面边界为止,适配设置项较多需要滑动的场景。
按上述规则匹配的准确率可达99%以上,修改「不保留活动」设置项的同类工具,用的就是这套匹配逻辑。
内容的提问来源于stack exchange,提问作者Favolas
相关产品推荐
相关产品推荐

