Tinker是微信出品的熱更新方案,采用類似QQ空間熱修復(fù)的原理单芜,是市面上不多的成熟方案细疚。熱修復(fù)牽扯的知識很多,而Tinker則做的比想象的更多俩莽。很好奇tinker是怎么實現(xiàn)的熱修復(fù)旺坠,于是就有了這一系列文章,代碼版本為1.9.14扮超。
以tinker為代表的熱修復(fù)方案的典型流程如下:
熱修復(fù)步驟
1 獲取當(dāng)前應(yīng)用的pathClassLoader
2 反射獲取DexPathList屬性PathList
3 反射修改pathlist的dexElement
3.1 將補(bǔ)丁包patch.dex轉(zhuǎn)換為Elelment(patch)
3.2 獲得pathList的dexElements屬性 (old)
3.3 patch+old合并取刃,并反射賦值給pathlist的DexElements屬性
tinker熱修復(fù) 可以分為patch打包和patch合成這兩部分,可能牽扯的文件有dex,so,resource文件出刷。合成也包括了patch的合成和加載這兩部分璧疗,下載到patch時會進(jìn)行patch的合成,而下次啟動時就會開始加載合成之后的文件馁龟。
合成的流程圖如下:
加載的流程圖大致如下:
因此本系列文章分為以下幾篇:
Tinker的補(bǔ)丁加載-dex加載
Tinker的補(bǔ)丁加載-資源加載
[Tinker的補(bǔ)丁加載-so加載]
結(jié)合日志崩侠,對tinker的流程有個大概的了解。但是比較缺乏理論坷檩,比如之前有篇文章Android N混合編譯與對熱補(bǔ)丁影響解析却音,讀了幾遍后大概知道怎么回事,但是沒有對應(yīng)到tinker的源碼淌喻。
今天學(xué)習(xí)的時候才對應(yīng)上僧家,tinker采用的方案是運(yùn)行時替換PathClassLoader方案,這個對應(yīng)的d代碼時NewClassLoaderInjector中的doInject()方法裸删,直接將系統(tǒng)的系統(tǒng)的classLoader替換為自己的classLoader八拱,這時候才恍然大悟。
以后要加強(qiáng)理論學(xué)習(xí)涯塔。
因技術(shù)水平有限肌稻,在閱讀tinker代碼時對熱修復(fù)這部分知識并不是掌握,因此理解有誤在所難免匕荸,請不吝指正爹谭。