章魚(yú)抓娃娃添加Bugly-Tinker熱更新支持

Bugly熱更新采用Tinker開(kāi)源方案,官方文檔如下:
Bugly Android熱更新使用指南
Bugly Android熱更新詳解

接入熱更新

我們的章魚(yú)App之前就已經(jīng)接入了Bugly,所以添加熱更新支持,只需在gradle文件中進(jìn)行如下更改即可。

/// 注釋掉之前的bugly
//"bugly": 'com.tencent.bugly:crashreport:latest.release', //日志統(tǒng)計(jì)
// 添加支持熱更新的 bugly
"bugly": 'com.tencent.bugly:crashreport_upgrade:latest.release', //日志統(tǒng)計(jì)(1.3.4之前含Tinker熱更新,現(xiàn)已剝離)
"tinker": 'com.tencent.tinker:tinker-android-lib:1.9.8', //Tinker熱修復(fù)      

此外,我們還需要在project層級(jí)的build.gradle中添加classpath;
接下來(lái)添加tinker-support.gradle文件并在app.gradle里添加配置;
......
不一一描述,這些Bugly官方文檔里都有。下面主要講接入熱更新后,章魚(yú)App項(xiàng)目引起的改動(dòng)。

改造Application

在 tinker-support.gradle 文件中配置

enableProxyApplication = true

可以避免Application的改動(dòng),但為了更好的兼容性,Tinker官方推薦改造Application。

我們的Application改造前如下圖左半,改造后如下圖右半。


Application改造

配置tinker-support

一般來(lái)說(shuō),在改造好Application后,tinker-support.gradle 無(wú)需更改即可使用。但為了在章魚(yú)項(xiàng)目下使用起來(lái)便捷,進(jìn)行了如下修改。

修改文件路徑

tinker-support默認(rèn)指定的文件路徑均位于build目錄下,而build目錄下的文件既不穩(wěn)定也不會(huì)同步到git服務(wù)器。這很容易讓我們發(fā)布線(xiàn)上包后丟失關(guān)鍵文件(用于生成對(duì)應(yīng)補(bǔ)丁包的文件),即打包后在 app/build/bakApk/日期 目錄下生成的如下文件:

app-release.apk (必有,預(yù)發(fā)布為app-prerelease.apk )
app-release-mapping.txt (開(kāi)啟混淆后會(huì)有)
app-release-R.txt (必有,預(yù)發(fā)布為app-prerelease-R.apk )

這些文件大多數(shù)時(shí)候是無(wú)用的,每次運(yùn)行項(xiàng)目或打包都會(huì)生成。我們真正需要的是線(xiàn)上包對(duì)應(yīng)的這些文件。
所以,讓tinker-support生成文件的路徑不變,將待修復(fù)apk的目錄修改為 app/bakApk/app-last-release 。
這樣,每次我們發(fā)布線(xiàn)上包后,將上述生成文件復(fù)制一份并替換到 app/bakApk/app-last-release 目錄下即可。

自動(dòng)修改tinkerId

每次打補(bǔ)丁或發(fā)布線(xiàn)上包,都需要修改tinkerId,并保證其唯一性。 我們采用如下格式:

"r" + generateDate()

例如 r-05301455 。

提供便利的測(cè)試(配置 tinker-support-prerelease.gradle 文件)

以上兩項(xiàng)配置保證了線(xiàn)上補(bǔ)丁發(fā)布的便利性,但在發(fā)布線(xiàn)上補(bǔ)丁前,我們希望對(duì)事情有所掌控。這時(shí),我們可以先測(cè)試預(yù)發(fā)布環(huán)境補(bǔ)丁效果。

為了方便,將 tinker-support.gradle 復(fù)制一份命名為 tinker-support-prerelease.gradle ,將其基準(zhǔn)包目錄修改為 app/bakApk/app-last-release ,并修改相應(yīng)文件名。

為了使tinkerId唯一且與線(xiàn)上補(bǔ)丁保持差異,采用如下格式:

"pr" + generateDate()

例如 pr-05301455 。

最后,在 app/build.gradle 文件中做如下修改(定義isReleaseTask()方法用于判斷是否為正式環(huán)境),根據(jù)任務(wù)類(lèi)型自動(dòng)引入相對(duì)應(yīng)的tinker-support配置。

if (isReleaseTask(gradle.startParameter.taskNames))
apply from: 'tinker-support.gradle'//tinker線(xiàn)上配置
else
apply from: 'tinker-support-prerelease.gradle' //tinker測(cè)試預(yù)發(fā)布包補(bǔ)丁配置。

發(fā)包清單

  1. 修改gradle配置,如versionName, versionCode等(tinker-support文件切換及tinkerId修改已自動(dòng)化);
  2. walle打包(Tinker支持walle多渠道包熱修復(fù));
  3. 將剛才 app/build/bakApk/日期 目錄下生成的文件備份到 app/bakApk/app-last-release 目錄(切記,只有確認(rèn)發(fā)布的線(xiàn)上包才這么做);
  4. 打tag,并將代碼提交至服務(wù)器。

發(fā)補(bǔ)丁清單

Tinker wiki

