APP項目如何與插件化無縫結合(二)

qc8414 8年前發布 | 28K 次閱讀 Android Android開發 移動開發

上一篇主要介紹插件化的一些概念和作用,以及我為什么選擇Small。現在來具體介紹下small。

Small的原理

1.動態加載class

APP項目如何與插件化無縫結合(二)

 

Android類由DexClassLoader 加載,如果直接在編譯搜索這個類的時候出現下面這種情況,我開始以為是沒有關聯源碼,還折騰了好一會,后面發現,應該是特意搜不到了。不過開源直接在https://android.googlesource.com 搜。請自備梯子,我一般是用lantern+谷歌瀏覽器。

APP項目如何與插件化無縫結合(二)

DexClassLoader的構造方法里面調用了父類的構造方法,我們跟進去可以看到BaseDexClassLoader 里面有個dexPath參數,這個通常是應用儲存apk的目錄/data/../*.apk。現在用來作為創建pathList。我們再看看new DexPathList里面做了什么。

APP項目如何與插件化無縫結合(二)

DexPathList里面調用makeDexElements方法創建dexElements。我們跟進去看看做了什么。

APP項目如何與插件化無縫結合(二)

可以看到,DexClassLoader不支持".so"后綴。那么small是怎么做的呢,看看偽代碼。

APP項目如何與插件化無縫結合(二)

為了讓應用啟動時能自動復制插件包到應用存儲目錄,需要支持".so"后綴。做法就是模擬壓縮包加載代碼塊,創建一個dex元素,再反射添加到宿主class loader里的dexPathList。后面的演示過程中,你會看到small更新的所謂插件,就是編譯過后的so文件。

2.動態加載resources

APP項目如何與插件化無縫結合(二)

安卓資源由AssetManager加載。應用啟動時,系統會為其創建一個AssetManager實例,并由addAssetPath方法添加資源搜索路徑,默認添加:"/framework/base.apk" - Android base resources (base),"/data/app/*.apk" - The launching apk resources (host)

APP項目如何與插件化無縫結合(二)

APP項目如何與插件化無縫結合(二)

所有的資源需要通過一個唯一的id來訪問,通常是形如0xPPTTNNNN,每個字段PPT的那個圖有相應的介紹,我就不多說了。那么如何處理這個資源id分配的問題呢?有下面幾種方案

APP項目如何與插件化無縫結合(二)

但是這幾種方案都有問題,為什么有問題的方案還會提?我是覺得這樣可以養成一種思考的能力。第一種會導致插件之間不能訪問資源。2.1字段有限,不好維護;2.2插件間無法訪問資源;2.3修改aapt源碼,不好維護。如果修改aapt生成產物,無縫連接,支持極致剪裁。資源包進行重新打包,重設資源id,small就是采取這種方式。具體深入的實現,這里就不提了。感興趣的可以繼續查看源碼看看。

3.動態注冊activities

APP項目如何與插件化無縫結合(二)

每一個activity由Activity的startActivityForResult方法啟動,通過instrumentation的execStartActivity方法激活生命周期。這個地方請大家留意下,后面也會提到這里。

APP項目如何與插件化無縫結合(二)

ActivityThread的performLaunchActivity方法中通過instrumentation的newActivity方法實例化。

 

APP項目如何與插件化無縫結合(二)

 

如果要動態注冊Activity,首先在宿主manifest中注冊一個命名特殊的占坑activity來欺騙mInstrumentation.execStartActivity以獲得生命周期,再欺騙mInstrumentation.newActivity來獲得插件activity實例。Small封裝一個instrumentation,來替換掉宿主。可以看到small里面的占坑。

寫了這么多,,我都有點累了,相信此時看的你也一定有點累,但是知識豈有不付出就能得到的?加油吧!!大概就是這些,后面將介紹Small的使用,加載,啟動,更新。實戰開始!!APP項目如何與插件化無縫結合(三)

 

系列文章

APP項目如何與插件化無縫結合(一)
APP項目如何與插件化無縫結合(二)
APP項目如何與插件化無縫結合(三)

 

參考資料:

1.https://github.com/wequick/Small

2.http://www.tuicool.com/articles/NB32EjY

3.http://www.tuicool.com/articles/RR3QrmV


來自:http://www.jianshu.com/p/c0f3395dfa4e
 

 

 本文由用戶 qc8414 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!