1. 程式人生 > >外掛化以及熱更新小結

外掛化以及熱更新小結

android分包方式:

1、dex分包;

2、外掛化;

熱更新相比外掛化多做了兩件事:

1、防止相關類打上CLASS_ISPREVERIFIED標籤,就可以搶先載入舊的bug類;

2、熱修復動態載入BaseDexClassLoader物件間接引用的DexElements;

總結:熱修復是在外掛化的基礎上進行替換舊的bug類。

類載入最主要的是兩個類:PathClassLoader和DexClassLoader

PathClassLoader只能去載入已經安裝到Android系統中的apk檔案

DexClassLoader可以用來從.jar和.apk型別的檔案內部載入classes.dex檔案

關於類是如何被打上CLASS_ISPREVERIFIED標籤的?

虛擬機器在啟動的時候,會有許多的啟動引數,其中一項就是verify選項,當verify選項被開啟的時候,doVerify變數為true,那麼就會執行dvmVerifyClass進行類的校驗,如果dvmVerifyClass校驗類成功,那麼這個類會被打上CLASS_ISPREVERIFIED的標誌!!

關於dvmVerifyClass類中的程式碼內容,主要是關於兩個:

1、clazz->directMethods

2、clazz->virtualMethods

其中directMethods中涉及到的方法有statics方法、private方法、建構函式,而virtualMethods中涉及到的方法是override方法。

以上方法中直接飲用到的類和clazz都在同一個dex中的話,就會被打上CLASS_ISPREVERIFIED標籤。

策略:往所有的類(Application除外)的構造方法中加入AntilazyLoad.class

不在Application中加入主要是因為dex分包也是在Application中載入的,如果在這裡載入AntilazyLoad.class,勢必會無法找到該類,就會有異常。

隱患:

當然了,android系統一開始設計CLASS_ISPREVERIFIED標籤的意圖肯定是為了提高效能,我們這樣修改會不會對效能有所影響呢?不好說,但是因為現在很多大專案都已經採用了這種方式,效能問題應該是可以放心的