Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo puedo detectar qué motor javascript (v8 o JSC) se utiliza en tiempo de ejecución en Android?

Las versiones más recientes de Android (> 2.2) incluyen el motor javascript v8, mientras que las versiones anteriores sólo tenían JSC. Sin embargo, de acuerdo con http://blogs.nitobi.com/joe/2011/01/14/android-your-js-engine-is-not-always-v8/ , que javascript motor se utiliza en tiempo de ejecución parece depender de Una variable de entorno presente en el tiempo de construcción ( JS_ENGINE ), así como las especificaciones de hardware del dispositivo:

 # The default / alternative engine depends on the device class. # On devices with a lot of memory (eg Passion/Sholes), the # default is V8. On everything else, the only choice is JSC. 

Mi pregunta es la siguiente: ¿hay alguna manera de determinar qué motor javascript está en uso desde una página web, un WebView integrado o una aplicación?

Si la respuesta es no, ¿alguien sabe qué motor JS es utilizado por el emulador de Android?


La razón por la que estoy preguntando esto es por este problema: http://code.google.com/p/android/issues/detail?id=12987

Básicamente, puede ser que el puente javascript-a-java en JSC esté roto en Android 2.3.X, y esto afecta la aplicación que estoy tratando de escribir. Estoy viendo un segfault desde algún lugar profundo en el JNI en mi emulador, pero no en el puñado de dispositivos físicos que he probado. Estoy tratando de determinar si se trata de una cosa sólo emulador, una cosa sólo JSC, o algo diferente en conjunto.

    3 Solutions collect form web for “¿Cómo puedo detectar qué motor javascript (v8 o JSC) se utiliza en tiempo de ejecución en Android?”

    Creo que la mejor pregunta es: ¿Por qué te importa? Usted está básicamente cayendo en la trampa de "detección de navegador" que mucha gente cayó a finales de los 90 / principios de los 00's. Desde entonces, sin embargo, hemos aprendido que es la detección de características que es el enfoque más útil, no menos porque las características soportadas en un navegador determinado (en su mayoría) un objetivo en movimiento. Ahora hay código, que se ejecuta en IE9 con su mejorado DOM y JavaScript de apoyo, que no está utilizando esas características, ya que está haciendo la detección del navegador y la caída en las técnicas de IE6.

    Así que en lugar de preocuparse por V8 vs JSC, sólo tiene que preocuparse por las características que desea. No sé nada acerca de JSC, pero por ejemplo vamos a suponer que no tiene el método forEach en matrices que V8 tiene (parte de la ECMAScript 5 ª edición estándar). En lugar de lanzar una gran palanca "V8 vs. JSC", haría lo siguiente:

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

    (Su "código que se cae" podría añadir forEach al prototipo, o tal vez esta prueba está en su propia función de iterador y desea saber si a defer a una implementación nativa o suministrar la suya propia).

    Y de manera similar para otras características que desea utilizar que pueden o no estar presentes.


    Pero si realmente necesita detectar V8 vs JSC (y de su comentario parece que puede), esta página parece demostrar un medio de hacerlo, aunque parece terriblemente frágil. Aquí está mi versión ligeramente editada (no menos importante para reemplazar window.devicePixelRatio con la prueba de WebkitAppearance – la primera da falsos positivos en al menos algunos otros navegadores [Firefox, por ejemplo, que utiliza Gecko, no WebKit]):

     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"); } 

    Ejemplo en vivo

    Funciona para mí detectar la diferencia entre Chrome (que también utiliza V8) y Safari (que también utiliza JSC).

    Aunque la respuesta anterior señala los mejores métodos, pensé que señalaría otra manera de hacer esto de dentro de una biblioteca nativa.

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

    Por desgracia, los símbolos exportados no están garantizados, por lo que no hay una garantía de 100% de que el compilador utilizado por el fabricante del firmware modificó el símbolo de la misma manera (use nm --defined-only libwebcore.so -g en una biblioteca con símbolos). Uno podría exponer esta función a través de la JNI y comprobar desde el código de Java.

    La biblioteca libwebcore.so también lista V8_Fatal como uno de los símbolos, que no es susceptible de mangling.

    JSC tendrá algunos otros símbolos exportados que puede buscar desde dentro de una biblioteca nativa. Si ambos son inexistentes, puede recurrir a otros métodos.

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

    Por cierto esto categorizará a Firefox como 'JSC' y versiones más recientes de IE se verán como V8.

    Mi blog tiene más trucos V8 sniffing: http://erikcorry.blogspot.dk/2012/12/which-version-of-v8-do-i-have.html

      FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.