Что происходит с кодом JavaScript после компиляции приложения с использованием Titanium Mobile - PullRequest
30 голосов
/ 18 ноября 2010

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

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

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

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

Код 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?

Ответы [ 2 ]

47 голосов
/ 25 января 2011

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

Это правда, что TitaniumМобильные приложения использовали WebView (как в Android, так и в iOS) в период до 1.0 дня.Однако это уже не так и не было с тех пор, как наша версия 1.0 была выпущена в марте 2010 года.

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

  • Источник подвергается статическому анализу для поиска ссылок на модули Titanium
  • Строки локализации (strings.xml), метаданные приложения (tiapp.xml) и изображения, специфичные для плотности, генерируют аналоги для конкретной платформы.
  • В iOS:
    • Создается проект / конфигурация XCode
    • JS Source является 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, и мы предоставляем некоторую простую интеграцию, которая позволяет вам вызывать API-интерфейсы Titanium из встроенного WebView.

4 голосов
/ 18 ноября 2010

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

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

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


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

Javascript предварительно обработан Titanium выполняет интерпретацию вашего скрипта так же, как любая другая программа (например, веб-браузер).Он выясняет, какие зависимости ваш скрипт имеет от Titanium API, и устанавливает все это.Затем он отображает ваши символы непосредственно в (в случае iPhone) Objective-C.Программа обычно читает ваш скрипт (который представляет собой просто String), интерпретирует его и запускает код на C, чтобы выполнить то, о чем просил ваш скрипт.Titanium делает это заранее, чтобы выяснить, какой код C должен быть запущен, и выполняет преобразование заранее. Код компилируется, где это возможно Основываясь на интерпретации вашего кода и его зависимостях от API-интерфейса Titanium, Titanium выясняет, какой код может быть скомпилирован напрямую, а какой нет, чтобы обеспечить полную динамику Javascript.Я не знаю, как он выбирает, что компилируется, а что нет, но вы можете проверить исходный код, если хотите узнать больше подробностей.Код, который все еще должен быть интерпретирован (оставлен как скрипт), по-прежнему преобразуется в символы, что приводит к более эффективному отображению на собственный код.Так что это все еще интерпретируемый скрипт, но это не значит, что это все еще Javascript.Это означает, что эти части вашего сценария будут работать быстрее, чем обычный Javascript.Для iPhone компилируемый C компилируется с GCC для создания собственного двоичного файла. У вас есть работающее приложение *Теперь у вас есть приложение, которое вы можете запустить на своем мобильном устройстве.Ваш скомпилированный код был скомпилирован и работает с молниеносной скоростью, в то время как остальная часть преобразована и все еще интерпретируется более эффективным способом, который работает с почти молниеносной скоростью.: P

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

...