9

私は最近、65,000 を超える参照を持つアプリを操作するための Android の新しい MultiDex 機能を発見しました。参照: https://developer.android.com/tools/building/multidex.html

誰かが次の質問を理解するのを手伝ってくれますか:

1) Gradle ビルド プラグインは、プライマリ dex ファイル (classes.dex) とセカンダリ dex ファイルに何を入れるかをどのように決定しますか? ドキュメントに基づいて、プライマリ dex に必要な特定の事項がありますが、例はありません。すべてのアクティビティをプライマリ dex ファイルに含める必要がありますか?

引用文:

Dalvik ランタイムで実行する場合、プライマリ dex ファイルで必要なクラスに関して複雑な要件があります。Android ビルド ツールの更新は Android の要件を処理しますが、他の組み込みライブラリには、イントロスペクションの使用やネイティブ コードからの Java メソッドの呼び出しなど、追加の依存関係要件がある可能性があります。一部のライブラリは、multidex ビルド ツールが更新されて、プライマリ dex ファイルに含める必要があるクラスを指定できるようになるまで使用できない場合があります。

2) Android API レベル 21 (Android L) 以降のみをビルドする場合、Gradle Build Plugin の動作が異なります。「アプリケーションの各モジュール (依存関係を含む) を個別の dex ファイルとしてビルドするため、はるかに高速です。これは、一般に pre-dexing と呼ばれます。」Androidのモジュールの定義は何ですか? これは、http: //developer.android.com/sdk/installing/studio-build.html#projectModulesで言及されている Java ライブラリ、Android ライブラリ、および Android アプリケーション モジュールですか? リモートまたはローカルのバイナリ依存関係 (例: Jar) は個別のモジュールとしてカウントされるため、別の dex ファイルに入れられますか、またはそれらに応じてモジュールに含まれますか?

4

2 に答える 2

4

1) gradle プラグインは内部的に Proguard を使用して、intermediates/multi-dexビルド フォルダーに 2 つの jar ファイルを作成します。1 つがプライマリ dex になり、残りは dex 2、3 などに分散されます。

このcollect{variant}MultiDexComponentsタスクは、proguard 用の keep ファイルの作成を担当します。このファイルと、上記のフォルダーのバリアント固有のサブディレクトリで使用される他の proguard パラメーターを確認できます。うまくいけば、これは長期的にカスタマイズ可能になります。

現在、gradle プラグインの 1.0.0-rc1 のテスト プロジェクトに関連するバグもあります ( https://code.google.com/p/android/issues/detail?id=80741 )。私が投稿した回避策にいくつかの小さな変更を加えることで、独自のエントリを保持リストに追加することもできます (したがって、クラスがプライマリ dex に確実に配置されるようになります)。

2)モジュールはGradleの観点からモジュールを参照しますが、実際には、リンク先のリストに記載されているさまざまなアイテムである可能性があります。フラグとしてコマンドラインから pre-lollipop gradle build を実行すると、--info渡されるすべての dex ファイルを確認できますdx。(これは multidex が有効なビルドまたは を含むものであってはならないことに注意してくださいpreDexLibraries = false)。

于 2014-11-25T13:28:31.677 に答える