【Android 插件化】Hook 插件化框架 ( 使用 Hook 方式替换插件 Activity 的 mResources 成员变量 )(一)

简介: 【Android 插件化】Hook 插件化框架 ( 使用 Hook 方式替换插件 Activity 的 mResources 成员变量 )(一)

文章目录

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 插件化框架 ( 反射工具类 | 反射常用操作整理 ) 中的反射工具类 ;






目录
相关文章
|
1月前
|
SQL 缓存 安全
Android ORM 框架之 greenDAO
Android ORM 框架之 greenDAO
37 0
|
5天前
|
Android开发
Android 插件化
Android 插件化
13 0
|
2天前
|
XML Java Android开发
利用Bundle实现Android Activity间消息的传递
利用Bundle实现Android Activity间消息的传递
|
2天前
|
Android开发 数据库管理
Android如何在Activity和Service之间传递数据
Android如何在Activity和Service之间传递数据
10 3
|
5天前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
11 0
|
5天前
|
Shell Android开发
Android Activity重写dump方法实现通过adb调试代码
Android Activity重写dump方法实现通过adb调试代码
11 0
|
1月前
|
Java Android开发
Android四大组件之Activity组件
Android四大组件之Activity组件
|
3月前
|
Android开发
安卓逆向 -- Hook多个dex文件
安卓逆向 -- Hook多个dex文件
20 1
|
3月前
|
Android开发
[Android 四大组件] --- Activity
[Android 四大组件] --- Activity
25 1
|
4月前
|
算法 安全 Android开发
安卓逆向 -- Frida Hook某车_sign算法分析
安卓逆向 -- Frida Hook某车_sign算法分析
79 0