为什么Nitro JavaScript引擎不适用于iOS 4.3中的移动Safari之外的应用程序

沿着类似的路线today’s story about the performance differences between Mobile Safari and the system-wide UIWebView control in iOS 4.3周二是关于移动Safari之外的网络应用程序性能的迷你骚动像往常一样,登记册在一个标题的故事中耸人听闻“Apple Handcuffs ‘Open’ Web Apps on iPhone Home Screen”

Apple’s iOS mobile operating system runs web applications at significantly slower speeds when they’re launched from the iPhone or iPad home screen in “full-screen mode” as opposed to in the Apple Safari browser, and at the same time, the operating system hampers the performance of these apps in other ways, according to tests from multiple developers and The Register.

It’s unclear whether these are accidental bugs or issues consciously introduced by AppleBut the end result is that, at least in some ways, the iOS platform makes it harder for web apps to replace native applications distributed through the Apple App Store, where the company takes a 30 per cent cut of all applications soldWhereas native apps can only run on Apple’s operating system, web apps — built with standard web technologies such as HTML, CSS, and JavaScript — can potentially run on any device.

“Apple is basically using subtle defects to make web apps appear to be low quality — even when they claim HTML5 is a fully supported platform,” says one mobile web app developer, who asked that his name not be used.

明确的暗示是,在Mobile Safari之外运行的网络应用程序运行速度较慢,但​​事实并非如此iOS 4.3发生的事情是网络应用程序(以及一般的JavaScript)正在运行移动Safari的速度明显加快。

Nitro JavaScript引擎仅在Mobile Safari中可用在Mobile Safari之外 - 无论是在使用UIWebView控件的App Store应用程序中,还是在已保存到主屏幕的真实Web应用程序中 - 应用程序都可以获得iOS旧的JavaScript引擎。

换一种方式:没有与4.2或更早版本相比,iOS 4.3中的网络应用或网页呈现速度较慢如果有的话,一切都至少要快一点但是:iOS 4.3中最重要的性能改进,尤其是JavaScript,是Mobile Safari独有的。

The obvious question: Why? The cynical answer is that Apple seeks to discourage the use of home screen web appsBut if that were the case, why don’t apps from the App Store get Nitro either? Many, many App Store apps use embedded UIWebView controls for displaying web content.

真正的答案是安全性也许Nitro在WebKit之前的JavaScript引擎上的性能提升的最大原因是使用了JIT - “即时”编译。这是维基百科关于JIT的页面JIT要求能够将RAM中的内存页标记为可执行文件,但是,作为安全措施,iOS不允许将内存中的页面标记为可执行文件这是一项重要且严肃的安全政策大多数现代操作系统允许内存中的页面标记为可执行文件 - 包括Mac OS X,Windows和(我相信)Android1iOS 4.3是此策略的例外,但例外仅限于Mobile Safari。

这是一种权衡由于性能原因,大多数OS允许将内存页标记为可执行文件出于安全原因,iOS不允许使用它如果允许将内存页面从可写升级到可执行文件(即使您要求页面永久地只读为只读),那么您将启用未签名的本机代码的执行它打破了信任链允许远程代码在本地执行会将每个本地可利用的安全漏洞转变为可远程利用的漏洞。

从iOS 4.3开始,Apple足以信任Mobile Safari好处是Mobile Safari现在明显更快缺点是任何针对Mobile Safari的安全漏洞现在都可能使比以前更糟糕的事情发生。

保存到主屏幕的Web应用程序无法在Mobile Safari中运行它们被有效地保存为离散应用程序 - 围绕UIWebView控件的薄包装器(That’s why they show up individually in the task bar, just like apps from the App Store.) Home screen apps may well eventually get access to the Nitro JavaScript engine — Apple simply hasn’t yet done (or perhaps finished?) the security work to allow it这不是一个疏忽或错误,或者是Apple希望阻碍网络应用程序性能的单个人的结果。

One way Apple could make Nitro available system-wide in iOS would be to do something similar to what they’ve done with web content plugins (like Flash Player) on Mac OS X: execute JavaScript in a separate (trusted) process that maps back to the host appOn Snow Leopard, Flash Player no longer executes within Safari; instead it gets its own process同样,Apple可以引入专用的Nitro JavaScript进程,为任何应用程序执行JavaScript,而不是执行任何应用程序我不知道这是Apple正在考虑或正在考虑的事情,我只是说这是他们可以向系统范围内的应用程序提供JavaScript JIT编译的一种方式,而不允许大多数进程将可写内存标记为可执行文件。

[更新:事实上,这正是如何仍在进行中WebKit2框架是设计的。]

简而言之,iOS的设计从一开始就比Mac OS X更安全这种权衡的代价是绩效。

另外请注意,Nitro不是新的WebKit团队首次宣布它(当时称为“SquirrelFish Extreme”)早在2008年9月直到现在才出现一点都不在iOS上表明这些安全隐患有多复杂Nitro在iOS上的可用性仅限于Mobile Safari,并不意味着它总是仅限于Mobile Safari。


  1. 我实际上并不是百分之百确定这对Android来说是正确的,但我的理解是Android上的每个应用程序都在JIT中运行。这就是Dalvik虚拟机的工作原理- 并且使用JIT是最近版本的Android比以前版本表现更好的原因如果Android操作系统不允许进程将内存中的页面标记为可执行文件,我看不出他们如何使用系统范围的JIT但如果我错了,让我知道↩︎

以前: 向后弯曲
下一个: SXSW互动的演变