這里只記錄本人對此方案的理解,以及根據(jù)自己實際情況對此方案的后續(xù)改進和想法,全是瞎寫。
Tinker_imitator是微信熱更新方案實現(xiàn), 由zzz40500大神提供的方案 源碼地址, Tinker_imitator 原理篇
根據(jù)作者提供的步驟操作開始一切順利,但是打包patch時使用插件提示no version can be fix,無法生成補丁包,目前不知道zzz40500修復沒


用jd-gui看插件部分代碼
List<FixApkVersionBean> applicationFacets = getApplicationFacets(anActionEvent.getProject());
的applicationFacets 為null,applicationFacets 為圖patch中的相關文件,文件真實存在,為什么會出這個bug我沒去過多探究,我采用命令的方式生成patch包(bsdiff的相關命令)。測試可行。
Tinker_imitator中主要就這三個

buildSrc
這個是用于干擾gradle打包,生成patch文件的代碼,具體看原理篇里有解釋。主要就是用來記錄class文件的MD5值,用于比較前后class是否有變化,在生成patch時選擇性的生成patch包,如:classes.dex類中有變化,而classes2.dex無變化,只打classes.dex的patch包。
library
用于app加載patch包的代碼,這里以后有時間在具體分析。
使用中的一些問題
在實際使用過程中,直接使用兩apk里的dex文件就可直接生成patch包,可以根據(jù)dex的頭文件來判斷dex是否一致,并不需要buildSrc,可能作者是有其他考慮,我沒有細致看代碼,只是看原理篇得出的粗淺結(jié)論。
dex頭文件結(jié)構

根據(jù)checksum和siganture就能確定兩文件是否相同。
現(xiàn)在可以用其他方式確定哪個dex改變了,可以用bsdiff命令來生成相應patch了。
后續(xù)我有時間自己用Java寫個工具可以把新舊apk差分成patch。