安卓插件化分享._第1頁
安卓插件化分享._第2頁
安卓插件化分享._第3頁
安卓插件化分享._第4頁
安卓插件化分享._第5頁
已閱讀5頁,還剩26頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、安卓插件化分享李東江目錄 什么叫插件化(what) 為什么要使用插件化?插件化帶來的好處?(why) Android在插件化存在的問題和方案 (how) 貼吧中插件化的實現 貼吧中插件化遇到的問題和解決方案 插件化Demo計算機硬件系統中有各種各樣可插拔組件,比如cpu,硬盤,內存等。當需要升級時,我們可以方便的更換其中一個或者幾個,只要符合主板規范,就可以正常工作。軟件系統中是否也能這樣“即插即用”?什么叫插件化 軟件系統中的插件借用了硬件系統中插件的思想。它是一種符合一定規范,實現了特定接口的程序,主要是用來擴展軟件的功能。 所謂插件化軟件開發就是將軟件系統分為一個主系統和若干個子系統,主

2、系統做為容器,為插件提供運行環境,而將子系統做成相對獨立的插件。插件化帶來的好處 隔離風險 解耦,降低系統復雜性 易于維護 擴展性好 并行開發 其他收益 解決包大小的問題 解決方法數超限,字符數超限的問題Android插件化的問題如何從外部文件加載一個類?如何從外部文件加載so庫?如何從外部文件啟動一個Activity?如何從外部文件加載資源?Android如何加載類 Java是通過Classloader將類加載到JVM中,Android也是一樣 Android是通過DexClassloader、PathClassLoader將dex類加載到Dalvik中 DexClassLoader 可以加

3、載 apk, jar 或者 dex 文件 PathClassLoader只能加載已經安裝到 Android 系統中的 apk 文件,也就是 /data/app 目錄下的 apk 文件。其它位置的文件加載的時候都會出現 ClassNotFoundException.Classloader都采用了雙親代理模式,什么叫雙親代理模式呢?所謂雙親代理模式就是裝載一個類時,先由自己定義的類裝載器請求其parent裝載,parent再請求它自己的parent裝載,直到頂級的Bootstrap ClassLoader。 若某一級的parent能裝載則裝載之,否則由它的“下級”自己嘗試裝載。為什么要使用這種雙親

4、委托模式呢? 第一個原因就是因為這樣可以避免重復加載,當父親已經加載了該類的時候,就沒有必要子ClassLoader再加載一次。 第二個原因就是考慮到安全因素,我們試想一下,如果不使用這種委托模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因為String已經在啟動時被加載,所以用戶自定義類是無法加載一個自定義的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,則調用parent的loadClass進行加載 c = parent.loadClass(name, false); else /parent為null,則調用BootstrapClassLoader進行加載 c = findBootstrapClass0(name); catch (ClassNotFoundException

6、e) /如果仍然無法加載成功,則調用自身的findClass進行加載 c = findClass(name); if (resolve) resolveClass(c); return c;如何從外部文件加載一個類?可以使用DexClassLoader從外部文件加載類Android如何加載SO庫 Android通過調用System.loadLibrary加載so庫 System.loadLibrary會調用Runtime.getRuntime().loadLibrary loadLibrary會搜索當前調用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的實現類是android.app.ApplicationContext Version 7以上的api context實現類是android.app.ContextImpl如何從外部文件啟動一個Activity?1.在配置文件中配置2.替換context.mPackageInfo中的classLoaderAndroid如何加載資源在activity內部訪問資源(字符串,圖片等)是很簡單的,只要getResources然后就可以得到Resourc

9、es對象,有了Resources對象就可以訪問各種資源了Resources對象是通過ContextImpl中的getResource方法拿到的會調用ResourcesManager的getTopLevelResources方法最終調用Resources構造函數Resources的構造函數通過AssetManager初始化AssetManager的私有方法addAssetPath能夠添加路徑AssetManager只能識別APK中的資源如何從外部文件加載資源?重寫Activity的getResource方法,返回有外部資源的ResourceAndroid插件化的問題如何從外部文件加載一個類?如何

10、從外部文件加載so庫?如何從外部文件啟動一個Activity?如何從外部文件加載資源?ADK中插件化中的主要類PluginCenterPluginPluginDexLoaderPluginDownloaderPluginInstallerPluginResourceManagerRemoteSynchronousDataHelperPluginCenter 對外提供的接口 維護插件列表 通過PluginCenter拿到Plugin 安裝、卸載插件 啟用禁用插件Plugin 對外提供的接口 加載插件 獲取接口實例PluginDexLoader 內部類 獲取插件加載需要的classloader 解

11、決Activity、Service等加載問題 解決SO加載問題PluginInstaller 內部類 從Asset安裝插件 從其他路徑安裝插件PluginResourceManager 解決從外部加載資源的問題 管理插件資源的加載 管理全局插件資源路徑 創建插件資源的ResourcePluginDownloader & RemoteSynchronousDataHelper PluginDownloader 下載插件 RemoteSynchronousDataHelper 進行多進程同步 同步的時機是 插件安裝好的時候 插件啟用禁用狀態改變的時候ADK中插件化的主要配置文件Plugin.xml 路徑 pluginEX/$pluginName/Plugin.xml 會實例化為PluginXMLInfo類型 主要用于插件加載InstallConfig.xml 路徑 pluginEX/installedConfig.xml 記錄系統中已經安裝的插件,啟動的時候將已經安裝的插件加載EnableConfig.xml 路徑pluginEX/$pluginName/EnableConfig.xml 針對不同用戶記錄插件的啟用狀態ADK中插件化的目錄結構PluginEXXXX1XXX1.apkSO$archPlugin.xmlEnableConfig.xmlXXX2XXX2.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論