2017-10-18 2 views
11

私は複数のライブラリプロジェクトを持っており、それらはすべてサポートライブラリに依存しています。私のアプリケーションは、これらの複数のライブラリプロジェクトに依存しています。すべてのライブラリプロジェクトには、R.javaファイルでライブラリのリソースをサポートするための参照が含まれています。これは、冗長性のためにフィールドIDカウントを膨らませます。 65536複数のR.javaの冗長リソース参照が原因でDexIndexOverflowExceptionが発生する

ので、この冗長R.java参照の:ない[0、0xffffの]のフィールドID:

私のアプリが

DexIndexOverflowExceptionを取得します。

このため、私のアプリは、47kのメソッドと65kフィールドIDを持っています。

編集:

私はマルチDEXを使用することはありません、それは私の問題への解決策ではありません。冗長なフィールドIDを削りたい。

質問は、問題を回避する方法ではなく、冗長フィールドIDを取り除く方法についての質問です。 multi-dexを使用しても冗長フィールドIDは削除されません。

答えて

3

、またはproguardを使用すると、あなたの問題を解決し、私は個人的にそれをお勧めします。

この方法に従わない場合は、重複した依存関係を手動で除外できます。

端末で次のコマンドを実行して、重複した依存関係を見つけます。プロジェクト名として

./gradlew :app:dependencies --configuration compile 

たりする場合は、Windows上で、

gradlew.bat :app:dependencies --configuration compile 

変更:app

compile 'com.android.support:support-compat:26.+' 
compile 'com.android.support:support-fragment:26.+' 

あなたは出力以下のようになります:

+--- com.android.support:support-compat:26.+ -> 26.0.0-alpha1 
| \--- com.android.support:support-annotations:26.0.0-alpha1 
\--- com.android.support:support-fragment:26.+ -> 26.0.0-alpha1 
    +--- com.android.support:support-compat:26.0.0-alpha1 (*) 
    +--- com.android.support:support-core-ui:26.0.0-alpha1 
    | +--- com.android.support:support-annotations:26.0.0-alpha1 
    | \--- com.android.support:support-compat:26.0.0-alpha1 (*) 
    \--- com.android.support:support-core-utils:26.0.0-alpha1 
      +--- com.android.support:support-annotations:26.0.0-alpha1 
      \--- com.android.support:support-compat:26.0.0-alpha1 (*) 

をそして、あなたは(*)でマークされた依存関係を見ることができ、そしてこれらの依存性を排除することができる

のは、あなたのGradleの依存関係がこのようにしていると仮定しましょう。あなたは64K

を下回る数を取得することができますそして今、最も困難な部分が残るまで

compile ('com.android.support:support-fragment:26.+') { 
    exclude module: 'support-compat' 
} 

これを繰り返す:あなたはsupport-compatが複製されて見て、それは次のように編集することによって行われ除外することができます。

私の経験では、いくつかの依存関係を除外すると、ビルドの失敗、実行時の例外などが発生する可能性があります。アプリケーションを問題なく正常に動作させる必要があります。

このヘルプが必要です。

+1

'(*)'でマークされた依存関係は、以前に言及したことだけを意味します。それらを除外しないでください。それらは必要であり、一度だけ含まれています。 –

3

DexIndexOverflowException:フィールドは、ID [0、0xFFFFの]ではない:65536

  • Androidはlimit of Methods of 65536上部事前に定義されています。

いつですか?

DEXファイルの方法インデックスのサイズは16ビットであるので、 65536は単一DEXファイル内のコードによって呼び出すことができる参照の合計数を表すことを意味します。克服すれば、このエラーが発生します。

あなたが到達する64K方法の制限が発生し、十分なライブラリが含まれるように始めたら、余分な依存関係を削除する必要があります。

どのようにですか?multiDex

  • を使用せずに、あなたはproguardを追加する必要があります。

ProGuardのは、バイトコードを最適化し、未使用のコード命令を除去し、そして は短い名前の残りのクラス、フィールドおよびメソッドを難読化。リソース縮小は のためのAndroidプラグインで利用可能です。パッケージライブラリの未使用リソースを含む パッケージされたアプリケーションから未使用のリソースを削除するGradle。それは と一緒に使用され、使用されていないコードが削除されると、もはや参照されていない リソースが安全に削除されるように、コードが縮小されます。あなたのbuild.gradleファイル内の適切なビルドタイプにminifyEnabled trueを追加ProGuardの

を有効にする方法

  1. android { 
        buildTypes { 
         release { //You can add this in debug mode 
          minifyEnabled true 
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 
            'proguard-rules.pro' 
         } 
        } 
    
    } 
    

    getDefaultProguardFile('proguard-android.txt')方法は、Android SDK tools->proguard->folderから デフォルトProGuard設定を取得します。カスタムProGuardルールを追加でき

  2. proguard-rules.proファイルです。コードのみの縮小と一緒に作品を縮小

    リソースを縮小

リソース。コード縮小機能が未使用のコードをすべて削除した後、リソース縮小機能は、アプリケーションがまだ使用しているリソースを特定できます。 @ IntelliJの-amiyaの答えのように

buildTypes { 
    release { 
       minifyEnabled true 
       shrinkResources true //You can add this in debug mode 
    } 
} 
+0

「com.android.support:multidex:1.0.1」がapi 19以下にのみ必要です。実際に私のために働いたことはありません、私はapi 19のmultidexでは成功しませんでした。私はリリースビルドのためのProguardシュリンクルールで終了しました(マルチディックスなしで動作します) – user1209216

+1

@ user1209216私の場合はmultidexを追加することによって決して機能しません。ちょっとした調整をすることで動作します。この答えは、opを助けませんが。 –

+3

**パッケージ全体を保管しないでください!**サポートライブラリは、提案よりも最適化された最小限のプロガード規則を適用します。 –

-1

私の問題は、module build.gradleのように "multiDexEnabled true"を追加することで解決しました。

android { 
      ... 
      defaultConfig { 
          ... 
          multiDexEnabled true 
         } 
     } 
関連する問題