關於動態加載機制的熱更新的小結

前段時間公司準備在項目裏面引入熱修復技術,自己以前也看過關於熱修復的文章,比如qq空間團隊關於熱修復技術的,安卓App熱補丁動態修復技術介紹 。在瞭解熱修復之前,首先要明白安卓裏面的ClassLoader這個類,這個類下面有兩個子類:pathClassLoader和DexClassLoader;對於這兩個同樣是繼承BaseClassLoader的這兩個類有不同的用法。
pathClassLoader:只能加載已安裝到系統中的apk文件。
DexClassLoader:可以加載apk文件和dex文件及jar。
關於classLoader就是通過遍歷每一個dex文件的內部Element數組,加載需要的class類。這個就是熱更新要解決的第一個問題,如何把我們打成的補丁插入到這個Element數組的內部的class前面。替換成我們需要使用的修復補丁文件,通過看QQ空間團隊對於熱更新技術的事件,可以發現爲了修復有bug的類需要防止引用的類被打上CLASS_ISPREVERIFIED標誌。QQ空間實現的方案是將被引用的類單獨作爲一個dex文件,這樣class.dex加載類的時候會應用一個不在同一個dex文件內的類,這樣就防止了這樣就防止了類被打上CLASS_ISPREVERIFIED的標誌了。
如何去做呢?
1.如何生成一個補丁文件
2.如何防止類被打上CLASS_ISPREVERIFIED標誌。
打補丁的工具:apkpatch
這裏寫圖片描述
通過該命令:a apkpatch.bat -f new.apk -t old.apk -o dir -k testfixappkey.jks -p pas -a testfixappkey.jks -e password

  1. new.apk :是修改之後的新包
  2. old.apk :是我有bug的bug
  3. dir: 定義補丁輸出的目錄
  4. testfixappkey.jks: 是keystore
  5. pas 是keystore的密碼
  6. testfixappkey.jks 是 alias keystore的用戶別名
  7. password:是我的alias的密碼。

我使用的是阿里的andfix框架,對於如何引入查看阿里團隊的andfix的源碼andfix源碼
首先在我的application裏面進行初始化。這裏寫圖片描述
然後會在檢查我的/data/data/包名/files目錄下檢查這個補丁文件這裏寫圖片描述
我是把補丁直接放在了手機的data/data/..這個目錄下的。在生產環境中肯定是要放在服務器上,傳輸到客戶端的目錄下的。
初始化之後,來實踐一下:首先在mainActivity中寫一段代碼這裏寫圖片描述然後打出一個簽名的包,然後將吐司的內容修改一下,再打出一個有簽名的包。然後通過補丁工具生成一個補丁後綴爲“.apkpatch”的文件這裏寫圖片描述將生成的補丁放入data/data/..目錄下,這樣當我們再次啓動應用的時候便會將之前吐司的內容修改掉:
下面是我兩張修改前和修改後的兩張GIF圖:
補丁打入前:這裏寫圖片描述
補丁打入後:這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章