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

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

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

我找到的最近的信息是这里的答案: Appcelerator Titanium 移动设备如何工作? 但我不清楚这个过程是如何运作的。

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 中找不到这些?

有帮助吗?

解决方案

如前所述,Titanium 并不是 Web 视图的包装器(尽管这准确地解释了 Phonegap 的工作原理)。问题中链接的杰夫的回答是对钛工作原理的技术上正确的解释,但这是迄今为止我听到的最好的版本,来自 马歇尔·卡尔佩珀:

确实,Titanium Mobile 在 1.0 版本之前就使用了 WebView(Android 和 iOS)。然而,现在情况已不再如此,自 2010 年 3 月发布 1.0 以来,情况就不再如此。

从 1.0 开始,我们的应用程序附带了两个独立的 Javascript 运行时,并且我们直接运行 Javascript 代码 没有 一个网页视图。您的整个应用程序从头到尾现在都由 JS 控制,我们提供了一套全面的本机 API 来实现这一点。从 UI 小部件(是的,包括 WebView)、核心 API(如网络、文件系统、数据库),一直到特定于操作系统的事物(如 Android 中的 JS 活动)。在 JS 运行时方面,我们在 iOS 中发布了 WebKit JavaScriptCore 的分叉版本,并在 Android 中发布了 Rhino 1.7 R3 CVS 的快照。我们对 javascript 源代码的实际操作取决于平台,但通常它是这样分解的:

  • 对源进行静态分析以查找对 Titanium 模块的引用
  • 本地化字符串 (strings.xml)、应用程序元数据 (tiapp.xml) 和特定于密度的图像都会生成特定于平台的类似物。
  • 在 iOS 中:
    • 生成 XCode 项目/配置
    • JS 源是 base64 的,并作为变量内联到生成的 C 文件中
    • xcodebuild 用于生成最终的二进制文件
    • 应用配置文件、签名密钥等
    • iTunes 和其他一些粘合剂用于将 IPA 发送到您的 iOS 设备
  • 在安卓中:
    • 生成一个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。

其他提示

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

在 Web 应用程序中,浏览器读取并解释您的 Javascript,并在内部运行关联的本机代码(可能是 C++)。例如,浏览器可能会说:“这个脚本正在执行 getElementById(), ,所以我将运行我自己的 C++ 方法来实现这一点。”Titanium 正在做的是提前弄清楚 JS->C++(或者在本例中为 JS->Objective-C)是什么,并进行编译。它仍然会在必要时为动态代码保留一个打开的解释器,但它会转换和编译它可以转换和编译的内容。

这意味着您将找不到任何与您最初在脚本中编写的内容相似的内容。任何必须留给解释器的内容仍然会被处理和转换,并且您的符号将会改变(例如打电话给 myTestFunction() 可能会转换为 A(), , 或者 10001101001101 :P)。


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

  • JavaScript 是经过预处理的

    Titanium 像任何其他程序(例如 Web 浏览器)一样解释您的脚本。它会找出您的脚本对 Titanium API 的依赖关系并进行设置。然后它将您的符号直接映射到(对于 iPhone)Objective-C。

    程序通常会读入您的脚本(只是一个字符串),对其进行解释,然后运行 ​​C 代码来完成脚本所要求的任务。Titanium 预先执行此操作以确定应运行哪些 C 代码,并提前进行转换。

  • 尽可能编译代码

    根据对代码的解释及其对 Titanium API 的依赖关系,Titanium 会确定哪些代码可以直接编译,哪些代码不能编译,以便实现 Javascript 的完整动态。我不知道它如何选择哪些内容被编译,哪些内容不被编译,但是如果您想了解更多细节,您可以查看源代码。

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

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

  • 您有一个可运行的应用程序*

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

  • 我希望这现在有意义,因为这就是我所拥有的一切!:D

    许可以下: CC-BY-SA归因
    不隶属于 StackOverflow
    scroll top