整个流程说明图
解释说明如下:
开启辅助服务的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