我在好久以前就想寫一系列關於插件化的博客,但是總被這樣或那樣的事情打斷。上週終於下定決心去作這個事情。今天這篇文章是一個開篇,做用有兩個:一是把吹的牛發佈到網上,前面已經說過了;二是對插件化的知識作一個簡單的介紹,順便幫本身整理一下接下來的寫做思路。網絡
一般,咱們的app只有一個apk文件。而插件化是一種將app拆分爲多個apk的技術,每個apk都是app功能的一部分。通常,咱們把app啓動時由系統加載的apk稱之爲宿主。而宿主是能夠加載其餘的apk的,這些被宿主加載的apk咱們稱爲插件。app
在學習一項新技能以前,咱們首先要弄清楚它能爲咱們帶來什麼。那插件化能給咱們帶來什麼呢?框架
從項目管理角度來講:學習
從程序運行角度來講:gradle
從公司運營角度來講:優化
插件化像是一門十分高深的武功,它須要修習者有必定理論基礎後才能修煉。那它須要哪些理論支撐呢?操作系統
ClassLoader插件
ClassLoader是由JVM平臺提供的類加載器。它容許程序從網絡、硬盤甚至是內存加載Class,這就爲Android插件化提供了最基礎的技術保障。咱們知道Android平臺對字節碼文件做了優化,摒棄了傳統JVM須要的.jar文件,而是採用體積更小的.dex文件。所以,Android自定義了一系列ClassLoader以知足對dex加載。在這些ClassLoader中,有一個DexClassLoader,它容許咱們的app加載外部的.jar和.apk文件。翻譯
反射和Hook技術調試
Hook的翻譯是"鉤子"。咱們知道Android操做系統有一套本身的機制,例如,Activity啓動流程、事件分發機制、資源管理機制等。有時候,這些機制沒法知足咱們的需求,經過系統的API也無能爲力。這時候就須要Hook技術對原有流程進行攔截,而後將系統流程替換成咱們本身的流程。而反射是Hook技術的一種必要手段。
APP安裝過程
咱們知道apk文件中包含了app運行須要的Activity、Service等信息。這些信息是在程序安裝過程當中經過PackageManagerService解析AndroidManifest文件取得的。只有瞭解了這些原理,咱們才能知道如何解析插件中的Activity、Service等信息。
四大組件的啓動流程
單純解析出插件的Activity、Service等信息是不行,咱們指望的是這些Activity、Service等能夠像咱們普通App中的同樣能夠正常運行。這就須要咱們去熟悉四大組件的啓動流程,而後經過Hook技術加入宿主啓動插件的Activity、Service等邏輯。
資源管理
插件化會給資源管理帶來兩個問題:
在Android打包編譯時,gradle會爲圖片、文案等資源生成一個惟一的Id。在運行期,經過對資源Id的引用來查找相應的資源。因爲宿主apk和各插件apk打包不是在一次gradle assemble命令中完成的,這就有可能形成多個apk中產生的資源id相同,咱們稱之爲資源衝突
各apk中的資源是沒法共享的,例如在宿主中沒法引用插件中的資源。
爲了解決這兩個問題,咱們有必要掌握Android平臺的資源管理機制。
後續文章我會採用原理+DEMO的表現形式。在每篇文章的前半部分主要是介紹原理知識;後半部分是代碼Demo,這些Demo串聯在一塊兒就是一個簡單的插件化框架。