Подтвердить что ты не робот

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

Я установил Titanium из appcelerator и создал пример приложения KitchenSink.

Все работает хорошо, мне просто интересно, где код javascript попадает в встроенное приложение.

I grep-ed проект Xcode, а также приложение результата, когда я нашел его в Library/Application Support/iPhone Simulator/....KitchenSink.app, но я не могу найти никаких имен функций из .js файлов, даже строковых текстов, используемых в приложении.

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

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

Update:

Это то, что я вижу в каталоге 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?

4b9b3361

Ответ 1

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

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

Начиная с версии 1.0, мы отправили две отдельные версии Javascript с нашими приложениями, и мы запускаем код Javascript напрямую без WebView. Все ваше приложение от начала до конца теперь контролируется JS, и мы предоставляем полный набор Native API, которые позволяют это. Все, начиная от пользовательских виджетах (да, включая WebView), Core API, таких как Networking, Filesystem, Database, полностью зависит от конкретных ОС, таких как JS Activities в Android. На фронте времени JS мы отправляем раздвоенную версию WebKit JavaScriptCore в iOS и снимок Rhino 1.7 R3 CVS для Android. То, что мы на самом деле делаем с вашим источником javascript, зависит от платформы, но обычно оно разбивается так:

  • Источник статически анализируется, чтобы найти ссылки на модули Titanium.
  • Строки локализации (strings.xml), метаданные приложения (tiapp.xml) и изображения, специфичные для плотности, генерируют специфичные для платформы аналоги.
  • В iOS:
    • Создается проект/конфигурация XCode
    • Источник JS - base64'd и встроен в переменную в сгенерированный файл C
    • xcodebuild используется для генерации окончательных двоичных файлов
    • профили настройки, подписи и т.д. применяются
    • iTunes и другой клей используются для отправки IPA на ваше устройство iOS.
  • В Android:
    • Создается проект Android/Eclipse
    • В режиме "Разработка" источник JS упакован как активы APK.
    • В режиме "Распространение" (производство), когда вы готовы отправить приложение, мы скомпилируем байт-код JS в Java с использованием компилятора Rhino JSC. Вы также можете включить это в режиме разработки, установив "ti.android.compilejs" в "true" в tiapp.xml, см. http://developer.appcelerator.com/question/100201/enable-android-byte-code-compile
    • dex, aapt и другие инструменты Android SDK используются для создания и создания окончательного APK
    • adb и keytool используются для нажатия APK на эмулятор и/или устройство

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

Ответ 2

Что jhaynie говорит в вашем связанном вопросе, так это то, что Titanium интерпретирует ваш JS-код и преобразует его в нечто, почти идентичное Objective-C.

В веб-приложении браузер читает и интерпретирует ваш Javascript и запускает связанный с ним собственный код (возможно, С++). Например, браузер может сказать: "Этот script выполняет getElementById(), поэтому для выполнения этого я буду запускать свои собственные С++-методы". Что делает Титан, выясняется, что этот JS- > С++ (или в этом случае JS → Objective-C) будет заранее, и скомпилировать это. Он по-прежнему оставляет интерпретатор открытым, когда это необходимо для вашего динамического кода, но он будет преобразовывать и компилировать то, что он может.

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


Обычное использование Javascript заключается в том, чтобы он интерпретировал в реальном времени запущенную программу. Это не то, что происходит здесь, и почему вы не видите никаких следов вашего script.

  

       Javascript предварительно обработан

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

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

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

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

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

      Для iPhone компилятор C скомпилирован с помощью GCC для создания собственного двоичного файла.

           У вас есть запущенное приложение *

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

Надеюсь, теперь это имеет смысл, потому что все, что у меня есть!: D