Что происходит с кодом JavaScript после компиляции приложения с использованием Titanium Mobile

StackOverflow https://stackoverflow.com/questions/4217551

Вопрос

Я установил титана из AppleLerator и построил пример приложения «KickeSink».

Все хорошо работает, мне просто интересно, где код JavaScript заканчивается встроенному приложению.

I Grep-Ed XCode Project, а также приложение результатов, поскольку я нашел его в Library/Application Support/iPhone Simulator/....KitchenSink.app, но я не могу найти какие-либо названия функций из .js Файлы, даже не строковые тексты, используемые в приложении.

Ближайшая информация, которую я нашел, это ответ здесь: Как работает мобильная работа Titanium Applerator? Но я не понял четко, как работает процесс.

Является ли код JavaScript с компиляцией в двоичный код (какой компилятор используется тогда?), Или он просто преобразуется в некоторых специальных форматах данных и интерпретируется в запущенном приложении?

Обновлять:

Это то, что я могу видеть в каталоге Build / Android из Kitchensink:

michal:bin mac$ find . -name table_view_layout\*
./assets/Resources/examples/table_view_layout.js
./assets/Resources/examples/table_view_layout_2.js
./assets/Resources/examples/table_view_layout_3.js
./assets/Resources/examples/table_view_layout_4.js
./assets/Resources/examples/table_view_layout_5.js
./classes/org/appcelerator/generated/examples/table_view_layout.class
./classes/org/appcelerator/generated/examples/table_view_layout_2.class
./classes/org/appcelerator/generated/examples/table_view_layout_3.class
./classes/org/appcelerator/generated/examples/table_view_layout_4.class
./classes/org/appcelerator/generated/examples/table_view_layout_5.class
michal:bin mac$ unzip -t app.apk | grep table_view_layout
    testing: assets/Resources/examples/table_view_layout.js   OK
    testing: assets/Resources/examples/table_view_layout_2.js   OK
    testing: assets/Resources/examples/table_view_layout_3.js   OK
    testing: assets/Resources/examples/table_view_layout_4.js   OK
    testing: assets/Resources/examples/table_view_layout_5.js   OK

Я не смотрел в App.apk раньше, все, что я мог видеть, были эти файлы классов, соответствующие каждому из файлов JavaScript. Поэтому я предположил, что на Android JavaScript составлен для JVM. Почему они не могут быть найдены в App.apk?

Это было полезно?

Решение

Титан не является оберткой вокруг веб-вида, как указано ранее (хотя это точно объясняет, как работает PhoneGap). Ответ Джеффа, связанный в вопросе, является технически правильным объяснением того, как работает титановый, но вот лучшая версия, которую я пока слышал, от Marshall Culpepper:

Это правда, что Titanium Mobile использовал веб-просмотр (как в Android и iOS) в до-1,0 дня. Тем не менее, это уже не верно и не было с момента нашего выпуска 1.0 - это март 2010 года.

С 1,0 мы отправили два отдельных javaScript runtimes с нашими приложениями, и мы используем код JavaScript напрямую без веб-просмотр. Все ваше приложение от начала до конца теперь контролируется JS, и мы предоставляем всеобъемлющий набор собственных API, которые позволяют этому. Все, от виджетов пользовательских интерфейсов (да, в том числе WebVView), основные APIS, такие как сеть, файловая система, база данных, все пути к ОС, такие как Джобладающие действия в Android. На фронте Runtime JS мы отправляем раздробленную версию JavaScriptCore javascriptCore в iOS и снимок CVS Rhino 1.7 R3 для Android. То, что мы на самом деле делаем с вашим источником JavaScript, зависит от платформы, но вообще сломается так:

  • Источник статически проанализирован, чтобы найти ссылки на титановые модули
  • Строки локализации (strings.xml), app metadata (tiapp.xml) и специфические изображения плотности, которые генерируют конкретные аналоги платформы.
  • В iOS:
    • Сгенерируется проект / конфигурация XCode
    • Источник JS является BASE64'D и включена в виде переменной в сгенерированный файл C
    • XCodeBuild используется для генерации окончательных двоичных файлов
    • Профессионные профили, ключевые ключи и т. Д.
    • iTunes и некоторые другие клей используются для отправки IPA на ваше устройство iOS
  • В Android:
    • Проект Android / Eclipse генерируется
    • В режиме «Разработка» источник JS упакован как активы APK
    • В режиме «Распределение» (производственный), когда вы готовы отправить приложение, мы компилируем JS к Java Bytecode с использованием компилятора ОАО «Rhino». Вы также можете включить это во время режима разработки, установив «Ti.Android.comPilejs» в «True» в Tiapp.xml, см.: http://developer.appcelenerator.com/question/100201/enable-aderoid-byte-code-compile.
    • DEX, AAPT и другие инструменты Android SDK используются для создания и создания окончательного APK
    • ADB и Keytool используются для нажатия APK на эмулятор и / или устройство

