【Android 插件化】Hook 插件化框架 ( 通过反射获取 “宿主“ 应用中的 Element[] dexElements )(一)

简介: 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “宿主“ 应用中的 Element[] dexElements )(一)

文章目录

Android 插件化系列文章目录

前言

一、通过反射获取 "宿主" 中的 Element[] dexElements

1、反射获取 BaseDexClassLoader.class

2、反射获取 DexPathList pathList 字段

3、反射获取 DexPathList pathList 对象

4、获取 DexPathList pathList 对象

5、反射获取 Element[] dexElements 字段

6、反射获取 Element[] dexElements 对象

二、完整代码示例


前言

在上一篇博客 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “插件包“ 中的 Element[] dexElements ) 介绍了从 " 插件包 " APK 文件中获取 Element[] dexElements 流程 , 本篇博客中介绍获取 “宿主“ 应用中的 Element[] dexElements ;



Android 中的类加载器 DexClassLoader , PathClassLoader 的父类是 BaseDexClassLoader ,


BaseDexClassLoader 中有 private final DexPathList pathList 成员变量 ,


DexPathList 中有 private Element[] dexElements 成员变量 ,


Element[] dexElements 就是最终存放 Dex 字节码数据的内存变量 , 最终将 " 宿主 " 应用中读取的 dexElements 合并到 " 宿主 " 应用的 dexElements 中 ;



获取 " 宿主 " 与 " 插件包 " Element[] dexElements 的区别在于 ,


" 插件包 " 的类加载器是 DexClassLoader , 是由开发者自己创建的 ;


// 创建类加载器
DexClassLoader plugin_dexClassLoader =
        new DexClassLoader(
                apkPath,                // 插件包路径
                cachePath,              // 插件包加载时产生的缓存路径
                null,   // 库的搜索路径, 可以设置为空
                mBase.getClassLoader()  // 父加载器, PathClassLoader
        );java


" 宿主 " 应用的类加载器 PathClassLoader 是由 Android 上下文 Context 提供的 , 也就是由系统创建的 ;


PathClassLoader host_pathClassLoader = (PathClassLoader) mBase.getClassLoader();






一、通过反射获取 “宿主” 中的 Element[] dexElements


反射 " 宿主 " 应用的 dexElement 执行步骤 :


① 反射获取 BaseDexClassLoader.class


② 反射获取 BaseDexClassLoader.calss 中的 private final DexPathList pathList 成员字段


③ 获取 PathClassLoader 类加载器中的 DexPathList pathList 成员对象


④ 获取 DexPathList.class


⑤ 反射获取 DexPathList.class 中的 private Element[] dexElements 成员变量的 Field 字段对象


⑥ 反射获取 DexPathList 对象中的 private Element[] dexElements 成员变量对象



1、反射获取 BaseDexClassLoader.class


反射获取 BaseDexClassLoader.class , 通过反射获取插件包中的 dexElements , 这种类加载是合并类加载 , 将所有的 Dex 文件 , 加入到应用的 dex 文件集合中 , 可参考 dex 加固 , 热修复 , 插装式插件化 的实现步骤 ;


反射出 BaseDexClassLoader 类 , PathClassLoader 和 DexClassLoader 都是 BaseDexClassLoader 的子类 ;


参考 : https://www.androidos.net.cn/android/9.0.0_r8/xref/libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java


代码示例 :


// ① 反射获取 BaseDexClassLoader.class
Class<?> host_baseDexClassLoaderClass = null;
try {
    host_baseDexClassLoaderClass = Class.forName("dalvik.system.BaseDexClassLoader");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}


2、反射获取 DexPathList pathList 字段


// ② 反射获取 BaseDexClassLoader.calss 中的 private final DexPathList pathList 成员字段
Field host_pathListField = null;
try {
    host_pathListField = host_baseDexClassLoaderClass.getDeclaredField("pathList");
    // 设置属性的可见性
    host_pathListField.setAccessible(true);
} catch (NoSuchFieldException e) {
    e.printStackTrace();
}



3、反射获取 DexPathList pathList 对象


根据 Field 字段获取 成员变量 , DexClassLoader 继承了 BaseDexClassLoader, 因此其内部肯定有 private final DexPathList pathList 成员变量 ;


// ③ 反射获取 DexClassLoader 类加载器中的 DexPathList pathList 成员对象
// 根据 Field 字段获取 成员变量
//  DexClassLoader 继承了 BaseDexClassLoader, 因此其内部肯定有
//  private final DexPathList pathList 成员变量
PathClassLoader host_pathClassLoader = (PathClassLoader) mBase.getClassLoader();
Object host_pathListObject = null;
try {
    host_pathListObject = host_pathListField.get(host_pathClassLoader);
} catch (IllegalAccessException e) {
    e.printStackTrace();
}



目录
相关文章
|
2月前
|
Android开发
安卓逆向 -- Hook多个dex文件
安卓逆向 -- Hook多个dex文件
18 1
|
3月前
|
算法 安全 Android开发
安卓逆向 -- Frida Hook某车_sign算法分析
安卓逆向 -- Frida Hook某车_sign算法分析
76 0
|
3月前
|
Shell Android开发 数据安全/隐私保护
安卓逆向 -- Frida环境搭建(HOOK实例)
安卓逆向 -- Frida环境搭建(HOOK实例)
36 0
|
6月前
|
算法 安全 Android开发
安卓逆向 -- Frida Hook某车_sign算法分析
安卓逆向 -- Frida Hook某车_sign算法分析
31 0
|
19天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
94 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
1月前
|
机器学习/深度学习 调度 Android开发
安卓应用开发:打造高效通知管理系统
【2月更文挑战第14天】 在移动操作系统中,通知管理是影响用户体验的关键因素之一。本文将探讨如何在安卓平台上构建一个高效的通知管理系统,包括服务、频道和通知的优化策略。我们将讨论最新的安卓开发工具和技术,以及如何通过这些工具提高通知的可见性和用户互动性,同时确保不会对用户造成干扰。
33 1
|
10天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
19天前
|
Android开发
Android开发小技巧:怎样在 textview 前面加上一个小图标。
Android开发小技巧:怎样在 textview 前面加上一个小图标。
10 0