【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
Android 插件化系列文章目录
【Android 插件化】插件化简介 ( 组件化与插件化 ) 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 ) 【Android 插件化】插件化原理 ( 类加载器 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
文章目录
一、动态加载 " 插件 "
插件化 中 , " 宿主 " 模块 和 " 插件 " 模块 可以分开进行编译 , 二者之间互不影响 , 各个模块可以并发进行开发 , " 宿主 " 模块 可以 动态更新插件 ;
动态加载 " 插件 " 模块 是插件化开发的核心 ;
动态加载 : " 宿主 " 模块 , 没有具体的业务 , 只提供一个空壳 , 功能逻辑实现都在 " 插件 " 模块中 , 在程序运行之后 , 才动态加载 " 插件 " 模块 APK 文件 ;
组件化 主要是设计好整个程序的架构 , 使用 Gradle 控制并切换 组件模式 / 集成模式 , 核心是 组件路由 的使用 ;
插件化 的核心就是实现 " 插件 " APK 的 动态加载与调用 ;
二、Java 虚拟机中的内存存储
程序运行之后 , 通过 ClassLoader 可以 动态地加载类 ; 加载后的 字节码 数据都存放在 Java 虚拟机的运行期数据区 中 ;
手机为 JVM 虚拟机分配一块内存 , 总称为 JVM 运行期数据区 , 该数据区分为以下几块内容 ,
格局线程划分 , 可以分为 线程共享数据区 和 线程不共享数据区 ;
线程不共享数据区 中 , 包含如下几个内存区域
- JVM 栈 : Java 虚拟机栈 , 存放 局部变量 , Class 字节码数据 ;
- 本地方法栈 ;
- 程序计数器 : 该区域没有 OOM ;
线程共享的区域
- Java 堆 : Java 中通过 new 创建的对象 , 都存放在 Java 堆中 ;
- 方法区 : 存储 常量值 , 静态变量 , 该内存区域的数据很少被回收 ;
Student student = new Student();
上述方法涉及到了 3 个区域 ,
区域 1 : new Student()
创建的对象在 Java 堆中 ;
区域 2 : Student student
放在 Java 虚拟机栈中 , 保存了指向 Java 堆中对象的地址 ;
区域 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开机动画多长时间_Android开机动画及黑屏[通俗易懂]
- Android listView中的button点击事件[通俗易懂]
- android activity singletask,Android Activity启动模式之singleTask实例详解
- android 安装p12证书,如何在Android中使用p12证书(客户端证书)
- android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用
- android cs bs 架构,BS架构与CS架构的区别
- Android原生编解码接口 MediaCodec 之——踩坑
- eclipse中android开发_Android开发教程
- android 系统浏览器 源码-Android 最最最简单的浏览器代码
- 浅谈android应用的版本更新
- 【Android 插件化】插件化简介 ( 组件化与插件化 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ⑥ ( 进入 ijkplayer-android/android 目录 | 执行 compile-ijk.sh 脚本完成编译 )
- 【Android Gradle 插件】AndroidSourceSets 配置 ② ( BaseExtension#sourceSets 配置 | AndroidSourceSets 配置简介 )
- 【错误记录】Android Studio 集成 ARoute 编译报错 ( 兼容 support 库和 androidx 库 | add ‘tools:replace=“android:appCo )
- 【Kotlin 协程】协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )
- android dataBinding详解手机开发
- Android Studio 导入项目 出现安装Error:Cause: failed to find target with hash string ‘android-23’ 等错误详解手机开发
- Linux监控JVM系统性能优化实战(linux监控jvm)
- 谷歌公布 Android 6.0 设备要求:强制开启全磁盘加密
- Linux 系统 JVM 日志分析指南(linux jvm 日志)
- Oracle JVM大路在何方(jvm路径 oracle)
- Oracle JVM安装指南(oracle jvm安装)
- 安卓(Android)中如何实现滑动导航
- Android中Parcelable的作用实例解析