




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、安卓插件化分享李東江目錄 什么叫插件化(what) 為什么要使用插件化?插件化帶來的好處?(why) Android在插件化存在的問題和方案 (how) 貼吧中插件化的實現(xiàn) 貼吧中插件化遇到的問題和解決方案 插件化Demo計算機硬件系統(tǒng)中有各種各樣可插拔組件,比如cpu,硬盤,內(nèi)存等。當需要升級時,我們可以方便的更換其中一個或者幾個,只要符合主板規(guī)范,就可以正常工作。軟件系統(tǒng)中是否也能這樣“即插即用”?什么叫插件化 軟件系統(tǒng)中的插件借用了硬件系統(tǒng)中插件的思想。它是一種符合一定規(guī)范,實現(xiàn)了特定接口的程序,主要是用來擴展軟件的功能。 所謂插件化軟件開發(fā)就是將軟件系統(tǒng)分為一個主系統(tǒng)和若干個子系統(tǒng),主
2、系統(tǒng)做為容器,為插件提供運行環(huán)境,而將子系統(tǒng)做成相對獨立的插件。插件化帶來的好處 隔離風險 解耦,降低系統(tǒng)復雜性 易于維護 擴展性好 并行開發(fā) 其他收益 解決包大小的問題 解決方法數(shù)超限,字符數(shù)超限的問題Android插件化的問題如何從外部文件加載一個類?如何從外部文件加載so庫?如何從外部文件啟動一個Activity?如何從外部文件加載資源?Android如何加載類 Java是通過Classloader將類加載到JVM中,Android也是一樣 Android是通過DexClassloader、PathClassLoader將dex類加載到Dalvik中 DexClassLoader 可以加
3、載 apk, jar 或者 dex 文件 PathClassLoader只能加載已經(jīng)安裝到 Android 系統(tǒng)中的 apk 文件,也就是 /data/app 目錄下的 apk 文件。其它位置的文件加載的時候都會出現(xiàn) ClassNotFoundException.Classloader都采用了雙親代理模式,什么叫雙親代理模式呢?所謂雙親代理模式就是裝載一個類時,先由自己定義的類裝載器請求其parent裝載,parent再請求它自己的parent裝載,直到頂級的Bootstrap ClassLoader。 若某一級的parent能裝載則裝載之,否則由它的“下級”自己嘗試裝載。為什么要使用這種雙親
4、委托模式呢? 第一個原因就是因為這樣可以避免重復加載,當父親已經(jīng)加載了該類的時候,就沒有必要子ClassLoader再加載一次。 第二個原因就是考慮到安全因素,我們試想一下,如果不使用這種委托模式,那我們就可以隨時使用自定義的String來動態(tài)替代java核心api中定義類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因為String已經(jīng)在啟動時被加載,所以用戶自定義類是無法加載一個自定義的ClassLoader。 protected synchronized Class loadClass(String name, boolean resolve) throws Cl
5、assNotFoundException / 首先檢查該name指定的class是否有被加載 Class c = findLoadedClass(name); if (c = null) try if (parent != null) /如果parent不為null,則調(diào)用parent的loadClass進行加載 c = parent.loadClass(name, false); else /parent為null,則調(diào)用BootstrapClassLoader進行加載 c = findBootstrapClass0(name); catch (ClassNotFoundException
6、e) /如果仍然無法加載成功,則調(diào)用自身的findClass進行加載 c = findClass(name); if (resolve) resolveClass(c); return c;如何從外部文件加載一個類?可以使用DexClassLoader從外部文件加載類Android如何加載SO庫 Android通過調(diào)用System.loadLibrary加載so庫 System.loadLibrary會調(diào)用Runtime.getRuntime().loadLibrary loadLibrary會搜索當前調(diào)用System.loadLibrary類的ClassLoader的Library路徑 pu
7、blic static void loadLibrary(String libName) Runtime.getRuntime().loadLibrary(libName, VMStack.getCallingClassLoader(); 如何從外部文件加載so庫?指定ClassLoader的LibraryPathAndroid如何加載Activity 無法通過new一個對象的方式加載,必須用context.startActivity Activity必須在AndroidManifest.xml中配置 最終在ActivityThread (源碼)生成Activity對象 最終會用context
8、.mPackageInfo.getClassLoader的classloader加載Activity Version 7及其以下的api context的實現(xiàn)類是android.app.ApplicationContext Version 7以上的api context實現(xiàn)類是android.app.ContextImpl如何從外部文件啟動一個Activity?1.在配置文件中配置2.替換context.mPackageInfo中的classLoaderAndroid如何加載資源在activity內(nèi)部訪問資源(字符串,圖片等)是很簡單的,只要getResources然后就可以得到Resourc
9、es對象,有了Resources對象就可以訪問各種資源了Resources對象是通過ContextImpl中的getResource方法拿到的會調(diào)用ResourcesManager的getTopLevelResources方法最終調(diào)用Resources構造函數(shù)Resources的構造函數(shù)通過AssetManager初始化AssetManager的私有方法addAssetPath能夠添加路徑AssetManager只能識別APK中的資源如何從外部文件加載資源?重寫Activity的getResource方法,返回有外部資源的ResourceAndroid插件化的問題如何從外部文件加載一個類?如何
10、從外部文件加載so庫?如何從外部文件啟動一個Activity?如何從外部文件加載資源?ADK中插件化中的主要類PluginCenterPluginPluginDexLoaderPluginDownloaderPluginInstallerPluginResourceManagerRemoteSynchronousDataHelperPluginCenter 對外提供的接口 維護插件列表 通過PluginCenter拿到Plugin 安裝、卸載插件 啟用禁用插件Plugin 對外提供的接口 加載插件 獲取接口實例PluginDexLoader 內(nèi)部類 獲取插件加載需要的classloader 解
11、決Activity、Service等加載問題 解決SO加載問題PluginInstaller 內(nèi)部類 從Asset安裝插件 從其他路徑安裝插件PluginResourceManager 解決從外部加載資源的問題 管理插件資源的加載 管理全局插件資源路徑 創(chuàng)建插件資源的ResourcePluginDownloader & RemoteSynchronousDataHelper PluginDownloader 下載插件 RemoteSynchronousDataHelper 進行多進程同步 同步的時機是 插件安裝好的時候 插件啟用禁用狀態(tài)改變的時候ADK中插件化的主要配置文件Plugin.xml 路徑 pluginEX/$pluginName/Plugin.xml 會實例化為PluginXMLInfo類型 主要用于插件加載InstallConfig.xml 路徑 pluginEX/installedConfig.xml 記錄系統(tǒng)中已經(jīng)安裝的插件,啟動的時候?qū)⒁呀?jīng)安裝的插件加載EnableConfig.xml 路徑pluginEX/$pluginName/EnableConfig.xml 針對不同用戶記錄插件的啟用狀態(tài)ADK中插件化的目錄結構PluginEXXXX1XXX1.apkSO$archPlugin.xmlEnableConfig.xmlXXX2XX
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司毛衣直播策劃方案
- 公司行政服務活動方案
- 公司組織跑步小活動方案
- 公司校招策劃方案
- 公司春節(jié)后開業(yè)活動方案
- 公司新春慰問福利活動方案
- 公司瑜伽學習活動方案
- 公司組織制作香熏活動方案
- 公司氛圍策劃方案
- 公司聚會桌面活動方案
- 湘教版七年級下冊地理期末試卷-附答案
- 教科版五年級下冊科學知識點整理
- 小學六年級數(shù)學計算題100道(含答案)
- DB33T 2250-2020企業(yè)綜合能耗確權核算通則
- 年產(chǎn)24萬噸硫酸轉化系統(tǒng)工藝設計
- 楊元喜-組合導航與融合導航(簡本)
- GB/T 7721-2007連續(xù)累計自動衡器(電子皮帶秤)
- 護理查房(宮外孕)課件
- 公司扣款單據(jù)模板
- 會議服務中心經(jīng)營管理服務方案
- 糖尿病病人的業(yè)務學習課件
評論
0/150
提交評論