概述
Tinker是微信團隊開源的Android熱修復(fù)解決方案,我們主要將這項技術(shù)用于在不發(fā)版的情況修復(fù)線上app存在的問題.
我們的項目一直使用Jenkins構(gòu)建來完成上線,在接入Tinker后我們也希望在發(fā)布補丁的時候也能通過Jenkins一鍵構(gòu)建完成,因此有了這篇文字.第一次寫博客,如有不足之處,請多多指正.
Tinker的接入
Tinker官方文檔給出了詳細的接入教程,然后很多同學(xué)在接入上還是覺得太難,太麻煩!我在接入的時候,采取的簡單粗暴的方式,直接照搬官方demotinker-sample-android來完成接入.由于要在多個項目中使用,因此將其當(dāng)做一個library提供給多個項目依賴;如圖:
本文demo地址: TinkerDemo
用法
下面的做法建立在Application改造完成的前提下
1.主工程的build.gradle文件添加tinker插件和資源混淆組件(AndResGuard)插件
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.3'
classpath "com.tencent.tinker:tinker-patch-gradle-plugin:${TINKER_VERSION}"
2.主Module依賴tinkelib
3.拷貝config文件到根目錄
4.主Module引入tinker.gradle和resguard.gradle配置
apply from: '../config/resguard.gradle'
apply from: '../config/tinker.gradle'
5.TINKER_ID的配置
5.1 build.gradle文件末尾添加,通過git commit來作為TINKER_ID
def getTinkerIdValue() {
return hasProperty("TINKER_ID") ? TINKER_ID : gitSha()
}
def gitSha() {
try {
String gitRev = 'git rev-parse --short HEAD'.execute(null, project.rootDir).text.trim()
if (gitRev == null) {
throw new GradleException("can't get git rev, you should add git to system path or just input test value, such as 'testTinkerId'")
}
return gitRev
} catch (Exception e) {
throw new GradleException("can't get git rev, you should add git to system path or just input test value, such as 'testTinkerId'")
}
}
5.2 主module的defaultConfig中添加
buildConfigField "String", "TINKER_ID", "\"${getTinkerIdValue()}\""
注:當(dāng)然有人想用app版本號作為TINKER_ID,只要將getTinkerIdValue()改為對應(yīng)的版本號即可
6.運行gradle resguardRelease命令,即可生成發(fā)布包(基準包),同時在工程根目錄下會自動備份tinker需要的文件(apk请垛、R、mapping咆爽、Resource mapping);
圖:
7.生成補丁時,只需要執(zhí)行gradle tinkerPatchRelease命令即可
至此,gradle的相關(guān)配置就完成了!
與Jenkins的結(jié)合使用
Jenkins的搭建及相關(guān)用法請自行g(shù)oogle.
我們的Jenkins有一個線上job,由于我們使用master分支上線,因此在Jenkins的Branch Specifier中保持master不變
發(fā)布版本的時候使用clean resguardRelease命令,如圖:
發(fā)布補丁時將tasks修改為tinkerPatchRelease即可
我們的渠道包使用美團的舊版生成方案,這一步工作是在服務(wù)器將apk拷入相應(yīng)文件夾來完成,同時再執(zhí)行一些其他腳本;
demo地址
參考
tinker.gradle中的備份腳本來著w4lle的Gradle模塊化配置;感謝w4lle同學(xué)