在上篇文章Android熱補(bǔ)丁方案中介紹了Tinker的原理框架鞋拟,那么我們現(xiàn)在就從初級入門開始,學(xué)習(xí)一下它的項目集成惹资,首先贺纲,我們來看看它官方Demo的使用,體驗一下熱修復(fù)褪测。
體驗官方Demo
步驟:
下載 Sample
打開Tinker開源代碼地址Tinker猴誊,把 Tinker 項目下載到本地后,使用 AS 導(dǎo)入項目tinker-sample-android
侮措;設(shè)置 tinkerId
打開 app 的 build.gradle文件懈叹,找到getTinkerIdValue()
方法中:TINKER_ID :gitSha()
,將gitSha()
替換成自己想要的 tinkerId 命名規(guī)則分扎;編譯 Base APK
編譯打包澄成,此時 Tinker 會在工程的app/build/bakApk/
目錄下保存打包好的apk文件,先在手機(jī)上安裝該 apk ;設(shè)置Base APK路徑
找到剛才生成的 apk 文件墨状,復(fù)制其完整文件名,在 app 的 build.gradle 文件卫漫,設(shè)置:
tinkerOldApkPath = "${bakPath}/<剛才生成的apk文件名>"
修復(fù) Bug
在 Base Apk的代碼基礎(chǔ)上修改代碼修復(fù) Bug;生成補(bǔ)丁
找到 Gradle 腳本中的tinker目錄下tinkerPatchDebug
雙擊運(yùn)行它將生成 debug 版的 patch (補(bǔ)丁) apk 文件肾砂,在 output/tinkerPatch/debug 下列赎,文件為patch_signed_7zip.apk
;打入補(bǔ)丁
將patch_signed_7zip.apk
這個文件拷貝到 Android 設(shè)備的ExternalStorageDirectory()
路徑下.文件的路徑可以隨意設(shè)定,只需在MainActivity
中指明補(bǔ)丁 Apk 路徑即可镐确;隨后點擊 Demo 中 Load Patch 按鈕包吝,提示成功后,點擊 Kill Self 結(jié)束當(dāng)前進(jìn)程源葫,重啟應(yīng)用诗越,即可看到所改的代碼修復(fù)的 Bug 現(xiàn)象。
項目集成
步驟:
(1) 在項目的 build.gradle 中臼氨,添加 tinker-patch-gradle-plugin
的依賴掺喻;
buildscript {
dependencies {
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:${TINKER_VERSION}')
}
}
TINKER_VERSION 可以在項目 properties 中配置芭届。
(2) 在 app 的 gradle 文件 app/build.gradle
储矩,我們需要添加 Tinker 的庫依賴以及 apply tinke r的 gradle 插件;
dependencies {
// tinker 熱修復(fù)導(dǎo)入
compile('com.tencent.tinker:tinker-android-lib:${TINKER_VERSION}') { changing = true }
compile('com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}') { changing = true }
// 多dex支持
compile 'com.android.support:multidex:1.0.1'
}
// apply tinker插件
apply plugin: 'com.tencent.tinker.patch'
(3) 參照官方 Sample 工程褂乍,把 gradle 文件中剩下的拷貝進(jìn)來(需要的考,已有的不需要考)逃片;
在這里,我們可以定制一些自己的配置褥实,比如 Tinkerid、PatchVersion 等损离,并且記得修改 buildWithTinker()
中 dex 的 loader 修改成自己的 Application 名。
def createTinkerId(){
return YourTinkerID;
}
def createPatchVersion(){
return YourPatchVersion;
}
有些具體的gradle配置的參數(shù)貌踏,大家可以參考Tinker介入指南中的表格窟勃,要是你英語夠好的話,可以去看sample中的app/build.gradle的英文介紹眷昆。
(4) 拷貝官方 Sample 項目中的文件并配置;
拷貝 keyStore 文件夾垦藏;
拷貝 keep_in_main_dex.txt 混淆文件且自定義其中的application伞访,并在 proguard-rules 混淆文件加入保護(hù):
-keepattributes SourceFile,LineNumberTable
拷貝 java 文件,并作適當(dāng)修改弟灼,如修改文件名冒黑、在 service 的 onPatchResult 函數(shù)中加入自己的邏輯
(5) 配置ApplicationLike代理
XXApplicationLike.java
中的注解包名,用于自動生成 Applicaion抡爹,并在 Menifest 中給 Application 節(jié)點設(shè)置 name ,指向自動生成的 Application:
-public class YourApplication extends Application {
+public class YourApplicationLike extends DefaultApplicationLike {
同時我們需要將 gradle 的 dex loader 中的 Application 改為新的 YourApplication:
dex {
loader = ["com.tencent.tinker.loader.*",
//warning, you must change it with your application
"tinker.sample.android.YourApplication"
]
}
然后配置一下 ApplicationLike 中 Application 以及 Tinker 配置:
@DefaultLifeCycle(
application = ".SampleApplication", //application類名
flags = ShareConstants.TINKER_ENABLE_ALL, //tinkerFlags
loaderClass = "com.tencent.tinker.loader.TinkerLoader", //loaderClassName, 這里使用默認(rèn)即可!
loadVerifyFlag = false) //tinkerLoadVerifyFlag
public class SampleApplicationLike extends DefaultApplicationLike {
采用 Annotation 生成 Application ,需要將原來的 Application 類刪掉欧穴。
將原本 Application 中的內(nèi)容全部拷貝到 ApplicationLike.java 中涮帘。
(6) 編譯和補(bǔ)丁
- 每次編譯或發(fā)包將安裝包與mapping文件備份笑诅;
- 若有補(bǔ)丁包的需要,按自身需要修改你的代碼弦叶、庫文件等妇多;
- 將備份的基準(zhǔn)安裝包與mapping文件輸入到tinkerPatch的配置中;
- 運(yùn)行tinkerPatchRelease砌梆,即可自動編譯最新的安裝包,并與輸入基準(zhǔn)包作差異桃序,得到最終的補(bǔ)丁包烂瘫。
在打補(bǔ)丁時注意gralde中關(guān)于路徑的修改:
Tinker 接入文檔
- 如何快速接入請參考Tinker 接入指南;
- 如何自定義類請參考Tinker 自定義擴(kuò)展芦鳍;
- Tinker的API預(yù)覽請參考Tinker API預(yù)覽;
- 其他常見問題皮仁,請參考常見問題菲宴;