.dexファイル内のメソッド参照の数は64k API 17を超えることはできません


154

SugarORM Libraryを使用してアプリをビルドしていますが、API 17のプロジェクトをビルドしようとすると(他をチェックしていません)、ビルドエラーが表示されます。

    Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

しかし、このプロジェクトをAndroid v5.0以降用にビルドすると、正常に動作します。SugarORM Gradleの依存関係を削除すると、v4.2.2とv5.0の両方のデバイスで正常に機能します。



ProGuardのこのリンクを使用してみてくださいandroid-arsenal.com/details/1/337 ProGuardのでSugarORMを使用して指定
Shaan_Bを

19
API 23にアップグレードした後、これを取得しました。Androidで生産性を発揮することは不可能です。すべてのSDKで問題が発生します。ASを更新するたびに問題が発生します。エラーメッセージは使用できません。ASが壊れています。ごみ、ごみ、ごみ。
RunLoop 2016

1
@RunLoopは希望を失わないでください.... Androidはこれまでに開発された最高のプラットフォームであることを発見しました.... Moch柔軟で強力です....コーディングに手を染めるので...それはうまくいきます....すべてのエラーメッセージが役立ちます。しかし、メッセージを理解する必要がある
Sandeep Singh Rana

2
@Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.私はトップの(そして受け入れられた)答えを提案します!。
Jon Goodwin

回答:


331

メソッドが多すぎます。dexには65536のメソッドしかありません。

提案されているように、multidexサポートを使用できます。

これらの行をに追加するだけmodule/build.gradleです:

android {

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'  //with support libraries
  //implementation 'androidx.multidex:multidex:2.0.1'  //with androidx libraries
}

また、あなたはmultidexサポートライブラリからアプリケーション要素にクラスをManifest追加しますMultiDexApplication

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.multidex.myapplication">
        <application
            ...
            android:name="android.support.multidex.MultiDexApplication">

            <!-- If you are using androidx use android:name="androidx.multidex.MultiDexApplication" -->

            <!--If you are using your own custom Application class then extend -->
            <!--MultiDexApplication and change above line as-->
            <!--android:name=".YourCustomApplicationClass"> -->

            ...
        </application>
    </manifest>

独自のApplicationクラスを使用している場合は、親クラスをからApplicationに変更しMultiDexApplicationます。
それができない場合は、Applicationクラスで次のようにattachBaseContextメソッドをオーバーライドします。

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    MultiDex.install(this);
}

別の解決策は、ProGuardを使用して未使用のコードを削除することです。ProGuardを実行するようにアプリのProGuard設定を構成し、リリースビルドで圧縮が有効になっていることを確認してください。


