Replugin 的hook点以及hook流程

Replugin 的 Hook 机制以 ‌唯一 Hook 点(ClassLoader) ‌ 为核心,通过轻量级改造实现插件化动态加载。以下为具体 Hook 点及流程解析:


一、核心 Hook 点

  1. ‌宿主 ClassLoader 替换‌

    • ‌目标对象 ‌:宿主的默认 PathClassLoader
    • ‌实现方式 ‌:在宿主应用启动时,通过反射将 ClassLoader 替换为自定义的 RePluginClassLoader,继承自 PathClassLoader 并重写关键方法‌13。
    • ‌作用‌:接管所有类的加载逻辑,优先从插件加载类。
  2. ‌双亲委派模型改造‌

    • ‌目标方法 ‌:RePluginClassLoader.loadClass()

    • ‌流程‌:

      • 优先通过插件 PluginDexClassLoader 加载类;
      • 若未命中,委托至宿主原 ClassLoader(即父类加载器)加载‌36。
    • ‌代码示意‌:

      typescript 复制代码
      protected Class<?> loadClass(String name, boolean resolve) {
          Class<?> clazz = pluginClassLoader.loadClass(name); // 插件优先
          if (clazz == null) {
              clazz = super.loadClass(name, resolve); // 宿主兜底
          }
          return clazz;
      }
  3. ‌Instrumentation 拦截‌

    • ‌目标方法 ‌:Instrumentation.newActivity()

    • ‌流程‌:

      • 在启动插件 Activity 时,通过 Hook 该方法将占位 Activity(如 PitActivity)替换为插件真实 Activity 类;
      • 动态注入插件 ClassLoader 和 Resources 上下文‌26。

二、Hook 流程解析

阶段 1:初始化宿主 Hook

  1. ‌替换 ClassLoader‌

    • 在 Application.attachBaseContext() 阶段,反射获取宿主的 PathClassLoader;

    • 构建 RePluginClassLoader 实例并替换宿主默认加载器‌17。

    • ‌关键代码‌:

      ini 复制代码
      ClassLoader originalLoader = getClassLoader();
      RePluginClassLoader newLoader = new RePluginClassLoader(originalLoader);
      ReflectUtils.setField(ActivityThread.currentActivityThread(), "mClassLoader", newLoader);
  2. ‌预加载公共类‌

    • 通过 Gradle 插件在编译期生成占位组件(如 Activity、Service),并预注册至宿主 Manifest‌15。

阶段 2:插件加载与类路由

  1. ‌插件安装‌

    • 调用 RePlugin.install() 释放插件 APK 至私有目录,并创建 PluginDexClassLoader 实例,其父加载器指向 RePluginClassLoader‌57。
    • ‌资源隔离 ‌:通过 AssetManager.addAssetPath() 合并插件资源路径,生成独立 Resources 对象‌68。
  2. ‌动态类加载‌

    • 当调用插件组件时,RePluginClassLoader 根据类名匹配插件标识,路由至对应的 PluginDexClassLoader 加载目标类‌37。

阶段 3:组件启动拦截

  1. ‌Activity 启动流程‌

    • ‌Intent 替换‌:将插件 Activity 的类名替换为宿主预注册的占位 Activity 类名,绕过 AMS 校验‌26。
    • ‌实例化拦截 ‌:在 Instrumentation.newActivity() 中,通过插件 ClassLoader 加载真实 Activity 类,并绑定插件上下文‌28。
  2. ‌其他组件处理‌

    • ‌Service ‌:通过 ActivityManagerProxy 拦截 startService 调用,动态创建插件 Service 实例‌48。
    • ‌BroadcastReceiver ‌:静态广播转为动态注册,通过 PackageParser 解析插件 Manifest 并注册至系统‌8。

三、与其他框架对比

框架 Hook 点数量 稳定性 侵入性
‌RePlugin‌ 1(ClassLoader) 高(阿里系验证) 低(无继承要求)‌16
‌DroidPlugin‌ 多(AMS、PMS 等) 低(易崩溃) 高(需继承基类)‌8
‌VirtualApp‌ 全面 Hook 中 高(沙箱环境)‌8

技术优势

  1. ‌轻量 Hook ‌:仅改造 ClassLoader 和 Instrumentation,避免深度 Hook 系统服务‌16。
  2. ‌兼容性‌:适配 Android 6.0-13,兼容主流厂商 ROM‌68。
  3. ‌开发透明‌:插件组件无需继承特定基类,与原生开发体验一致‌17。

通过上述机制,RePlugin 在 ‌稳定性 ‌ 与 ‌灵活性‌ 之间取得平衡,成为轻量化插件框架的典型代表‌

相关推荐
海宇大数据10 小时前
零信任架构实战:基于海宇学历核验版构建自动化风控审查网关
运维·人工智能·架构·自动化
91刘仁德10 小时前
RAG实战-从 NoSQL 到 Milvus 混合检索的架构演进
架构·nosql·milvus
这个DBA有点耶10 小时前
数据融合平台的下一代形态:数据库内核自己就能融合,为什么还要ETL?
数据库·架构·aigc
传奇开心果编程11 小时前
【Flutter入门练中学】第11课:状态管理进阶与声明式路由
android·学习·flutter·ui·ios
孟健12 小时前
Stripe出海收款架构设计:水星银行与香港账户实测对比与资金流闭环
后端·架构
这个DBA有点耶12 小时前
连接池与MySQL交互实战:连接风暴、连接泄漏与连接状态异常排查
数据库·mysql·架构
JasonSJX12 小时前
四端自建播放器怎么落地:Android、iOS、tvOS、Tizen 的 DRM 播放 SDK 技术盘点
android·ios·音视频·视频防录屏·加密保护课程·直播安全
驰骋工作流12 小时前
工作流引擎四大流程模块功能点统计:769 项能力清单梳理低代码工作流引擎表单
android·低代码·rxjava
恋猫de小郭12 小时前
Flutter 多窗口重要优化合并,多窗口性能和实用性大幅提升
android·前端·flutter
AirDroid_cn12 小时前
实时定位孩子手机超便捷!iPhone家长同步收提醒,省心又踏实
android