在上篇文章Android熱補丁方案中介紹了Tinker的原理框架,那麼我們現在就從初級入門開始,學習一下它的項目集成,首先,我們來看看它官方Demo的使用,體驗一下熱修復。
體驗官方Demo
步驟:
-
下載 Sample
打開Tinker開源代碼地址Tinker,把 Tinker 項目下載到本地後,使用 AS 導入項目tinker-sample-android
; -
設置 tinkerId
打開 app 的 build.gradle文件,找到getTinkerIdValue()
方法中:TINKER_ID :gitSha()
,將gitSha()
替換成自己想要的 tinkerId 命名規則; -
編譯 Base APK
編譯打包,此時 Tinker 會在工程的app/build/bakApk/
目錄下保存打包好的apk文件,先在手機上安裝該 apk ; -
設置Base APK路徑
找到剛纔生成的 apk 文件,複製其完整文件名,在 app 的 build.gradle 文件,設置:
tinkerOldApkPath = "${bakPath}/<剛纔生成的apk文件名>"
-
修復 Bug
在 Base Apk的代碼基礎上修改代碼修復 Bug; -
生成補丁
找到 Gradle 腳本中的tinker目錄下tinkerPatchDebug
雙擊運行它將生成 debug 版的 patch (補丁) apk 文件,在 output/tinkerPatch/debug 下,文件爲patch_signed_7zip.apk
; -
打入補丁
將patch_signed_7zip.apk
這個文件拷貝到 Android 設備的ExternalStorageDirectory()
路徑下.文件的路徑可以隨意設定,只需在MainActivity
中指明補丁 Apk 路徑即可;隨後點擊 Demo 中 Load Patch 按鈕,提示成功後,點擊 Kill Self 結束當前進程,重啓應用,即可看到所改的代碼修復的 Bug 現象。
##項目集成
###步驟:
(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預覽;
- 其他常見問題,請參考常見問題;