微信 Tinker + 騰訊 Bugly 熱修復就搞定啦

本篇文章使用 tinker 做爲熱修復工具,使用 bugly 作爲後臺進行下補丁。android

Tinker、Bugly 簡介

「 Tinker 」 是微信官方的 Android 熱補丁解決方案,支持動態下發代碼、So庫以及資源,用來緊急修復 bug,解決你的燃眉之急。git

「 Bugly 」 是騰訊針對移動端 bug 管理、運營統計、熱修復的一個平臺。github

Tinker 熱修復組件 GitHub 連接地址bash

使用說明和簡介詳見項目 wiki 連接地址微信

接入指南詳見 GitHub 連接地址app

Bugly Android 熱更新使用指南 連接地址ide

Bugly、Tinker 接入

參考上面的「 Bugly Android 熱更新使用指南 」,按照步驟一步一步來。 其中要注意一下以幾個點:工具

  1. 配置依賴時,最好指定版本號。由於最新版本要是改東西了,你也不知道,可能就會發生一些問題,好比:方法的名字變了,當升級後就找不到了。gradle

  2. 若是你之前接入過 bugly 須要在 gradle 中註釋掉原有的 bugly 依賴。ui

  3. 別忘記在 app modul e的 「build.gradle」 文件中添加插件依賴。

    apply from: 'tinker-support.gradle'

  4. 使用推薦的 Tinker 接入方式,雖然接入麻煩寫,但兼容性會更好。

這裏詳細說下推薦的 Tinker 接入方式,許多人在這裏比較暈乎。

  1. 將 BaseApplication 中繼承的 Application 改成繼承 DefaultApplicationLike,並導入構造方法。
  2. 在 BaseApplication 中添加 onBaseContextAttached() 方法和 registerActivityLifecycleCallback() 方法。
@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);
    }
複製代碼
  1. 在 onCreate 方法中初始化 Bugly 。
@Override
    public void onCreate() {
        super.onCreate();
        // 這裏實現SDK初始化,appId替換成你的在Bugly平臺申請的appId
        // 調試時,將第三個參數改成true
        Bugly.init(getApplication(), "900029763", false);
    }
複製代碼

至此,咱們的原 BaseApplication 就已經改造完成了。Application 的獲取能夠經過 getApplication() 進行獲取。

  1. 自定義 Application 繼承 TinkerApplication。
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 是你的項目包名。

  1. 將 AndroidManifest.xml 中的 application name 改成自定義的 Application。

至於 tinker-support.gradle 文件,咱們直接粘貼過來便可。 配置參數可參考 TinkerSupport 插件使用指南,參考連接

發佈正式版本:

  1. 在項目的主 moudle 下,打開 tinker-support.gradle 文件,也可以使用全局搜索。此文件是 tinker 的配置文件,熱修復相關功能和參數能都在此文件中配置。

  2. 打開 tinker 熱修復組件。在 tinkerSupport 的方法中,將 enable 改成 true。

    enable = true ( true 開啓,false 關閉 )。

  3. 啓用覆蓋 tinkerPatch 配置功能。在 tinkerSupport 的方法中,將 overrideTinkerPatchConfiguration 改成 true。

    overrideTinkerPatchConfiguration = true ( true 開啓,false 關閉 )。

  4. 按照規則配置 tinkerId,tinkerId必須保證惟一性

  • 正式包 base-版本名 例:base-2.6.1
  • 補丁包 patch-版本名.1 例:patch-2.6.1.1 patch-2.6.1.2 。。。
  1. 關閉 tinkerPatch 的功能。在 tinkerPatch 中,註釋 tinkerPatch 中 tinkerEnable = false。

    //tinkerEnable = false

  2. 修改好這些配置後,就能夠正式打包了,打包有兩種方式,如下兩種方式都可。

  • Android Studio 正常打包流程,Build -> Generate Signed APK。

    正常打包流程

  • 打開 gradle 文件,運行 項目 gradle -> Tasks -> build -> assembleRelease。

    使用 gradle 打包

等待 gradle 運行結束後,會生成 bakApk 的文件夾,此文件夾下的 app-MMdd-hh-mm-ss 是咱們的基準包目錄,後期打補丁包的時候須要用到,必定要保存好。

文件位置:項目主 moudle -> build -> bakApk -> app-MMdd-hh-mm-ss(按照時間生成)。

文件位置

app-release.apk 就是咱們打好的包,在使用 360 加固助手加固後就能夠上線了。

發佈補丁包:

當修改好 bug 之後,

  1. 修改基準包目錄。在 tinker-support.gradle 中,將 def baseApkDir 改成你須要修復版本的基準包目錄(也就是上面提到的基準包目錄)。

    def baseApkDir = "app-MMdd-hh-mm-ss"

    MMdd-hh-mm-ss 修改成你須要修復版本的基準包目錄

後續的 5 個步驟和發正式包的前 5 個步驟相同,切記必定要修改 tinkerId,不然無發辨別版本。

  1. 使用 buildTinkerPatchRelease 打補丁包。

打開 gradle 運行 項目 gradle -> Tasks -> tinker-support -> buildTinkerPatchRelease。

buildTinkerPatchRelease位置

若是沒有此選項,首先確認你的 tinkerEnable 是不是 true,而後從新構建下項目便可。

  1. 使用 Bugly 平臺下發補丁包。

等待 gradle 運行結束後,會生成新的基準包,修復好的 apk 在此文件中。同時,還會生成 patch 文件夾,下發的補丁 patch_signed_7zip.apk 就在此文件夾中。

補丁文件位置:項目主 moudle -> build -> outputs -> patch -> release。

補丁圖片

打開 Bugly 平臺,選擇移動端平臺 -> 應用升級 -> 熱更新。

點擊發布補丁,選擇補丁文件,目標版本會在補丁上傳後會自動匹配。 可選擇下發範圍,選好後下發便可。

上傳補丁

使用 instantrun 的配置

因爲 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 功能了。

相關文章
相關標籤/搜索