如何經過熱修復,搞定開發中的那些 Bug?

做爲程序員,Bug 修復終究是繞不開的話題,本期移動開發精英俱樂部討論的主題即是 Bug 修復中的 Hotfix,即熱修復。接下來讓咱們跟隨大牛的腳步來了解 Hotfix,就算你不能一下豁然開朗,相信也必定會有所啓發。很是感謝賴春輝的整理,本文系國內 ITOM 管理平臺 OneAPM 審校。html

什麼是熱修復?

主持人-牛樹民:咱們本身的項目中尚未這方面的技術方案,最近一直在考慮這個。你們對熱修復這個名詞是怎麼理解的?什麼是熱修復?react

七裏小晴天:是否是跟遊戲打補丁差很少?ios

longway:運行時,改變運行行爲。git

王威威:對已發佈 App 進行 Bug 修復。程序員

羅飛:邊開發邊修復?修復 Bug 時不影響正常開發?熱補丁的主要優點是不會使設備當前正在運行的業務中斷,即在不重啓設備的狀況下能夠對設備當前軟件版本的缺陷進行修復。——百度百科react-native

主持人-牛樹民:從廣義的角度理解,你們都比較認同 Hotfix 是在移動端不須要從新發版,經過在線更新對版本 Bug 的修復。安全

使用 Hotfix 的團隊都有哪些?

王威威:目前有多少公司已經用上 Hotfix 了?服務器

七裏小晴天:12306的增量更新,算不算?微信

李程:百度貼吧是熱修復。多線程

羅飛:咱們使用 git flow,它有 Hotfix 的機制,我一直認爲 Hotfix 只是修改 Bug 並不影響正常開發, 應該廣義的 Hotfix 範圍比這更大吧?

主持人-牛樹民:你們在本身公司的項目中有使用過熱修復方案的嗎?有經驗的歡迎來分享一下。

李道建:只是最近剛看 JSPatch ,【推薦文章 JSPatch – 動態更新 iOS App http://www.cOCoachina.com/ios/20150709/12468.html

主持人-牛樹民:好像微信團隊有在使用 JSPatch,這個尚未求證。網上說,滴滴也開始在使用了。

如何實現 Hotfix ?

不會涼的黃瓜菜:熱更新和增量更新是一個東西嗎?

王威威:不同,增量更新是 Patch, JSPatch 是動態更新吧?

李程:熱更新就是替換啊,替換整個函數。替換類太大了,通常都是替換方法。

李道建:我感受確切應該是替換某個方法或類。

longway:類,也有替換方法的,不是函數。

李道建:均可以,根據線上的Bug而定。

主持人-牛樹民:在遊戲開發者通常採用的JS,Lua解釋性語言,經過下載代碼的方式,在技術角度上是一種熱修復。

李程:通常修復Bug,都是某個函數的問題,若是函數錯的不少也別惹修復類了,直接再發一版了。

:在移動 App 開發裏,能夠動態部署達到熱修復。例如某頁面出現了 Bug ,後臺服務器修改配置爲採用 React Native 顯示此頁面,而有 Bug 的 Native 頁面就隱藏了。等到下一次版本更新發到線上渠道,再採用 Native 展現此頁面。

主持人-牛樹民:個人理解 React Native 更像是一種更新。運行時修復在 iOS 和 Android 中具體都有怎麼樣的體現呢?

李程:運行時修復不用等待App從新啓動,iOS 利用運行時特性修改函數地址,從而達到修復目的。

Neuropathy:那這樣的話移動開發中的熱修復好像不容易吧,不重啓也能夠麼?

李程:是的,要是重啓就是冷修復了。

李道建:反正我在官網上下載一個 Demo,用 JSPatch 也是須要重啓。

kyleduo:我以爲重啓這個問題能夠不用太糾結,即便須要重啓,能穩定修復線上問題也是可用的,畢竟對於嚴重的 Bug 來講,不在於及時修復。

:咱們作了基於 JSPatch 的定製開發,也能夠作到不重啓App就生效。

:主要熱修復,我感受就是由於發到線上的客戶端,是無法及時修改的,可是服務器能夠隨時控制。

longway:須要服務端深度配合,發佈版本及時自動化,仍是有些麻煩。

李道建:假如移動App線上有問題,應該是是從服務器下載某些文件,再經過運行時機制來替換有問題的代碼嗎?

