微信Android熱更新Tinker使用詳解(星空武哥)
Tinker是什么
Tinker是微信官方的Android熱補(bǔ)丁解決方案,它支持動(dòng)態(tài)下發(fā)代碼、So庫以及資源,讓應(yīng)用能夠在不需要重新安裝的情況下實(shí)現(xiàn)更新。當(dāng)然,你也可以使用Tinker來更新你的插件。
它主要包括以下幾個(gè)部分:
gradle編譯插件: tinker-patch-gradle-plugin
核心sdk庫: tinker-android-lib
非gradle編譯用戶的命令行版本: tinker-patch-cli.jar
為什么使用Tinker
當(dāng)前市面的熱補(bǔ)丁方案有很多,其中比較出名的有阿里的AndFix、美團(tuán)的Robust以及QZone的超級(jí)補(bǔ)丁方案。但它們都存在無法解決的問題,這也是正是我們推出Tinker的原因。
總的來說:
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";
由于各個(gè)廠商的加固實(shí)現(xiàn)并不一致,在1.7.6以及之后的版本,tinker不再支持加固的動(dòng)態(tài)更新;
對(duì)于資源替換,不支持修改remoteView。例如transition動(dòng)畫,notification icon以及桌面圖標(biāo)。
如何使用Tinker
下面就一BuglyTinker的使用方式進(jìn)行介紹
為什么使用Bugly熱更新?
因?yàn)閎ugly已經(jīng)集成了tinker
無需關(guān)注Tinker是如何合成補(bǔ)丁的
無需自己搭建補(bǔ)丁管理后臺(tái)
無需考慮后臺(tái)下發(fā)補(bǔ)丁策略的任何事情
無需考慮補(bǔ)丁下載合成的時(shí)機(jī),處理后臺(tái)下發(fā)的策略
我們提供了更加方便集成Tinker的方式
我們通過HTTPS及簽名校驗(yàn)等機(jī)制保障補(bǔ)丁下發(fā)的安全性
豐富的下發(fā)維度控制,有效控制補(bǔ)丁影響范圍
我們提供了應(yīng)用升級(jí)一站式解決方案
至于如何使用Bugly熱更新看文檔就可以了,今天我就說一說官網(wǎng)文檔中多渠道補(bǔ)丁的一些錯(cuò)誤(今天以Bugly1.2.2(tinker1.7.6))為例
在project的build.gradle中添加依賴
配置app build.gradle
這里要注意,官方給出的project.tinkerPatch.oldApk、project.tinkerPatch.buildConfig.applyMapping、project.tinkerPatch.buildConfig.applyResourceMapping三個(gè)配置路徑有錯(cuò)誤,tinker 1.7.6也存在多渠道打包有bug(和官方溝通后證實(shí)了這一點(diǎn))
我們?cè)谶M(jìn)行多渠道打包的時(shí)候會(huì)執(zhí)行下面的命令,他打出的補(bǔ)丁包都是一樣的,通過查看補(bǔ)丁包內(nèi)的YAPATCH.MF文件就可以證明,官網(wǎng)表示會(huì)在下一個(gè)版本中修復(fù)
這里的簽名方式不懂可以看這篇文章:http://www.dbjr.com.cn/article/122745.htm
這里的配置的config.gradle不明白可以看這篇文章:http://www.dbjr.com.cn/article/122746.htm
tinker-support.gradle的配置,
配置config.gradle
其他配置
不要忘了混淆,還有關(guān)于適配Android7.0系統(tǒng)的配置,這里就不說了。
接下來我們執(zhí)行下面的命令開始生成基準(zhǔn)包(一定要保留好基準(zhǔn)包)
tinkerPatchAllFlavorRelease
生成生產(chǎn)版本的apk后,如果我們發(fā)現(xiàn)bug,可以修復(fù)bug,然后生成補(bǔ)丁包。
生成完補(bǔ)丁包后,就可以借助Bugly的熱更新進(jìn)行修復(fù)了,找到我們注冊(cè)的app,上傳補(bǔ)丁包
tinker是在我們打開app的時(shí)候去檢查服務(wù)器有沒有補(bǔ)丁包,以及本地有沒有補(bǔ)丁包,如果檢測到了就去下載,然后會(huì)在下次啟動(dòng)app的進(jìn)行補(bǔ)丁的修復(fù)。這樣通過Bugly我們不用去搭建下發(fā)補(bǔ)丁包的服務(wù)器了,特別方便。
源代碼代碼:BuglyTinker_jb51.zip
相關(guān)文章
android滑動(dòng)解鎖震動(dòng)效果的開啟和取消
在4.0的圓環(huán)滑動(dòng)解鎖中,我們點(diǎn)擊下去的時(shí)候會(huì)有震動(dòng)效果,因?yàn)檫@個(gè)控件設(shè)置的震動(dòng)效果沒有綁定設(shè)置中設(shè)置的觸摸振動(dòng)開關(guān)來取消振動(dòng)效果,下邊這個(gè)例子實(shí)現(xiàn)了開啟和取消的方法2013-06-06Android 出現(xiàn)“Can''t bind to local 8602 for debugger”錯(cuò)誤的解決方法
這篇文章主要介紹了Android 出現(xiàn)“Can't bind to local 8602 for debugger”錯(cuò)誤的解決方法的相關(guān)資料,需要的朋友可以參考下2017-03-03Android 使用Vitamio打造自己的萬能播放器(5)——在線播放(播放優(yōu)酷視頻)
本文主要介紹Android Vitamio的使用,這里給大家提供效果圖和代碼實(shí)例,來說明Vitamio組件播放網(wǎng)絡(luò)視頻,有需要的小伙伴可以參考下2016-07-07Android WebView實(shí)現(xiàn)截長圖功能
這篇文章主要為大家詳細(xì)介紹了Android截長圖的一種實(shí)現(xiàn)方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05android4.0混淆XmlPullParser報(bào)錯(cuò)原因分析解決
今天,用android4.0在proguard-project.txt中加入 -libraryjars libs/ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar這句話后,混淆時(shí)報(bào)上面的錯(cuò)誤,下面與大家分享下具體的解決方法2013-06-06Android完美實(shí)現(xiàn)平滑過渡的ViewPager廣告條
這篇文章主要為大家詳細(xì)介紹了Android完美實(shí)現(xiàn)平滑過渡的ViewPager廣告條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11