Есть еще подробнее, что я могу погрузиться в специально на каждом из этих точек, но точка, которую я хотел водить домой, это то, что мы больше не используем веб-просмотр в качестве нашего JavaScript Engine. Ты могу Однако все еще встраиваемые веб-просмотры, и мы предоставляем некоторую простую интеграцию, которая позволяет вам вызовать титановые API из встроенного веб-просмотра.

Другие советы

То, что jhaynie говорит в вашем связанном вопросе, заключается в том, что Titanium интерпретирует ваш код JS и преобразует его во что-то, что почти идентично объекту-C.

В веб-приложении браузер прочитает и интерпретирует ваш JavaScript и работает ассоциированным кодом (возможно C ++). Например, браузер может сказать: «Этот скрипт выполняется getElementById(), Поэтому я буду бежать своими собственными методами C ++ для достижения этого ». Какой титана делает, выясняется, что, что JS-> C ++ (или в этом случае, js-> objective-c) будет заранее, и компиляция. Он по-прежнему оставляет интерпретатор открытым там, где это необходимо для вашего динамического кода, но он преобразует и соберет, что он может.

Это означает, что вы не найдете ничего, что выглядит похоже на то, что вы изначально написали в своем сценарии. Все, что должно быть оставлено в переводчике, все еще обрабатывается и преобразуется, и ваши символы изменится (например, вызов myTestFunction() может быть преобразован в A(), или 10001101001101 :П).


То обычный Использование JavaScript - это интерпретировать в режиме реального времени запущенной программой. Это не то, что здесь происходит, и именно поэтому вы не можете видеть никаких следов вашего сценария.

  • JavaScript предварительно обрабатывается

    Titanium выполняет интерпретацию вашего сценария, поскольку любая другая программа будет делать (например, веб-браузер). Он выясняет, какие зависимости ваш сценарий имеет на титановом API и устанавливает этот материал. Затем он отображает ваши символы непосредственно в (в случае iPhone).

    Программа обычно прочитала в вашем скрипте (которая является просто строкой), интерпретирует ее и работает C Code для выполнения того, для чего спросил ваш скрипт. Titanium делает это раньше, чтобы выяснить, какой код C должен быть запущен, и заранее выполняется преобразование.

  • Код компилируется, где это возможно

    Основываясь на интерпретации вашего кода и его зависимостей на API Titanium, титановые показатели, какой код может быть непосредственно скомпилирован, и что не должно быть скомпилировано для того, чтобы позволить им полную динамику JavaScript. Я не знаю, как он выбирает, что делает и не компилируется, но вы можете проверить источник, если вы хотите знать, что это значительно деталь.

    Код, который все еще должен быть интерпретирован (влево как скрипт), все еще преобразуется в символы, которые приводят к более эффективному отображению на нативный код. Так что это все еще интерпретированный скрипт, но это не значит, что это все еще JavaScript. Это означает, что эти части вашего сценария все равно будут работать быстрее, чем обычный JavaScript.

    Для iPhone коммутилизируемый C скомпилирован с GCC для создания нативной бинарности.

  • У вас есть приложение Runnable *

    Теперь у вас есть приложение, которое вы можете запустить на своем мобильном устройстве. Ваш коммутилизирующий код был скомпилирован и работает на скорости молнии, в то время как остальное преобразуется и все же интерпретируется более эффективным способом, который работает рядом с скоростью молнии. :П

  • Я надеюсь, что это имеет смысл сейчас, потому что это все, что у меня есть! : D.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top