Android中的Serializable、Parcelable">Android中的Serializable、Parcelable
945
2025-04-01
Android 插件化系列文章目錄
【Android 插件化】插件化簡介 ( 組件化與插件化 )
【Android 插件化】插件化原理 ( JVM 內(nèi)存數(shù)據(jù) | 類加載流程 )
【Android 插件化】插件化原理 ( 類加載器 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 原理與實現(xiàn)思路 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 類加載器創(chuàng)建 | 資源加載 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 獲取插件入口 Activity 組件 | 加載插件 Resources 資源 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 運行應(yīng)用 | 代碼整理 )
文章目錄
Android 插件化系列文章目錄
一、動態(tài)加載 " 插件 "
二、Java 虛擬機中的內(nèi)存存儲
三、類加載流程
一、動態(tài)加載 " 插件 "
插件化 中 ,
" 宿主 " 模塊
和
" 插件 " 模塊
可以分開進行編譯 , 二者之間互不影響 , 各個模塊可以并發(fā)進行開發(fā) ,
" 宿主 " 模塊
可以
動態(tài)更新插件 ;
動態(tài)加載 " 插件 " 模塊
是插件化開發(fā)的核心 ;
動態(tài)加載 : " 宿主 " 模塊 , 沒有具體的業(yè)務(wù) , 只提供一個空殼 , 功能邏輯實現(xiàn)都在 " 插件 " 模塊中 , 在程序運行之后 , 才動態(tài)加載 " 插件 " 模塊 APK 文件 ;
組件化 主要是設(shè)計好整個程序的架構(gòu) , 使用
Gradle
控制并切換
組件模式 / 集成模式
, 核心是
組件路由
的使用 ;
插件化 的核心就是實現(xiàn)
" 插件 " APK 的
動態(tài)加載與調(diào)用 ;
二、Java 虛擬機中的內(nèi)存存儲
程序運行之后 , 通過
ClassLoader
可以
動態(tài)地加載類
; 加載后的 字節(jié)碼 數(shù)據(jù)都存放在
Java 虛擬機的運行期數(shù)據(jù)區(qū)
中 ;
手機為 JVM 虛擬機分配一塊內(nèi)存 , 總稱為 JVM 運行期數(shù)據(jù)區(qū) , 該數(shù)據(jù)區(qū)分為以下幾塊內(nèi)容 ,
格局線程劃分 , 可以分為
線程共享數(shù)據(jù)區(qū)
和
線程不共享數(shù)據(jù)區(qū) ;
線程不共享數(shù)據(jù)區(qū) 中 , 包含如下幾個內(nèi)存區(qū)域
JVM 棧
: Java 虛擬機棧 , 存放 局部變量 , Class 字節(jié)碼數(shù)據(jù) ;
本地方法棧 ;
程序計數(shù)器
: 該區(qū)域沒有 OOM ;
線程共享的區(qū)域
Java 堆
: Java 中通過 new 創(chuàng)建的對象 , 都存放在 Java 堆中 ;
方法區(qū)
: 存儲 常量值 , 靜態(tài)變量 , 該內(nèi)存區(qū)域的數(shù)據(jù)很少被回收 ;
Student student = new Student();
1
上述方法涉及到了 3 3 3 個區(qū)域 ,
區(qū)域 1 1 1 : new Student() 創(chuàng)建的對象在 Java 堆中 ;
區(qū)域 2 2 2 : Student student 放在 Java 虛擬機棧中 , 保存了指向 Java 堆中對象的地址 ;
區(qū)域 3 3 3 : 程序計數(shù)器 ;
類加載時 , 在上述 JVM 棧中拿到 Class 字節(jié)碼數(shù)據(jù) , 生成 Class 對象 ;
加載 Student 類的 Class 字節(jié)碼對象的情景 :
① 調(diào)用 new Student() 構(gòu)造函數(shù)
, 一定會將 Student.class 類對象加載到內(nèi)存中 , 該 Class 類字節(jié)碼對象 內(nèi)存中只存在一個 ; 如果程序中沒有加載 Student 類對象 , 就無法使用 Student 類 ;
② Student 類中有靜態(tài)變量 ;
③ Student 類的子類 Class 對象加載 ;
三、類加載流程
具體的動態(tài)加載 Class 的流程參考如下步驟 :
1 . 步驟一 : 獲得系統(tǒng)
DexPathList
中的
Element[] dexElements
數(shù)組 ,
(
libcore/dalvik/src/main/java/dalvik/system/DexPathList.java
) ;
2 . 步驟二 : 在本應(yīng)用中創(chuàng)建
Element[] dexElements
數(shù)組 , 用于存放解密后的 dex 文件 ;
3 . 步驟三 : 將 系統(tǒng)加載的 Element[] dexElements 數(shù)組 , 與我們自己創(chuàng)建的 Element[] dexElements 數(shù)組進行
合并操作
4 . 步驟四 :
替換
ClassLoader 加載過程中的
Element[] dexElements 數(shù)組
( 封裝在 DexPathList 中 ) ;
參考博客 : 在 Dex 加固 和 熱修復(fù)中 , 都使用了上述原理 ;
【Android 安全】DEX 加密 ( 代理 Application 開發(fā) | 加載 dex 文件 | 反射獲取系統(tǒng)的 Element[] dexElements )
【Android 熱修復(fù)】熱修復(fù)原理 ( 類加載機制 | PathClassLoader 加載 Dex 機制 | PathDexList 查找 Class 機制 | 類查找的順序機制 )
Android JVM
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。