Android使用騰訊Bugly中的Tinker進行熱更新詳解

前言:本人之前沒有使用過和集成過熱更新tinker,決定自己看文檔嘗試一下,在項目中配置一下。在看了文檔之後,文檔中介紹了兩種集成實現熱更新的方式,其中一對我來說就是比較麻煩的一種,要修改自己項目中的已經寫好的Application類,由於一些原因,我不想修改這個類,而且覺得這種方式寫起來麻煩,就選擇了寫更少的代碼去實現。這裏我是完全按照文檔來的,但是對文檔進行了多次熱更新嘗試中間有時成功有時失敗,最後總結的配置方法,這裏我不在介紹怎麼配置依賴,配置簡單,參考https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20180709165613 

什麼第一步添加插件依賴,第二部集成SDK,上面介紹的比較詳細,完全按照上面的來弄就行,

,接着在app module的“build.gradle”文件中添加:

 依賴插件腳本   :    apply from: 'tinker-support.gradle'       這個寫在和 apply plugin: 'com.android.application' 同級,就寫在它下一行就行了。

然後新建一個名爲tinker-support.gradle 的文件,和app的build.gradle 同級別即可,創建完,打開此文件,裏面直接把文檔連的全部複製下來,拷貝進去,我就是。

//這個不需要改動
apply plugin: 'com.tencent.bugly.tinker-support'
//這個不需要改動
def bakPath = file("${buildDir}/bakApk/")

/**
 * 此處填寫每次構建生成的基準包目錄
* 這個內容是在app->build->bakApk下的文件名字,看你想用哪個文件下面的內容,注意如果多次編譯,會出現多個,但是在後面打補丁包只能選擇一個,而且下面的baseApk 內容填寫的就是你選擇的那個文件下面的apk的名稱
BaseApkDir 目錄名稱爲上次打包發佈時的bakApk 的文件夾名稱(一定要記下來,且不能刪除,也不能輕易clean,一旦clean,這些文件就全部沒了,然後你就無法打補丁了)雖然每次運行都會生成一個新的,這個裏面的文件夾會越來越多,但是你可以手動把其他的刪除,發佈版本生成apk那個對應的文件夾名稱不要刪除,要留着
 */
def baseApkDir = "app-0208-15-10-00"

/**
 * 對於插件各參數的詳細解析請參考
 */
tinkerSupport {

    // 開啓tinker-support插件,默認值true
    enable = true

    // 指定歸檔目錄,默認值當前module的子目錄tinker
    autoBackupApkDir = "${bakPath}"

    // 是否啓用覆蓋tinkerPatch配置功能,默認值false
    // 開啓後tinkerPatch配置不生效,即無需添加tinkerPatch
    overrideTinkerPatchConfiguration = true

    // 編譯補丁包時,必需指定基線版本的apk,默認值爲空
    // 如果爲空,則表示不是進行補丁包的編譯
    // @{link tinkerPatch.oldApk }
    // 這裏也需要改 ,每次都改爲自己的新發布的版本的apk名稱
    baseApk = "${bakPath}/${baseApkDir}/app-release.apk"

    // 對應tinker插件applyMapping
    //這個看項目內容,有的有,有的沒有,我的項目中沒有生成這個文件,我就註釋掉了,這是混淆文件會有這個
    baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"

    // 對應tinker插件applyResourceMapping    
    // 這個一般不用動,都是一樣的
    baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"

       // 構建基準包和補丁包都要指定不同的tinkerId,並且必須保證唯一性
    //每次發佈新版本時,都需要重新修改一下tinkerId 的值,確保即即將發佈的版本中的tinkerId在目前所有版本中是唯一的
    //其他版本時沒有的,這樣爲了在此版本有修改的bug時,再修改此tinkerId的,只會對應當前線上你想對應的版本
    tinkerId = "base-1.0.1"

    // 構建多渠道補丁時使用
    // buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

    // 是否啓用加固模式,默認爲false.(tinker-spport 1.0.7起支持)
    // isProtectedApp = true

    // 是否開啓反射Application模式  ,這個看需求,我改爲true 了,
    enableProxyApplication = false

    // 是否支持新增非export的Activity(注意:設置爲true才能修改AndroidManifest文件)
    supportHotplugComponent = true

}

