1. 程式人生 > >熱修復的一些理解

熱修復的一些理解

對於熱修復這個概念,第一次聽到是在蘋果制裁騰訊的時候聽到的,後來就在很多的ap中都有看到,就看了下熱修復相關的部落格。

從原理來看,主要是利用jvm的ClassLoader載入機制,這裡使用的是PathClassLoader及DexClassLoader這兩個類來實現熱修復的。

這兩個類都繼承自BaseClassLoader,他們的實現差別就在建構函式上的一個引數,而具體的功能實現都放在BaseClassLoader中,對於我們的app編出來的classes.dex檔案,使用的是PathClassLoader來進行的類載入。而熱修復則是利用DexClassLoader,利用該類將我們用於修復的dex檔案載入進來,並且與現有的PathClassLoader載入得到的當前app所對應的class檔案進行合併,放到同一個數組裡面,因為ClassLoader是遍歷陣列來找到要執行的類,所以,這裡只需要將修復的類,放到類元素的陣列的前面,讓ClassLoader提前得到我們用於修復的類就可以完成熱修復。

這裡利用ClassLoader載入機制,將修復所用的補丁,動態的加到ClassLoader所維護的elements陣列的頭部,讓ClassLoader提前找到修復用的class,而不是一開始我們app自帶的class來完成bug的修復。通過少量的記憶體空間來換取使用者頻繁升級的使用者體驗,是好呢?還是壞呢?

實現思路:

1. 利用SDK中的dx工具生成補丁dex。

2.寫程式碼獲取當前類載入器中的dexPathList;

3.得到dexPathList所對應的Elements;

4.利用DexClassLoader將補丁dex載入進來。

5.將補丁dex Elements與上面獲取到的Elements進行數組合並,補丁Elements要放在陣列的靠前位置。

6.用新得到的Elements陣列替換原ClassLoader的Elements陣列。

參考連結:https://blog.csdn.net/csdn_lqr/article/details/78534065