Tinker源碼分析

Tinker是微信出品的熱更新方案,采用類似QQ空間熱修復(fù)的原理,是市面上不多的成熟方案。熱修復(fù)牽扯的知識很多,而Tinker則做的比想象的更多。很好奇tinker是怎么實(shí)現(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時(shí)會進(jìn)行patch的合成,而下次啟動時(shí)就會開始加載合成之后的文件。
合成的流程圖如下:


截屏2020-05-17下午5.27.54.png

加載的流程圖大致如下:


截屏2020-05-17下午3.58.46.png

因此本系列文章分為以下幾篇:

Tinker的補(bǔ)丁生成過程

Tinker的補(bǔ)丁加載-dex加載
Tinker的補(bǔ)丁加載-資源加載
[Tinker的補(bǔ)丁加載-so加載]

結(jié)合日志,對tinker的流程有個(gè)大概的了解。但是比較缺乏理論,比如之前有篇文章Android N混合編譯與對熱補(bǔ)丁影響解析,讀了幾遍后大概知道怎么回事,但是沒有對應(yīng)到tinker的源碼。
今天學(xué)習(xí)的時(shí)候才對應(yīng)上,tinker采用的方案是運(yùn)行時(shí)替換PathClassLoader方案,這個(gè)對應(yīng)的d代碼時(shí)NewClassLoaderInjector中的doInject()方法,直接將系統(tǒng)的系統(tǒng)的classLoader替換為自己的classLoader,這時(shí)候才恍然大悟。
以后要加強(qiáng)理論學(xué)習(xí)。

因技術(shù)水平有限,在閱讀tinker代碼時(shí)對熱修復(fù)這部分知識并不是掌握,因此理解有誤在所難免,請不吝指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容