Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )

网友投稿 830 2022-05-29

Android 插件化系列文章目录

【Android 插件化】插件化简介 ( 组件化与插件化 )

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

【Android 插件化】插件化原理 ( 类加载器 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )

文章目录

Android 插件化系列文章目录

一、动态加载 " 插件 "

二、Java 虚拟机中的内存存储

三、类加载流程

一、动态加载 " 插件 "

插件化 中 ,

" 宿主 " 模块

" 插件 " 模块

可以分开进行编译 , 二者之间互不影响 , 各个模块可以并发进行开发 ,

" 宿主 " 模块

可以

动态更新插件 ;

动态加载 " 插件 " 模块

是插件化开发的核心 ;

动态加载 : " 宿主 " 模块 , 没有具体的业务 , 只提供一个空壳 , 功能逻辑实现都在 " 插件 " 模块中 , 在程序运行之后 , 才动态加载 " 插件 " 模块 APK 文件 ;

组件化 主要是设计好整个程序的架构 , 使用

Gradle

控制并切换

组件模式 / 集成模式

, 核心是

组件路由

的使用 ;

插件化 的核心就是实现

" 插件 " APK 的

动态加载与调用 ;

二、Java 虚拟机中的内存存储

程序运行之后 , 通过

ClassLoader

可以

动态地加载类

; 加载后的 字节码 数据都存放在

Java 虚拟机的运行期数据区

中 ;

手机为 JVM 虚拟机分配一块内存 , 总称为 JVM 运行期数据区 , 该数据区分为以下几块内容 ,

格局线程划分 , 可以分为

线程共享数据区

线程不共享数据区 ;

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

线程不共享数据区 中 , 包含如下几个内存区域

JVM 栈

: Java 虚拟机栈 , 存放 局部变量 , Class 字节码数据 ;

本地方法栈 ;

程序计数器

: 该区域没有 OOM ;

线程共享的区域

Java 堆

: Java 中通过 new 创建的对象 , 都存放在 Java 堆中 ;

方法区

: 存储 常量值 , 静态变量 , 该内存区域的数据很少被回收 ;

Student student = new Student();

1

上述方法涉及到了 3 3 3 个区域 ,

区域 1 1 1 : new Student() 创建的对象在 Java 堆中 ;

区域 2 2 2 : Student student 放在 Java 虚拟机栈中 , 保存了指向 Java 堆中对象的地址 ;

区域 3 3 3 : 程序计数器 ;

类加载时 , 在上述 JVM 栈中拿到 Class 字节码数据 , 生成 Class 对象 ;

加载 Student 类的 Class 字节码对象的情景 :

① 调用 new Student() 构造函数

, 一定会将 Student.class 类对象加载到内存中 , 该 Class 类字节码对象 内存中只存在一个 ; 如果程序中没有加载 Student 类对象 , 就无法使用 Student 类 ;

② Student 类中有静态变量 ;

③ Student 类的子类 Class 对象加载 ;

三、类加载流程

具体的动态加载 Class 的流程参考如下步骤 :

1 . 步骤一 : 获得系统

DexPathList

中的

Element[] dexElements

数组 ,

(

libcore/dalvik/src/main/java/dalvik/system/DexPathList.java

) ;

2 . 步骤二 : 在本应用中创建

Element[] dexElements

数组 , 用于存放解密后的 dex 文件 ;

3 . 步骤三 : 将 系统加载的 Element[] dexElements 数组 , 与我们自己创建的 Element[] dexElements 数组进行

合并操作

4 . 步骤四 :

替换

ClassLoader 加载过程中的

Element[] dexElements 数组

( 封装在 DexPathList 中 ) ;

参考博客 : 在 Dex 加固 和 热修复中 , 都使用了上述原理 ;

【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 反射获取系统的 Element[] dexElements )

【Android 热修复】热修复原理 ( 类加载机制 | PathClassLoader 加载 Dex 机制 | PathDexList 查找 Class 机制 | 类查找的顺序机制 )

Android JVM

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:多线程——Java中继承Thread类与实现Runnable接口的区别
下一篇:浅谈华为云WeLink的跨企业沟通功能?
相关文章