1
@Override protected void attachBaseContext(Context newBase){super.attachBaseContext(newBase); MultiDex.install(this); また、オーバーライド
Sandeep Singh Rana

1
MultiDexApplicationをCmdクリックすると、逆コンパイルされた.classファイルが、指定したattachBaseContext()オーバーライドをすでに正確に実行していることがわかります。それはそれを再度上書きする必要はありませんので、私は..推測
METE

4
メソッドが多すぎない場合はどうなりますか?私のアプリにはそれほど多くのメソッドはありません。届かないと思います。
ネオンワージ2016

6
「multiDexEnabled true」という2つの部分のみを実行し、build.grandleファイルで「com.android.support:multidex:1.0.0」をコンパイルしました。マニフェストファイルの内容を変更したり、attachBaseContextのオーバーライドについて述べたその他のことを行ったりする必要はありませんでした。しかし、あなたのソリューションで問題が解決されました!ありがとう。
Jaime Montoya

2
@NeonWargeおそらくあなたの依存関係のためです。おそらく、Google Play開発者サービス全体が含まれていますか?詳細については、
mr5 '14 / 03/17

131

android / app / build.gradle

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

これをdefaultConfigの中に入れます:

multiDexEnabled true 

わたしにはできる


3
これはロリポップ以上のものですよね?
Vic Torious 2016年

1
ビルドは成功しますが、アプリは起動後にクラッシュします。
Vasanth

18

私のbuild.gradleファイルにプロジェクトの自動更新コンパイルバージョンをコーディングしているため、このエラーメッセージが表示されました。

android {
    ...
    buildToolsVersion "23.0.2"
    ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0' }

バージョンを修正して解決します。

android {
        ...
        buildToolsVersion "23.0.2"
        ...
    }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

2
シンプルなアプリを作成していますが、Googleマップオブジェクトのチュートリアルを試すまでは問題なく動作しました。突然、もうコンパイルできなくなりました。この解決策は私のためにそれを修正しました。一体どうやってそれをうまくやりましたか?
maccaroo 2016年

4
新しいコンパイルライブラリにはメソッドが多すぎ(65536を超える)、古いライブラリにはないため、このメソッドは幸運にも機能しました。ですから、それは簡単な修正であり、遅かれ早かれ、受け入れられた回答のようなmultidexサポートを追加することによって修正する必要があります。
Quan Nguyen

15

これは私のために働いたものです:

これは、未使用のメソッドが多すぎるために発生します。これらのメソッドのほとんどは、build.gradleに含まれているライブラリからのものです

リソースを縮小および縮小して、gradleでこれを修正し、同時にコードをクリーンアップします。

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }

12

アプリレベルのbuild.gradleを変更します。

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

それは私のために働いた。


はい、これは古い問題ですが、APIの最後のバージョンではmultiDexEnabled、依存関係やマニフェストファイルの変更なしに、オプションのみが必要です
Hpsaturn

11

このエラーは、afewのみを使用しているときにすべてのGoogle Play開発者サービスAPIをロードしたときにも発生します。

googleが述べたように:「6.5より前のバージョンのGoogle Play開発者サービスでは、APIのパッケージ全体をアプリにコンパイルする必要がありました。これを行うと、アプリ内のメソッドの数(フレームワークAPI、ライブラリメソッド、および独自のコード)を65,536に制限します。

バージョン6.5以降、代わりにGoogle PlayサービスAPIを選択的にアプリにコンパイルできます。」

たとえば、アプリにplay-services-maps、play-services-locationが必要な場合。以下に示すように、アプリレベルでbuild.gradleファイルに2つのAPIのみを追加する必要があります。

compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'com.google.android.gms:play-services-location:10.2.1'

の代わりに:

compile 'com.google.android.gms:play-services:10.2.1'

完全なドキュメントとGoogle Play開発者サービスAPIのリストについては、ここをクリックしてください


9

アプリの参照が65,536メソッドを超えると、アプリがAndroidビルドアーキテクチャの制限に達したことを示すビルドエラーが発生します

Android 5.0より前のMultidexサポート

Android 5.0(APIレベル21)より前のバージョンのプラットフォームでは、Dalvikランタイムを使用してアプリコードを実行します。デフォルトでは、DalvikはアプリをAPKごとに単一のclasses.dexバイトコードファイルに制限します。この制限を回避するために、プロジェクトにmultidexサポートライブラリを追加できます。

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

Android 5.0以降のMultidexサポート

Android 5.0(APIレベル21)以降では、ARTと呼ばれるランタイムを使用します。これは、APKファイルからの複数のDEXファイルのロードをネイティブでサポートしています。したがって、minSdkVersionが21以上の場合、multidexサポートライブラリは必要ありませ

64Kの制限を回避する

  • ProGuardで未使用のコードを削除する-コード圧縮を有効にする

アプリでmultidexを構成する

minSdkVersionが21以上に設定されている場合、モジュールレベルのbuild.gradleファイルでmultiDexEnabledをtrueに設定するだけです。

android {
defaultConfig {
    ...
    minSdkVersion 21 
    targetSdkVersion 28
    multiDexEnabled true
  }
 ...
}

minSdkVersionが20以下に設定されている場合は、multidexサポートライブラリを使用する必要があります

android {
defaultConfig {
    ...
    minSdkVersion 15 
    targetSdkVersion 28
    multiDexEnabled true
   }
   ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.3'
}

Applicationクラスをオーバーライドし、次のようにMultiDexApplicationを拡張するように変更します(可能な場合)。

public class MyApplication extends MultiDexApplication { ... }

マニフェストファイルに追加する

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="MyApplication" >
        ...
    </application>
</manifest>

8

私は同じ問題に直面しており、multidexをサポートするには、アプリケーションのminSdkVersionを覚えておく必要があります。minSdkVersion 21以降を使用している場合は、multiDexEnabled trueを次のように記述します

defaultConfig {
    applicationId *******************
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

それは私にとってはうまくいき、21未満(lolipopの下)のminSdkVersionを使用している場合は、さらに2つの簡単なことを行う必要があります。

1.最初にこの依存関係を追加します

「com.android.support:multidex:1.0.1」をコンパイルします

あなたのbuild.gradleで。

2.最後と2番目に、マニフェストのアプリケーションにこの下の行を1つ追加します

android:name = "android.support.multidex.MultiDexApplication"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name="android.support.multidex.MultiDexApplication"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

ビンゴは、それより低いバージョンでも動作します.. :)ハッピーコーディング


1

余談ですが、multidexのサポートを追加する前に、不要な依存関係を追加しないようにしてください。

たとえば公式のFacebook分析ガイドでは

次の依存関係を追加する必要があることを明確に述べています。

implementation 'com.facebook.android:facebook-android-sdk:[4,5)'

これは実際にはFacebookSDK 全体です。たとえば、アナリティクスだけが必要な場合は、次のものに置き換える必要があります。

implementation 'com.facebook.android:facebook-core:5.+'

Facebook部分SDKオプション


完全に同意する。たとえば私の場合、「Facebookでログイン」ボタンが必要で、Facebook SDK全体を使用していました。私はそれを交換しましたfacebook-corefacebook-loginそしてエラーはなくなりました。
cleybertandre

0

私にとっては、Gradleのアップグレードが 機能します.Android Webサイトで更新を探して、次のようにbuild.gradle(プロジェクト)に追加します

 dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha4'   
          ....
    }

次に、gradleファイルとプロジェクトを同期します。java.exe(私の場合)が原因で、Windowsのタスクマネージャーからjava.exeを強制的に強制終了してから、プログラムを再実行することもある


0

これも試すことができます:

android{
    .
    .
    // to avoid DexIndexOverflowException
    dexOptions {
       jumboMode true
    }
}

それが誰かを助けることを願っています。ありがとう


0

**

Unityゲーム開発者向け

**

このエラーがUnityプロジェクトに表示されたために誰かがここに来た場合は、[ファイル]-> [ビルド設定]-> [プレーヤー設定]-> [プレーヤー]に移動します。[公開設定]に移動し、[ビルド]タブで[カスタムランチャーGradleテンプレート]を有効にします。そのテキストの下にパスが表示されます。パスに移動し、次のようにmultiDexEnabled trueを追加します。

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}

-1

Android Studioで「インスタントラン」を有効にすると、multidexをサポートできます。


-2

これを行う、それは動作します:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

2
答えを説明してください。SOではコードのみの回答はお勧めしません。ありがとうございました。
Gennadii Saprykin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.