在使用Titanium Mobile编译应用程序后,JavaScript代码会发生什么

Mic*_*hal 30 javascript iphone android objective-c titanium

我从appcelerator安装了Titanium并构建了"KitchenSink"示例应用程序.

一切正常,我只是想知道javascript代码在构建的应用程序中的最终位置.

我发现了Xcode项目和结果应用程序Library/Application Support/iPhone Simulator/....KitchenSink.app,但是我找不到.js文件中的任何函数名,甚至找不到应用程序中使用的字符串文本.

我找到的最近信息是答案:Appcelerator Titanium Mobile如何工作?但我不清楚这个过程是如何运作的.

将javascript代码编译成二进制代码(然后使用什么编译器?),还是只是转换为某种特殊的数据格式并在正在运行的应用程序中进行解释?

更新:

这是我在KitchenSink的build/android目录中可以看到的:

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
Run Code Online (Sandbox Code Playgroud)

之前我没有查看app.apk,我只能看到这些类文件对应于每个javascript文件.因此我假设在Android上javascript正在为JVM编译.为什么不能在app.apk中找到这些?

Kev*_*ery 47

如前所述,Titanium不是Web视图的包装器(尽管它准确地解释了Phonegap的工作原理).杰夫的回答与问题相关,是技术上正确解释Titanium的工作方式,但这是迄今为止我所听到的最好的版本,来自Marshall Culpepper:

Titanium Mobile确实在1.0天之前使用了WebView(在Android和iOS中).然而,这已不再适用,自从我们的1.0版本发布到2010年3月以来就没有了.

从1.0开始,我们已经通过我们的应用程序发布了两个单独的Javascript运行时,我们直接运行Javascript代码而没有 WebView.从头到尾,您的整个应用程序现在由JS控制,我们提供了一组全面的Native API来实现这一点.UI小部件(是的,包括WebView),核心API,如网络,文件系统,数据库,一直到特定于操作系统的东西,如Android中的JS活动.在JS运行时方面,我们在iOS中发布了WebKit的JavaScriptCore的分叉版本,以及Android的Rhino 1.7 R3 CVS的快照.我们实际使用的javascript源代码依赖于平台,但通常它会像这样分解:

  • 对源进行静态分析以查找对Titanium模块的引用
  • 本地化字符串(strings.xml),App元数据(tiapp.xml)和密度特定图像都生成特定于平台的模拟.
  • 在iOS中:
    • 生成XCode项目/配置
    • JS Source是base64'd并作为变量内联到生成的C文件中
    • xcodebuild用于生成最终的二进制文件
    • 应用配置文件,签名密钥等
    • iTunes和其他一些粘合剂用于将IPA发送到您的iOS设备
  • 在Android中:
    • 生成Android/Eclipse项目
    • 在"开发"模式下,JS源被打包为APK资产
    • 在"分发"(生产)模式中,当您准备发布应用程序时,我们使用Rhino JSC编译器将JS编译为Java字节码.您也可以在开发模式中通过在tiapp.xml中将"ti.android.compilejs"设置为"true"来启用此功能,请参阅:http://developer.appcelerator.com/question/100201/enable-android-byte-code-编
    • dex,aapt和其他Android SDK工具用于构建和生成最终的APK
    • adb和keytool用于将APK推送到模拟器和/或设备

我可以在这些要点中详细介绍更多细节,但我想回家的重点是我们不再使用WebView作为我们的Javascript引擎.但是,您仍然可以嵌入WebView,我们提供了一些简单的集成,允许您从嵌入式WebView调用Titanium API.