以下で説明するプロジェクトは、Eclipse Juno(4.2) を使用して作成およびビルドされています。
Android アプリケーションの実行構成を実行すると、次のエラーが表示されます。最大は 65536 です。パッケージ別:
2857 com.android.foo.bar
12 com.android.foo.bar.util
236 com.blah.yo.io
6 com.blah.yo.util
2 com.hmm
82 com.hmm.android.app
2761 com.hmm .android.common
2761 com.hmm.android.map
2761 com.hmm.android.map.common
. . .
名前空間のリストが続き、それらの前に同様の番号が付いています
エラー 2 で Dalvik 形式への変換に失敗しました
プロジェクト構造の例を次に示します。
概念構造: A - メイン/非ライブラリ モジュール
- B - A のライブラリ モジュール/Android 依存関係
- C - ライブラリ モジュール B の Android 依存関係として取り込まれたライブラリ モジュール
- D - A のライブラリ モジュール/Android 依存関係
- E - A のライブラリ モジュール/Android 依存関係
- F - E のライブラリ モジュール/Android 依存関係
- G - E、B、D のライブラリ モジュール/Android 依存関係 (異なるモジュール間で使用される共通の IO モジュール)
フォルダ構造:
/プロジェクトA/
B/*Android module structure*
C/*Android module structure*
D/*Android module structure*
E/*Android module structure*
F/*Android module structure*
G/*Android module structure*
最初は「うわー、最大の fields_ids_size に達したので、アプリが大きくなったに違いない」と思いましたが、これは機能的にはかなり大きなアプリです。
問題のクリーンアップ/発見を何度か試みた後、これが原因であるとは思えません。fields_ids_size の classes.dex ファイルを分析し、さまざまなことを試みた後、ライブラリ モジュールを削除してメイン プロジェクトに含めるだけで、fields_ids の数を減らすことができることがわかりました。プロジェクト間でコード/モジュールを再利用するのは恐ろしいことですが、上記のエラー メッセージの数は 65757 から 24,000 近くまで減少します。同様に、ライブラリ モジュールを jar して依存エンティティ (メインの非ライブラリ モジュールまたはライブラリ モジュール) のクラスパスに含める場合、そのライブラリ モジュールへの Android 依存関係を削除すると、数も縮小されます。 jarファイルを使用するだけです。
これを見て、私は上記の例から D を取り出し、他のモジュールへの依存関係/タイインを持たない独自のスタンドアロン アプリにし、そのための classes.dex ファイルを作成しました。この例では、D に名前空間 com.android.foo.bar があると仮定します。上記のエラーの例から、この名前空間は、A のライブラリ モジュールとして使用されたときに 2857 のフィールド ID を占めていました。独自のアプリとしてコンパイルし、classes.dex ファイルを分析すると、この数が約 120 のフィールド ID に減少することがわかりました。
この上限に達しているため、これはアプリにとってかなり大きな問題です。ある種の回避策はありますが、かなり扱いにくく、時間がかかります。これらのライブラリ参照を使用できるようにし、ライブラリ モジュールの fields_ids の数が増加してこの問題を引き起こしているように見える問題が発生しないようにするための解決策があることを願っています。