longway:對,通常是個補丁包。

A RunningYoung:App 的線上 Bug 能夠採用輕量級的修復吧,如 JSPatch 要是大規模熱更新或者採用RN 吧。

李道建:最近看 JSPatch,大致就是這樣的思路。

:好比 iOS 下的 JSPatch , WaxPatch ,Android 下的 Dexpose,AndFix ,ClassLoader 都是比較成熟 Hot Patch 動態部署解決方案。這些方案的思路都是經過下載遠程服務器的代碼來動態更新本地的代碼行爲。

A RunningYoung:感受代碼質量好了,用個輕量級的就能夠修復嚴重的Bug了。

一毛:Deposed 和 Fix 都不能所有適配,各自的方案都有本身的優缺點,classloader 能夠發揮更好用途,局部的更新卻是採用 andfix 這樣類型的方案,感受比較方便。

:Hotfix 版本管理策略怎麼說呢?

李程:JSPatch 就解決了啊,JSPatch 就是經過 JS修改原生代碼。

王偉:咱們 Lua ,JSPatch 都用到了

:iOS 的 Patch 是比較成熟了,能夠用。

主持人-牛樹民:Lua 和 JSPatch 哪一個好些呢?

王偉:我以爲用 Lua 順手,可是他有些問題在 Block 中用的話,引擎以前有過64位的問題。

:阿里巴巴解決了64位的問題

王嶽明:是的,Wax 被阿里接手後修復了這個問題

王偉:JSPatch 咱們年初上的,下發策略用的一套方案,咱們用的場景很少,除非重要線上Bug,Lua 引擎最近咱們更新都一年多了。

李道建:大家須要重啓 App 嗎?

王偉:不須要重起。

:咱們打算用 classloader 方式 不過貌似必須重啓 App。

A RunningYoung: JSPatch 也必須重啓才生效 ,而後替代本地的 OC 代碼。

主持人-牛樹民:Hotfix 的用途也就在此吧。

一毛:Lua 在遊戲中運用比較多

王嶽明:JSPatxh 爲何要重啓?是運行時橋接啊。

王偉:確實,遊戲中使用場景多。

主持人-牛樹民:遊戲中更可能是更新遊戲模塊等, 在應用開發中用於 Bug 修復吧。

下發策略

主持人-牛樹民:你們講講的下發策略吧。

王偉:我說下大概吧,咱們有個 sync 接口,會下發當前版本是否須要下載 Lua 包。若是有就啓動下載,下載後會進行校驗。

李程:你指的 sync 接口是?

AFI:那是全量下載 Lua 包嗎?

李道建:校驗是避免重複下載是嗎?

王偉:而後加載腳本,到指定類時運行。咱們目前是針對版本號作的,能夠理解這個版本下的全量下載,校驗是防止被篡改。

李程:確定不能全量下載,每一個 JS 補丁包都有個 ID 號的。下發策略,主要是本地與服務器制定的協議如何設計了,增量應該是沒問題的,每次全量下載確定不太好,咱們項目就是經過 App 版本號與 JS 補丁號來進行增量取的。

主持人-牛樹民:校驗的方式都有哪些呢,MD5 值和加密?

AFI:若是隻是熱修復,問題並不大。

李程:校驗方式確定本身家項目設定的了,防止別人抓去接口,隨意給惡意修改函數。

主持人-牛樹民:對,怎麼保證在下發代碼執行過程當中的安全呢?,有可能由於疏忽下發了有問題的代碼,致使大量 App Crash,或一些其餘異常狀況,須要有一些機制避免這種狀況。

李程:設定本身的校驗協議。

:例如方法 a 在主線程執行,方法 b 在子線程執行,若是這兩方法都有 Bug 要 Patch 就不行了。

王偉:咱們會在本地測試好,QA 經過驗證後才正式發送修復腳本。

拯救與逍遙:灰度熱更新。

李程:這就是須要一個健壯的 Server 與 App 之間的協議了。

王偉:並且內部模擬下發全流程操做測試。

主持人-牛樹民:我以爲能夠針對部分用戶作下發代碼更新,作一個灰度驗證。

Neil.zhang:其實,Android Studio 2 的 Preview 版本中體現的Instant Run功能,本質上也是一種熱修復技術

