如何检测Android中运行时使用的JavaScript引擎(v8或JSC)?

前端之家收集整理的这篇文章主要介绍了如何检测Android中运行时使用的JavaScript引擎(v8或JSC)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
较新版本的 Android(> 2.2)包括v8 JavaScript引擎,而旧版本只有JSC.然而,根据 http://blogs.nitobi.com/joe/2011/01/14/android-your-js-engine-is-not-always-v8/,在运行时使用哪个javascript引擎似乎取决于构建时存在的环境变量(JS_ENGINE)以及设备的硬件规格:
# The default / alternative engine depends on the device class.
# On devices with a lot of memory (e.g. Passion/Sholes),the
# default is V8. On everything else,the only choice is JSC.

我的问题是:有什么办法可以确定网页,嵌入式WebView或应用程序中使用哪个JavaScript引擎?

如果答案是否定的,有没有人知道Android模拟器使用哪个JS引擎?

我问的原因是因为这个问题:http://code.google.com/p/android/issues/detail?id=12987

基本上,这可能是Android 2.3.X中的JSC中的JavaScript到java桥断了,这会影响我正在写的应用程序.我在模拟器上看到了JNI深处的一个segfault,但没有在我测试过的一些物理设备上.我试图确定这是一个只有模拟器的东西,一个JSC的东西,还是一些不同的东西.

解决方法

我认为最好的问题是:你为什么关心?您基本上陷入了90年代末/ 00年代初期很多人陷入“浏览器检测”陷阱.从那时起,我们已经知道,它的功能检测是更有用的方法,尤其是因为给定浏览器中支持功能(主要是)移动目标.现在有了代码,运行在IE9上,其显着改进的DOM和JavaScript支持,不使用这些功能,因为它正在进行浏览器检测并落后于IE6技术.

所以,而不是担心V8与JSC,只是担心你想要的功能.我不知道有关JSC的任何内容,但是我们假设在V8的阵列上没有forEach方法(ECMAScript第5版标准的一部分).你不必投掷一个大的“V8对JSC”杠杆,而是:

if (typeof Array.prototype.forEach === "function") {
    // Code that expects `forEach`
}
else {
    // Code that falls back
}

(您的“后退代码”可能会添加到原型中,或者也许这个测试在您自己的迭代器函数中,并且您想知道是否推迟本机实现或提供自己的实现.)

对于您想要使用的其他功能,也可能存在或可能不存在.

但是,如果您真的需要检测V8与JSC(并且您的评论似乎是可能的话),那么this page似乎表现出一种这样做的手段,尽管它似乎非常脆弱.这是我稍作修改的版本(最重要的是用Webkit Appearance测试来替换window.devicePixelRatio – 前者在至少一些其他浏览器上使用了错误的假设[例如,使用Gecko而不是WebKit的Firefox]):

var v8string = 'function%20javaEnabled%28%29%20%7B%20%5Bnative%20code%5D%20%7D';

if ('WebkitAppearance' in document.documentElement.style)  //If (probably) WebKit browser
{
   if (escape(navigator.javaEnabled.toString()) === v8string)
   {
      display('V8 detected');
   }
   else
   {
      display('JSC detected');
   }
}
else {
  display("Not a WebKit browser");
}

Live example

可以检测Chrome(也使用V8)和Safari(也使用JSC)之间的区别.

猜你在找的Android相关文章