補(bǔ)丁方案選定
當(dāng)前市面的熱補(bǔ)丁方案有很多,其中比較出名的有阿里的AndFix轮蜕、美團(tuán)的Robust以及QZone的超級(jí)補(bǔ)丁方案
不同角度的分析
Tinker -- 微信Android熱補(bǔ)丁方案
Tinker是什么
Tinker是微信官方的Android熱補(bǔ)丁解決方案蜜宪,它支持動(dòng)態(tài)下發(fā)代碼圃验、So庫(kù)以及資源澳窑,讓應(yīng)用能夠在不需要重新安裝的情況下實(shí)現(xiàn)更新供常。當(dāng)然栈暇,你也可以使用Tinker來更新你的插件源祈。
它主要包括以下幾個(gè)部分:
gradle編譯插件:tinker-patch-gradle-plugin
核心sdk庫(kù):tinker-android-lib
非gradle編譯用戶的命令行版本:tinker-patch-cli.jar
為什么使用Tinker
當(dāng)前市面的熱補(bǔ)丁方案有很多煎源,其中比較出名的有阿里的AndFix、美團(tuán)的Robust以及QZone的超級(jí)補(bǔ)丁方案新博。但它們都存在無法解決的問題薪夕。
總的來說:
AndFix作為native解決方案,首先面臨的是穩(wěn)定性與兼容性問題赫悄,更重要的是它無法實(shí)現(xiàn)類替換原献,它是需要大量額外的開發(fā)成本的馏慨;
Robust兼容性與成功率較高,但是它與AndFix一樣姑隅,無法新增變量與類只能用做的bugFix方案写隶;
Qzone方案可以做到發(fā)布產(chǎn)品功能,但是它主要問題是插樁帶來Dalvik的性能問題讲仰,以及為了解決Art下內(nèi)存地址問題而導(dǎo)致補(bǔ)丁包急速增大的慕趴。
特別是在Android N之后,由于混合編譯的inline策略修改冕房,對(duì)于市面上的各種方案都不太容易解決毫捣。而Tinker熱補(bǔ)丁方案不僅支持類饶辙、So以及資源的替換,它還是2.X-7.X的全平臺(tái)支持。利用Tinker我們不僅可以用做bugfix,甚至可以替代功能的發(fā)布。Tinker已運(yùn)行在微信的數(shù)億Android設(shè)備上惑艇,那么為什么你不使用Tinker呢
Tinker的已知問題
由于原理與系統(tǒng)限制恭取,Tinker有以下已知問題:
Tinker不支持修改AndroidManifest.xml耗跛,Tinker不支持新增四大組件;
由于Google Play的開發(fā)者條款限制,不建議在GP渠道動(dòng)態(tài)更新代碼;
在Android N上檀葛,補(bǔ)丁對(duì)應(yīng)用啟動(dòng)時(shí)間有輕微的影響润讥;
不支持部分三星android-21機(jī)型,加載補(bǔ)丁時(shí)會(huì)主動(dòng)拋出"TinkerRuntimeException:checkDexInstall failed";
tinker的一般模式并不支持加固变隔,需要使用usePreGeneratedPatchDex模式鲜棠,即提前生成補(bǔ)丁模式柑爸。某些加固工具可能會(huì)將非exported的四大組件類名替換馅而,這些類將無法修改偎血。對(duì)于Android N之后的設(shè)備,本模式可能會(huì)因?yàn)閮?nèi)聯(lián)而出現(xiàn)問題,建議過濾N之后的設(shè)備;
對(duì)于資源替換,不支持修改remoteView。例如transition動(dòng)畫,notification icon以及桌面圖標(biāo)春霍。