Miracle:用 cordova angularJS 框架的應用,你們都用 JSPatch 作 Hotfix 嗎?

阿塵:我用 JSPatch.com 的方案,首屏不能實時更新,須要重啓。其餘地方的均可以。

AFI:那React Native 和 Hybird 比,你們怎麼選?【推薦文章:Hybrid App 和 React Native 開發那點事

阿塵:JSPatch 是修復 Native,Hybrid 自己就能夠有動態性,不該該在討論範疇。

阿塵:你們能夠看看,JSPatch 做者分享的乾貨

JSPatch實現原理詳解

JSPatch近期新特性解析

主持人-牛樹民:是的, RN 方案自己是做爲更新程序功能來使用。

阿塵:據小道消息,阿里也在嘗試 JSPatch了,和 Wax 結合使用。

林曦:爲啥要和 Wax 結合使用呢?這兩種方案有互補的地方?

阿塵:兩種都支持吧。JS 比較受歡迎,也可能 Wax 有些缺陷,還未考證。使用 Hotfix 可能面臨的問題,就是多線程。

:JS 和 Lua 都是單線程的,這是硬傷。

AFI:嗯,確實,但也提供了一些模擬多線程的辦法,不過在性能上跟 Native 還差些。

:不是簡單的性能問題,若是要同時修復兩個線程的方法就悲劇了。

李程:修復兩個線程的方法 ?

來海龍:要是多線程的話如今有解麼?

主持人-牛樹民:JSPatch 近期新特性裏有講到,已經解決了這個問題。

:咱們是作了多實例,主線程獨佔一實例,安卓Patch就沒有多線程的問題,不過就是碎片化的問題嚴重,jni 在不一樣的 rom 上實現標準不統一。

適配與性能影響

kyleduo:我比較關心的問題,1,Hotfix 會不會影響性能;2,對 Android 來講,會不會有機型不支持,不支持的體現是什麼會不會致使 FC 或功能不可用。

拯救與逍遙:1,基本不影響 2,適配是大問題,有些方案不兼容5.0。

kyleduo:以前調研過,也是說5.0的問題,如今5.0已經比例很大了,因此不敢用。

拯救與逍遙: 女媧的原理是支持5.0的,可是我沒有試過 ,據我所知,這個原理是原QQ空間團隊的一我的作出來的。

kyleduo:百度到的:基於 Nuwa 實現 Android 自動化

App Stores審覈

主持人-牛樹民:使用 JSPatch 在 App Store 審覈上會有問題嗎?

李道建:網上說 JSPatch,Apple 已經承認。

幸xing:沒問題,不少大廠也用了。

主持人-牛樹民JSPatch 官網平臺有 SDK 集成和代碼部署的整套方案

Swift可否實現 JSPatch?

劉志淳:Swift 有相似 JSPatch 相似的實現麼?據說 Swift 混合 OC 調用 JSPatch 有問題?

:Swift 有點尷尬哦,這個坑沒踩過。

Server:Swift 調 JSPatch 有點坑。

劉志淳:好吧,Swift 作主力開發的只能打醬油了。

羅飛:Swift 怎麼解決?

:Swift 默認取消 OC 的動態性,固然也有辦法讓 Swift 方法採用 OC 的編譯方式,感受仍是不方便。

noark9:動態的地方要用 OC 才行。

劉志淳:混編這麼形式我以爲始終是臨時解決方案,Swift 目前沒有靠譜的 Hotfix 解決方案?

阿塵:Swift 自己 Runtime 不行,目前沒有靠譜的 Hotfix 方案。

PS:大道千萬,何須死磕動態特性?就算 Swift 是靜態語言,也有許多方法讓其靈動起來,咱們無需讓其強行實現 Objective-C 的特性,那樣就失去 Swift 自身的特色了,Objective-C 終究會成爲過去式,蘋果也不建議這麼作。——Swift 腦殘粉

國內 ITOM 管理平臺 OneAPM 致力於幫助企業用戶提供全棧式的性能管理以及 IT 運維管理服務,經過一個探針就可以完成日誌分析、安全防禦、APM 基礎組件監控、集成報警以及大數據分析等功能。想閱讀更多優秀文章,請訪問 OneAPM 官方技術博客

本文轉自 OneAPM 官方博客

相關文章
相關標籤/搜索