為什么使用Tinker
-
大家都知到線上的項(xiàng)目缠黍,最怕的事情是出了bug,這就意味這得重新發(fā)版本,這一直以來就是很頭疼的事情,所以增量更新是一個(gè)必然的趨勢冶共,在用戶沒有感知的情況修復(fù)bug,也不用加班趕著上新版本脱盲,剩余的時(shí)間好處很多邑滨,老司機(jī)都懂!
Tinker的介紹
- 廢話不說先上地址
Tinker - Tinker是微信官方的Android熱補(bǔ)丁解決方案钱反,它支持動(dòng)態(tài)下發(fā)代碼掖看、So庫以及資源,讓應(yīng)用能夠在不需要重新安裝的情況下實(shí)現(xiàn)更新
- 建議大家使用gradle的接入方式面哥,一來可以很方便的集成哎壳,二來版本更新的時(shí)候只需要修改gradle配置文件,但是還是不建議項(xiàng)目初期就導(dǎo)入這個(gè)東西尚卫,可以在項(xiàng)目上線后在接入归榕,目前Tinker不支持Instant Run,需要在Setting中取消Enable Instant Runx選項(xiàng),下面是接入的方法
- 在項(xiàng)目的[build.gradle]中吱涉,添加tinker-patch-gradle-plugin的依賴
buildscript {
dependencies {
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.11')
}
}
- 然后在app的gradle文件[app/build.gradle]我們需要添加tinker的庫依賴以apply tinker的gradle插件
dependencies {
//可選蹲坷,用于生成application類
provided('com.tencent.tinker:tinker-android-anno:1.7.11')
//tinker的核心庫
compile('com.tencent.tinker:tinker-android-lib:1.7.11')
}
...
...
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'
- 配置好這些之后我們可以下載官方的demo找到 build.gradle文件驶乾,從build.gradle 的第127行開始復(fù)制粘貼到自己的app/build.gradle文件中
def bakPath = file("${buildDir}/bakApk/")......
4.注意配置apk路徑
ext {
//for some reason, you may want to ignore tinkerBuild, such as instant run debug build?
tinkerEnabled = true
//for normal build
//舊版本apk路徑配置
tinkerOldApkPath = "${bakPath}/app-debug-xxxx-14-05-21.apk"
//用于混淆,沒有混淆可以不管
tinkerApplyMappingPath = "${bakPath}/app-debug-xxxx-14-05-21-mapping.txt"
//舊版本apk R文件
tinkerApplyResourcePath = "${bakPath}/app-debug-xxxx-14-05-21-R.txt"
//only use for build all flavor, if not, just ignore this field
tinkerBuildFlavorDirectory = "${bakPath}/app-debug-xxxx-14-05-21"
}
5.新建自己的Application
繼承DefaultApplicationLike 并重寫onBaseContextAttached 循签,框架會(huì)自動(dòng)生成所需要的application
打開自己的AndroidManifest.xml 在application 節(jié)點(diǎn)下配置android:name=”xxx.xxx.xxx.xxxApplication”
由于我們的項(xiàng)目已有自己的Application级乐,為了避免改動(dòng)可以將項(xiàng)目中的Application 繼承TinkerApplication(此時(shí)onCreate方法會(huì)報(bào)錯(cuò)),去掉onCreate方法县匠,將onCreate方法中的初始化操作單獨(dú)抽一個(gè)init方法出來风科,再合適的時(shí)機(jī)進(jìn)行調(diào)用,例如MainActivity乞旦,這樣我們其他引用Application的地方都不需要改動(dòng)贼穆。
接下來就很簡單了,在as右邊找到Gradle projects下的Tinkerr然后build
這時(shí)我們打開 app/build/output發(fā)現(xiàn)多了一個(gè)tinkerPatch 文件夾兰粉,其中patch_signed_7zip.apk 就是我們的補(bǔ)丁文件
接下在合適的時(shí)候加載補(bǔ)丁故痊,就可以實(shí)現(xiàn)熱更新!
重要重要重要玖姑,如果要打補(bǔ)丁包愕秫,不要直接提交修復(fù)BUG后的代碼 一定要先保存一個(gè)基準(zhǔn)包(這里的基準(zhǔn)包其實(shí)就是指你的線上發(fā)版的包,可以建立一個(gè)包來專門保存這些apk文件)
Tinker目前存在的問題
1.Tinker不支持修改AndroidManifest.xml焰络,Tinker不支持新增四大組件戴甩;
2.由于Google Play的開發(fā)者條款限制,不建議在GP渠道動(dòng)態(tài)更新代碼闪彼;
3.在Android N上甜孤,補(bǔ)丁對應(yīng)用啟動(dòng)時(shí)間有輕微的影響;
4.不支持部分三星android-21機(jī)型畏腕,加載補(bǔ)丁時(shí)會(huì)主動(dòng)拋出"TinkerRuntimeException:checkDexInstall failed"缴川;
5.對于資源替換,不支持修改remoteView描馅。例如transition動(dòng)畫二跋,notification icon以及桌面圖標(biāo)。