安卓自动化研究之一:主流Activity布局获取方式分析
获取安卓系统页面布局是安卓自动化较为重要的一环。通过对Activity(单个屏幕)布局分析,得到视图与控件等信息,通常他们是树形结构,类似html
的dom树
。再通过对这些信息分析,进而得到要操作对象的信息并执行操作。下面我会分析并演示这一过程
一、通过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
的信息都非常的详细,例如text
,resource-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 |
版权声明:未经允许,谢绝转载
作者: Lookcos 发表日期:2021-01-20 21:43