Android 插件化系列文章目录

【Android 插件化】插件化简介 ( 组件化与插件化 )
【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
【Android 插件化】插件化原理 ( 类加载器 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )

【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 )
【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )
【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

【Android 插件化】Hook 插件化框架 ( hook 插件化原理 | 插件包管理 )


文章目录

  • Android 插件化系列文章目录
  • 前言
  • 一、hook 插件化原理
  • 二、插件化依赖库创建
  • 三、插件包管理
  • 四、插件包管理完整代码示例
  • 五、博客资源

前言

前 222 篇博客 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 ) , 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 ) 中 , 分析了从 Activity 调用 startActivity 启动另一个 Activity 的底层源码流程 , 涉及到了 222 个进程 , 一个是本应用的主线程所在的进程 , 一个是 ActivityManagerService 进程 ;

本博客中开始对 Activity 启动过程进行 Hook 操作 , 基于 Android 999 , API 282828 版本 , 这里要注意 , 不同的 API 版本底层源码逻辑不同 , Hook 点以及 Hook 方式也不同 ;

目前的主流插件化框架都已经兼容到了 Android 101010 版本 ;


一、hook 插件化原理


使用 Hook 实现的插件化原理如下 : 通过以下 333 个步骤实现插件化 ;

1. 加载插件包中的字节码

2. hook 技术 : 直接通过 hook 技术, 钩住系统的 Activity 启动流程实现

① Activity 对象创建之前 , 要做很多初始化操作 , 先在 ActivityRecord 中加载 Activity 信息 , 如果修改了该信息 , 将要跳转的 Activity 信息修改为插件包中的 Activity , 原来的 Activity 只用于占位 , 用于欺骗 Android 系统 ;

② 使用 hook 技术 , 加载插件包 apk 中的 Activity

③ 实现跳转的 Activity ( 插件包中的 )

3. 资源加载 : 主要是解决 Resources 资源冲突问题 ;

( 使用上述 hook 插件化 , 可以不用考虑 Activity 的生命周期问题 )

占位 Activity : 插件包中的 Activity 是通过正规流程 , 由 AMS 进行创建并加载的 , 但是 该 Activity 并没有在 AndroidManifest.xml 清单文件中注册 , 这里需要一个已经在清单文件注册的 Activity 欺骗系统 ;

插装式插件化 : 是通过代理 Activity , 将 插件包加载的 字节码 Class 类 中 对应的 Activity 类作为一个普通的 Java 类 , 该普通的 Java 类有所有的 Activity 的业务逻辑 , 该 Activity 的生命周期 , 由代理 Activity 执行相关的生命周期方法

hook 插件化 : hook 插件化直接钩住系统中 Activity 启动流程的某个点

二、插件化依赖库创建


hook 插件化依赖库是 Android 依赖库 ( Android Library Module ) ;

创建插件化的核心依赖库 :

通过该 lib_plugin_core 依赖库 , 实现插件化相关功能 ;

在其中创建插件化的核心管理类 PluginManager , 用于管理插件相关内容 ;

三、插件包管理


插件包目录 : 将插件包放在 /data/data/< package name >/files/ 目录中 ;

// 插件包的绝对路径 ,  /data/data/< package name >/files/
String apkPath = mBase.getFilesDir().getAbsolutePath() + "plugin.apk";

插件包缓存目录 : 同时设置 , 加载插件包中产生的缓存文件路径是 /data/data/< package name >/app_plugin_cache/ 目录 ;

// 加载插件包后产生的缓存文件路径
// /data/data/< package name >/app_plugin_cache/
String cachePath =mBase.getDir("plugin_cache", Context.MODE_PRIVATE).getAbsolutePath();

创建插件包的类加载器 :

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

四、插件包管理完整代码示例


