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

时间:2011-07-20 20:57:53

标签: javascript android v8 javascript-engine

较新版本的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

基本上,可能是JSC中的javascript-to-java桥在Android 2.3.X上被破坏了,这会影响我正在尝试编写的应用程序。我在模拟器上看到了JNI深处的某个段错误,但是我测试过的少数几个物理设备上没有。我试图确定这是否只是一个模拟器,只有JSC的东西,或者完全不同的东西。

3 个答案:

答案 0 :(得分:18)

答案 1 :(得分:6)

虽然上面的答案指出了最好的方法,但我想我会从本地库中指出另一种方法。

void *dlWebCoreHandle = dlopen("libwebcore.so", RTLD_NOW);
void *v8GetVersion = dlsym(dlWebCoreHandle, "_ZN2v82V810GetVersionEv");
if (v8GetVersion == NULL) {
    /* does not appear to be V8 */
} ... etc.

遗憾的是,导出的符号被破坏,因此没有100%保证固件制造商使用的编译器以相同的方式损坏符号(在带符号的库上使用nm --defined-only libwebcore.so -g)。一个人会通过JNI公开这个函数,并从Java代码中检查。

libwebcore.so库还列出V8_Fatal作为其中一个符号,不易受到损坏。

JSC将有一些其他导出符号,您可以从本机库中检查它们。如果两者都不存在,您可以回退到其他方法。

答案 2 :(得分:1)

var s = '';
for (x in {
    3: 3,
    1: 1
  }) {
  s += x
}
if (s === '31') {
  alert('JSC');
} else {
  alert('V8');
}

顺便说一下,这会将Firefox归类为'JSC',而较新的IE版本将看起来像V8。

我的博文有更多V8嗅探技巧:http://erikcorry.blogspot.dk/2012/12/which-version-of-v8-do-i-have.html