Android 熱修復 - Tinker 實現及踩過的坑

轉載請註明出處:https://juejin.im/post/5a44648a6fb9a045023bef4djava

寫在開頭

Android 熱修復 - 各框架原理學習及對比 一文中,介紹了Nuwa、Robust、Andfix 和 Tinker 的實現原理,以及優缺點對比等。下面咱們就讓 Tinker-Demo跑起來,看看實際效果以及解決集成過程當中遇到的問題。android

Tinker-Demo 效果

下載 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

tinkerId is not set!!!

看一下app/build.gradle中在哪裏設置tinkerId。框架

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

tinkerId is not set 官網回答

這裏設置成版本號便可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
}
複製代碼

oldApkPath

包名改爲和左邊的同樣。 在底部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

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

  • failed to start daemon * error:` 試了一大堆方法,無果...

好吧!手動拷貝到手機文件管理根目錄下。 再次打開Tinker-Demo 點擊LOAD PATCH 按鈕 過了2-3s 出現Toast 提示

Toast 提示

返回,再進入... 沒反應 這裏注意,必需要殺掉進程,再次進來才能成功加載patch包的代碼。 手動殺掉,或者點擊KILL SELF 按鈕

hello, Tinker

完成修復

寫在後頭

各個框架各有優劣,Tinker 官方在文檔中也指出其不足之處:

Tinker通過幾回全量上線,也發現了一些熱補丁的問題。有如下的一些優化工做還沒有完成: 1. 支持四大組件的代理; 2. Crash 啓動保護;

道阻且長,目前Tinker 還只能是替換類、資源和so 文件等,若是支持了四大組件的代理,也許全部的非重大版本更新均可以用熱修復來實現了。

推薦閱讀:Android 熱修復 - 各框架原理學習及對比
Amigo學習(一)解決使用中遇到的問題比

記錄在此,僅爲學習! 感謝您的閱讀!歡迎指正! 歡迎加入 Android 技術交流羣,羣號:155495090。

相關文章
相關標籤/搜索