標籤:非同步 bit 標記 follow 安裝 自訂 著作權 target 好的
著作權聲明:本文由朱煌原創文章,轉載請註明出處:
文章原文連結: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解決了這些問題,更加穩定,並且支援非同步機制、動態復原等最佳化特性。
TPatch動態補丁系統(iOS)