【詳細(xì)】Android熱更新Bugly集成配置

上一篇文章說道tinker的熱更新,可是少了點補丁包的管理震嫉,這一篇文章介紹的bugly就是增強版的,更加方便你集成tinker和包括了補丁包的后臺管理。
為什么使用 Bugly 熱更新铣耘?

  1. 無需關(guān)注 Tinker 是如何合成補丁的
  2. 無需自己搭建補丁管理后臺
  3. 無需考慮后臺下發(fā)補丁策略的任何事情
  4. 無需考慮補丁下載合成的時機,處理后臺下發(fā)的策略
  5. 我們提供了更加方便集成 Tinker 的方式
  6. 我們通過 HTTPS 及簽名校驗等機制保障補丁下發(fā)的安全性
  7. 豐富的下發(fā)維度控制以故,有效控制補丁影響范圍
  8. 我們提供了應(yīng)用升級一站式解決方案

Bugly下面我們用1.3.4版本的bugly來開發(fā)蜗细。

1.申請appid

去官網(wǎng)Bugly官網(wǎng) 申請appid比如asd778asd89,如果你之前應(yīng)用bugly的異常上報就不用再申請appid。用的是同一個appid怒详。

2.添加bugly插件

在項目的root目錄下的build.gradle

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

在app/build.gralde

android{
    ...
    defaultConfig{
        //開啟dex分包
        multiDexEnabled true
    }

    dexOption{
        //大項目模式
        jumboMode true
        maxProcessCount 4
        javaMaxHeapSize "2g"
    }
    //配置好簽名
   signingConfigs {
        release {
            keyAlias 'xx'
            keyPassword 'xx'
            storeFile file('../app/xxx.jks')
            storePassword 'x'
            v1SigningEnabled true
            v2SigningEnabled true

        }
   }
   //使用你的簽名
     buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

}

dependiences{
       implementation 'com.tencent.bugly:crashreport_upgrade:1.3.4'
       implementation 'com.android.support:multidex:1.0.2'
}

如果你的項目之前使用了bugly的crash包就要去掉炉媒,因為crashreport_upgrade包里面包含了crash。不然會提示program is already.

3. 創(chuàng)建tinker-support.gradle文件

目標(biāo)地址app/tinker-support.gradle昆烁,然后在app/build.gradle申請加入apply from: 'tinker-support.gradle'

這樣子完成了70%吊骤。

//請求插件
apply plugin: 'com.tencent.bugly.tinker-support'
//基準(zhǔn)包路徑
def bakPath=file("${buildDir}/bakApk/")
//基準(zhǔn)包父目錄
def baseApkDir="app-0224-14-03-02"

//基準(zhǔn)包的tinkerid
//def myTinkerId="base-"+"1.0"
//補丁包的tinkerid,每發(fā)布一個補丁包依次疊加一次補丁版本號(比如0.0->0.1)
def myTinkerId="patch-"+"1.0"+".0.1"

