章魚抓娃娃添加Bugly-Tinker熱更新支持

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

接入熱更新

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

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

此外惫皱,我們還需要在project層級的build.gradle中添加classpath像樊;
接下來添加tinker-support.gradle文件并在app.gradle里添加配置;
......
不一一描述旅敷,這些Bugly官方文檔里都有生棍。下面主要講接入熱更新后,章魚App項目引起的改動扫皱。

改造Application

在 tinker-support.gradle 文件中配置

enableProxyApplication = true

可以避免Application的改動足绅,但為了更好的兼容性,Tinker官方推薦改造Application韩脑。

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


Application改造

配置tinker-support

一般來說段多,在改造好Application后首量,tinker-support.gradle 無需更改即可使用。但為了在章魚項目下使用起來便捷进苍,進行了如下修改加缘。

修改文件路徑

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

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

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

自動修改tinkerId

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

"r" + generateDate()

例如 r-05301455 忌锯。

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

以上兩項配置保證了線上補丁發(fā)布的便利性,但在發(fā)布線上補丁前领炫,我們希望對事情有所掌控偶垮。這時,我們可以先測試預(yù)發(fā)布環(huán)境補丁效果。

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

為了使tinkerId唯一且與線上補丁保持差異龙助,采用如下格式:

"pr" + generateDate()

例如 pr-05301455 。

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

if (isReleaseTask(gradle.startParameter.taskNames))
apply from: 'tinker-support.gradle'//tinker線上配置
else
apply from: 'tinker-support-prerelease.gradle' //tinker測試預(yù)發(fā)布包補丁配置仅淑。

發(fā)包清單

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

發(fā)補丁清單

Tinker wiki

Tinker補丁不具有即時性,需要app收到補丁后下次啟動才會生效筐钟。
Tinker補丁支持修改gradle文件與資源文件揩瞪。建議補丁與基準包(待修復(fù)包)保持一致的versionName, versionCode。
此外篓冲,Tinker對Manifest的修改支持性不好壮韭,建議補丁包別動Manifest,若需要改動纹因,請先在預(yù)發(fā)布環(huán)境下測試補丁的效果。

補丁發(fā)布步驟:

  1. 待發(fā)布代碼測試通過琳拨;
  2. 生成預(yù)發(fā)布環(huán)境補丁包瞭恰;
  3. 發(fā)布預(yù)發(fā)布環(huán)境補丁包并觀察效果;
    ——若3順利通過狱庇,則繼續(xù)向下執(zhí)行惊畏,否則break。
  4. 生成線上補丁包密任;
  5. 灰度發(fā)布線上補丁包并觀察效果颜启;
    ——若5順利通過,則繼續(xù)向下執(zhí)行浪讳,否則break缰盏。
  6. 全量發(fā)布線上補丁包。

第2、3步是對補丁是否能生效的測試口猜,約耗時15~30分鐘负溪。理論上這兩步是可以省去的,在你確保改動代碼被Tinker支持的情況下济炎。不過川抡,不建議如此,熱修復(fù)依然存在許多問題须尚,在預(yù)發(fā)布環(huán)境先行測試補丁效果具有必要性崖堤。

如何生成補丁

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

生成測試補丁
  1. 將代碼切回至有問題的線上節(jié)點耐床。

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

  3. 安裝剛剛生成的基準apk(即代碼等同于線上包的debug包)咙咽;

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

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


    生成預(yù)發(fā)布補丁
生成線上補丁

因為在打包時已對線上補丁進行備份愚战,所以生成線上補丁比測試補丁更為簡單娇唯,步驟如下。

  1. 將代碼切換至待發(fā)布補丁的節(jié)點寂玲。

  2. 保證versionName塔插、versionCode與線上版本一致(以免后續(xù)升級有問題)。

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

如何發(fā)布補丁

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

將 patch_signed_7zip.apk 文件上傳至Bugly指定項目即可流纹。
圖文請參照bugly官方文檔:上傳補丁包到平臺

觀察補丁情況

每個補丁都對應(yīng)著特定的一個apk违诗,比如前面提到的線上apk或調(diào)試apk漱凝,在裝有該apk的手機上觀察補丁的下發(fā)與生效。補丁生效需app重啟诸迟。

如何驗證茸炒?

為了便于驗證愕乎,在 build.gradle 里添加一個字段 APK_DATE

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笛粘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子湿硝,更是在濱河造成了極大的恐慌薪前,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件关斜,死亡現(xiàn)場離奇詭異示括,居然都是意外死亡,警方通過查閱死者的電腦和手機痢畜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門挺份,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窃判,“玉大人,你說我怎么就攤上這事≡缇矗” “怎么了事镣?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵啡氢,是天一觀的道長繁仁。 經(jīng)常有香客問我,道長授账,這世上最難降的妖魔是什么枯跑? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮白热,結(jié)果婚禮上敛助,老公的妹妹穿的比我還像新娘。我一直安慰自己屋确,他們只是感情好辜腺,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乍恐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪测砂。 梳的紋絲不亂的頭發(fā)上茵烈,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音砌些,去河邊找鬼呜投。 笑死加匈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仑荐。 我是一名探鬼主播雕拼,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粘招!你這毒婦竟也來了啥寇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤洒扎,失蹤者是張志新(化名)和其女友劉穎辑甜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袍冷,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡磷醋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胡诗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邓线。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖煌恢,靈堂內(nèi)的尸體忽然破棺而出骇陈,到底是詐尸還是另有隱情,我是刑警寧澤症虑,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布缩歪,位于F島的核電站,受9級特大地震影響谍憔,放射性物質(zhì)發(fā)生泄漏匪蝙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一习贫、第九天 我趴在偏房一處隱蔽的房頂上張望逛球。 院中可真熱鬧,春花似錦苫昌、人聲如沸颤绕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奥务。三九已至,卻和暖如春袜硫,著一層夾襖步出監(jiān)牢的瞬間氯葬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工婉陷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帚称,地道東北人官研。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像闯睹,于是被迫代替她去往敵國和親戏羽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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