本篇文章使用 tinker 做爲熱修復工具,使用 bugly 作爲後臺進行下補丁。android
「 Tinker 」 是微信官方的 Android 熱補丁解決方案,支持動態下發代碼、So庫以及資源,用來緊急修復 bug,解決你的燃眉之急。git
「 Bugly 」 是騰訊針對移動端 bug 管理、運營統計、熱修復的一個平臺。github
Tinker 熱修復組件 GitHub 連接地址。bash
使用說明和簡介詳見項目 wiki 連接地址。微信
接入指南詳見 GitHub 連接地址。app
Bugly Android 熱更新使用指南 連接地址。ide
參考上面的「 Bugly Android 熱更新使用指南 」,按照步驟一步一步來。 其中要注意一下以幾個點:工具
配置依賴時,最好指定版本號。由於最新版本要是改東西了,你也不知道,可能就會發生一些問題,好比:方法的名字變了,當升級後就找不到了。gradle
若是你之前接入過 bugly 須要在 gradle 中註釋掉原有的 bugly 依賴。ui
別忘記在 app modul e的 「build.gradle」 文件中添加插件依賴。
apply from: 'tinker-support.gradle'
使用推薦的 Tinker 接入方式,雖然接入麻煩寫,但兼容性會更好。
這裏詳細說下推薦的 Tinker 接入方式,許多人在這裏比較暈乎。
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
// you must install multiDex whatever tinker is installed!
MultiDex.install(base);
// 安裝tinker
Beta.installTinker(this);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {
getApplication().registerActivityLifecycleCallbacks(callbacks);
}
複製代碼
@Override
public void onCreate() {
super.onCreate();
// 這裏實現SDK初始化,appId替換成你的在Bugly平臺申請的appId
// 調試時,將第三個參數改成true
Bugly.init(getApplication(), "900029763", false);
}
複製代碼
至此,咱們的原 BaseApplication 就已經改造完成了。Application 的獲取能夠經過 getApplication() 進行獲取。
public class SampleApplication extends TinkerApplication {
public SampleApplication() {
super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike",
"com.tencent.tinker.loader.TinkerLoader", false);
}
}
複製代碼
其中第二個參數 "xxx.xxx.SampleApplicationLike",就是咱們剛剛改好的 BaseApplication,xxx.xxx 是你的項目包名。
至於 tinker-support.gradle 文件,咱們直接粘貼過來便可。 配置參數可參考 TinkerSupport 插件使用指南,參考連接。
在項目的主 moudle 下,打開 tinker-support.gradle 文件,也可以使用全局搜索。此文件是 tinker 的配置文件,熱修復相關功能和參數能都在此文件中配置。
打開 tinker 熱修復組件。在 tinkerSupport 的方法中,將 enable 改成 true。
enable = true
( true 開啓,false 關閉 )。
啓用覆蓋 tinkerPatch 配置功能。在 tinkerSupport 的方法中,將 overrideTinkerPatchConfiguration 改成 true。
overrideTinkerPatchConfiguration = true
( true 開啓,false 關閉 )。
按照規則配置 tinkerId,tinkerId必須保證惟一性。
關閉 tinkerPatch 的功能。在 tinkerPatch 中,註釋 tinkerPatch 中 tinkerEnable = false。
//tinkerEnable = false
修改好這些配置後,就能夠正式打包了,打包有兩種方式,如下兩種方式都可。
Android Studio 正常打包流程,Build -> Generate Signed APK。
打開 gradle 文件,運行 項目 gradle -> Tasks -> build -> assembleRelease。
等待 gradle 運行結束後,會生成 bakApk 的文件夾,此文件夾下的 app-MMdd-hh-mm-ss 是咱們的基準包目錄,後期打補丁包的時候須要用到,必定要保存好。
文件位置:項目主 moudle -> build -> bakApk -> app-MMdd-hh-mm-ss(按照時間生成)。
app-release.apk 就是咱們打好的包,在使用 360 加固助手加固後就能夠上線了。
當修改好 bug 之後,
修改基準包目錄。在 tinker-support.gradle 中,將 def baseApkDir 改成你須要修復版本的基準包目錄(也就是上面提到的基準包目錄)。
def baseApkDir = "app-MMdd-hh-mm-ss"
MMdd-hh-mm-ss 修改成你須要修復版本的基準包目錄
後續的 5 個步驟和發正式包的前 5 個步驟相同,切記必定要修改 tinkerId,不然無發辨別版本。
打開 gradle 運行 項目 gradle -> Tasks -> tinker-support -> buildTinkerPatchRelease。
若是沒有此選項,首先確認你的 tinkerEnable 是不是 true,而後從新構建下項目便可。
等待 gradle 運行結束後,會生成新的基準包,修復好的 apk 在此文件中。同時,還會生成 patch 文件夾,下發的補丁 patch_signed_7zip.apk 就在此文件夾中。
補丁文件位置:項目主 moudle -> build -> outputs -> patch -> release。
打開 Bugly 平臺,選擇移動端平臺 -> 應用升級 -> 熱更新。
點擊發布補丁,選擇補丁文件,目標版本會在補丁上傳後會自動匹配。 可選擇下發範圍,選好後下發便可。
因爲 Android Studio 的 instantrun 和 tinker 有衝突,因此,想要使用 instanttun 須要關閉 tinker,關閉方法以下:
1.關閉 tinker 熱修復組件。在 tinkerSupport 的方法中,將 enable 改成 false。
enable = false
( true 開啓,false 關閉 )。
2.關閉覆蓋 tinkerPatch 配置功能。在 tinkerSupport 的方法中,將 overrideTinkerPatchConfiguration 改成 false。
overrideTinkerPatchConfiguration = false
( true 開啓,false 關閉 )。
3.打開 tinkerPatch 的功能。在 tinkerPatch 中,去掉 tinkerPatch 中 tinkerEnable = false 的註釋。
tinkerEnable = false
而後就能夠正常的使用 instantrun 功能了。