nuwa熱修複是基於qq空間團隊的思路,最近的熱度話題了,很多種方案,自己先研究幾種方案,基本上都各有優勢,學習肯定得先挑個軟柿子捏了,自己對比了一下,發現nuwa代碼量少點,所以就決定了,先研究nuwa。 首先肯定得gradle 例子github上也都有,也可以下載別人的項目借鑒 然後進入appl ...
nuwa熱修複是基於qq空間團隊的思路,最近的熱度話題了,很多種方案,自己先研究幾種方案,基本上都各有優勢,學習肯定得先挑個軟柿子捏了,自己對比了一下,發現nuwa代碼量少點,所以就決定了,先研究nuwa。
首先肯定得gradle
例子github上也都有,也可以下載別人的項目借鑒
然後進入application看看具體情況
跟著流程看下去
下麵的方法才是重點
/**
* 筆記
* “類載入器”(ClassLoader),其作用是動態裝載Class文件,每個ClassLoader對象在初始化時必須指定Class文件的路徑
* 一般情況下,需要某個類時,只需使用import關鍵字包含該類就可以了,但是import有兩個前提:
* 1.必須存在於本地,當程式運行時需要該類時,內部類裝載器會自動裝載該類,這對程式員來講是透明的,
* 即程式員感知不到這一過程,
* 2.編譯時必須在現場,否則編譯不過,會因為找不到引用文件而無法編譯,插件化class文件不滿足此前提的。
*
* 在一般情況下,應用程式不需要創建一個全新的ClassLoader對象,而是使用當前環境已經存在的ClassLoader。
* 因為Javad的Runtime環境在初始化時,其內部會創建一個ClassLoader對象用於載入Runtime所需的各種Java類。
* 每個ClassLoader必須有一個父ClassLoader,在裝載Class文件時,子ClassLoader會先請求父ClassLoader載入該Class
* 文件,只有當其父ClassLoader找不到該Class文件時,子ClassLoader才會繼續裝載該類,這是一種安全機制。
*
* dex文件是將所需的所有Class文件重新打包,打包的規則不是簡單的壓縮,而是完全對Class文件內部的各種函數表、
* 變數表等進行優化,並產生一個新的文件,這就是dex文件。
* 由於dex文件是一種經過優化的Class文件,因此要載入這樣特殊的Class文件就需要特殊的類裝載器,這就是
* DexClassLoader,Android SDK中提供的DexClassLoader類就是出於這個目的。
*/
/**
* classloader 分三個級別,最上級 : bootstrap classLoader 中間級:extension classLoader
* 最低級 app classLoader. 當需要載入某個類的時候,會看看這個類是否已經被載入了,如果沒有,會請求app級來載入,
* app 請求 extension 級 extension 請求 bootstrap級, 由最高級來負責載入
* (這個就是雙親委派,委托 上兩級的loader來做載入),如果高級的無法載入 則會將人物返回給 下一級 以此類推
* 最後如果雙親都不行 就由自己來載入.
* 為什麼要用這個機制? 比如 java.lang.String 這個類,這個是jdk提供的類, 如果我們自定義個 包名:
* java.lang 然後在裡面創建一個String 類, 當我在用String類的時候,根據前面所說,是由bootstrap級的loader
* 來進行載入的,這個時候它發現其實已經載入過了jdk的String了,那麼就不會去載入自定義的String了,防止了重覆
* 載入 也加大了安全性
*/
接下來就是使用了,知道了大致是個什麼情況了就按照文檔說明準備了
首先運行nuwa項目,跑起來,然後outputs下會生成一個nuwa的文件夾,把它複製到D盤下,這個隨你喜歡(你的項目\app\build\outputs\nuwa)
然後就修改裡面的一點內容,比如把裡面某個輸出改掉,然後用命令生成jar包(gradlew clean nuwaQihooDebugPatch -P NuwaDir=D:/nuwa)
執行效果如下:
接下來你會在你的項目文件夾下的 app\build\outputs\nuwa\qihoo\debug 中發現生成的jar文件,複製這個文件到你手機的根目錄
接下來重新啟動程式,發現代碼已經更新
這就是開源的力量啊,要是純屬自己搗鼓得搗鼓到什麼時候啊,其實才剛空下來研究,很多細節深處也還沒搞懂,不過起碼得把流程搞通,跑通是基礎
前人栽樹後人乘涼,我感覺渾身都很涼快,記錄自己的學習之路,也供需要學習的參考學習