1. 程式人生 > >Android中apk動態載入技術研究(2)android插件化及實現

Android中apk動態載入技術研究(2)android插件化及實現

name creat package path iss fontsize 調用 dex con

了解了android中類載入的前期知識點後,來看看android中DexClassLoader詳細的實現
詳細載入流程例如以下:
宿主程序會到文件系統比方SD卡中去載入APK【1】,然後通過一個叫proxy的Activity去運行apk中的Activity
關於動態載入ap。理論上可用用到DexClassLoad、PathClassLoader、URLClassLoader;
DexClassLoader: 能夠載入文件系統上的jar、dex、apk
PathClassLoader:能夠載入 /data/app 文件夾下的apk,這也意味著它僅僅能載入已經安裝的apk
URLClassLoader:能夠載入java中的jar,但因為android中的dalvik不能直接識別jar,全部該方法在android中無法使用。盡管有這個類

獲取AssetsManager
載入的方法是通過反射,通過調用AssetManager中的addAssetPath方法。我們能夠將一個apk中的資源載入到Resources中,因為addAssetPath是隱藏api我們無法直接調用,所以僅僅能通過反射,以下是它的聲明,通過凝視我們能夠看出,傳遞的路徑能夠是zip文件也能夠是一個資源文件夾。而apk就是一個zip。所以直接將apk的路徑傳給它,資源就載入到AssetManager中了,然後再通過AssetManager來創建一個新的Resources對象,這個對象就是我們能夠使用的apk中的資源了


封裝數據:
1:把classLoader、assetManager、resource作為插件的成員。封裝成bean
2:多插件時通過Map維護,當中key為apk的packageName


插件載入到內存流程:

技術分享

載入插件的Activity:

? 插件Activity本身無法啟動(生命周期,資源等問題),是通過宿主提供的ProxyActivity來載入的。 ? 當我們發Intent去啟動插件當Activity時實質啟動的是ProxyActivity ? 為了封裝細節所以封裝了DXIntent ? 全部插件實現了IDXPlugin接口 PrxoyActivity接管了全部插件Activity

DXPluginBean 封裝bean

?封裝了每一個Plugin也就是apk的數據
? 維護在DXPluginManger類的Map

DXPluginManager 插件管理核心類 ? 載入插件、啟動插件、插件維護
IDXPlugin:

?把每一個插件的Activity抽象成一個“插件” ? IDXPlugin實現了Activity的主要方法 ? onAttach方法是插件專用的回調方法,當插件ActivityProxy載入當時候proxy的引用賦值給that
DXIntent: ? pluginPackgeName: 跳轉的Plugin的包名,也就是
Manifest裏的packageName

pluginClassName:跳轉的Plugin中指定的ActivityName,能夠傳null,則默認時跳轉main Activity


DXPluginBaseActivity、DXPluginBaseFragmentActivity:

全部插件Activity繼承這兩個Activity

該Activity實現IDXPlugin接口

onAttach方法中獲得proxyActivity的引用

? 全部activity繼承方法中須要對插件本身啟動還是在宿主中被啟動進行推斷 ----》FROM_INTERNAL和FROM_EXTERNAL
DXProxyActivity、DXProxyFragmentActivity :. ? 宿主Activity ? host中調用插件Activity的跳轉,本質就是這兩個Activity之間的跳轉 ? 為插件提供真正的Context ? 為降低反復代碼將插件的初始化放在DXPluginInitializer類中
DXPluginInitializer ?修復theme帶來的崩潰問題 ? 啟動插件Activity

1 通過反射獲得插件Activity的默認構造函數

2 通過反射new出一個插件並強轉成IDXPlugin

3 回調onAttach方法傳入Prxoy的引用

4 調用onCreate方法調起插件



能夠直接參考demo:

http://download.csdn.net/detail/yaya_soft/8858645



Android中apk動態載入技術研究(2)android插件化及實現