在上篇文章Android熱更新檔方案中介紹了Tinker的原理架構,那麼我們現在就從初級入門開始,學習一下它的項目內建,首先,我們來看看它官方Demo的使用,體驗一下熱修複。
體驗官方Demo
步驟:
-
下載下傳 Sample
打開Tinker開源代碼位址Tinker,把 Tinker 項目下載下傳到本地後,使用 AS 導入項目
;tinker-sample-android
-
設定 tinkerId
打開 app 的 build.gradle檔案,找到
方法中:TINKER_ID :getTinkerIdValue()
,将gitSha()
替換成自己想要的 tinkerId 命名規則;gitSha()
-
編譯 Base APK
編譯打包,此時 Tinker 會在工程的
目錄下儲存打包好的apk檔案,先在手機上安裝該 apk ;app/build/bakApk/
-
設定Base APK路徑
找到剛才生成的 apk 檔案,複制其完整檔案名,在 app 的 build.gradle 檔案,設定:
tinkerOldApkPath = "${bakPath}/<剛才生成的apk檔案名>"
-
修複 Bug
在 Base Apk的代碼基礎上修改代碼修複 Bug;
-
生成更新檔
找到 Gradle 腳本中的tinker目錄下
輕按兩下運作它将生成 debug 版的 patch (更新檔) apk 檔案,在 output/tinkerPatch/debug 下,檔案為tinkerPatchDebug
;patch_signed_7zip.apk
-
打入更新檔
将
這個檔案拷貝到 Android 裝置的patch_signed_7zip.apk
路徑下.檔案的路徑可以随意設定,隻需在ExternalStorageDirectory()
中指明更新檔 Apk 路徑即可;随後點選 Demo 中 Load Patch 按鈕,提示成功後,點選 Kill Self 結束目前程序,重新開機應用,即可看到所改的代碼修複的 Bug 現象。MainActivity
##項目內建
###步驟:
(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 熱修複導入
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 檔案中剩下的拷貝進來(需要的考,已有的不需要考);
在這裡,我們可以定制一些自己的配置,比如 Tinkerid、PatchVersion 等,并且記得修改
buildWithTinker()
中 dex 的 loader 修改成自己的 Application 名。
def createTinkerId(){
return YourTinkerID;
}
def createPatchVersion(){
return YourPatchVersion;
}
有些具體的gradle配置的參數,大家可以參考Tinker介入指南中的表格,要是你英語夠好的話,可以去看sample中的app/build.gradle的英文介紹。
(4) 拷貝官方 Sample 項目中的檔案并配置;
- 拷貝 keyStore 檔案夾;
- 拷貝 keep_in_main_dex.txt 混淆檔案且自定義其中的application,并在 proguard-rules 混淆檔案加入保護:
-keepattributes SourceFile,LineNumberTable
- 拷貝 java 檔案,并作适當修改,如修改檔案名、在 service 的 onPatchResult 函數中加入自己的邏輯
(5) 配置ApplicationLike代理
XXApplicationLike.java
中的注解包名,用于自動生成 Applicaion,并在 Menifest 中給 Application 節點設定 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, 這裡使用預設即可!
loadVerifyFlag = false) //tinkerLoadVerifyFlag
public class SampleApplicationLike extends DefaultApplicationLike {
采用 Annotation 生成 Application ,需要将原來的 Application 類删掉。
将原本 Application 中的内容全部拷貝到 ApplicationLike.java 中。
(6) 編譯和更新檔
- 每次編譯或發包将安裝包與mapping檔案備份;
- 若有更新檔包的需要,按自身需要修改你的代碼、庫檔案等;
- 将備份的基準安裝包與mapping檔案輸入到tinkerPatch的配置中;
- 運作tinkerPatchRelease,即可自動編譯最新的安裝包,并與輸入基準包作差異,得到最終的更新檔包。
在打更新檔時注意gralde中關于路徑的修改:
##Tinker 接入文檔
- 如何快速接入請參考Tinker 接入指南;
- 如何自定義類請參考Tinker 自定義擴充;
- Tinker的API預覽請參考Tinker API預覽;
- 其他常見問題,請參考常見問題;