Android Bugly 熱修復(fù) 快速接入

轉(zhuǎn)載自:
http://blog.csdn.net/myliuyx/article/details/54315025

  • 介紹
    1、Bugly目前采用微信Tinker
    2遗锣、Bugly已經(jīng)搭建了管理后臺(tái)精偿,對(duì)每個(gè)版本補(bǔ)丁進(jìn)行管理赋兵。
    3搔预、實(shí)現(xiàn)自動(dòng)下載補(bǔ)丁包斯撮、合成扶叉、并應(yīng)用補(bǔ)丁。

  • 接入Bugly
    1溢十、添加插件依賴达吞,工程根目錄下“build.gradle”文件中添加:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // tinker gradle插件
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.5')

        // tinkersupport插件
        classpath "com.tencent.bugly:tinker-support:latest.release"
    }
}
 dependencies {
          // 多dex配置
          compile "com.android.support:multidex:1.0.1"
          compile 'com.tencent.bugly:crashreport_upgrade:latest.release'//其中l(wèi)atest.release指代最新版本號(hào)酪劫,也可以指定明確的版本號(hào),例如1.2.0
      }

2刻剥、集成SDK gradle配置
在app module的“build.gradle”文件中添加(示例配置):

3滩字、在app module的“build.gradle”文件中添加

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

tinkerSupport {

    // 開啟tinker-support插件麦箍,默認(rèn)值true
    enable = true

    // 是否編譯完成后,歸檔apk到指定目錄享钞,默認(rèn)值false
    autoBackupApk = false
    // 指定歸檔目錄话瞧,默認(rèn)值當(dāng)前module的子目錄tinker
    // backupApkDir = 'tinker'

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

    // 編譯補(bǔ)丁包時(shí)处坪,必需指定基線版本的apk,默認(rèn)值為空
    // 如果為空玄帕,則表示不是進(jìn)行補(bǔ)丁包的編譯
    // @{link tinkerPatch.oldApk }
    baseApk = "YOUR_OLD_APK"

    // 對(duì)應(yīng)tinker插件applyMapping
    baseApkProguardMapping = "YOUR_OLD_APK_PROGUARD_FILE"

    // 對(duì)應(yīng)tinker插件applyResourceMapping
    baseApkResourceMapping = "YOUR_OLD_APK_RES_MAPPING"

    tinkerId = "YOUR_TINKER_ID"
}

更詳細(xì)的配置項(xiàng)參考 tinker-support配置說明

4想邦、自定義Application

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

將定義的Application 配置進(jìn)AndroidManifest.

5丧没、自定義ApplicationLike
注:此自定義的ApplicationLike 就是前面第四部Application 構(gòu)造函數(shù)中”xxx.xxx.SampleApplicationLike”

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, Resources[] resources,
            ClassLoader[] classLoader, AssetManager[] assetManager) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime,
                applicationStartMillisTime, tinkerResultIntent, resources, classLoader,
                assetManager);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // 這里實(shí)現(xiàn)SDK初始化呕童,appId替換成你的在Bugly平臺(tái)申請(qǐng)的appId
        Bugly.init(getApplication(), "appid", true);
    }

    @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);
    }

}

注: 以前所有在Application的實(shí)現(xiàn)必須要全部拷貝到這里夺饲,在onCreate方法調(diào)用SDK的初始化方法,在onBaseContextAttached中調(diào)用Beta.installTinker(this);往声。

6浩销、配置相關(guān)
權(quán)限配置

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

Activity配置

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

配置FileProvider(Android N之后配置)

 <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}請(qǐng)?zhí)鎿Q為您的包名撼嗓,例如com.bugly.upgrade.demo。這里要注意一下粉捻,F(xiàn)ileProvider類是在support-v4包中的斑芜,檢查你的工程是否引入該類庫杏头。

在res目錄新建xml文件夾,創(chuàng)建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>

這里配置的兩個(gè)外部存儲(chǔ)路徑是升級(jí)SDK下載的文件可能存在的路徑呢燥,一定要按照上面格式配置寓娩,不然可能會(huì)出現(xiàn)錯(cuò)誤呼渣。

混淆配置

為了避免混淆SDK屁置,在Proguard混淆文件中增加以下配置:

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

如果你使用了support-v4包仁连,你還需要配置以下混淆規(guī)則:

-keep class android.support.**{*;}
  • 使用