Tinker補(bǔ)丁不具有即時(shí)性,需要app收到補(bǔ)丁后下次啟動(dòng)才會(huì)生效。
Tinker補(bǔ)丁支持修改gradle文件與資源文件。建議補(bǔ)丁與基準(zhǔn)包(待修復(fù)包)保持一致的versionName, versionCode。
此外,Tinker對(duì)Manifest的修改支持性不好,建議補(bǔ)丁包別動(dòng)Manifest,若需要改動(dòng),請(qǐng)先在預(yù)發(fā)布環(huán)境下測(cè)試補(bǔ)丁的效果。

補(bǔ)丁發(fā)布步驟:

  1. 待發(fā)布代碼測(cè)試通過(guò);
  2. 生成預(yù)發(fā)布環(huán)境補(bǔ)丁包;
  3. 發(fā)布預(yù)發(fā)布環(huán)境補(bǔ)丁包并觀察效果;
    ——若3順利通過(guò),則繼續(xù)向下執(zhí)行,否則break。
  4. 生成線(xiàn)上補(bǔ)丁包;
  5. 灰度發(fā)布線(xiàn)上補(bǔ)丁包并觀察效果;
    ——若5順利通過(guò),則繼續(xù)向下執(zhí)行,否則break。
  6. 全量發(fā)布線(xiàn)上補(bǔ)丁包。

第2、3步是對(duì)補(bǔ)丁是否能生效的測(cè)試,約耗時(shí)15~30分鐘。理論上這兩步是可以省去的,在你確保改動(dòng)代碼被Tinker支持的情況下。不過(guò),不建議如此,熱修復(fù)依然存在許多問(wèn)題,在預(yù)發(fā)布環(huán)境先行測(cè)試補(bǔ)丁效果具有必要性。

如何生成補(bǔ)丁

線(xiàn)上補(bǔ)丁與測(cè)試補(bǔ)丁生成的差異主要體現(xiàn)在配置上。

生成測(cè)試補(bǔ)丁
  1. 將代碼切回至有問(wèn)題的線(xiàn)上節(jié)點(diǎn)。

  2. 在此配置下使用walle打 prerelease 包,并備份剛剛在 app/build/bakApk/日期 目錄下生成的基準(zhǔn)文件。

  3. 安裝剛剛生成的基準(zhǔn)apk(即代碼等同于線(xiàn)上包的debug包);

  4. 代碼切回到待發(fā)布節(jié)點(diǎn)(前面幾步造成的代碼改動(dòng)不需要保存),將第2步備份好的基準(zhǔn)文件替換到 app/bakApk/app-last-prerelease 目錄。——如果早已備份好線(xiàn)上對(duì)應(yīng)的測(cè)試包,且已安裝,則之前步驟都可以省去。

  5. 如下圖,執(zhí)行 buildTinkerPatchPreRelease/buildTinkerPatchDebug 指令生成prerelease/debug補(bǔ)丁。


    生成預(yù)發(fā)布補(bǔ)丁
生成線(xiàn)上補(bǔ)丁

因?yàn)樵诖虬鼤r(shí)已對(duì)線(xiàn)上補(bǔ)丁進(jìn)行備份,所以生成線(xiàn)上補(bǔ)丁比測(cè)試補(bǔ)丁更為簡(jiǎn)單,步驟如下。

  1. 將代碼切換至待發(fā)布補(bǔ)丁的節(jié)點(diǎn)。

  2. 保證versionName、versionCode與線(xiàn)上版本一致(以免后續(xù)升級(jí)有問(wèn)題)。

  3. 執(zhí)行 buildTinkerPatchRelease 指令生成release補(bǔ)丁。

如何發(fā)布補(bǔ)丁

生成后的補(bǔ)丁位于項(xiàng)目 app/build/outputs/patch/環(huán)境 目錄下,其中, patch_signed_7zip.apk 文件即為要發(fā)布的補(bǔ)丁。

將 patch_signed_7zip.apk 文件上傳至Bugly指定項(xiàng)目即可。
圖文請(qǐng)參照bugly官方文檔:上傳補(bǔ)丁包到平臺(tái)

觀察補(bǔ)丁情況

每個(gè)補(bǔ)丁都對(duì)應(yīng)著特定的一個(gè)apk,比如前面提到的線(xiàn)上apk或調(diào)試apk,在裝有該apk的手機(jī)上觀察補(bǔ)丁的下發(fā)與生效。補(bǔ)丁生效需app重啟。

如何驗(yàn)證?

為了便于驗(yàn)證,在 build.gradle 里添加一個(gè)字段 APK_DATE

buildConfigField "String", "APK_DATE", ""${generateDate()}""

這樣,APK_DATE 即為apk的構(gòu)建時(shí)間(即我們用指令生成該apk或其最新補(bǔ)丁的時(shí)間);
在設(shè)置頁(yè)面連擊版本號(hào)7次,即可觀察到相關(guān)信息 "生成時(shí):" + BuildConfig.APK_DATE。我們根據(jù)該時(shí)間信息可以很輕松地判定出當(dāng)前包是否為補(bǔ)丁包。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,083評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,706評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,442評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,802評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,983評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,287評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,486評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,710評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,116評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,412評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,224評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,462評(píng)論 2 378

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