1. 程式人生 > >Android熱修復應用篇--關於騰訊Bugly的使用

Android熱修復應用篇--關於騰訊Bugly的使用

上篇介紹了 Android 熱修復原理篇及幾大方案比較 介紹了熱修復功能和幾個比較火的庫,本篇介紹Bugly(目前採用微信Tinker的開源方案)的整合及使用方法.

bugly兼有異常採集上報,全量更新及熱更新功能,本文主要關注其熱更新模組;話不多說兩橫一豎直接開幹.

首先註冊登入bugly平臺賬號,然後就可以註冊新的app,填寫相應的資訊,就可以得到相應的APP_ID。這點相信大家很有經驗,不用多說.

第一步:新增外掛依賴

工程根目錄下“build.gradle”檔案中新增:注意是根目錄下,即最外層的build.gradle下!

buildscript {
    repositories
{        jcenter()    }    dependencies {        // tinkersupport外掛, 其中lastest.release指拉取最新版本,也可以指定明確版本號,例如1.0.4        classpath "com.tencent.bugly:tinker-support:latest.release"    } }
注意:自tinkersupport 1.0.3版本起無需再配tinker外掛的classpath。

第二步:整合SDK

gradle配置

在app module的“build.gradle”檔案中新增(示例配置):


 dependencies {

          compile "com.android.support:multidex:1.0.1" // 多dex配置
          compile 'com.tencent.bugly:crashreport_upgrade:latest.release' // 升級SDK
}

在app module的“build.gradle”檔案中新增:

// 依賴外掛指令碼
apply from: 'tinker-support.gradle'

tinker-support.gradle內容如下所示(示例配置):

注:您需要在同級目錄下建立tinker-support.gradle這個檔案哦。


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

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

/**
 * 此處填寫每次構建生成的基準包目錄
 */
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 }
    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 = "base-1.0.1"

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

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

}

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


第三步:初始化SDK

enableProxyApplication = false 的情況

這是Tinker推薦的接入方式,一定程度上會增加接入成本,但具有更好的相容性。

整合Bugly升級SDK之後,我們需要按照以下方式自定義ApplicationLike來實現Application的程式碼(以下是示例):

自定義Application

public class SampleApplication extends TinkerApplication {
    public SampleApplication() {
        super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike",
                "com.tencent.tinker.loader.TinkerLoader", false);
    }
}

注意:這個類整合TinkerApplication類,這裡面不做任何操作,所有Application的程式碼都會放到ApplicationLike繼承類當中
引數解析
引數1:tinkerFlags 表示Tinker支援的型別 dex only、library only or all suuport,default: TINKER_ENABLE_ALL
引數2:delegateClassName Application代理類 這裡填寫你自定義的ApplicationLike
引數3:loaderClassName Tinker的載入器,使用預設即可
引數4:tinkerLoadVerifyFlag 載入dex或者lib是否驗證md5,預設為false

我們需要您將以前的Applicaton配置為繼承TinkerApplication的類:

配置基準包的tinkerId

自定義ApplicationLike

public class SampleApplicationLike extends DefaultApplicationLike {

    public static final String TAG = "Tinker.SampleApplicationLike";

    public SampleApplicationLike(Application application, int tinkerFlags,
            boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime,
            long applicationStartMillisTime, Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
    }


    @Override
    public void onCreate() {
        super.onCreate();
        // 這裡實現SDK初始化,appId替換成你的在Bugly平臺申請的appId
        // 除錯時,將第三個引數改為true
        Bugly.init(getApplication(), "900029763", false);
    }


    @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
        // TinkerManager.installTinker(this); 替換成下面Bugly提供的方法
        Beta.installTinker(this);
    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {
        getApplication().registerActivityLifecycleCallbacks(callbacks);
    }

}

注意:tinker需要你開啟MultiDex,你需要在dependencies中進行配置compile "com.android.support:multidex:1.0.1"才可以使用MultiDex.install方法; SampleApplicationLike這個類是Application的代理類,以前所有在Application的實現必須要全部拷貝到這裡,在onCreate方法呼叫SDK的初始化方法,在onBaseContextAttached中呼叫Beta.installTinker(this);

