其實很久之前就有越獄工作者研究過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.csdn.net/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真是暴君。