我从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中找到这些?
答案 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源代码取决于平台,但通常它会像这样分解:
我还可以详细介绍其中的每一个细节,但我想回家的重点是我们不再使用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是让它由正在运行的程序实时解释。这不是这里发生的事情,这就是为什么你看不到你的剧本的任何痕迹。
我希望现在有道理,因为这就是我所拥有的一切! :d