Intereting Posts
Как установить тайм-аут keepalive в Android? Как уменьшить расстояние между TextView Как получить контекст в классе android Service Недопустимая ошибка родительской папки для AppFolder в драйвере API Отсутствует ключ api_key / current с Google Services 3.0.0 и ключом API Карт в build.gradle Аналогичный класс «Handler» в Java Как добавить ScrollView в GLSurfaceview в Opengl ES2.0 на Android Обновите изображения на FragmentStatePagerAdapter при возобновлении активности Как мы можем реализовать привязку данных для кнопки Switch для события onCheckedChageListener? Нажимать только scrollview, пока открытая клавиатура открыта ExifInterface не обновляет теги exif Android: Тип java.awt.Image не может быть разрешен. Это косвенно ссылается на требуемые файлы .class Как я могу получить переменную из другого класса в Java? AlarmManager: как планировать ежедневную тревогу и обрабатывать изменения времени Как настроить представление Android на основе размеров родителя

Как я могу определить, какой механизм javascript (v8 или JSC) используется во время выполнения в Android?

Более новые версии Android (> 2.2) включают в себя javascript-движок v8, в то время как более старые версии имели только АО. Однако, согласно 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 (eg Passion/Sholes), the # default is V8. On everything else, the only choice is JSC. 

Мой вопрос заключается в следующем: есть ли способ определить, какой механизм javascript используется на веб-странице, встроенном WebView или приложении?

Если ответ отрицательный, знает ли кто-нибудь, какой JS-движок используется эмулятором Android?


Причина, по которой я спрашиваю об этом, связана с этой проблемой: http://code.google.com/p/android/issues/detail?id=12987

В принципе, может быть, что мотив javascript-to-java в АО разбит на Android 2.3.X, и это влияет на приложение, которое я пытаюсь написать. Я вижу segfault где-то глубоко в JNI на эмуляторе, но не на нескольких физических устройствах, которые я тестировал. Я пытаюсь определить, является ли это только эмулятор, только для АО или вообще что-то совсем другое.

Я думаю, что лучший вопрос: почему вас это волнует? Вы в основном попадаете в ловушку «обнаружения браузера», в которую попали многие люди в конце 90-х / начале 00-х годов. С тех пор, однако, мы узнали, что это особенность обнаружения , это более полезный подход, не в последнюю очередь потому, что функции, поддерживаемые в данном браузере, были (в основном) движущейся целью. Теперь есть код, работающий на IE9 с его значительно улучшенной поддержкой DOM и JavaScript, который не использует эти функции, потому что он выполняет обнаружение браузера и отказывается от методов IE6.

Поэтому, вместо того, чтобы беспокоиться о V8 против АО, просто волнуйтесь о функциях, которые вы хотите. Я ничего не знаю об АО, но, допустим, предположим, что у него нет метода forEach для массивов, который V8 имеет (часть стандарта ECMAScript 5th edition). Вместо того, чтобы бросать большой рычаг «V8 против АО», вы бы сделали:

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

(Ваш «код, который возвращается» может добавить forEach к прототипу, или, может быть, этот тест находится в вашей собственной функции итератора, и вы хотите знать, следует ли откладывать на собственную реализацию или поставлять свои собственные.)

И аналогично для других функций, которые вы хотите использовать, которые могут или не могут присутствовать.


Но если вам действительно нужно обнаружить V8 vs. JSC (и, по вашему мнению, вы можете это сделать), эта страница, похоже, демонстрирует средства для этого, хотя она кажется ужасно хрупкой. Вот моя слегка отредактированная версия (не в последнюю очередь для замены window.devicePixelRatio с тестом на WebkitAppearance – первая дает ложные срабатывания по крайней мере в некоторых других браузерах [например, Firefox, в котором используется Gecko, а не 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"); } 

Живой пример

Работает для меня, обнаруживая разницу между Chrome (который также использует V8) и Safari (который также использует АО).

Хотя ответ выше указывает на лучшие методы, я подумал, что я бы указал на другой способ сделать это изнутри родной библиотеки.

 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 как один из символов, который не поддается манипулированию.

АО будет иметь некоторые другие экспортированные символы, которые вы можете проверить изнутри собственной библиотеки. Если они не существуют, вы можете отказаться от других методов.

 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