【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )
Android 插件化系列文章目錄
【Android 插件化】插件化簡(jiǎn)介 ( 組件化與插件化 )
【Android 插件化】插件化原理 ( JVM 內(nèi)存數(shù)據(jù) | 類(lèi)加載流程 )
【Android 插件化】插件化原理 ( 類(lèi)加載器 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 原理與實(shí)現(xiàn)思路 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 類(lèi)加載器創(chuàng)建 | 資源加載 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 獲取插件入口 Activity 組件 | 加載插件 Resources 資源 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 運(yùn)行應(yīng)用 | 代碼整理 )
文章目錄
- Android 插件化系列文章目錄
- 一、" 插樁式 " 插件化
- 二、插件包中的組件類(lèi) 與 應(yīng)用中的組件類(lèi) 區(qū)別
- 三、" 代理 " 組件 與 " 插件 " 組件
- 四、" 插樁式 " 插件化框架實(shí)現(xiàn)思路
一、" 插樁式 " 插件化
將 " 插件 " 模塊 編譯打包成 apk 文件 , 該文件包含 classes.dex 文件 , 被打包在了 apk 壓縮包中 ;
只要拿到了 apk 文件 , 就可以將其解壓 , 獲取到其中的 classes.dex 文件 , 可以自己實(shí)現(xiàn)一個(gè) DexClassLoader 加載該 dex 文件 , 進(jìn)而調(diào)用其中封裝的字節(jié)碼類(lèi)對(duì)象 ;
" 插樁式 " 插件化 : 在 " 宿主 " 模塊 應(yīng)用中 , 將 " 插件 " 模塊 apk 插入到程序中 , 可以調(diào)用這些 apk 安裝包中的功能 ; " 宿主 " 模塊中需要提前預(yù)留好 插件組件 對(duì)應(yīng)的 代理組件 接口 ;
類(lèi)似于電腦主板 , 提前預(yù)制好插槽 , 可以插入內(nèi)存條 , 顯卡等硬件設(shè)備 , 主板運(yùn)行時(shí)調(diào)用這些設(shè)備 ;
二、插件包中的組件類(lèi) 與 應(yīng)用中的組件類(lèi) 區(qū)別
應(yīng)用中的組件 :
應(yīng)用運(yùn)行時(shí) , 插件包 apk 是 運(yùn)行后才加載的 , 將該 apk 文件中的 dex 加載到內(nèi)存之后 , 其中的 Activity , Service 等組件類(lèi) , 與 當(dāng)前應(yīng)用運(yùn)行的組件 是有區(qū)別的 , 這些新加入的組件類(lèi)沒(méi)有上下文 ;
應(yīng)用中的 Activity , Service 等組件初始化 , 不需要開(kāi)發(fā)者干預(yù) , 都是由系統(tǒng)完成的 , 這些組件都在清單文件中注冊(cè)過(guò)了 , 系統(tǒng)按照清單初始化相關(guān)組件 ;
插件包中的組件 :
插件包 apk 中的類(lèi) , 是通過(guò) DexClassLoader 加載到內(nèi)存中的 , 僅僅是加載了 字節(jié)碼數(shù)據(jù) , 組件的初始化 , 賦予上下文等 , 必須 由開(kāi)發(fā)者手動(dòng)完成 , 應(yīng)用系統(tǒng)是不管的 ;
加載的插件中的 Activity 并不是 Activity 組件 , 只是 有 Activity 方法 , 成員 , 繼承關(guān)系的字節(jié)碼類(lèi) ;
插件 Activity 類(lèi)沒(méi)有生命周期 , 不在 ActivityManagerService 管理范疇內(nèi) ;
這些通過(guò)插件包加載進(jìn)來(lái)的組件類(lèi)的生命周期 , 需要開(kāi)發(fā)者進(jìn)行管理 ;
三、" 代理 " 組件 與 " 插件 " 組件
代理 Activity ( ProxyActivity ) 與 插件 Activity ( PluginActivity ) :
將加載進(jìn)來(lái)的 Activity 類(lèi) ( PluginActivity ) 當(dāng)做普通類(lèi) , 構(gòu)造一個(gè) 代理 Activity , 命名為 ProxyActivity , 在 ProxyActivity 中 持有從 apk 插件包中加載的 PluginActivity 類(lèi)對(duì)象 ;
ProxyActivity 是空的 Activity , 沒(méi)有任何實(shí)際的業(yè)務(wù)邏輯 , 只是作為一個(gè) 生命周期的轉(zhuǎn)接代理接口 ; 但是 ProxyActivity 有著完整的生命周期回調(diào)機(jī)制 , 在進(jìn)入該界面時(shí)會(huì)回調(diào) onCreate , onStart , onResume 生命周期方法 , 在退出該界面時(shí)會(huì)回調(diào) onPause , onStop , onDestroy 生命周期方法 ;
在 ProxyActivity 中的生命周期方法中, 調(diào)用 PluginActivity 相應(yīng)的生命周期方法即可 ;
ProxyActivity 運(yùn)行時(shí)會(huì)有上下文 , PluginActivity 使用上下文時(shí)調(diào)用 ProxyActivity 的上下文 ;
四、" 插樁式 " 插件化框架實(shí)現(xiàn)思路
" 插樁式 " 插件化框架 實(shí)現(xiàn)思路 : 如果要加載 " 插件 " 模塊 編譯的 apk 插件包中的 Activity 類(lèi) , 需要執(zhí)行如下流程 ;
① 加載類(lèi)對(duì)象 : 使用 DexClassLoader 加載 Activity 對(duì)應(yīng)的 Class 字節(jié)碼類(lèi)對(duì)象 ;
② 管理生命周期 : 處理加載進(jìn)來(lái)的 Activity 類(lèi)的生命周期 , 創(chuàng)建 ProxyActivity , 通過(guò)其生命周期回調(diào) , 代理管理 插件包中加載的未納入應(yīng)用管理的組件 Activity 類(lèi) ;
③ 注入上下文 : 為加載進(jìn)來(lái)的 Activity 類(lèi)注入 上下文 ;
④ 加載資源 : 使用 AssetManager 將插件包 apk 中的資源主動(dòng)加載進(jìn)來(lái) ;
總結(jié)
以上是生活随笔為你收集整理的【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Android 插件化】插件化原理 (
- 下一篇: 【错误记录】Android Studio