2

以下で説明するプロジェクトは、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 の数が増加してこの問題を引き起こしているように見える問題が発生しないようにするための解決策があることを願っています。

4

1 に答える 1

3

最近、まったく同じ問題に遭遇しました。私のメイン プロジェクトは多くのライブラリ プロジェクトを参照しているため、コードを簡単に再利用できます。

私のライブラリ プロジェクトのうち 3 つが両方とも、頻繁に使用されるライブラリ actionBarSherlock に依存しているとしましょう。3 つのパッケージすべてで、R.java が自動生成され、actionbarsherlock のすべての ID が新しい R.java に配置されます。これで、多くの同じ ID が使用された 4 つの R.java ファイル (ActionBarSherlock、lib1、lib2、lib3) ができました。

これを回避するための秘訣は、すべてのライブラリ プロジェクト AndroidManifest.xml で同じパッケージ名を宣言することです。これにより、同一の ID が多くなりません。

他の選択肢は次のとおりです。

1) ant を使用してプロジェクトをビルドし、複数の dex ファイルを作成してロードします (恐ろしい解決策) http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

2) コードをマージして簡素化する

これが役立つことを願っています

于 2012-08-20T22:19:38.950 に答える