获取安卓系统页面布局是安卓自动化较为重要的一环。通过对Activity(单个屏幕)布局分析,得到视图与控件等信息,通常他们是树形结构,类似htmldom树。再通过对这些信息分析,进而得到要操作对象的信息并执行操作。下面我会分析并演示这一过程

一、通过uiautomator获取

uiautomator是一Android4.3发布的时候顺带发布的一个UI测试工具。Android Studio老版本自带,新版本未知。 本质上是将activity的信息可视化了,可以测试每个控件是否符合预期等。但是安装uiautomator比较麻烦,实际上我们通过adb就能调用Android系统内部的uiautomator,进而输出布局信息的xml文件。

PS E:\> adb shell uiautomator dump
UI hierchary dumped to: /sdcard/window_dump.xml

PS E:\> adb pull /sdcard/window_dump.xml e:\ui
/sdcard/window_dump.xml: 1 file pulled, 0 skipped. 0.7 MB/s (12321 bytes in 0.018s)

在连接adb的情况下,我们通过上述两条命令就能把安卓任意页面(当前活动页面)的布局信息导出到E盘下的ui文件夹,打开后字符串都显示在一行,不便于阅读,我们可以通过在线xml格式化工具格式化一下。 获取模拟器首屏的布局
它的界面长如下

对应的页面信息(节选) 可以看到每个node的信息都非常的详细,例如textresource-id等,这其中较为重要的是bounds bounds描述了一个矩形的范围,可以在这个范围内任意点击,便可触发相应事件。
举个例子,bounds="[43,138][188,413]"表示的就是,在屏幕坐标系中,左右方向上X=43至X=188,上下方向Y=138至Y=413所表示的一块矩形范围。假设 node中text=多开助手的app对应的bounds如上,那我们在上述范围中任意一点点击即可启动该APP。

二、通过AccessibilityService获取

AccessibilityService据官方介绍,是指开发者通过增加类似contentDescription的属性,从而在不修改代码的情况下,让视觉障碍等人士更加方面的操作Android系统,改善使用体验。但近年来,广泛被黑灰产业利用,利用其优点开发自动化抢购、游戏辅助脚本等软件或脚本,以此获取利益。著名的auto.js也是主要使用了该方式获取视图信息。主要就是因为它的优点很多,缺点较少。AccessibilityService是安卓开发概念中的一个服务。使用该功能需要配合安卓开发,使用起来需要配合相关软件。但貌似没有单纯以AccessibilityService提供节点信息的相关软件。

插播(2021/2/10):

做了一个基于AccessibilityService 的安卓布局分析及自动化操作软件,非常的方便,仅2.8M

https://lookcos.cn/archives/1044.html    具体使用方法,请转到文章内提到的项目地址查看

三、优缺点分析

AccessibilityService uiautomator
获取方式 通过 AccessibilityService API中方法获得控件信息,例如getRootInActiveWindow()可以获得根节点信息,进而通过遍历获得所有节点信息 通过shell命名,调用uiautomator获取信息,无需ROOT
优点 快速,不用分析底层数据,也能获取包信息,能够动态实时获取 把信息分析的过程交给手机端处理,减少了开发者的处理时间,获取的信息简洁有效,无需root
缺点 开发成本大,接口有限制,需要手动开启无障碍权限 响应时间长,点击前获取一次信息需要2S左右,太慢。
应用案例 auto.js uiautomator viwer、Appium

标签: 自动化测试, 页面布局, 布局分析, 自动化, activity, 布局获取

分类: 所有文章

相关文章

2021.02.10   2.8M 用hermit API + canvas 实现Android activity 安卓 页面布局分析

2020.08.30   APP自动化那些事儿:高效定位, 像解析网页一样定位APP

2020.05.30   [无需Root]用Python操作安卓手机|自动打卡|智能刷抖音

仅有一条评论

  1. bbzdjslm bbzdjslm

    学习了

添加新评论