enableProxyApplication = true 的情況


public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 這裡實現SDK初始化,appId替換成你的在Bugly平臺申請的appId
        // 除錯時,將第三個引數改為true
        Bugly.init(this, "900029763", false);
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        // you must install multiDex whatever tinker is installed!
        MultiDex.install(base);


        // 安裝tinker
        Beta.installTinker();
    }

}

注:無須你改造Application,主要是為了降低接入成本,我們外掛會動態替換AndroidMinifest檔案中的Application為我們定義好用於反射真實Application的類(需要您接入SDK 1.2.2版本 和 外掛版本 1.0.3以上)。

第四步:AndroidManifest.xml配置

1. 許可權配置

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

注意:如果你也想使用升級功能,你必須要進行2、3項的配置,而如果你只想使用熱更新能力,你只需要配置許可權即可。

2. Activity配置

<activity
    android:name="com.tencent.bugly.beta.ui.BetaActivity"
    android:theme="@android:style/Theme.Translucent" />

3. 配置FileProvider

注意:如果您想相容Android N或者以上的裝置,必須要在AndroidManifest.xml檔案中配置FileProvider來訪問共享路徑的檔案。如果你使用的第三方庫也配置了同樣的FileProvider,你需要將第三方庫配置的路徑copy到我們配置的provider_path檔案下。


 <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>

${applicationId}請替換為您的包名,例如com.bugly.upgrade.demo。這裡要注意一下,FileProvider類是在support-v4包中的,檢查你的工程是否引入該類庫。

在res目錄新建xml資料夾,建立provider_paths.xml檔案如下:


<?xml version="1.0" encoding="utf-8"?>
<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>

這裡配置的兩個外部儲存路徑是升級SDK下載的檔案可能存在的路徑,一定要按照上面格式配置,不然可能會出現錯誤。

第五步:混淆配置

為了避免混淆SDK,在Proguard混淆檔案中增加以下配置:

-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}

如果你使用了support-v4包,你還需要配置以下混淆規則:


-keep class android.support.**{*;}

檢視Bugly的Logcat日誌

開啟Bugly的Logcat日誌需要在初始化時,isDebug引數設為true。

TAG為CrashReportInfo,是Bugly主要操作日誌,包括初始化、日誌上報資訊;

TAG為CrashReport,是Bugly除錯日誌,若Bugly使用中有問題,可以將該日誌資訊反饋給客服人員。

到此bugly熱更新配置已完成,下面來進行具體用法

完整接入流程

  • 打基準包安裝並上報聯網(注:填寫唯一的tinkerId)
  • 對基準包的bug修復(可以是Java程式碼變更,資源的變更)
  • 修改基準包路徑、填寫補丁包tinkerId、mapping檔案路徑、resId檔案路徑
  • 執行tinkerPatchRelease打Release版本補丁包
  • 選擇app/build/outputs/patch目錄下的補丁包並上傳(注:不要選擇tinkerPatch目錄下的補丁包,不然上傳會有問題)
  • 編輯下發補丁規則,點選立即下發
  • 重啟基準包,請求補丁策略(SDK會自動下載補丁併合成)
  • 再次重啟基準包,檢驗補丁應用結果
  • 檢視頁面,檢視啟用資料的變化

普通打包

1、編譯基準包

配置基準包的tinkerId

配置基準包的tinkerId

tinkerId最好是一個唯一標識,例如git版本號、versionName等等。 如果你要測試熱更新,你需要對基線版本進行聯網上報。

這裡強調一下,基線版本配置一個唯一的tinkerId,而這個基線版本能夠應用補丁的前提是整合過熱更新SDK,並啟動上報過聯網,這樣我們後臺會將這個tinkerId對應到一個目標版本,例如tinkerId = "bugly_1.0.0" 對應了一個目標版本是1.0.0,基於這個版本打的補丁包就能匹配到目標版本。

執行assembleRelease編譯生成基準包:

編譯基準包