package kim.hsl.plugin;import android.content.Context;import java.lang.reflect.Field;import dalvik.system.DexClassLoader;/*** 使用 Hook 实现的插件使用入口*  1. 加载插件包中的字节码*  2. 直接通过 hook 技术, 钩住系统的 Activity 启动流程实现*      ① Activity 对象创建之前 , 要做很多初始化操作 , 先在 ActivityRecord 中加载 Activity 信息*          如果修改了该信息 , 将要跳转的 Activity 信息修改为插件包中的 Activity*          原来的 Activity 只用于占位 , 用于欺骗 Android 系统*      ② 使用 hook 技术 , 加载插件包 apk 中的 Activity*      ③ 实现跳转的 Activity ( 插件包中的 )*  3. 解决 Resources 资源冲突问题*  ( 使用上述 hook 插件化 , 可以不用考虑 Activity 的声明周期问题 )**  插件包中的 Activity 是通过正规流程 , 由 AMS 进行创建并加载的*      但是该 Activity 并没有在 AndroidManifest.xml 清单文件中注册*      这里需要一个已经在清单文件注册的 Activity 欺骗系统**  插装式插件化 是通过代理 Activity , 将插件包加载的字节码 Class 作为一个普通的 Java 类*      该普通的 Java 类有所有的 Activity 的业务逻辑*      该 Activity 的声明周期 , 由代理 Activity 执行相关的生命周期方法*  hook 插件化 : hook 插件化直接钩住系统中 Activity 启动流程的某个点*      使用插件包中的 Activity 替换占位的 Activity*/
public class PluginManager {/*** 上下文*/private Context mBase;/*** 单例*/private static PluginManager instance;public static PluginManager getInstance(Context context) {if (instance == null) {instance = new PluginManager(context);}return instance;}private PluginManager(Context context) {this.mBase = context;}/*** Application 启动后 , 调用该方法初始化插件化环境*  加载插件包中的字节码*/private void init() {// 加载 apk 文件loadApk();}private void loadApk() {// 插件包的绝对路径 ,  /data/data/< package name >/files/String apkPath = mBase.getFilesDir().getAbsolutePath() + "plugin.apk";// 加载插件包后产生的缓存文件路径// /data/data/< package name >/app_plugin_cache/String cachePath =mBase.getDir("plugin_cache", Context.MODE_PRIVATE).getAbsolutePath();// 创建类加载器DexClassLoader plugin_dexClassLoader =new DexClassLoader(apkPath,                // 插件包路径cachePath,              // 插件包加载时产生的缓存路径null,   // 库的搜索路径, 可以设置为空mBase.getClassLoader()  // 父加载器, PathClassLoader);}}

五、博客资源


博客资源 :

  • GitHub : https://github.com/han1202012/Plugin_Hook

【Android 插件化】Hook 插件化框架 ( hook 插件化原理 | 插件包管理 )相关推荐

  1. Android 注解Annotation及在流行框架中使用的原理

    前言 Annotation--注解,JDK1.5新增加的功能.它能够添加到 Java 源代码的语法元数据.类.方法.变量.参数.包都可以被注解,可用来将信息元数据与程序元素进行关联.目前很多开源库都使 ...

  2. 【Android 插件化】Hook 插件化框架总结 ( 插件包管理 | Hook Activity 启动流程 | Hook 插件包资源加载 ) ★★★

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  3. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 主线程创建 Activity 实例之前使用插件 Activity 类替换占位的组件 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | AMS 启动前使用动态代理替换掉插件 Activity 类 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  6. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  7. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. delete后加 limit是个好习惯么 !
  2. Cocoon的sitemap详解
  3. Visual Studio 常见问题及解决方案(持续更新)
  4. php截取字符串,带中文,多余的省略号代替
  5. 修改类名后依旧按照原先的类名进行加载
  6. C++读取Json生成随机名字
  7. Windows系统(cmd)常用命令
  8. Understand-4.0.877-Linux-64bit.tgz最新版本2017年源代码阅读利器,养眼theme之配置
  9. 2017.0713.《计算机组成原理》-汉明码
  10. python中字符a如何变成b_python 如何把'a=b'这样的字符解析成dict类型
  11. 数字电子技术基础第六版阎石王红课后答案
  12. opencv中calcOpticalFlowPyrLK实现的光流法(Lucas-Kanade Method for Sparse Optical Flow)原理解析 (摘要翻译)
  13. Log:Spdlog初探(1)
  14. Zabbix如何配置告警短信?(预警短信通知设置流程)
  15. 已解决:Component should be written as a pure functioneslintreact/prefer-stateless-fun报错
  16. 套接字 I/O 模型 WSAEvent
  17. 古诗+代码 = 绝配
  18. 跨平台AR增强现实开发(一)(AR开发环境的搭建)
  19. 萤石android demmo错误,Deemo - 叩击心灵的旋律 - Android 应用 - 【最美应用】
  20. WiFi共享精灵与路由器

热门文章

  1. SPQuery 查询知多少
  2. 挑出IIS日志里某一文件的请求次数
  3. omnicppcomplete - a Vim plugin [转载]
  4. opencv imshow
  5. Smali插桩打日志
  6. SELinux 入门
  7. hive的用户和用户权限
  8. win10 1709电脑无法显示局域网共享
  9. Android SQLite调试
  10. python学习--numpy的数组