The number of method references in a .dex file can

2019-01-01 10:58发布

问题:

I am building an app with SugarORM Library but when i try to build the project for API 17 (didn\'t check for others) it shows build error.

    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

But when i build this project for android v5.0 or above, it works fine.If i remove SugarORM gradle dependency it works fine for both devices v4.2.2 and v5.0

回答1:

You have too many methods. There can only be 65536 methods for dex.

As suggested you can use the multidex support.

Just add these lines in the build.gradle:

android {

    defaultConfig {
        ...

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

dependencies {
  compile \'com.android.support:multidex:1.0.0\'
}

Also in your Manifest add the MultiDexApplication class from the multidex support library to the application element

    <?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 your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
            android:name=\".YourCustomApplicationClass\">

            ...
        </application>
    </manifest>

override attachBaseContext method

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

If you are using your own Application class, change the parent class from Application to MultiDexApplication.

Another solution is to try to remove unused code with ProGuard - Configure the ProGuard settings for your app to run ProGuard and ensure you have shrinking enabled for release builds.



回答2:

android {

compileSdkVersion 23

 buildToolsVersion \'23.0.0\'

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

Put this inside your defaultConfig:

multiDexEnabled true 

its work for me



回答3:

I got this error message because while coding my project auto update compile version in my build.gradle file :

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\' }

Solve it by correcting the version:

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\'
}


回答4:

This is what worked for me:

This happens because there are too many unused methods. Most of these methods are coming from included libraries in your build.gradle

Use minify and shrink resources to fix this with gradle and clean up your code at the same time.

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


回答5:

This error can also occur when you load all google play services apis when you only using afew.

As stated by google:\"In versions of Google Play services prior to 6.5, you had to compile the entire package of APIs into your app. In some cases, doing so made it more difficult to keep the number of methods in your app (including framework APIs, library methods, and your own code) under the 65,536 limit.

From version 6.5, you can instead selectively compile Google Play service APIs into your app.\"

For example when your app needs play-services-maps ,play-services-location .You need to add only the two apis in your build.gradle file at app level as show below:

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

Instead of:

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

For full documentation and list of google play services apis click here



回答6:

I have been facing the same problem and for multidex support, you have to keep in mind the minSdkVersion of your application. If you are using minSdkVersion 21 or above then just write multiDexEnabled true like this

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

It works for me and if you are using minSdkVersion below 21 (below lolipop) then you have to do two extra simple things

1. First add this dependency

compile \'com.android.support:multidex:1.0.1\'

in your build.gradle.

2. Last and second add one this below line to your application in manifest

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>

Bingo then it will work in the lower version also..:) Happy coding



回答7:

For me Upgrading Gradle works.Look for update at Android Website then add it in your build.gradle (Project) like this

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

then sync project with gradle file plus it might be happened sometimes because of java.exe (in my case) just force kill java.exe from task manager in windows then re run program



回答8:

Can also try this :

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

Hope it helps someone. Thanks



回答9:

Multidex support prior to Android 5.0

Versions of the platform prior to Android 5.0 (API level 21) use the Dalvik runtime for executing app code. By default, Dalvik limits apps to a single classes.dex bytecode file per APK. In order to get around this limitation, please read configure your app for multidex

Multidex support for Android 5.0 and higher

Android 5.0 (API level 21) and higher uses a runtime called ART which natively supports loading multiple DEX files from APK files. ART performs pre-compilation at app install time which scans for classesN.dex files and compiles them into a single .oat file for execution by the Android device. Therefore, if your minSdkVersion is 21 or higher, you do not need the multidex support library. All you need to do is set multiDexEnabled to true in your module-level build.gradle

Read more here - https://developer.android.com/studio/build/multidex



回答10:

you can enable \"Instant Run\" on Android Studio to get multidex support.



回答11:

Do this, it works:

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