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でこれらが見つからないのはなぜですか?
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ソースで実際に行うことはプラットフォームによって異なりますが、通常は次のように分割されます。
これらの各ポイントについて具体的に掘り下げることができる詳細は他にもたくさんありますが、私が家に帰りたかったポイントは、JavascriptエンジンとしてWebViewを使用しなくなったことです。 canただし、WebViewは引き続き埋め込まれ、埋め込まれたWebViewからTitaniumAPIを呼び出すことができるいくつかの簡単な統合が提供されます。
リンクされた質問でjhaynieが言っているのは、TitaniumがJSコードを解釈し、Objective-Cとほぼ同じものに変換するということです。
Webアプリケーションでは、ブラウザーはJavascriptを読み取って解釈し、関連するネイティブコード(おそらくC++)を内部で実行します。たとえば、ブラウザは「このスクリプトはgetElementById()
を実行しているので、それを実現するために独自のC++メソッドを実行します」と言うかもしれません。 Titaniumが行っているのは、JS-> C++(またはこの場合はJS-> Objective-C)が何であるかを事前に把握し、それをコンパイルすることです。動的コードに必要な場合はインタプリタを開いたままにしますが、可能なことを変換してコンパイルします。
つまり、スクリプトで最初に書いたものに似たものは何も見つかりません。インタプリタに任せなければならないものはすべて処理および変換され、シンボルが変更されます(たとえば、myTestFunction()
の呼び出しはA()
または10001101001101
に変換される可能性があります: P)。
Javascriptの通常の使用法は、実行中のプログラムによってリアルタイムで解釈されるようにすることです。それはここで起こっていることではありません、そしてそれはあなたがあなたのスクリプトの痕跡を見ることができない理由です。
私が持っているのはそれだけなので、これが今理にかなっていることを願っています! :D