博客: 安卓之家
掘金: jp1017
微博: 追風917
CSDN: 蔣朋的家
簡書: 追風917linux
當前熱修復方案不少,今天研究了下微信的tinker,使用效果仍是不錯的,配合tinker server服用更佳。下面介紹二者的使用,以便你們快速接入。android
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')
}複製代碼
配置基礎包, 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類, 那麼須要自定義一個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
就能夠了
下一次打補丁時就能夠從快捷欄選擇,而後點擊右側運行, 以下圖:
第二個參數是補丁包存放路徑, 名稱任意, 能夠不以 .bak
結尾
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), patchPath);
還能夠自定義加載成功等交互, 請參考 SampleResultService
, 別忘記添加進清單
當補丁出現異常或者某些狀況,咱們可能但願清空所有補丁,調用方法爲:
Tinker.with(context).cleanPatch();
固然咱們也能夠選擇卸載某個版本的補丁文件:
Tinker.with(context).cleanPatchByVersion();
在升級版本時咱們也無須手動去清除補丁,框架已經爲咱們作了這件事情。須要注意的是,在補丁已經加載的前提下清除補丁,可能會引發crash。這個時候更好重啓一下全部的進程。
boolean isPatched = tinker.isTinkerLoaded();
tinker server 提供tinker補丁包下發及監控等, 使用也是很簡單
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官方示例,我作了一些修改,可點擊這裏查看: github.com/jp1017/tink…
最後,很是感謝您的閱讀,有任何疑問,能夠後面評論,謝謝!
神奇的安卓開發網站:androidcat.com/
安卓開源庫收集整理:github.com/XXApple/And…
分享是一種美德,更是一種生活方式!!
也許你會說我是一個夢想者,但我不是惟一的一個。
悅分享,越快樂^_^
歡迎交流,轉載請註明出處,謝謝!