在RePlugin框架中注册AIDL服务实现插件与宿主通信,需遵循以下步骤:
一、AIDL接口定义
-
统一接口包名
-
宿主与插件工程需定义相同包名及结构的AIDL文件 (如
com.example.ILoginService.aidl),确保跨进程通信时类加载一致性。 -
示例AIDL内容:
arduino// ILoginService.aidl package com.example; interface ILoginService { boolean login(String username, String password); User getCurrentUser(); }
-
-
支持Parcelable对象
- 若接口涉及自定义对象(如
User类),需实现Parcelable接口,并单独定义其AIDL文件(如User.aidl)。
- 若接口涉及自定义对象(如
二、宿主端实现
-
实现AIDL接口
-
继承
ILoginService.Stub类,重写接口方法:lesspublic class LoginServiceImpl extends ILoginService.Stub { @Override public boolean login(String username, String password) { /* ... */ } @Override public User getCurrentUser() { /* ... */ } }
-
-
注册Service
-
在宿主
AndroidManifest.xml中声明Service,并配置RePlugin的PluginService特性:ini<service android:name=".LoginServiceImpl" android:process=":main" android:exported="true"> <intent-filter> <action android:name="com.example.ILoginService"/> </intent-filter> </service> -
通过
RePlugin.registerHookingClass确保插件能正确加载宿主Service类67。
-
三、插件端调用
-
绑定宿主服务
-
使用
RePlugin.fetchService()或RePlugin.bindService()获取服务代理对象:iniILoginService loginService = ILoginService.Stub.asInterface( RePlugin.fetchService(Context, new Intent("com.example.ILoginService")) );
-
-
调用远程方法
-
通过代理对象执行跨进程方法调用:
iniboolean result = loginService.login("user", "pwd"); User user = loginService.getCurrentUser();
-
四、注意事项
-
类加载隔离
- 启用
RePluginConfig.setUseHostClassIfNotFound(true),允许插件访问宿主类。
- 启用
-
版本一致性
- 宿主与插件的AIDL接口需保持严格版本同步,避免序列化兼容性问题。
-
线程安全
- AIDL方法默认运行在Binder线程池,需自行处理线程同步及UI线程更新。
通过上述流程,可实现RePlugin框架下基于AIDL的插件与宿主高效通信