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

博客: 安卓之家
掘金: jp1017
微博: 追風917
CSDN: 蔣朋的家
簡書: 追風917linux

來自unsplash的美圖

當前熱修復方案不少,今天研究了下微信的tinker,使用效果仍是不錯的,配合tinker server服用更佳。下面介紹二者的使用,以便你們快速接入。android

tinker 接入指南

安裝tinker gradle插件

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

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

2 而後在app的gradle文件app/build.gradle,咱們須要添加tinker的庫依賴以及apply tinker的gradle插件.github

//apply tinker插件windows

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

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掉基礎包文件app

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, 雙擊執行就能夠, 以下圖:

gradle

好比, 打debug補丁, 雙擊tinkerPatchDebug就能夠了

下一次打補丁時就能夠從快捷欄選擇,而後點擊右側運行, 以下圖:

patch

安裝及卸載補丁

加載補丁

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

TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), patchPath);

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

清除補丁

當補丁出現異常或者某些狀況,咱們可能但願清空所有補丁,調用方法爲:

Tinker.with(context).cleanPatch();

固然咱們也能夠選擇卸載某個版本的補丁文件:

Tinker.with(context).cleanPatchByVersion();

在升級版本時咱們也無須手動去清除補丁,框架已經爲咱們作了這件事情。須要注意的是,在補丁已經加載的前提下清除補丁,可能會引發crash。這個時候更好重啓一下全部的進程。

查看補丁是否加載

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, 就是補丁的版本, 我這裏都是版本號, 能夠參考這個issue: 關於AppVersion問題

4 清單配置網絡及sd卡讀寫權限

  
 
   
    
   

 複製代碼

代碼初始化

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

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

請求更新補丁

1 主動請求更新

TinkerServerManager.checkTinkerUpdate(true);

2 獲取新增參數

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

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

tinker_server

參考

更多使用及問題請參考官方文檔:

Tinker -- 微信Android熱補丁方案

Tinker 接入指南

Tinker API概覽

Tinker 自定義擴展

Tinker 常見問題

Tinker Platform 平臺使用文檔

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

最後,很是感謝您的閱讀,有任何疑問,能夠後面評論,謝謝!

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

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

分享是一種美德,更是一種生活方式!!

也許你會說我是一個夢想者,但我不是惟一的一個。

悅分享,越快樂^_^

歡迎交流,轉載請註明出處,謝謝!

相關文章
相關標籤/搜索