#### **概述**
通過本章的學習,讓同學們了解什么是插件化,插件化與組件化兩種思想的區別,以及插件化的原理和難點。
插件化并不像熱修復使用的那么廣泛,因為一般的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中,通過插件的協作來完成整個功能
**結構相比**

之所以將插件apk以so庫形式存在,是為了和普通的APP應用相統一。
下圖就是解壓后的優酷apk的lib中的armeabi文件中的很多的so庫文件,其中紅色圈起來的都是插件apk以so庫存在,還有很多沒有標記,這些只是一部分

#### **概念解析對比**
**插件化和組件化**
* 組件化是一種編程思想,而插件化是一種技術
* 組件化是為了代碼的高度復用性而出現的。
將常用的功能模塊封裝成獨立的lib,供需要它的任何APP使用
* 插件化是為了解決應用越來越大而出現的
插件化主要是將各個關聯性不是很強的業務獨立的封裝到自己的apk中,通過插件部署到宿主apk中完成功能的實現
二者沒有任何沖突,可以在插件化過程中使用組件化思想
**插件化和動態更新**
* 與動態更新一樣,都是動態加載技術的應用
* 動態更新是為了解決線上bug或小功能的更新而出現的
動態更新的使用頻率更高,對原來工程改造相對比較小,原理相對簡單
* 插件化是為了解決應用越來越大而出現的
插件化對原來工程的改造很大,原理更加復雜

#### **相關知識**
* android ClassLoader加載class文件原理
* Java反射原理
* Android資源加載原理
* 四大組件加載原理
要想完成插件化框架的構架,工作量很大,基本上個人是無法獨立完成的,一般都是一個小團隊來完成。
**清單文件(Mainfest處理)的處理**

重點研究如何修改這個流程完成清單文件的合并
**插件類的加載**

每個插件都是一個apk,都有其自己的dex文件,dex文件包含了所有的類,字節碼。市面上的插件化框架基本上都如上圖來加載插件中的類的。
如上圖
這里的bundle就是插件的意思
首先會區分宿主apk和插件apk,因為宿主apk已經安裝到了手機中,Android虛擬機會給宿主apk創建它自己的ClasLoader,無須手動創建。插件apk并沒有安裝到手機中,Android系統不會為這些插件apk創建ClasLoader,要想加載插件中的apk文件,必須具備ClasLoader,這時候插件化框架就起作用了。插件化框架會為每個插件apk創建它需要的自己的ClasLoader,就可以使用自己的ClasLoader加載對應的class文件。
這里需要研究的2個問題
* 如何自定義ClasLoader加載類文件
* 如何調用插件apk文件中的類
#### **模擬插件化框架管理步驟**
**資源加載**

上圖,我們可以得到:真正起作用的是AssetManager這個類。Resources類主要完成resource由資源ID到資源文件的映射。
安裝到系統的apk,系統會為這apk創建AssetManager類和Resources類,所以安裝到系統的apk可以直接通過context獲取到資源,那么沒有安裝到系統的apk,系統不會為這些apk創建AssetManager類和Resources類,這時候插件化框架就起作用了:動態創建插件apk所需要的資源加載類。
目前市面上流行的插件化框架的思路:

1. 所有的Bundle Res資源都是加入到DelegateResources
2. Bundle Install的時候講Res、So等目錄通過反射加入到(AssetManager.addAssetPath)
3. 通過不同的packageId來區分各個Bundle的資源ID
4. 覆蓋getIdentfier方法,兼容5.0以上的系統
**核心技術**
* 處理所有apk文件中的清單文件
* 管理宿主apk中所有的插件apk信息
* 為每個插件apk創建對應的類加載器,資源管理器
- 前言
- Android 熱補丁技術——資源的熱修復
- 插件化系列詳解
- Dex分包——MultiDex
- Google官網——配置方法數超過 64K 的應用
- IMOOC熱修復與插件化筆記
- 第1章 class文件與dex文件解析
- Class文件解析
- dex文件解析
- class與dex對比
- 第2章 虛擬機深入講解
- 第3章 ClassLoader原理講解
- 類的加載過程
- ClassLoade源碼分析
- Android中的動態加載
- 第4章 熱修復簡單講解
- 第5章 熱修復AndFix詳解
- 第6章 熱修復Tinker詳解及兩種方式接入
- 第7章 引入熱修復后代碼及版本管理
- 第8章 插件化原理深入講解
- 第9章 使用Small完成插件化
- 第10章 使用Atlas完成插件化
- 第11章 課程整體總結
- DN學院熱修復插件化筆錄
- 插件化
- 熱修復
- Android APP開發應掌握的底層知識
- 概述
- Binder
- AIDL
- AMS
- Activity的啟動和通信原理
- App啟動流程第2篇
- App內部的頁面跳轉
- Context家族史
- Service
- BroadcastReceiver
- ContentProvider
- PMS及App安裝過程