文章目录
Android 插件化系列文章目录
前言
一、使用 Hook 方式替换插件 Activity 资源
1、通过反射获取 ActivityThread 及 实例对象
2、通过反射获取 Instrumentation 实例对象
3、通过反射替换 ActivityThread 中的 mInstrumentation 成员
二、Instrumentation 代理类
1、持有被代理实例对象
2、代理执行 execStartActivity 方法
3、截获 Activity 实例对象
4、替换 Activity 中的 mResources 成员
三、替换 Activity 中的 mResources 成员
1、判断 Activity 是否是插件中的组件
2、反射 ContextThemeWrapper 类
3、反射获取 ContextThemeWrapper 类的 mResources 字段
4、将插件资源设置到插件 Activity 中
四、完整代码示例
1、HookUtils 完整代码示例
2、Instrumentation 代理类完整代码示例
五、为不同的插件包设置不同的资源
六、博客资源
前言
在上一篇博客 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 ) 中 , 分析了加载插件资源 , 并替换 Activity 中 Resources 成员可用的 Hook 点 , 本篇博客开始实现插件资源的加载与替换 ;
一、使用 Hook 方式替换插件 Activity 资源
1、通过反射获取 ActivityThread 及 实例对象
首先反射 android.app.ActivityThread 类 , 该类是单例类 , 其唯一的实例对象定义在 sCurrentActivityThread 静态成员中 , 通过反射 , 可以获取 ActivityThread 的实例对象 ;
// 反射 ActivityThread 类 // 反射获取 ActivityThread 类中的 sCurrentActivityThread 静态成员 // 这是单例类内部的静态成员 Object sCurrentActivityThreadObj = Reflector.on("android.app.ActivityThread") // 反射 ActivityThread 类 .field("sCurrentActivityThread") // 获取 sCurrentActivityThread 字段 .get(); // 获取 sCurrentActivityThread 对象
上述代码使用了 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 ) 中的反射工具类 ;
2、通过反射获取 Instrumentation 实例对象
在 ActivityThread 中有 mInstrumentation 成员变量 , 这个就是 Android 启动过程中的 Instrumentation ;
最终目的是替换 sCurrentActivityThread 中的 mInstrumentation 字段 , 使用我们自定义的 Instrumentation 代理类 , 替换实际的 Instrumentation 实例对象 ;
// 反射获取 ActivityThread 对象中的 mInstrumentation 成员变量 // 目的是替换 sCurrentActivityThread 中的 mInstrumentation 字段 Reflector reflector = Reflector.on("android.app.ActivityThread") // 反射 ActivityThread 类 .field("mInstrumentation") // 获取 mInstrumentation 字段 .with(sCurrentActivityThreadObj); // 设置 ActivityThread 实例对象 // 获取 ActivityThread 中的 mInstrumentationObj 成员, 创建 Instrumentation 静态代理时使用 Instrumentation mInstrumentationObj = (Instrumentation) reflector.get();
上述代码使用了 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 ) 中的反射工具类 ;
3、通过反射替换 ActivityThread 中的 mInstrumentation 成员
将 ActivityThread 对象中的 mInstrumentation 成员变量 , 替换成开发者自己开发的代理类 ;
// 将 ActivityThread 对象中的 mInstrumentation 成员变量 // 替换成自己的代理类 reflector.set(new InstrumentationProxy(mInstrumentationObj));
下面介绍 InstrumentationProxy 的实现 ;
上述代码使用了 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 ) 中的反射工具类 ;