轉載請註明出處:https://juejin.im/post/5a44648a6fb9a045023bef4djava
在 Android 熱修復 - 各框架原理學習及對比 一文中,介紹了Nuwa、Robust、Andfix 和 Tinker 的實現原理,以及優缺點對比等。下面咱們就讓 Tinker-Demo跑起來,看看實際效果以及解決集成過程當中遇到的問題。android
下載 Github 上的開源代碼,而後僅需導入 tinker-sample-android 工程便可。git
在項目的 build.gradle 中,添加 tinker-patch-gradle-plugin 的依賴github
buildscript {
dependencies {
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.9.1')
}
}
複製代碼
而後在app的gradle文件app/build.gradle,咱們須要添加tinker的庫依賴以及apply tinker的gradle插件.bash
dependencies {
//可選,用於生成application類
provided('com.tencent.tinker:tinker-android-anno:1.9.1')
//tinker的核心庫
compile('com.tencent.tinker:tinker-android-lib:1.9.1')
}
...
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'
複製代碼
準備好後,運行...app
看一下app/build.gradle中在哪裏設置tinkerId。框架
def getTinkerIdValue() {
return hasProperty("TINKER_ID") ? TINKER_ID : gitSha()
}
複製代碼
def gitSha() {
String gitRev = 'git rev-parse --short HEAD'.execute(null, project.rootDir).text.trim()
...
複製代碼
這裏是 Tinker 官方的常見問題文檔 Tinker常見問題文檔ide
這裏設置成版本號便可post
String gitRev = '1.9.1'
複製代碼
再運行... 點擊 SHOW INFO 按鈕學習
MainActivity.java中添加代碼
Toast.makeText(this, "hello, Tinker", Toast.LENGTH_SHORT).show();
複製代碼
在app/build.gralde中,將剛纔生成的apk包標記爲oldApk
if (buildWithTinker()) {
apply plugin: 'com.tencent.tinker.patch'
tinkerPatch {
...
oldApk = getOldApkPath()
複製代碼
def getOldApkPath() {
return hasProperty("OLD_APK") ? OLD_APK : ext.tinkerOldApkPath
}
複製代碼
包名改爲和左邊的同樣。 在底部Terminal中輸入生成補丁包的命令 graldew tinkerPatchDebug
... 報錯
com.tencent.tinker.build.util.TinkerPatchException:
Warning: ignoreWarning is false, manifest was changed, while hot plug component support mode is disabled. Such changes will not take effect.
複製代碼
搜了下Issues,有相同的問題。官方技術大佬是怎麼回覆的,不過具體緣由還有待研究...
ignoreWarning = true
這裏設置爲忽略警告,再次 graldew tinkerPatchDebug
成功以後有個patch_signed_7zip.apk
可使用命令行將補丁包發送到手機。 adb push ./app/build/outputs/apk/tinkerPatch/debug/patch_signed_7zip.apk /storage/sdcard0/
不過這裏運行失敗了 `adb server is out of date. killing... CreateProcess failure, error 2
好吧!手動拷貝到手機文件管理根目錄下。 再次打開Tinker-Demo 點擊LOAD PATCH 按鈕 過了2-3s 出現Toast 提示
返回,再進入... 沒反應 這裏注意,必需要殺掉進程,再次進來才能成功加載patch包的代碼。 手動殺掉,或者點擊KILL SELF 按鈕
完成修復
各個框架各有優劣,Tinker 官方在文檔中也指出其不足之處:
Tinker通過幾回全量上線,也發現了一些熱補丁的問題。有如下的一些優化工做還沒有完成: 1. 支持四大組件的代理; 2. Crash 啓動保護;
道阻且長,目前Tinker 還只能是替換類、資源和so 文件等,若是支持了四大組件的代理,也許全部的非重大版本更新均可以用熱修復來實現了。
推薦閱讀:Android 熱修復 - 各框架原理學習及對比
Amigo學習(一)解決使用中遇到的問題比
記錄在此,僅爲學習! 感謝您的閱讀!歡迎指正! 歡迎加入 Android 技術交流羣,羣號:155495090。