<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                #### **概述** 通過本章的學習,讓同學們了解什么是插件化,插件化與組件化兩種思想的區別,以及插件化的原理和難點。 插件化并不像熱修復使用的那么廣泛,因為一般的App并不需要插件化,只有航母級別的App(淘寶,優酷等)這些門戶型的apk才會在實際開發中使用到插件化。 #### **插件化出現的背景** * APP體積越來越大,功能模塊越來越多。 比如手機淘寶,淘寶內部集成了彩票、聚劃算等功能 * 模塊越來越多,模塊耦合度高,協同開發溝通成本極大 * 方法數超過65536(64K限制),占用內存過大 #### **如何解決?** * 將一個大的APK按照業務分割成多個小的apk 只有用戶點擊到那個小apk,才會動態加載那個小apk。 * 每個小的apk既可以獨立運行又可以作為插件運行 #### **插件化的優點** * 業務模塊基本完全解耦 * 高效并行開發(編譯速度更快) * 按需加載,內存占用更低等等 #### **基本概念** * 宿主:主APP可以加載插件,也成為Host。 宿主APP里面只有基本的類庫和功能 * 插件:插件APP,被宿主加載的APP。可以是跟普通APP一樣的apk文件。 各個業務功能模塊獨立出來的apk,這些apk模塊不需要安裝在手機中。可以直接被宿主加載其內部的dex文件和資源文件。 * 插件化:將一個應用按照宿主插件的方式改造就叫插件化。 核心在于與普通的apk相比,普通的App的所有代碼都運行在一個apk文件中,插件化后,各自的代碼運行在各自的插件apk中,通過插件的協作來完成整個功能 **結構相比** ![](https://box.kancloud.cn/21d6e4ac0323bd0bebef2a5f029f228f_1428x396.png) 之所以將插件apk以so庫形式存在,是為了和普通的APP應用相統一。 下圖就是解壓后的優酷apk的lib中的armeabi文件中的很多的so庫文件,其中紅色圈起來的都是插件apk以so庫存在,還有很多沒有標記,這些只是一部分 ![](https://box.kancloud.cn/2323b7122bdc5946a220f4a391d80a43_365x906.png) #### **概念解析對比** **插件化和組件化** * 組件化是一種編程思想,而插件化是一種技術 * 組件化是為了代碼的高度復用性而出現的。 將常用的功能模塊封裝成獨立的lib,供需要它的任何APP使用 * 插件化是為了解決應用越來越大而出現的 插件化主要是將各個關聯性不是很強的業務獨立的封裝到自己的apk中,通過插件部署到宿主apk中完成功能的實現 二者沒有任何沖突,可以在插件化過程中使用組件化思想 **插件化和動態更新** * 與動態更新一樣,都是動態加載技術的應用 * 動態更新是為了解決線上bug或小功能的更新而出現的 動態更新的使用頻率更高,對原來工程改造相對比較小,原理相對簡單 * 插件化是為了解決應用越來越大而出現的 插件化對原來工程的改造很大,原理更加復雜 ![](https://box.kancloud.cn/6a9f294c4f6646ff630817df1b2e1654_773x427.png) #### **相關知識** * android ClassLoader加載class文件原理 * Java反射原理 * Android資源加載原理 * 四大組件加載原理 要想完成插件化框架的構架,工作量很大,基本上個人是無法獨立完成的,一般都是一個小團隊來完成。 **清單文件(Mainfest處理)的處理** ![](https://box.kancloud.cn/aac18b27e50d007069b28d7168ca6899_1297x484.png) 重點研究如何修改這個流程完成清單文件的合并 **插件類的加載** ![](https://box.kancloud.cn/4185f4b8d0c4488aca4e51b80a3582e4_1321x466.png) 每個插件都是一個apk,都有其自己的dex文件,dex文件包含了所有的類,字節碼。市面上的插件化框架基本上都如上圖來加載插件中的類的。 如上圖 這里的bundle就是插件的意思 首先會區分宿主apk和插件apk,因為宿主apk已經安裝到了手機中,Android虛擬機會給宿主apk創建它自己的ClasLoader,無須手動創建。插件apk并沒有安裝到手機中,Android系統不會為這些插件apk創建ClasLoader,要想加載插件中的apk文件,必須具備ClasLoader,這時候插件化框架就起作用了。插件化框架會為每個插件apk創建它需要的自己的ClasLoader,就可以使用自己的ClasLoader加載對應的class文件。 這里需要研究的2個問題 * 如何自定義ClasLoader加載類文件 * 如何調用插件apk文件中的類 #### **模擬插件化框架管理步驟** **資源加載** ![](https://box.kancloud.cn/a3e433f729953f31be9a696cd1c1a902_670x627.png) 上圖,我們可以得到:真正起作用的是AssetManager這個類。Resources類主要完成resource由資源ID到資源文件的映射。 安裝到系統的apk,系統會為這apk創建AssetManager類和Resources類,所以安裝到系統的apk可以直接通過context獲取到資源,那么沒有安裝到系統的apk,系統不會為這些apk創建AssetManager類和Resources類,這時候插件化框架就起作用了:動態創建插件apk所需要的資源加載類。 目前市面上流行的插件化框架的思路: ![](https://box.kancloud.cn/9d658162714f4406c7d72008b83c5c0d_543x523.png) 1. 所有的Bundle Res資源都是加入到DelegateResources 2. Bundle Install的時候講Res、So等目錄通過反射加入到(AssetManager.addAssetPath) 3. 通過不同的packageId來區分各個Bundle的資源ID 4. 覆蓋getIdentfier方法,兼容5.0以上的系統 **核心技術** * 處理所有apk文件中的清單文件 * 管理宿主apk中所有的插件apk信息 * 為每個插件apk創建對應的類加載器,資源管理器
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看