當前熱修復方案很多,今天研究了下微信的tinker,使用效果還是不錯的,配合tinker server服用更佳。本文介紹兩者的使用,以便大家快速接入。
目錄
1.tinker接入指南
?安裝tinker gradle插件
?配置tinker task
?生成Application
?打補丁包
?安裝及卸載補丁
?加載補丁
?清除補丁
?查看補丁是否加載
2.tinker serve接入及使用
?gradle配置環境
?代碼初始化
?請求更新補丁
3.參考
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 -v
和 gradlew -v
查看而windows就可以是 gradlew。
注意 debug和release配置的基包不同, 和他們一一對應, 另外, release還需要配置mapping文件。
2 雙擊對應task
就是去gradle projects里找到對應task, 雙擊執行就可以, 如下圖:
比如, 打debug補丁, 雙擊 tinkerPatchDebug
就可以了。下一次打補丁時就可以從快捷欄選擇,然后點擊右側運行, 如下圖:
安裝及卸載補丁
1.加載補丁
第二個參數是補丁包存放路徑, 名稱任意, 可以不以 .bak
結尾。
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), patchPath);
還可以自定義加載成功等交互, 請參考 SampleResultService
, 別忘記添加進清單。
2.清除補丁
當補丁出現異常或者某些情況,我們可能希望清空全部補丁,調用方法為:
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 截圖:
參考
更多使用及問題請參考官方文檔:
Tinker -- 微信Android熱補丁方案
Tinker 接入指南
Tinker API概覽
Tinker 自定義擴展
Tinker 常見問題
Tinker Platform 平臺使用文檔
代碼就是Tinker官方示例,我做了一些修改,可點擊這里查看:github.com/jp1017/tink…
?神奇的安卓開發網站:androidcat.com/
安卓開源庫收集整理:github.com/XXApple/And…