热更新相关调研

背景

2017年JSPatch相关App都会收到警告邮件,提示删除相关SDK

Apple之所以能揪出JSPatch,则是因为JSPatch中涉及使用到dlopen(),dlsym(),responsToSelector :、 performSelector:,method_exchangeImplementations()等方法。但实际上我们的项目中也存在上述几个方法,依然能过审。所以推测被卡住的原因与这几个方法相关,但不必然相关。

PS:已确认dlsym()函数会触发苹果的监测,造成上线失败。

现在如果引入JSPatch仍然会有被拒的风险,以下是官方的原话:

JSPatch 平台使用公告(2019.1.30)

平台最新 SDK 1.8.2 处于试验阶段,未能确保审核通过,有意配合试验者可邮件获取 SDK。
SDK 1.8.0 版本有较大概率审核被拒,但企业版APP可用,若确认使用可点此下载

用平台最新的 SDK 接入可以通过审核吗

可以通过,已有接入并通过审核的 APP。

为什么平台 SDK 能通过审核

因为做了简单的类名修改混淆。

为什么游戏中允许热更新呢?

游戏中的热更新技术主要的实现方式是把动态脚本下载之后,让动态脚本调用游戏引擎提供的接口实现缺陷修复。与 JSPatch不同的是,动态脚本并不能任意调用全部原生代码,而是只能根据游戏引擎提供的接口调用相关功能。在这个过程中,游戏引擎的原生端作为一个安全沙箱,提供了一个安全的保护层,只要游戏引擎不要对外提供获取通讯录的接口,黑客就无法通过替换动态脚本的方式获取用户的隐私资料。进而可以被认为是安全的,自然就不在苹果的禁止范围内。

解读规范

2015 年苹果发过一篇协议《Apple Developer Program License Agreement》,文中第 3.3.2 节有一段关于热更新的内容:

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 可以动态执行下发的脚本和文件,其它所有脚本/代码/解释器都必须打包在 APP 内部。这句话其实就给 React Native 留了一个口子:React Native 就是用 JavascriptCore 执行 JS 脚本文件的,那么动态下发也是合理的。

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.

这一段话大概就是说,我允许你热更新,但是必须遵循我这三条规定:

  • 不能大的修改 APP 功能,导致应用实际功能和 APP Store 的宣传不符
  • 不能动态创建应用商店
  • 不能绕过签名/沙箱/OS 的安全功能

现在市面上的热更新方案:

一、阿里百川hotfix、Sophix、LuaView,腾讯的Bugly、OCS,滴滴的DynamicCocoa。

  1. 阿里百川hotfix、Sophix,仅支持安卓
  2. LuaView,类似于Flutter,将Android、iOS原生的UI、网络、存储、硬件控制等能力桥接到Lua层,进行动态下发
  3. Bugly内部集成的JSPatch支持的热更新
  4. OCS是全新设计的iOS动态化方案。我们定义了一套精确描述OC语义的字节码指令集(OCScript),开发了一套全自动编译器(OCSCompiler),实现了一个高性能的虚拟机(OCSVM)以及一个可以跟底层无缝对接的桥接器(OCSBridge)。我们首先使用OCS编译器把OC源码转化成OCS字节码,然后通过OCS桥接器实现OCS虚拟机与Native运行时的互联,最后使用OCS虚拟机对OCS字节码进行解释运算,并驱动Native运行时完成逻辑的执行,以此达到Native代码动态化的效果。OCS被用于iOS APP安装包减包、功能插件化、HotPatch等方方面面动态化需求。
  5. DynamicCocoa 闭源

二、Weex、RN、Hybrid

本身由js编写的代码,自然可以进行js进行bundle拉取

三、TTPatch、MangoFix

1.TTPatch

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

TTPatch2.0,核心实现替换为libffi实现.同时将代码重构,修改敏感命名.TTPatch更新为TTDFKit

官方风险提示: 仅供技术交流使用,上架有风险!!!!

2.MangoFix

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

是DSL即 “领域专用语言”,用的是解析器进行词法、语法、语义检查和分析,作者用到了libffi库(用于高级语言之间的相互调用)进行运行时动态创建C函数,然后在创建的C函数中查找MangoFix脚本中方法并调用(这个用了类似dlsym的symdl进行动态调用函数),然后用刚刚创建的C函数替换原来Method的IMP指针并保留原有的IMP指针

脚本和OC极度类似,接入和jspatch相似,有一个下发脚本的接口,缺点就是下发完脚本需要重新进入页面才能更新

参考资料:

  1. https://jspatch.com/
  2. iOS 现在的 “热修复/热更新”
  3. 如何隐藏你的热更新 bundle 文件?
  4. 【腾讯Bugly干货分享】OCS——史上最疯狂的iOS动态化方案
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容