熱更新相關調(diào)研

背景

2017年JSPatch相關App都會收到警告郵件鸭你,提示刪除相關SDK

Apple之所以能揪出JSPatch,則是因為JSPatch中涉及使用到dlopen()喇颁,dlsym()芥被,responsToSelector :、 performSelector:屹逛,method_exchangeImplementations()等方法础废。但實際上我們的項目中也存在上述幾個方法汛骂,依然能過審。所以推測被卡住的原因與這幾個方法相關评腺,但不必然相關帘瞭。

PS:已確認dlsym()函數(shù)會觸發(fā)蘋果的監(jiān)測,造成上線失敗蒿讥。

現(xiàn)在如果引入JSPatch仍然會有被拒的風險蝶念,以下是官方的原話:

JSPatch 平臺使用公告(2019.1.30)

平臺最新 SDK 1.8.2 處于試驗階段,未能確保審核通過芋绸,有意配合試驗者可郵件獲取 SDK媒殉。
SDK 1.8.0 版本有較大概率審核被拒,但企業(yè)版APP可用摔敛,若確認使用可點此下載

用平臺最新的 SDK 接入可以通過審核嗎

可以通過廷蓉,已有接入并通過審核的 APP。

為什么平臺 SDK 能通過審核

因為做了簡單的類名修改混淆马昙。

為什么游戲中允許熱更新呢桃犬?

游戲中的熱更新技術主要的實現(xiàn)方式是把動態(tài)腳本下載之后,讓動態(tài)腳本調(diào)用游戲引擎提供的接口實現(xiàn)缺陷修復行楞。與 JSPatch不同的是攒暇,動態(tài)腳本并不能任意調(diào)用全部原生代碼,而是只能根據(jù)游戲引擎提供的接口調(diào)用相關功能子房。在這個過程中形用,游戲引擎的原生端作為一個安全沙箱就轧,提供了一個安全的保護層,只要游戲引擎不要對外提供獲取通訊錄的接口田度,黑客就無法通過替換動態(tài)腳本的方式獲取用戶的隱私資料钓丰。進而可以被認為是安全的,自然就不在蘋果的禁止范圍內(nèi)每币。

解讀規(guī)范

2015 年蘋果發(fā)過一篇協(xié)議《Apple Developer Program License Agreement》携丁,文中第 3.3.2 節(jié)有一段關于熱更新的內(nèi)容:

Except as set forth in the next paragraph, an Application may not download or install executable code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exceptions to the foregoing are scripts and code downloaded and run by Apple's built-in WebKit framework or JavascriptCore, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store.

這一段話大概就是說除了 Webkit 和 JavascriptCore 可以動態(tài)執(zhí)行下發(fā)的腳本和文件,其它所有腳本/代碼/解釋器都必須打包在 APP 內(nèi)部兰怠。這句話其實就給 React Native 留了一個口子:React Native 就是用 JavascriptCore 執(zhí)行 JS 腳本文件的梦鉴,那么動態(tài)下發(fā)也是合理的。

Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS.

這一段話大概就是說揭保,我允許你熱更新肥橙,但是必須遵循我這三條規(guī)定:

  • 不能大的修改 APP 功能,導致應用實際功能和 APP Store 的宣傳不符
  • 不能動態(tài)創(chuàng)建應用商店
  • 不能繞過簽名/沙箱/OS 的安全功能

現(xiàn)在市面上的熱更新方案:

