代码之家  ›  专栏  ›  技术社区  ›  Michal

使用Titanium Mobile编译应用程序后,javascript代码会发生什么变化?

  •  30
  • Michal  · 技术社区  · 15 年前

    我从Appcelerator安装了钛,并构建了“Kitchensink”示例应用程序。

    一切都很好,我只是想知道javascript代码最终会出现在构建的应用程序中。

    我对xcode项目和在中找到的结果应用程序进行了grep处理。 Library/Application Support/iPhone Simulator/....KitchenSink.app ,但我找不到任何函数名 .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 回复  |  直到 15 年前
        1
  •  47
  •   Kevin Whinnery    15 年前

    如前所述,Titanium并不是Web视图的包装器(尽管它准确地解释了PhoneGap的工作原理)。杰夫的回答与这个问题联系在一起,从技术上讲是对钛的工作原理的正确解释,但这里是迄今为止我听到的最好的版本,从 Marshall Culpepper :

    事实上,Titanium Mobile在1.0天前使用了WebView(在Android和iOS中)。然而,这不再是真的了,自从我们的1.0版本在2010年3月发布以来就没有了。

    从1.0开始,我们在应用程序中提供了两个单独的javascript运行时,我们直接运行javascript代码。 没有 WebVIEW。您的整个应用程序从开始到结束都由JS控制,我们提供了一套全面的本地API来实现这一点。从UI小部件(是的,包括WebView)、核心API(如网络、文件系统、数据库)到操作系统特定的东西(如Android中的JS活动)。在JS运行时前端,我们将在iOS中发布WebKit的JavaScript的分叉版本,并为Android提供Rhino1.7r3 cvs的快照。我们对您的javascript源代码的实际操作依赖于平台,但通常情况下它会像这样分解:

    • 对源进行了静态分析,以找到钛模块的参考资料。
    • 本地化字符串(strings.xml)、应用程序元数据(tiapp.xml)和密度特定的图像都会生成平台特定的模拟。
    • 在IOS中:
      • 生成Xcode项目/配置
      • JS源是base64'd,并作为变量内联到生成的C文件中
      • xcodebuild用于生成最终的二进制文件
      • 应用配置文件、签名密钥等
      • iTunes和其他一些胶水用于将IPA发送到iOS设备
    • 在Android中:
      • 生成一个Android/Eclipse项目
      • 在“开发”模式下,JS源被打包为APK资产。
      • 在“分发”(生产)模式中,当您准备出货应用程序时,我们使用犀牛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调用TitaniumAPI。

        2
  •  4
  •   Brendan    15 年前

    Jhainie在你的链接问题中说的是Titanium解释了你的JS代码,并将其转换成与Objective-C几乎相同的代码。

    在Web应用程序中,浏览器读取和解释JavaScript并在内部运行关联的本机代码(也许是C++)。例如,浏览器可能会说,“这个脚本正在执行 getElementById() 因此,我将运行我自己的C++方法来完成这一任务。“钛正在做的是找出JS & Gt;C++(或者在这种情况下,JS& & GT;Objtovi-C)将是什么,并编译它。它仍然让解释器在您的动态代码需要时打开,但它将尽可能地转换和编译。

    这意味着您将找不到任何与您最初在脚本中编写的内容类似的内容。必须留给解释器的任何内容仍将被处理和转换,您的符号将更改(例如,调用 myTestFunction() 可能转换为 A() 10001101001101 P)。


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

  • javascript是预处理的

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

    程序通常会在脚本中读取(只是一个字符串),对其进行解释,并运行C代码来完成脚本要求的内容。Titanium在动手之前就这样做了,以确定应该运行什么C代码,并提前进行转换。

  • 尽可能编译代码

    根据您的代码的解释及其对Titanium API的依赖性,Titanium可以计算出哪些代码可以直接编译,哪些代码不可以编译,以便让它们具有JavaScript的完整动态性。我不知道它如何选择做什么和不编译什么,但是如果你想知道那么多细节的话,你可以查看源代码。

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

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

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

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

  • 我希望这是合理的,因为这是我所拥有的一切!D