這個會在build/outputs/bakApk路徑下生成每次編譯的基準包、混淆配置檔案、資源Id檔案,如下圖所示:

生成的基線版本

實際應用中,請注意儲存線上釋出版本的基準apk包、mapping檔案、R.txt檔案,如果線上版本有bug,就可以藉助我們tinker-support外掛進行補丁包的生成

啟動apk,上報聯網資料

我們每次冷啟動都會請求補丁策略,會上報當前版本號和tinkerId,這樣我們後臺就能將這個唯一的tinkerId對應到一個版本,大家測試的時候可以開啟logcat檢視我們的日誌,如下圖所示:

上報聯網資料

2、對基線版本的bug修復

未修復前

未修復前

這個類有一個會造成空指標的方法。

修復後

修復後

對產生bug的類進行修復,作為補丁下次覆蓋基線版本的類。

3、根據基線版本生成補丁包

相關推薦

Android修復應用--關於Bugly的使用

上篇介紹了 Android 熱修復原理篇及幾大方案比較 介紹了熱修復功能和幾個比較火的庫,本篇介紹Bugly(目前採用微信Tinker的開源方案)的整合及使用方法. bugly兼有異常採集上報,全量更新及熱更新功能,本文主要關注其熱更新模組;話不多說兩橫一豎直接開幹.

Android 修復原理及幾大方案比較

熱修復說白了就是”即時無感打補丁”,比如你們公司上線一個app,使用者反應有重大bug,需要緊急修復。2015年以來,Android開發領域裡對熱修復技術的討論和分享越來越多,同時也出現了一些不同的解決方案.如果按照通常做法,那就是程式猿加班搞定bug,然後測試,重新打包併

修復系列之一----Android 修復原理及幾大方案比較

熱修復說白了就是”即時無感打補丁”,比如你們公司上線一個app,使用者反應有重大bug,需要緊急修復。2015年以來,Android開發領域裡對熱修復技術的討論和分享越來越多,同時也出現了一些不同的解決方案.如果按照通常做法,那就是程式猿加班搞定bug,然後測試,重新打包

Android Bugly——異常上報和應用更新

schema err hidden eno xmlns 哈哈 map ant export 騰訊Bugly,為移動開發者提供專業的異常上報和運營統計,幫助開發者快速發現並解決異常,同時掌握產品運營動態,及時跟進用戶反饋。 首先Bugly有兩大優點,免費,不用審核 使用步驟如

Android Bugly 更新

nor 現在 oar rri filter ble 實施 2.2.0 armeabi 這個是一位大佬教我的,我自己照著做寫博客 熱更新雖然看起來很復雜,但是Bugly通過集成,使得這個過程很簡單。我這裏不涉及多渠道熱更新,只講述最簡單的情況。 1.首先我們需要在Bugly上

Android Bugly更新接入(Kotlin語言)

Android 騰訊Bugly熱更新接入(Kotlin語言) 簡介 一、新增外掛依賴 二、gradle配置 三、新建tinker-support.gradle 四、初始化SDK 五、AndroidManifest.xml配置 六、混淆

bugly修復功能整合筆記

首先我們從整體比較目前市面上常用的幾種Android App 熱修復方案: bugly熱更新功能集成了Tinker熱修復框架,引用騰訊bugly官網的一段話: 無需關注Tinker是如何合成補丁的無需自己搭建補丁管理後臺無需考慮後臺下發補丁策略的任何事情無需考慮補丁

Android Bugly(封裝tinker) 更新遇到的坑

這篇文章主要是來講遇到的問題的,如果需要整合教程最好還是到官方的文件中心https://bugly.qq.com/docs/廢話不多說,開始坑1: 所有針對bugly 屬性的設定不生效。原因:屬性設定一定要放在Bugly.init(getApplicationContext(

Bugly修復更新的渠道包和加固問題

菜的坑 首先騰訊的熱修復是真的好用,釋出了補丁包之後真的可以實現使用者無感知更新APP新增內容或者修改bug,但是官方文件寫到最後加固和多渠道問題處理的並不清楚,並且上邊建議的方法很是麻煩,效果並不好,個人感覺是這樣,給點小建議,可以參考,這裡先給出官方