/**
 * 一般來說,我們無需對下面的參數做任何的修改
 * 對於各參數的詳細介紹請參考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    //oldApk ="${bakPath}/${appName}/app-release.apk"
    ignoreWarning = false
    useSign = true
    dex {
        dexMode = "jar"
        pattern = ["classes*.dex"]
        loader = []
    }
    lib {
        pattern = ["lib/*/*.so"]
    }

    res {
        pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
        ignoreChange = []
        largeModSize = 100
    }

    packageConfig {
    }
    sevenZip {
        zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
//        path = "/usr/local/bin/7za"
    }
    buildConfig {
        keepDexApply = false
        //tinkerId = "1.0.1-base"
        //applyMapping = "${bakPath}/${appName}/app-release-mapping.txt" //  可選,設置mapping文件,建議保持舊apk的proguard混淆方式
        //applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可選,設置R.txt文件,通過舊apk文件保持ResId的分配
    }
}

注意:這裏在多說幾句,

def baseApkDir = "app-0208-15-10-00"   這一行上面已經 詳細的說明了,這裏在囉嗦一句,假如我現在發佈一個版本的apk,我要build apk,然後會生成一個release 的apk,此時,會在app -> build -> bakApk -> 下面生成一個文件夾,文件夾的名字就是當前的時間命名的,假如現在是11月17日19點30分54秒,那文件夾的名稱就是app-1117-19-30-54 展開此文件夾,下面就會有對應的兩個或三個文件,這個先不管,我們一定要記住這個發佈時對應的這個文件一定留着。

還有上面在build apk時,看看上面的tinker-support.gradle 文件中 這個內容是否有值,: tinkerId = "base-1.0.1"

這裏默認爲base-1.0.1 ,你也可以用這個初始化命名,也可以稍作修改,我的改爲了base-1.0.0 了,然後在進行build生成要發佈的apk.

好了,現在我們把上面打包好的apk發佈上去,用戶下載。

突然有一個bug需要修改,我們此時要先把需要修改的bug改掉,接着在注意上面發佈的apk,這時,我們先把上面build生成apk時那個bakApk下的那個文件夾名字記住了,然後把名字 寫到  

def baseApkDir  

這個對應的值中。

然後,在修改  

tinkerId  的值,上面我發佈的時候,值爲  base-1.0.0  那麼,這裏我需要改一下和發佈不一樣的,這個修改有個規律,就是和我們apk的版本號一樣,雖然爲字符串,但是我們依然可以那麼寫,這裏我們改爲 base-1.0.1, 

然後在看一下 這個值:

baseApk    它後面的apk的名稱和我們上面發佈apk時bakApk下面對應的文件夾裏面的apk名稱是否一樣,一樣就不需要動了,不一樣就要修改一下,其他的就不用動了。

接着我們就開始打補丁了,點擊AndroidStudio右邊的Gradle,然後在app下面Task-》tinker-support 下面的buildTInkerPatchRelease ,點擊它就開始打補丁了。補丁打好之後,會在左邊項目的app -> build -> outputs下面的patch文件夾下面生成三個文件,哪三個文件,這個我就不寫了,截個圖

我們需要的就是中間那個,patch_signed_7zip.apk ,我們拷貝這個文件,然後發佈到bugly的熱更新中,發佈補丁,

選擇文件,之後會自動匹配到對應的版本,然後備註一下,點擊立即下發,過一會就能看到你修改的東西了。可能需要等待兩三分鐘。在下發列表中可以看到下發數量和激活數量。必須激活有激活的,才表示補丁成功。

 

這裏在多說一句,每次發佈的新版本,build  apk時,一樣要先修改 tinkerId  ,一個tinkerId對應一個apk版本,若不修改,和之前老版本的tinkerId一樣,那你這個補丁基本下發都是失敗的,我嘗試過多次,都是這個問題。一點主意。然後在打補丁,打補丁需要基於已發佈的版本的tinkerId 對base-1.0.1進行增加,改動,不能和之前的一樣。即可。多次遇坑就在這裏。慢慢摸索的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章