30

appcelerator から Titanium をインストールし、"KitchenSink" サンプル アプリケーションをビルドしました。

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

で見つけた Xcode プロジェクトと結果アプリケーションを grep しましたが、アプリケーション内で使用されている文字列テキストでさえ、ファイルLibrary/Application Support/iPhone Simulator/....KitchenSink.appから関数名を見つけることができません。.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 ファイルに対応するこれらのクラス ファイルしか確認できませんでした。したがって、AndroidではjavascriptがJVM用にコンパイルされていると想定しました。これらが app.apk で見つからないのはなぜですか?

4

2 に答える 2

47

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

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

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

  • ソースを静的に分析して、Titanium モジュールへの参照を見つけます
  • ローカリゼーション文字列 (strings.xml)、アプリ メタデータ (tiapp.xml)、および密度固有のイメージはすべて、プラットフォーム固有の類似物を生成します。
  • iOS の場合:
    • XCode プロジェクト / 構成が生成されます
    • JS ソースは base64 化され、生成された C ファイルに変数としてインライン化されます
    • xcodebuild は、最終的なバイナリを生成するために使用されます
    • プロビジョニング プロファイル、署名キーなどが適用されます
    • IPA を iOS デバイスに送信するために、iTunes とその他の接着剤が使用されます。
  • Android の場合:
    • Android / Eclipse プロジェクトが生成されます
    • 「開発」モードでは、JS ソースが APK アセットとしてパッケージ化されます
    • 「配布」(本番) モードでは、アプリを出荷する準備ができたら、Rhino JSC コンパイラを使用して JS を Java バイトコードにコンパイルします。tiapp.xmlで「ti.android.compilejs」を「true」に設定することで、開発モード中にこれを有効にすることもできます。コンパイル
    • dex、aapt、およびその他の Android SDK ツールを使用して、最終的な APK をビルドおよび生成します。
    • adb と keytool は、APK をエミュレーターやデバイスにプッシュするために使用されます。

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

于 2011-01-25T20:36:58.700 に答える
4

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

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

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


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

  • Javascript は前処理されます

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

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

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

    する コードの解釈と Titanium API への依存関係に基づいて、Titanium は、Javascript の完全なダイナミクスを実現するために、どのコードを直接コンパイルできるか、またどのコードをコンパイルしてはならないかを判断します。コンパイルされるものとコンパイルされないものをどのように選択するかはわかりませんが、詳細を知りたい場合はソースをチェックアウトできます。

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

    アイフォンの場合、

  • 実行可能なアプリができました*

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

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

    于 2010-11-18T17:18:24.710 に答える