AccessibilityService源码解析

整个流程说明图
在这里插入图片描述
解释说明如下:
开启辅助服务的APP:可以理解为是使用辅助服务的应用,如抢红包app。开启此app的辅助服务后可以理解为添加了目标app事件变化的监听
目标App:用辅助服务拿app页面数据的app,如微信
系统进程:system_server进程,主要是进程里的AccessibilityManagerService
AccessibilitymanagerService是在SystemServer类中启动的
在这里插入图片描述

一、发送辅助服务事件:

当app的页面内容改变时,比如窗口事件,滑动事件等
举个最简单的例子,调用TextView的setText方法时,就会发送辅助服务事件
在这里插入图片描述
调用的是父类的View方法:notifyViewAccessibilityStateChangedIfNeeded
在这里插入图片描述
这里最终会调用ViewRootImpl里的方法(至于为何是ViewRootImpl类,请参考文章最下面的链接)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过AccessibilityManager最终调用的是AccessibilityManagerService中的sendAccessibilityEvent方法
在这里插入图片描述

二、通知目标服务

调用service中的notifyAccessibilityEvent方法(AccessibilityServiceConnection里面的方法)
在这里插入图片描述
这个Service是从AccessibilityUserState中获取的,看下是什么时候add进去的,以及到底这个Service是哪个类(实际中需要打日志,这里无法编译烧录framework,所以只能分析,可能会有错误,实际还是以打日志为准),是哪个类,***这里标记下 ***,下文给出答案
AccessibilityServiceConnection类里面的onServiceConnected回调方法会将此对象加入到数组中,
在这里插入图片描述
那这个绑定成功的回调是什么时候调用的呢,又是绑定的什么呢,见下面的分析。
AccessibilityManagerService在创建的时候,init方法里会调用registerBroadcastReceivers方法注册监听广播,
在这里插入图片描述

当app的信息(如开启了辅助服务,相当于app的配置信息改变了),则会调用onUserStateChangedLocked方法,
在这里插入图片描述
在这里插入图片描述
updateServicesLocked方法中会调用创建连接,并绑定此连接,
在这里插入图片描述
绑定成功后则会赋值
mServiceInterface = IAccessibilityServiceClient.Stub.asInterface(service);
并调用初始化方法initializeService
在这里插入图片描述
调用的是serviceInterface中的init方法,serviceInterface赋值的是IAccessibilityServiceClient.Stub.asInterface(service),
在这里插入图片描述
IAccessibilityServiceClient是一个aidl,则即为AccessibilityService中的内部类IAccessibilityServiceClientWrapper,则init调用的就是IAccessibilityServiceClientWrapper里面的init方法
在这里插入图片描述
即这个DO_INIT最终的处理是在在这里插入图片描述
即AccessibilityService中的onBind方法里创建的IAccessibilityServiceClientWrapper,即为上文标记处的类service,所以上面调用发送事件的方法会调用到这里的

public void onAccessibilityEvent(AccessibilityEvent event) {
    AccessibilityService.this.onAccessibilityEvent(event);
}

然后调用到app端重写的这个方法
最后一步一步会调用到AccessibilityService(app里面继承AccessibilityService的服务)中重写的onAccessibilityEvent方法。所以通知的目标服务就是抢红包app里继承的AccessibilityService的服务
在这里插入图片描述
今天就写到这里,framework里面的文件是在是太大了,全部放到as中,刚才写着写着电脑蓝屏了,这个不是实时保存的,又重写了一遍,真是…

下面是小编觉得比较好的解析博客,别人写的已经非常详细了
AccessibilityService事件输入源码
Android 源码系列之<十>从源码的角度深入理解AccessibilityService,打造自己的APP小外挂(上)
Android 源码系列之<十一>从源码的角度深入理解AccessibilityService,打造自己的APP小外挂(下)
Android AccessibilityService源码分析
Android AccessibilityService机制源码解析
Android之辅助服务下篇————AccessibilityServic源码分析
Android 源码阅读第一编 AccessibilityServic包下的AccessibilityService 和 AccessibilityServiceInfo<meta-data
Android AccessibilityService机制源码解析
Android AccessibilityService机制源码解析
android 辅助功能(无障碍) AccessibilityService 实战入门详解
Android-无障碍服务(AccessibilityService)
Android AccessibilityService使用
通过源码角度看看AccessibilityService
更新于 20220807 22:41 ylxy 1668850213

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值