其实很久之前就有越狱工作者研究过iOS的MobileSafari是如何进行 JIT 处理。
原始PDF地址为:http://reverse.put.as/wp-content/uploads/2011/06/syscan11_breaking_ios_code_signing.pdf
其简单原理如下:
JIT的本质是在运行时动态生成Native Code并执行。
这个操作恰恰是App Store所禁止的,因为App Store必须审核第三方程序上传的Native Code,所以iOS系统会通过权限管理对应用程序进行限制。
所做的限制可以简单理解为 “动态生成的NativeCode只能在 某个内存分页上执行”。详情见上面的PDF。
如何在越狱设备上开启第三方应用程序的JIT:
众所周知,MobileSafari是开启了JIT的。我们可以通过 ldid 工具查看其 Code Sign,发现有如下字段:
<key>dynamic-codesigning</key>
<true/>
该字段就是为了告诉系统,该程序有动态代码的需求。
如果我们想将iOS的Chrome开启JIT,那么我们只需参考 http://blog.youkuaiyun.com/lucky_06/article/details/8925804 的方法,添加上述entitlement 字段即可。
对于自己build的程序,只要在code sign entitlements 的时候添加上述字段就可以开启。
效率对比:
通过SunSpider测试, http://www.webkit.org/perf/sunspider/sunspider.html
在iPad2上的结果如下:(代表每项平均完成时间,越小越好)
不开启JIT : 7213ms
开启JIT : 1803ms
总体效率差距有3倍之多,Apple真是暴君。