tinkerSupport{
    //是否啟動熱修復(fù)静尼,開發(fā)階段設(shè)置為false
    enable=true
    //app要不要加固
    isProtectedApp =false
    //反射獲取application
    enableProxyApplication=false
    //支持新增activity嗎
    supportHotplugComponent=true
    autoBackupApkDir="${bakPath}"
    //autoGenerateTinkerId = true
    overrideTinkerPatchConfiguration =true
    baseApk="${bakPath}/${baseApkDir}/app-release.apk"
    // 對應(yīng)tinker插件applyMapping
    baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"
    // 對應(yīng)tinker插件applyResourceMapping
    baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"
    tinkerId="${myTinkerId}"
}
/**
 * 一般來說,我們無需對下面的參數(shù)做任何的修改
 * 對于各參數(shù)的詳細(xì)介紹請參考:
 * 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" //  可選白粉,設(shè)置mapping文件,建議保持舊apk的proguard混淆方式
        //applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可選鼠渺,設(shè)置R.txt文件鸭巴,通過舊apk文件保持ResId的分配
    }
}

4. 創(chuàng)建ApplicationLike類

把項目的application繼承為TinkerApplciation 在構(gòu)造函數(shù)調(diào)用父類方法比如,最后在Androidmanifest拦盹。xml的application標(biāo)簽的name還是DemoApplication(繼承TinkerApplication的Applciation)

里面有四個參數(shù)分別是

  1. 你要修復(fù)什么內(nèi)容有dex so res等鹃祖,全選就是TINKER_ENABLE_ALL
  2. ApplicationLike代理Application類,正真的oncreate attachBaseContext寫在里面
  3. tinker的類加載器掌敬,默認(rèn)是它
  4. 要不要驗證md5 惯豆,因為上文知道jar模式驗證md5很慢池磁,所以不驗證了。
public class DemoApplication extends TinkerApplication {
    public DemoApplication() {
        super(ShareConstants.TINKER_ENABLE_ALL,
                "com.ppjun.android.tinkerinbugly.DemoApplicationLike"
        ,"com.tencent.tinker.loader.TinkerLoader",false);
    }
}
public class DemoApplicationLike extends DefaultApplicationLike {
    
    public DemoApplicationLike(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();

        Beta.betaPatchListener=new BetaPatchListener() {
            @Override
            public void onPatchReceived(String s) {

            }

            @Override
            public void onDownloadReceived(long l, long l1) {

            }

            @Override
            public void onDownloadSuccess(String s) {

            }

            @Override
            public void onDownloadFailure(String s) {

            }

            @Override
            public void onApplySuccess(String s) {

            }

            @Override
            public void onApplyFailure(String s) {

            }

            @Override
            public void onPatchRollback() {

            }
        };
        Bugly.setIsDevelopmentDevice(getApplication(),true);
        Bugly.init(getApplication(),"6f399f3eeb",false);
      //把你之前onCreate的邏輯寫到這里
        
    }

    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
        MultiDex.install(base);
        Beta.installTinker(this);
        //把你之前applciation的attachbasecontext邏輯寫到這里
    }

   public void  registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks){
        getApplication().registerActivityLifecycleCallbacks(callbacks);
   }

    @Override
    public void onTerminate() {
        super.onTerminate();
        Beta.unInit();
    }
}

  1. 確保在onBaseContextAttached里面分包和安裝tinker
  2. 添加registerActivityLifecycleCallback方法和onTerminate方法
  3. 在oncreate注冊你的appid

現(xiàn)在離完成還有10%楷兽。

剩下的就是打包了地熄。

5. 打基準(zhǔn)包

在tinker-support.gradle修改為基準(zhǔn)包的tinkerId。

然后執(zhí)行./gradlew assembleRelease

然后在app/build/bakApk看到一個app-0224-14-03-02 已打包時間為名字的文件夾芯杀,里面包含了有基準(zhǔn)包app-release.apk端考,基準(zhǔn)包的R.txt 和mapping.txt。

然后你可以安裝基準(zhǔn)包。

6.修改基準(zhǔn)包

  1. 比如修改android.text="not patch" 改為android.text="has patch"
  2. 然后修改tinker-support.gradle的baseApkDir 。改為你剛才打基準(zhǔn)包的父文件夾名字锭部。比如

def baseApkDir="app-0224-14-03-02"

  1. 修改補丁包的tinkerId,每打一個補丁包補丁版本+1裂明,補丁包的tinkerid=patch+apk版本號+補丁版本號
  2. 執(zhí)行./gradlew buildTinkerPatchRelease,要和之前的打的release包對應(yīng)太援。
  3. 在app/build/outputs/patch/得到補丁包patch_signed_7zip.apk闽晦。(**不要用outputs/apk/release/patch_signed_7zip.apk **)

7. 上傳補丁包

image.png

上傳補丁包后,目標(biāo)版本會出現(xiàn)versionName+"."+versionCode 代表識別成功

如果上傳補丁包后提岔,沒得到目標(biāo)版本號仙蛉,就是代表基準(zhǔn)包還沒被安裝〖蠲桑或者安裝后沒聯(lián)網(wǎng)荠瘪。

或者基準(zhǔn)包沒安裝tinker,沒成功初始化tinker赛惩。
如果出現(xiàn)-1 -2這些錯誤碼可以到TinkerLoadResult類看到對應(yīng)的原因
全文完 ) ) >

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哀墓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喷兼,更是在濱河造成了極大的恐慌麸祷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褒搔,死亡現(xiàn)場離奇詭異,居然都是意外死亡喷面,警方通過查閱死者的電腦和手機星瘾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惧辈,“玉大人琳状,你說我怎么就攤上這事『谐荩” “怎么了念逞?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵困食,是天一觀的道長。 經(jīng)常有香客問我翎承,道長硕盹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任叨咖,我火速辦了婚禮瘩例,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甸各。我一直安慰自己垛贤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布趣倾。 她就那樣靜靜地躺著聘惦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儒恋。 梳的紋絲不亂的頭發(fā)上善绎,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音碧浊,去河邊找鬼涂邀。 笑死,一個胖子當(dāng)著我的面吹牛箱锐,可吹牛的內(nèi)容都是我干的比勉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驹止,長吁一口氣:“原來是場噩夢啊……” “哼浩聋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起臊恋,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衣洁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抖仅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坊夫,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年撤卢,在試婚紗的時候發(fā)現(xiàn)自己被綠了环凿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡放吩,死狀恐怖智听,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤到推,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布考赛,位于F島的核電站,受9級特大地震影響莉测,放射性物質(zhì)發(fā)生泄漏颜骤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一悔雹、第九天 我趴在偏房一處隱蔽的房頂上張望复哆。 院中可真熱鬧,春花似錦腌零、人聲如沸梯找。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锈锤。三九已至,卻和暖如春闲询,著一層夾襖步出監(jiān)牢的瞬間久免,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工扭弧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阎姥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓鸽捻,卻偏偏與公主長得像呼巴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子御蒲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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