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是其中一種比較好的解決方案。
框架

2.TPatch特色

  • 支持多線程:
    使用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的目的。
異步

4.打補丁流程


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解決了這些問題,更加穩定,而且支持異步機制、動態回滾等優化特性。
相關文章
相關標籤/搜索