【移动应用开发技术】通过源码角度看看AccessibilityService_第1页
【移动应用开发技术】通过源码角度看看AccessibilityService_第2页
【移动应用开发技术】通过源码角度看看AccessibilityService_第3页
【移动应用开发技术】通过源码角度看看AccessibilityService_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】通过源码角度看看AccessibilityService

简介

AccessibilityService的设计初衷是为了辅助有身体缺陷的群体使用Android应用,它的设计贯穿着Android的控件树View,ViewGroup,ViewRootImpl体系。借助于system_server进程的中转,能够注册Accessibility事件的客户端可以具备通过system_server提供的Accessibility服务来实现监听、操作其它应用视图的功能。这个功能十分强大,可以模拟用户的行为去操作其它APP,常常被用在自动化测试、微信抢红包、自动回复等功能实现中。写这个的初衷有二:整体图

类图整体设计图实例代码以上是一个典型的实现Accessibility功能的JAVA代码,主要涉及三点功能:本篇文章将会围绕着这三点主要功能进行源码分析源码分析

常见AccessibilityEvent事件种类

onAccessibilityEvent触发流程这里以TextView.setText触发事件变化流程为例进行分析TextView.setText应用组件状态发生变化frameworks/base/core/java/android/widget/TextView.javaViewRootImpl.requestSendAccessibilityEventViewRootImpl将事件派发到system_serverframeworks/base/core/java/android/view/ViewRootImpl.javaframeworks/base/core/java/android/view/accessibility/AccessibilityManager.javaAccessibilityManagerService.sendAccessibilityEventsystem_server将事件分发到各个监听组件变化的Serviceframeworks/base/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.javaAccessibilityService.onAccessibilityEventAPP接收到组件变化的事件,并可以选择做出相应的处理frameworks/base/core/java/android/accessibilityservice/AccessibilityService.javagetRootInActiveWindow父节点获取流程在调用findAccessibilityNodeInfosByText之前,需要通过getRootInActiveWindow方法获取到父节点,才能通过调用父AccessibilityNodeInfo的方法进行其子节点信息查询AccessibilityService.getRootInActiveWindowframeworks/base/core/java/android/accessibilityservice/AccessibilityService.javaframeworks/base/core/java/android/view/accessibility/AccessibilityInteractionClient.javaService.findAccessibilityNodeInfoByAccessibilityId注意一下,这里的Service不是Android中的四大组件的Service,取名叫AccessiblitManagerServiceInternal其实更合适frameworks/base/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.javaAccessibilityInteractionConnection.findAccessibilityNodeInfoByAccessibilityId这里调用到了APP端,其实同onAccessibilityEvent调用流程一样,是APP->SYSTEM->APP的调用顺序frameworks/base/core/java/android/view/ViewRootImpl.javaframeworks/base/core/java/android/view/AccessibilityInteractionController.javaAccessibilityInteractionClient.setFindAccessibilityNodeInfosResultframeworks/base/core/java/android/view/accessibility/AccessibilityInteractionClient.javafindAccessibilityNodeInfosByText与performAction对目标节点进行操作AccessibilityNodeInfo.findAccessibilityNodeInfosByText找到父节点信息后,就可以通过父节点获取对应的子节点信息了frameworks/base/core/java/android/view/accessibility/AccessibilityNodeInfo.java以下的代码流程同getRootInActiveWindow大概一致,就不详细分析了

####AccessibilityNodeInfo.performAction

获取到对应子节点后,通过performAction可以执行对应的操作了,如常用的点击

最终回调用到AccessibilityInteractionController,获取到AccessibilityProvier后就可以执行performAction的最终操作了

frameworks/base/core/java/android/view/AccessibilityInteractionController.java

frameworks/base/core/java/android/view/View.java分析到这里可以看到,Accessibility服务框架类似于hook在AndroidView组件树中的一套实现,它并不是独立的一套机制,而是”寄生”在View的显示、事件分发的流程中。总结

功能实现依赖于ViewRootImpl,ViewGroup,View视图层级管理的基本架构。在视图变化时发出事件、当收到视图操作请求时也能够作出响应。

system_server在实现该功能的过程中扮演着中间人的角色。当被监听APP视图变化时,APP首先会发出事件到system_server,随后再中转到监听者APP端。当监听者APP想要执行视图操作时,也是首先在system_serv

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论