1饭冬、編譯基準(zhǔn)包
執(zhí)行assembleRelease編譯生成基準(zhǔn)包:


這里寫圖片描述

這個(gè)會(huì)在build/outputs/bakApk路徑下生成每次編譯的基準(zhǔn)包、混淆配置文件、資源Id文件遣钳,如下圖所示:


這里寫圖片描述

啟動(dòng)apk蕴茴,上報(bào)聯(lián)網(wǎng)數(shù)據(jù)

我們每次冷啟動(dòng)都會(huì)請(qǐng)求補(bǔ)丁策略倦淀,會(huì)上報(bào)當(dāng)前版本號(hào)和tinkerId,這樣我們后臺(tái)就能將這個(gè)唯一的tinkerId對(duì)應(yīng)到一個(gè)版本姻成,大家測(cè)試的時(shí)候可以打開logcat查看我們的日志愿棋,如下圖所示:

這里寫圖片描述

以上 是 基準(zhǔn)包 也就是我們正常上線的包糠雨, 如果 遇到bug 需要發(fā)布補(bǔ)丁包 需要單獨(dú)打出pacth 包。

修復(fù)完代碼 執(zhí)行構(gòu)建補(bǔ)丁包的task


這里寫圖片描述

生成的補(bǔ)丁包在build/outputs/patch目錄下:


這里寫圖片描述

上傳補(bǔ)丁包到平臺(tái)


這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

以下是官方地址以及文檔:

Bugly Android熱更新使用指南
Bugly Android熱更新詳解
官方Demo
Tinker WIKI
原生 Tinker

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末松邪,一起剝皮案震驚了整個(gè)濱河市逗抑,隨后出現(xiàn)的幾起案子解恰,更是在濱河造成了極大的恐慌浙于,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腐宋,死亡現(xiàn)場(chǎng)離奇詭異胸竞,居然都是意外死亡参萄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門校赤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來马篮,“玉大人怜奖,你說我怎么就攤上這事∏ㄑ耄” “怎么了滥崩?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵夭委,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我崇摄,道長(zhǎng)慌烧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任厕氨,我火速辦了婚禮,結(jié)果婚禮上田晚,老公的妹妹穿的比我還像新娘国葬。我一直安慰自己,他們只是感情好接奈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布序宦。 她就那樣靜靜地躺著背苦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钉疫,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天牲阁,我揣著相機(jī)與錄音,去河邊找鬼备燃。 笑死凌唬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的况褪。 我是一名探鬼主播更耻,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秧均,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼号涯!你這毒婦竟也來了链快?” 一聲冷哼從身側(cè)響起起胰,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎地消,沒想到半個(gè)月后畏妖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡半夷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年巫橄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了湘换。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片统阿。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扶平,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出结澄,到底是詐尸還是另有隱情麻献,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布王悍,位于F島的核電站餐曼,受9級(jí)特大地震影響鲜漩,放射性物質(zhì)發(fā)生泄漏孕似。R本人自食惡果不足惜刮刑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雷绢。 院中可真熱鬧翘紊,春花似錦、人聲如沸帆疟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柳琢。三九已至,卻和暖如春痘绎,著一層夾襖步出監(jiān)牢的瞬間肖粮,已是汗流浹背尔苦。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工允坚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稠项。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓展运,卻偏偏與公主長(zhǎng)得像精刷,于是被迫代替她去往敵國和親蔗候。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锈遥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 熱更新能力是Bugly為解決開發(fā)者緊急修復(fù)線上bug所灸,而無需重新發(fā)版讓用戶無感知就能把問題修復(fù)的一項(xiàng)能力。B...
    Smile__EveryDay閱讀 24,856評(píng)論 31 19
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評(píng)論 25 707
  • Tinker介紹 Tinker是微信團(tuán)隊(duì)開源的Android熱修復(fù)工具,支持dex, library和resour...
    HolenZhou閱讀 4,140評(píng)論 4 15
  • 摘自:http://www.reibang.com/p/cdb4b03078c3 2017-03-24 李笑來知纷,得...
    Aleph_Zheng閱讀 214評(píng)論 0 0
  • 面對(duì)自家孩子琅轧,雖然心中有無盡的愛與憐踊挠,卻難免有時(shí)候會(huì)有意無意地把自家孩子與別人的孩子作對(duì)比,“看看人家孩子……”效床。...
    寧靜遇夏雨閱讀 221評(píng)論 0 3