Bugly 版本更新和熱修復接入

提起版本更新,是每個app和開發(fā)者最熟悉的東西,但是頻繁的更新會讓用戶反感,但是不更新的話在發(fā)現(xiàn)了bug怎么辦呢?在用戶體驗和版本穩(wěn)定性的碰撞下,熱修復出來了,熱修復就不用多說了,常見熱修復分為冷啟動修復和實時修復,這里不多介紹,感興趣的朋友可以了解各大平臺的熱修復原理,這次由于公司有用到Bugly的熱修復,所以記錄下來。

1.引入依賴及簽名配置

首先在我們app目錄下的build.gradle文件中引入:

    implementation 'com.tencent.bugly:crashreport_upgrade:latest.release'
    implementation 'com.tencent.bugly:nativecrashreport:latest.release'
    implementation 'com.tencent.tinker:tinker-android-lib:1.9.9'

這里的latest.release代表最新版本的意思,然后我們在Project的build.gradle文件中引入

 classpath "com.tencent.bugly:tinker-support:1.1.5"  

回到我們app目錄下的build.gradle文件,在頂部加入

apply from: 'tinker-support.gradle'

然后配置好簽名,為什么要配置簽名呢?因為在我們等下自動打包的時候會用上,在app目錄下的build.gradle文件中android節(jié)點下加入

signingConfigs {

        release {
            keyAlias '簽名文件別名'
            keyPassword '密碼'
            storeFile file('簽名文件路徑')
            storePassword '簽名文件密碼'
        }
    }

配置好后,我們還要在 buildTypes 的節(jié)點中設置:


    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release//在這里設置配置的簽名
        }
    }

以上我們就完成了自動打包的簽名配置,接下來接入和初始化,需要在清單文件中先配置:

 <!--騰訊bugly升級服務start-->
        <activity
            android:name="com.tencent.bugly.beta.ui.BetaActivity"
            android:configChanges="keyboardHidden|orientation|screenSize|locale"
            android:theme="@android:style/Theme.Translucent" />


        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.fileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

        <!--騰訊bugly升級服務end-->

provider文件主要是為了支持andorid N以上訪問共享路徑的文件,如果你的項目中有其他第三方庫也配置了,可以繼承FileProvider類來解決合并沖突的問題:

<provider
    android:name="com.tencent.bugly.beta.utils.BuglyFileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true"
    tools:replace="name,authorities,exported,grantUriPermissions">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"
        tools:replace="name,resource"/>
</provider>

然后我們需要在res目錄新建xml文件夾,創(chuàng)建provider_paths.xml文件如下:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->
    <external-path name="beta_external_path" path="Download/"/>
    <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->
    <external-path name="beta_external_files_path" path="Android/data/"/>
</paths>

這樣我們就完事具備,只欠東風,在Application中初始化:

 Beta.autoInit = true;
 Beta.canShowUpgradeActs.add(MainActivity.class);
 Beta.installTinker();
 Bugly.init(this, "appId", true);

Beta類作為Bugly的初始化擴展,通過Beta類可以修改升級的檢測時機,界面元素以及自定義升級行為,詳情可以查看官方文檔Beat拓展類,在這里呢,我就不多說了,由于自動檢測更新我覺得有延遲,所以可以在主頁面調(diào)用Beta.checkUpgrade(isManual ,isSilence );方法來檢測更新
參數(shù)1:isManual 用戶手動點擊檢查,非用戶點擊操作請傳false

參數(shù)2:isSilence 是否顯示彈窗等交互,[true:沒有彈窗和toast] [false:有彈窗或toast]
然后打包上傳一氣呵成,這里提交后要稍等幾分鐘才能生效,然后關掉app,打開就會有更新提示了。


1465806964532.png

更新完成后,到我們的重頭戲熱更了。

2.熱更新配置

首先我們要在app的目錄下創(chuàng)建tinker-support.gradle,然后拷入代碼:

apply plugin: 'com.tencent.bugly.tinker-support'

def bakPath = file("${buildDir}/bakApk/")

/**
 * 此處填寫每次構建生成的基準包目錄
 */
def baseApkDir = "app-0523-11-17-07"

/**
 * 對于插件各參數(shù)的詳細解析請參考
 */
tinkerSupport {

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

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

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

    // 編譯補丁包時,必需指定基線版本的apk,默認值為空
    // 如果為空,則表示不是進行補丁包的編譯
    // @{link tinkerPatch.oldApk }
    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 = "0.0.39.2-pasth"
    //tinkerId = "0.0.39.1-app"
    // 構建多渠道補丁時使用
    // buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

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

    // 是否開啟反射Application模式
    enableProxyApplication = true

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

}

/**
 * 一般來說,我們無需對下面的參數(shù)做任何的修改
 * 對于各參數(shù)的詳細介紹請參考:
 * 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的分配
    }
}

大多數(shù)配置不用修改,在這里注意
baseApkDir
tinkerId
baseApkProguardMapping
這三個參數(shù),第一個呢暫時不用管,是打補丁包時的基準包目錄,第二個時標識符,可以隨意明明,但是注意唯一性,第三個參數(shù)如果項目沒有啟用混淆,可以屏蔽掉,由于我們配置好了簽名,先修改tinkerId的參數(shù),隨意命名(最好用版本號加項目名),然后打開anroid studio的Gradle菜單:

QQ圖片20190523163748.png

如圖打基準包的箭頭所指,雙擊,等待控制臺日志如下圖:


QQ圖片20190523164001.png

出現(xiàn)BUILE SUCCESSFUL字樣,表示編譯成功,然后我們在以下目錄可以看到生成的基準包:


QQ圖片20190523164028.png

基準包有了,我們先修改一下app的內(nèi)容,修改完后,將tinker-support.gradle文件中的baseApkDir修改為編譯生成的基準包的目錄名,如上圖的app-0523-16-28-51,然后記得修改tinkerId,之后點擊Gradle菜單中的buildTinkerPatchRelease,等待日志出現(xiàn)BUILD SUCCESSFUL的字樣,在如下路徑中找到補丁包:
QQ圖片20190523170656.png

箭頭所指就是我們的補丁包,打工告成,記住,上傳補丁包前請先安裝基準包并打開,否則會報找不到版本的錯誤。

Snip20170209_6.png

等待十幾分鐘后,重新打開app會發(fā)現(xiàn)修復成功。

總結

熱更新的配置不是很麻煩,熟悉了以后就很快了,關鍵是Bugly生效時間慢,一開始配置成功見沒生效還以為沒弄好,這是個坑,希望能幫到配置Bugly熱更的大家。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容