Android组件化跨进程通信框架Andromeda解析(1),2024Android开发现状分析

本文深入解析Android组件化框架Andromeda,包括本地服务、远程服务、进程优先级管理、事件总线和插桩技术。重点介绍了IRemoteTransfer接口及其在跨进程通信中的作用,以及如何通过ContentProvider和插桩实现服务的注册和获取。此外,还探讨了2024年Android开发的现状和挑战,如进程优先级提升和事件总线的实现。
摘要由CSDN通过智能技术生成

IRemoteTransfer是一个AIDL接口,RemoteTransfer是它的实现类,RemoteTransfer还实现了IRemoteServiceTransfer接口。

这里需要一张类图来帮你理清思路:

#IRemoteTransfer.aidl

interface IRemoteTransfer {

//① 将Dispatcher代理返回给RemoteTransfer

oneway void registerDispatcher(IBinder dispatcherBinder);

oneway void unregisterRemoteService(String serviceCanonicalName);

oneway void notify(in Event event);

}

#IRemoteServiceTransfer.java

public interface IRemoteServiceTransfer {

//②获取远程服务包装

BinderBean getRemoteServiceBean(String serviceCanonicalName);

//注册/反注册 远程服务

void registerStubService(String serviceCanonicalName, IBinder stubBinder);

void unregisterStubService(String serviceCanonicalName);

}

两个问题需要注意:

① 方法的调用方在Dispatcher中,这样就把Dispatcher的远程代理回传给了当前进程,之后注册远程服务就可以通过这个DispatcherProxy完成。

② 无论是注册还是获取远程服务,都是不能直接传递Binder的,因为Binder并没有实现Parcelable接口,因此需要将Binder包装在一个实现了Parcelable接口的类中传递,BinderBean就是其中一个包装类。

主体逻辑已经讲清楚了,我们正式开始分析功能。

  • 通过ContentProvider方式同步的获取Dispatcher的代理,这个ContentProvider属于Dispatcher进程,且通过插桩的方式织入manifeset文件。

  • 获取远程服务时传递当前进程的Activity或Fragment,并bind预先插桩好的StubService,这个StubService属于远程服务所在进程。

这是整个Andromeda工程最最核心的原理,你是不是快看不懂了,没关系,下面会结合时序图、关系图详细分析实现过程。

本地服务

本地服务没什么讲的,内部通过维护一个Map关系表,来记录注册服务的名称和实现类。

LocalServiceHub

public class LocalServiceHub implements ILocalServiceHub {

private Map<String, Object> serviceMap = new ConcurrentHashMap<>();

@Override

public Object getLocalService(String module) {

return serviceMap.get(module);

}

@Override

public void registerService(String module, Object serviceImpl) {

serviceMap.put(module, serviceImpl);

}

@Override

public void unregisterService(String module) {

serviceMap.remove(module);

}

}

远程服务

远程服务是框架的核心,对远程服务的操作就是两个,一是注册远程服务,二是获取远程服务。

我们先来看服务的注册,时序图如下 ↓

  1. 客户端通过<T extends IBinder> registerRemoteService(String serviceCanonicalName, T stubBinder)注册本进程可提供的远程服务,stubBinder即服务实现类。

  2. 调用RemoteTransfer的registerStubService方法。

  3. registerStubService内部先初始化DispatcherProxy,如果为空跳转3.1。

  • 3.1-3.2 要实现服务的同步注册,本质上是同步获取DispatcherProxy,这是一次IP
  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值