web-dev-qa-db-ja.com

Titanium Mobileを使用してアプリをコンパイルした後、JavaScriptコードはどうなりますか

AppceleratorからTitaniumをインストールし、「KitchenSink」サンプルアプリケーションを作成しました。

すべてがうまく機能します。JavaScriptコードがビルドされたアプリのどこに配置されるのか疑問に思っています。

Library/Application Support/iPhone Simulator/....KitchenSink.appで見つけたXcodeプロジェクトと結果アプリケーションをgrep-しましたが、.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

以前はapp.apkを調べていませんでした。表示されたのは、各javascriptファイルに対応するこれらのクラスファイルだけでした。したがって、on Android javascriptがJVM用にコンパイルされていると仮定しました。app.apkでこれらが見つからないのはなぜですか?

30
Michal

Titaniumは、前述のようにWebビューのラッパーではありません(ただし、Phonegapの動作を正確に説明しています)。質問にリンクされているジェフの答えは、チタンがどのように機能するかについての技術的に正しい説明ですが、これは私がこれまでに聞いた中で最高のバージョンです マーシャルカルペッパー

Titanium Mobileが1.0より前の日にWebViewを(AndroidとiOSの両方で)使用したことは事実です。しかし、これはもはや真実ではなく、1.0リリースが2010年3月であるため使用されていません。 。

1.0以降、アプリに2つの別々のJavascriptランタイムが付属しており、Javascriptコードを直接実行していますwithout WebView。アプリ全体が最初から最後までJSによって制御されるようになり、これを可能にする包括的なネイティブAPIのセットが提供されます。 UIウィジェット(はい、WebViewを含む)、ネットワーク、ファイルシステム、データベースなどのコアAPIから、AndroidのJSアクティビティなどのOS固有のものまですべて。 JSランタイムの面では、iOSでのWebKitのJavaScriptCoreのフォークバージョンとAndroid用のRhino 1.7 R3CVSのスナップショットを出荷しています。 JavaScriptソースで実際に行うことはプラットフォームによって異なりますが、通常は次のように分割されます。

  • ソースは静的に分析され、Titaniumモジュールへの参照が見つかります
  • ローカリゼーション文字列(strings.xml)、アプリメタデータ(tiapp.xml)、および密度固有の画像はすべて、プラットフォーム固有のアナログを生成します。
  • IOSの場合:
    • XCodeプロジェクト/構成が生成されます
    • JSソースはbase64で処理され、生成されたCファイルに変数としてインライン化されます
    • xcodebuildは、最終的なバイナリを生成するために使用されます
    • プロビジョニングプロファイル、署名キーなどが適用されます
    • iTunesとその他の接着剤を使用してIPAをiOSデバイスに送信します
  • Androidの場合:
    • Android/Eclipseプロジェクトが生成されます
    • 「開発」モードでは、JSソースはAPKアセットとしてパッケージ化されます
    • 「配布」(本番)モードでは、アプリを出荷する準備ができたら、RhinoJSCコンパイラを使用して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をエミュレーターやデバイスにプッシュするために使用されます

これらの各ポイントについて具体的に掘り下げることができる詳細は他にもたくさんありますが、私が家に帰りたかったポイントは、JavascriptエンジンとしてWebViewを使用しなくなったことです。 canただし、WebViewは引き続き埋め込まれ、埋め込まれたWebViewからTitaniumAPIを呼び出すことができるいくつかの簡単な統合が提供されます。

47
Kevin Whinnery

リンクされた質問でjhaynieが言っているのは、TitaniumがJSコードを解釈し、Objective-Cとほぼ同じものに変換するということです。

Webアプリケーションでは、ブラウザーはJavascriptを読み取って解釈し、関連するネイティブコード(おそらくC++)を内部で実行します。たとえば、ブラウザは「このスクリプトはgetElementById()を実行しているので、それを実現するために独自のC++メソッドを実行します」と言うかもしれません。 Titaniumが行っているのは、JS-> C++(またはこの場合はJS-> Objective-C)が何であるかを事前に把握し、それをコンパイルすることです。動的コードに必要な場合はインタプリタを開いたままにしますが、可能なことを変換してコンパイルします。

つまり、スクリプトで最初に書いたものに似たものは何も見つかりません。インタプリタに任せなければならないものはすべて処理および変換され、シンボルが変更されます(たとえば、myTestFunction()の呼び出しはA()または10001101001101に変換される可能性があります: P)。


Javascriptの通常の使用法は、実行中のプログラムによってリアルタイムで解釈されるようにすることです。それはここで起こっていることではありません、そしてそれはあなたがあなたのスクリプトの痕跡を見ることができない理由です。

  • Javascriptは前処理されています

    Titaniumは、他のプログラム(Webブラウザーなど)と同じようにスクリプトの解釈を実行します。スクリプトがTitaniumAPIにどのような依存関係を持っているかを把握し、それを設定します。次に、シンボルを(iPhoneの場合)Objective-Cに直接マップします。

    プログラムは通常、スクリプト(単なる文字列)を読み取り、それを解釈し、Cコードを実行して、スクリプトが要求したことを実行します。 Titaniumはこれを事前に実行して、実行するCコードを把握し、事前に変換を実行します。

  • 可能な場合はコードをコンパイルします

    コードの解釈とTitaniumAPIへの依存関係に基づいて、Titaniumは、直接コンパイルできるコードと、Javascriptの完全なダイナミクスを可能にするためにコンパイルしてはならないコードを判断します。コンパイルするものとしないものをどのように選択するかはわかりませんが、詳細を知りたい場合は、ソースを確認してください。

    まだ解釈する必要のあるコード(スクリプトとして残しておく)は、ネイティブコードへのより効率的なマッピングをもたらすシンボルに変換されます。したがって、それはまだインタープリター型スクリプトですが、それがまだJavascriptであるという意味ではありません。これは、スクリプトのこれらの部分が通常のJavascriptよりも高速に実行されることを意味します。

    iPhoneの場合、コンパイル可能なCはGCCでコンパイルされ、ネイティブバイナリが作成されます。

  • 実行可能なアプリがあります*

    これで、モバイルデバイスで実行できるアプリができました。コンパイル可能なコードはコンパイルされ、電光石火の速度で実行されますが、残りは変換され、ほぼ電光石火の速度で実行されるより効率的な方法で解釈されます。 :P

  • 私が持っているのはそれだけなので、これが今理にかなっていることを願っています! :D

    4
    Brendan