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

时间:2010-11-18 17:06:34

标签: javascript iphone android objective-c titanium

我从appcelerator安装了Titanium并构建了“KitchenSink”示例应用程序。

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

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

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

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

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

2 个答案:

答案 0 :(得分: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-compile
    • dex,aapt和其他Android SDK工具用于构建和生成最终的APK
    • adb和keytool用于将APK推送到模拟器和/或设备

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

答案 1 :(得分:4)

jhaynie在您的链接问题中说的是,Titanium会解释您的JS代码并将其转换为几乎与Objective-C相同的内容。

在Web应用程序中,浏览器会读取并解释您的Javascript并在内部运行相关的本机代码(可能是C ++)。例如,浏览器可能会说,“此脚本正在执行getElementById(),因此我将运行自己的C ++方法来实现这一目标。” Titanium正在做的是确定JS-> C ++(或者在这种情况下,JS-> Objective-C)提前做什么,然后编译它。它仍然会在动态代码需要的地方打开解释器,但它会转换并编译它可以的内容。

这意味着您将找不到与您最初在脚本中编写的内容类似的内容。必须留给口译员的任何内容仍然会被处理和转换,并且您的符号会发生变化(例如,对myTestFunction()的调用可能会转换为A()10001101001101:P)。< / p>


通常使用Javascript是让它由正在运行的程序实时解释。这不是这里发生的事情,这就是为什么你看不到你的剧本的任何痕迹。

    

  •          Javascript已预处理

            Titanium会像其他任何程序一样执行脚本解释(例如Web浏览器)。它会计算出您的脚本对Titanium API的依赖关系并设置了这些内容。然后它将你的符号直接映射到(在iPhone的情况下)Objective-C。

            程序通常会在您的脚本中读取(这只是一个String),解释它并运行C代码来完成脚本所要求的内容。 Titanium事先做了这个,以确定应该运行什么C代码,并提前进行转换。

        
  •     
  •         代码尽可能编译

            基于对代码的解释及其对Titanium API的依赖性,Titanium确定了可以直接编译的代码,以及为了允许它们完全动态化Javascript而不能编译的代码。我不知道它是如何选择什么做和不做编译的,但是如果你想知道那么多细节,你可以查看来源。

            仍然必须解释的代码(作为脚本保留)仍然会转换为符号,从而更有效地映射到本机代码。所以它仍然是一个解释的脚本,但这并不意味着它仍然是Javascript。这意味着脚本的这些部分仍然比通常的Javascript运行得更快。

            对于iPhone,可编译的C使用GCC编译以创建原生二进制文件。

        
  •     
  •         你有一个可运行的app *

            现在您有一个可以在移动设备上运行的应用程序。您的可编译代码已经编译并以闪电般的速度运行,而其余代码则被转换并仍以更有效的方式解释,并以接近闪电的速度运行。 :P     

  • 我希望现在有道理,因为这就是我所拥有的一切! :d