Replugin插件化框架原理简介

本文详细介绍了Replugin插件化框架的原理,包括为何需要插件化、插件化的不稳定因素及其解决方案。重点讨论了Replugin如何通过Hook技术实现稳定插件化,如PathClassLoader、Dex和资源的处理,以及Context的非Hook策略。此外,文章还探讨了坑位方案、Service处理和ContextManager的角色,展示了Replugin在设计上的灵活性和稳定性。

转载请注明链接: https://blog.youkuaiyun.com/feather_wch/article/details/88148286

Replugin插件化框架原理简介

版本号:2019-03-11(23:05)


简介

为什么需要插件化?

1、为什么需要插件化?

  1. 发布不够灵活
  2. 安装包过大
  3. 模块不够独立,耦合度高。

导致插件化不稳定的根源在哪?

2、导致插件化框架不稳定的根源在哪?

  1. Hook太多—修改了太多的系统API
  2. 市面上可以hook的内容:
  3. AMS
  4. Instrumentation
  5. System-Services
  6. PackageManager
  7. ContextImpl
  8. Resources

3、哪些情况可能会导致Hook引起稳定性问题?

  1. Android升级
  2. ROM修改
  3. Hook的使用不当,Hook点选择不正确

4、Hook要越少越好!

5、总结插件化稳定的方法

  1. Hook一处:宿主的ClassLoader
  2. DexClassLoader原生
  3. Resources原生
  4. PluginContext非Hook,new出来的
  5. 坚持真正、长久的稳定大量适配过、非长久的稳定是伪稳定

如何解决不灵活的问题?

1、灵活的目标

  1. 插件组件随意增改
  2. 新插件直接用
  3. 主程序长期不发版本
  4. 自由设置进程

大项目才使用插件化?

1、大项目才使用插件化?

  1. 插件 = 免安装应用
  2. 基础放在主程序中,放心
  3. 迁移成本高

2、全面插件化

  1. 自由、独立发布
  2. 应用“积木化”
  3. 宿主/插件交互简单

Hook技术

PathClassLoader的Hook

1、RePlugin如何通过Hook实现插件化?

  1. 仅仅Hook ClassLoader
  2. 最终使用本身的RepluginClassLoader
Application.mBase.mPackageInfo.mClassLoader
    = new RepluginClassLoader();

2、RePlugin Hook的ClassLoader仅仅更改了loadClass,其他的都直接透传。

  1. 系统原生的四大组件等内容,通过Hook的RepluginClassLoaderloadClass()方法转换成插件所需要的内容,并交给系统。
  2. loadClass()里面有PitManager、HookingClassManager进行处理

3、ClassLoader一定要继承自PathClassLoader

  1. 防止 Android 7.x 因使用 addDexPath 而有问题。
  2. 除此之外,此 ClassLoader 所在位置也非常稳定。目前来看,从 Android 2.1 至今都没有发生过位置、名称上的变化,可以长期使用。

Dex的Hook

3、RePlugin中不对Dex进行Hook

  1. 使用原生的DexClassLoader
  • 为了支持使用宿主类,后Hook了PluginDexClassLoader
// 1、获取插件apk的路径
mPath = getPl
### RePlugin 插件化框架的使用指南与实现原理 RePlugin 是一个成熟的 Android 插件化框架,其设计目标是为开发者提供一种动态加载和运行插件的能力。以下是关于 RePlugin 的使用指南以及其实现原理的详细说明。 #### 使用指南 1. **集成宿主项目** 在宿主项目中引入 `replugin-host-gradle` 和 `replugin-host-library` 两个模块[^2]。通过以下方式配置: ```groovy // 宿主项目的 build.gradle 文件 plugins { id 'com.qihoo360.replugin.host' } dependencies { implementation 'com.qihoo360.replugin:replugin-host-library:xxx' } ``` 2. **集成插件项目** 在插件项目中引入 `replugin-plugin-gradle` 和 `replugin-plugin-library` 模块[^2]。配置如下: ```groovy // 插件项目的 build.gradle 文件 plugins { id 'com.qihoo360.replugin.plugin' } dependencies { implementation 'com.qihoo360.replugin:replugin-plugin-library:xxx' } ``` 3. **插件打包与加载** - 插件以 APK 格式存在,可以通过 `RePlugin.install()` 方法动态安装插件。 - 使用 `RePlugin.loadPlugin()` 方法加载已安装的插件。 - 调用插件中的组件(如 Activity、Service 等)需要通过 RePlugin 提供的 API,例如 `RePlugin.startActivity()`。 4. **插件开发注意事项** - 插件项目应尽量减少对系统 API 的直接调用,避免因 Hook 不足导致功能失效。 - 插件的上下文(Context)由框架提供的 `PluginContext` 替代,而非原始的 Application Context[^3]。 #### 实现原理 1. **Binder 机制** RePlugin 使用 Binder 机制实现宿主与插件之间的通信和数据共享[^1]。这种方式类似于 Android 系统中的 ServiceManager 和 AMS 的结构,确保了高效且稳定的跨进程通信。 2. **ClassLoader 加载** 插件的 ClassLoader 由 RePlugin 框架管理,通过自定义的 ClassLoader 动态加载插件中的类文件[^4]。这使得插件可以独立于宿主运行,并支持热更新。 3. **Activity 启动流程** RePlugin 并未 Hook 系统的 `startActivity` 方法,而是通过业务方调用框架提供的 `RePlugin.startActivity()` 方法实现插件 Activity 的启动[^5]。这种方式减少了对系统 API 的依赖,降低了兼容性问题的风险。 4. **双向通信** 插件端通过反射调用宿主端的接口,实现插件与宿主之间的双向通信。这种设计既保证了插件的功能完整性,又避免了复杂的 Hook 操作。 5. **特殊上下文处理** 插件的上下文由框架提供的 `PluginContext` 替代,该上下文封装了插件所需的资源访问能力,同时避免了对系统 API 的直接修改[^3]。 ```python # 示例代码:动态加载并启动插件 Activity if (RePlugin.isPluginInstalled("plugin_name")) { RePlugin.startActivity(context, new RePluginComponentName("plugin_name", "com.example.PluginActivity")); } else { Toast.makeText(context, "插件未安装", Toast.LENGTH_SHORT).show(); } ``` ### 注意事项 - 插件的开发需遵循 RePlugin 的规范,避免直接使用系统 API。 - 宿主与插件的版本需保持一致,以避免兼容性问题。 - 插件的加载和卸载过程可能会对性能产生一定影响,需合理优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值