Intereting Posts
Нужна помощь в настройке Android TableLayout Подумайте о добавлении android: paddingStart = "25dp", чтобы лучше поддерживать макеты справа налево Ошибка ListView на вкладке салфетки не обновляется, если не перезапустить Нельзя использовать макет ScrollView внутри SlidingUpPanelLayout Xamarin Android Listview: Как оставаться выделенным / выбранным после нажатия кнопки «Назад»? Пользовательские действия с использованием неявных намерений между приложениями Кнопка отскока на кране Как сделать .jar из проекта Android Studio Wake + Wifi блокировки нет эффекта Android Создание приложения на Android с помощью Android LinearLayout перекрывается Координатор поддержкиLayout Установить язык на французский в android DatePickerDialog Передача перечисления или объекта через намерение (лучшее решение) Есть ли способ во время выполнения указать, на каком уровне API работает Android-устройство? Keytool генерирует 32-символьный длинный хэш вместо 28

Как я могу определить, какой механизм 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 на эмуляторе, но не на нескольких физических устройствах, которые я тестировал. Я пытаюсь определить, является ли это только эмулятор, только для АО или вообще что-то совсем другое.

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

Я думаю, что лучший вопрос: почему вас это волнует? Вы в основном попадаете в ловушку «обнаружения браузера», в которую попали многие люди в конце 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