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

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

一、动态加载 " 插件 "


插件化 中 , " 宿主 " 模块 和 " 插件 " 模块 可以分开进行编译 , 二者之间互不影响 , 各个模块可以并发进行开发 , " 宿主 " 模块 可以 动态更新插件 ;


动态加载 " 插件 " 模块 是插件化开发的核心 ;


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


组件化 主要是设计好整个程序的架构 , 使用 Gradle 控制并切换 组件模式 / 集成模式 , 核心是 组件路由 的使用 ;


插件化 的核心就是实现 " 插件 " APK 的 动态加载与调用 ;


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


程序运行之后 , 通过 ClassLoader 可以 动态地加载类 ; 加载后的 字节码 数据都存放在 Java 虚拟机的运行期数据区 中 ;


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


格局线程划分 , 可以分为 线程共享数据区 和 线程不共享数据区 ;


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


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

本地方法栈 ;

程序计数器 : 该区域没有 OOM ;


线程共享的区域


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

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


Student student = new Student();

1

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


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


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


区域 3 33 : 程序计数器 ;


类加载时 , 在上述 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 中 ) ;


目录
相关文章
|
6月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
581 55
|
23天前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
159 4
|
30天前
|
存储 缓存 算法
深入理解JVM《JVM内存区域详解 - 世界的基石》
Java代码从编译到执行需经javac编译为.class字节码,再由JVM加载运行。JVM内存分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)区域,其中堆是GC主战场,方法区在JDK 8+演变为使用本地内存的元空间,直接内存则用于提升NIO性能,但可能引发OOM。
|
7月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
555 6
|
4月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
307 11
|
6月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
1560 2
|
8月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1341 0
|
4月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
403 0

热门文章

最新文章