一秸侣、阿里百川hotfix存筏、Sophix、LuaView味榛,騰訊的Bugly椭坚、OCS,滴滴的DynamicCocoa搏色。

  1. 阿里百川hotfix善茎、Sophix,僅支持安卓
  2. LuaView频轿,類似于Flutter垂涯,將Android、iOS原生的UI航邢、網(wǎng)絡耕赘、存儲、硬件控制等能力橋接到Lua層膳殷,進行動態(tài)下發(fā)
  3. Bugly內(nèi)部集成的JSPatch支持的熱更新
  4. OCS是全新設計的iOS動態(tài)化方案操骡。我們定義了一套精確描述OC語義的字節(jié)碼指令集(OCScript),開發(fā)了一套全自動編譯器(OCSCompiler)秽之,實現(xiàn)了一個高性能的虛擬機(OCSVM)以及一個可以跟底層無縫對接的橋接器(OCSBridge)当娱。我們首先使用OCS編譯器把OC源碼轉(zhuǎn)化成OCS字節(jié)碼,然后通過OCS橋接器實現(xiàn)OCS虛擬機與Native運行時的互聯(lián)考榨,最后使用OCS虛擬機對OCS字節(jié)碼進行解釋運算跨细,并驅(qū)動Native運行時完成邏輯的執(zhí)行,以此達到Native代碼動態(tài)化的效果河质。OCS被用于iOS APP安裝包減包冀惭、功能插件化震叙、HotPatch等方方面面動態(tài)化需求。
  5. DynamicCocoa 閉源

二散休、Weex媒楼、RN、Hybrid

本身由js編寫的代碼戚丸,自然可以進行js進行bundle拉取

三划址、TTPatch、MangoFix

1.TTPatch

https://github.com/yangyangFeng/TTPatch
(star:420)

TTPatch2.0,核心實現(xiàn)替換為libffi實現(xiàn).同時將代碼重構(gòu),修改敏感命名.TTPatch更新為TTDFKit

官方風險提示: 僅供技術交流使用,上架有風險!!!!

2.MangoFix

https://github.com/YPLiang19/Mango
(star:890)

是DSL即 “領域?qū)S谜Z言”限府,用的是解析器進行詞法夺颤、語法、語義檢查和分析胁勺,作者用到了libffi庫(用于高級語言之間的相互調(diào)用)進行運行時動態(tài)創(chuàng)建C函數(shù)世澜,然后在創(chuàng)建的C函數(shù)中查找MangoFix腳本中方法并調(diào)用(這個用了類似dlsym的symdl進行動態(tài)調(diào)用函數(shù)),然后用剛剛創(chuàng)建的C函數(shù)替換原來Method的IMP指針并保留原有的IMP指針

腳本和OC極度類似署穗,接入和jspatch相似寥裂,有一個下發(fā)腳本的接口,缺點就是下發(fā)完腳本需要重新進入頁面才能更新

參考資料:

  1. https://jspatch.com/
  2. iOS 現(xiàn)在的 “熱修復/熱更新”
  3. 如何隱藏你的熱更新 bundle 文件案疲?
  4. 【騰訊Bugly干貨分享】OCS——史上最瘋狂的iOS動態(tài)化方案
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末封恰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子络拌,更是在濱河造成了極大的恐慌俭驮,老刑警劉巖回溺,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件春贸,死亡現(xiàn)場離奇詭異,居然都是意外死亡遗遵,警方通過查閱死者的電腦和手機匆笤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門广凸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事枢希。” “怎么了楼肪?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵寿桨,是天一觀的道長。 經(jīng)常有香客問我琅坡,道長悉患,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任榆俺,我火速辦了婚禮售躁,結(jié)果婚禮上坞淮,老公的妹妹穿的比我還像新娘。我一直安慰自己陪捷,他們只是感情好回窘,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著市袖,像睡著了一般啡直。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苍碟,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天付枫,我揣著相機與錄音,去河邊找鬼驰怎。 笑死阐滩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的县忌。 我是一名探鬼主播掂榔,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼症杏!你這毒婦竟也來了装获?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤厉颤,失蹤者是張志新(化名)和其女友劉穎穴豫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逼友,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡精肃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帜乞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司抱。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖黎烈,靈堂內(nèi)的尸體忽然破棺而出习柠,到底是詐尸還是另有隱情,我是刑警寧澤照棋,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布资溃,位于F島的核電站,受9級特大地震影響烈炭,放射性物質(zhì)發(fā)生泄漏溶锭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一梳庆、第九天 我趴在偏房一處隱蔽的房頂上張望暖途。 院中可真熱鬧卑惜,春花似錦、人聲如沸驻售。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欺栗。三九已至毫痕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迟几,已是汗流浹背消请。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留类腮,地道東北人臊泰。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像蚜枢,于是被迫代替她去往敵國和親缸逃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

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