整合bugly修復功能sdk步驟

首先為什麼要整合bugly熱修復。市面上有其他的熱修復框架,為什麼就用bugly?這裡給出2張圖大家就明白了。 引用騰訊bugly官網的一段話: 無需關注Tinker是如何合成補丁的無需自己搭建補丁管理後臺無需考慮後臺下發補丁策略的任何事情無需考慮補丁下載合

Android利用Bugly實現一鍵多渠道打包+一包更新全渠道

騰訊Bugly,為移動開發者提供專業的異常上報和運營統計,幫助開發者快速發現並解決異常,同時掌握產品運營動態,及時跟進使用者反饋。Bugly主要功能有異常上報、運營統計和應用升級(包含熱更新和全包更新),這些功能在官網上都有對應的開發文件可供參考,並且在熱更新模組還錄有專門的視訊教程以供參考。我在按照官方文件

Bugly更新整合以及問題

ClassLoader 我們知道Java在執行時載入對應的類是通過ClassLoader來實現的,ClassLoader本身是一個抽象來,Android中使用PathClassLoader類作為Android的預設的類載入器,  PathClassLoader其實實現的就是簡單的從檔案

Android bugly的學習使用

轉載:https://www.jianshu.com/p/7984b3ee7880 前序:一般一個專案的開發,從需求調研到開發完成正式上線必須要經歷修改bug,修改bug,修改bug 的死迴圈中,而往往一些專案在上線之後由於測試人員沒有測試出一些偶發概率的bug,這就導致使用者在下載使用App的

Bugly乾貨分享】Android程序保活招式大全

【騰訊Bugly乾貨分享】Android程序保活招式大全 本文來自於騰訊bugly開發者社群,非經作者同意,請勿轉載,原文地址:http://dev.qq.com/topic/57ac4a0ea374c75371c08ce8 作者:騰訊——張興華 目前市面上的應用,貌似除了微信和手Q都會

手把手帶你打造一個 Android 修復框架(上

本文來自網易雲社群作者:王晨彥前言熱修復和外掛化是目前 Android 領域很火熱的兩門技術,也是 Android 開發工程師必備的技能。目前比較流行的熱修復方案有微信的 Tinker,手淘的 Sophix,美團的 Robust,以及 QQ 空間熱修復方案。QQ 空間熱修復方

Android中最簡單的整合Bugly

專案中使用到整合騰訊的Bugly方便應用的版本管理,崩潰日誌的檢視和熱更新的應用,研究了一下寫出來了: 庫檔案匯入 Bugly支援自動整合和手動整合兩種方式,如果您使用Gradle編譯Apk,我們強烈推薦您使用自動接入方式配置庫檔案。 自動整合(推薦) Bugly支援JCenter倉

安卓使用Bugly實現應用升級功能

百度搜索bugly登陸平臺,建立應用,獲取應該用ID,在應用程式程式碼中使用該ID就可以實現該應用與bugly平臺應用對接 進入bugly平臺之後會看到三個模組:異常上報,運營統計,應用升級。也就是說bugly平臺包含著三大功能,今天要研究的就是應用升級模組,此模組包含

Bugly更新整合總結

熱更新:多麼高大上的名字,Android 開發者應該都知道這麼個東西,原理呢!請自行百度,這裡只是整合總結,謝謝!!! 對於第三方SDK的使用,大家都知道用“步步高點讀機,哪裡不會點哪裡”—— 所以第一步肯定是看官方整合文件:地址:https://bugly.

Bugly乾貨分享:Android機型適配之痛

一、個性化十足的Launcher 快捷方式雖然看起來只是一個很小的功能點,但是它涉及到的機型適配問題很多。 快捷方式建立程式碼: ntent addShortCut = new Intent("com.android.launcher.action.I

bugly 簡單應用 異常 崩潰--資料展示

//直接根據網址整合 https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20170912151050#_2 //整合當中要這麼寫這段話 ndk { // 設定支援的SO庫架構 ab