微信熱修復tinker及 tinker server 的快速接入方法

當前熱修復方案很多,今天研究了下微信的tinker,使用效果還是不錯的,配合tinker server服用更佳。本文介紹兩者的使用,以便大家快速接入。

目錄


1.tinker接入指南

?安裝tinker gradle插件
?配置tinker task
?生成Application
?打補丁包
?安裝及卸載補丁
?加載補丁
?清除補丁
?查看補丁是否加載

2.tinker serve接入及使用

?gradle配置環境
?代碼初始化
?請求更新補丁

3.參考

image
image

tinker 接入指南


安裝tinker

gradle插件

1.在項目的build.gradle中, 添加tinker-patch-gradle-plugin的依賴。

buildscript {
    dependencies {
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.5')
    }
}

2.然后在app的gradle文件app/build.gradle,我們需要添加tinker的庫依賴以及apply tinker的gradle插件。

//apply tinker插件

apply plugin: 'com.tencent.tinker.patch'

dependencies {
    //可選,用于生成application類
    provided('com.tencent.tinker:tinker-android-anno:1.7.5')
    //tinker的核心庫
    compile('com.tencent.tinker:tinker-android-lib:1.7.5')
}

配置tinker task

配置基礎包, tinkerid, dexMode等,詳見gradle配置:

tinker task 配置

我做了如下修改:

1.修改tinkerid為版本號, 跳過了需要commit一次的坑:smile:

def getTinkerIdValue() {
    //版本作為id
    return android.defaultConfig.versionName
}

2.移動備份文件到/tinker/bakApk/下, 防止clean掉基礎包文件。

3.重命名備份文件, 比如 base-app-debug-v1.0.1-2016-1125.apk , 當然自動生成的是 app-debug-v1.0.1-2016-1125.apk , 需要手動添加前綴作為基礎包, 后面多次編譯不會把基礎包覆蓋掉, 也不會像官方demo里那樣以秒命名產生很多文件。

?4.修改tinker message 為 I am the patch apk-v版本號 。

5.修改patchVersion為版本號, 這個在tinker server需要。

-configField("patchVersion", "1.0.7")
+configField("patchVersion", android.defaultConfig.versionName)

注意 里面有些修改的地方, 包名修改為你的包名等, 我用todo做了標記。

生成 Application

如果你有Application類, 那么需要自定義一個DefaultApplicationLike, 讓tinker
幫你生成Application。

正如項目里的 public class SampleApplicationLike extends DefaultApplicationLike { 并對類添加注解, 比如添加如下注解:

@DefaultLifeCycle(
application = "tinker.sample.android.app.SampleApplication",             
//application name to generate
flags = ShareConstants.TINKER_ENABLE_ALL)

編譯后, 會生成一個SampleApplication, 用這個作為你的Application, 寫入清單文件。

好了, tinker到這里就配置好了, 下面開始打補丁。

打補丁包

1 命令行

打debug補丁: ./gradlew tinkerPatchDebug

打release補丁: ./gradlew tinkerReleaseDebug

?這里需要注意, 命令在linux和mac下最好是 ./gradlew , 意思是當前項目的gradlew, 如果寫成 gradlew 可以會去下載gradle等, 因為那是全局的, 比如AS2.2.2帶的版本是2.14.1。而我現在的是最新版本3.2.1, 可輸入 ./gradlew -vgradlew -v 查看而windows就可以是 gradlew。

注意 debug和release配置的基包不同, 和他們一一對應, 另外, release還需要配置mapping文件。

2 雙擊對應task

就是去gradle projects里找到對應task, 雙擊執行就可以, 如下圖:

image

比如, 打debug補丁, 雙擊 tinkerPatchDebug 就可以了。下一次打補丁時就可以從快捷欄選擇,然后點擊右側運行, 如下圖:

?
image

安裝及卸載補丁

1.加載補丁

第二個參數是補丁包存放路徑, 名稱任意, 可以不以 .bak 結尾。

TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), patchPath);

還可以自定義加載成功等交互, 請參考 SampleResultService , 別忘記添加進清單。

2.清除補丁

當補丁出現異?;蛘吣承┣闆r,我們可能希望清空全部補丁,調用方法為:

Tinker.with(context).cleanPatch();

當然我們也可以選擇卸載某個版本的補丁文件:

Tinker.with(context).cleanPatchByVersion();

在升級版本時我們也無須手動去清除補丁,框架已經為我們做了這件事情。需要注意的是,在補丁已經加載的前提下清除補丁,可能會引起crash。這個時候更好重啟一下所有的進程。

3.查看補丁是否加載
?

boolean isPatched = tinker.isTinkerLoaded();

tinker server接入及使用


tinker server提供tinker補丁包下發及監控等, 使用也是很簡單。

gradle 配置環境

1.gradle遠程倉庫依賴jcenter:

repositories {
    jcenter()
}

?
2.再添加sdk庫的dependencies依賴:

dependencies {
    compile("com.tencent.tinker:tinker-server-android:0.3.0")
}

?
3.在TinkerPatch 平臺中得到的 AppKey 以及AppVersion,將他們寫入 buildConfig 中:比如:

buildConfigField "String", "APP_KEY", "\"f938475486f91936\""
buildConfigField "String", "APP_VERSION",  "\"3.0.0\""

平臺鏈接: tinkerpatch.com

新增app后可以得到AppKey, 至于AppVersion, 就是補丁的版本。

4.清單配置網絡及sd卡讀寫權限 代碼初始化

TinkerServerManager.installTinkerServer(getApplication(), Tinker.with(getApplication()), 3);

后面的3表示每隔3小時請求一次服務器, 檢查是否有更新包。

請求更新補丁

1.主動請求更新

TinkerServerManager.checkTinkerUpdate(true);

2.獲取新增參數

TinkerServerManager.getDynamicConfig(new ConfigRequestCallback() {...

下面來一個該demo的tinker server 截圖:

image

參考


更多使用及問題請參考官方文檔:
Tinker -- 微信Android熱補丁方案
Tinker 接入指南
Tinker API概覽
Tinker 自定義擴展
Tinker 常見問題
Tinker Platform 平臺使用文檔

代碼就是Tinker官方示例,我做了一些修改,可點擊這里查看:github.com/jp1017/tink…

?神奇的安卓開發網站:androidcat.com/

安卓開源庫收集整理:github.com/XXApple/And…

(文章轉載自:https://juejin.im/post/5838298d61ff4b006b442b53

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容