天天看點

TPatch動态更新檔系統(iOS)

版權聲明:本文由朱煌原創文章,轉載請注明出處: 

文章原文連結:https://www.qcloud.com/community/article/160

來源:騰雲閣 https://www.qcloud.com/community

TPatch是一套使用JavaScript給iOS打熱更新檔的系統,能非常有效的解決線上App的Crash和各種問題。

1.從何而來?

對于每一個開發,從寫Hello World開始,到使用各種語言,可能都會遇到各種BUG。有的BUG能快速解決,比如Web側的,發個JS或者Html即可。但是在終端開發中,比如iOS,發現的線上問題往往沒那麼快能解決,換包可能需要Apple短則幾天長則一周以上的稽核,成本很高。有沒有辦法能快速解決iOS App的線上問題?TPatch是其中一種比較好的解決方案。

TPatch動态更新檔系統(iOS)

2.TPatch特點

TPatch動态更新檔系統(iOS)
  • 支援多線程:

    使用JS打更新檔的天然優勢在于JavaScriptCore是線程安全的,雖然鎖的粒度有點大,并且有些方法的鎖有問題(這些在TPatch都已解決)。

  • 支援Block:

    JS中的function和OC的Block有很多相似之處。有更新檔中定義的function,傳遞到OC,我們會轉成Block,并且Block可以在OC和JS之間傳遞,這點Lua更新檔是很難做到。

  • 異步機制:

    由于JavsSciptCore是線程安全的,同時也帶來另外一個問題,假如工作線程和主線程都打了更新檔,工作線程的更新檔耗時非常嚴重,這時候如果主線程更新檔開始運作,就會被阻塞。TPatch引入了異步機制,能讓進入JSCore的更新檔快速傳回,異步執行,減少更新檔之間的影響。

  • 支援線上Reset復原:

    在更新檔釋出後,有可能通過監控發現更新檔有問題,這時候使用者側的運作邏輯已經被“污染”。TPatch支援,在更新檔背景設定該更新檔過期後,使用者側App會删掉本地有問題的更新檔包,并且線上Reset,而不是等App重新開機後再恢複,下次重新開機可能得好幾天。

  • 調試友善:

    利用JavaScriptCore的天然優勢,其内部提供了Debug接口。我們可以像調試App裡面的網頁一樣,使用Mac下的Safari遠端調試更新檔,斷點、堆棧、異常等一目了然。

  • 精準投放:

    TPatch支援按使用者、iOS版本、業務App版本和Mask标記投放。Mask是一個可擴充的bit标記,業務可以自定義,比如取一位越獄标記,或者網絡标記,更新檔就可以根據是否越獄和網絡标記下發。

3.核心原理

TPatch包括更新檔包背景系統和終端元件,其核心原理是更新檔背景根據更新檔配置,下發一段更新檔JS給終端,終端執行這段更新檔,利用OC Runtime覆寫有問題的方法或者執行一段邏輯,修正運作時的邏輯,進而達到修複BUG的目的。

TPatch動态更新檔系統(iOS)

4.打更新檔流程

TPatch動态更新檔系統(iOS)

1) 在更新檔背景下發更新檔腳本後,首先會經過iOS7及以上系統自帶的JavaScriptCore.framework把JS更新檔執行起來,通過調用TPatch.js裡面的Bridge接口,調用到OC裡面打更新檔的方法,打上更新檔。

2) 當業務代碼執行這段已經打了更新檔的功能時,不會是原來的OC代碼,而是一段JS代碼。JS可以通過JS引起和OC引擎支援Block、異步執行等,并且支援線上Reset復原。

5.和其他方案對比

  • waxPatch:

    是使用Lua+Wax打更新檔的方案,App需要內建Lua解釋器和Wax架構(接近1M)。不過waxPatch對Block不太完善,多線程更新檔也可能有問題,Wax也已經兩年沒人維護。相比之下TPatch更加輕量,對安裝包影響僅200K,功能也更加強大。

  • JSPatch:

    同樣使用JS來打更新檔,和TPatch終端元件核心原理是相似的。不過JSPatch在實際的海量産品中運用還有不少問題沒解決,比如Block傳遞、多線程Crash等問題,TPatch解決了這些問題,更加穩定,并且支援異步機制、動态復原等優化特性。