64k limit exceeded on older APIs than lollipop, but not newer
Solution 1
To answer your specific question is:
- This method count limitation is on the DEX (Dalvik Executable) file.
- A common workaround for this limitation is to have multiple DEX files.
- Older versions of Android does not natively support multiple DEX files.
- Starting from Lollipop the system supports it natively.
So that's why it fails on older devices but it works on newer devices. It has nothing to do with support libraries.
To add more useful content to the my answer:
But maybe what some might want to know is how to workaround it on older devices, please note that I used the word natively
on my bullet points above. That means, that there're workarounds to make older platforms support it, but you have to code those workarounds into your app.
The workaround (and even the issue itself) is detailed explained on this Google guide: http://developer.android.com/tools/building/multidex.html
The base of it is:
- add multidex to your dependencies
compile 'com.android.support:multidex:+'
- enable multiDex on your build script inside android->default config
multiDexEnabled true
- on the manifest make your application extends from
MultidexApplication
android:name="android.support.multidex.MultiDexApplication"
or, if you need to sub-classApplication
for your own app, make your Application extends from it.
Solution 2
The issue is occuring when using Instant Run and pre-lollipop devices!
https://code.google.com/p/android/issues/detail?id=208577 https://code.google.com/p/android/issues/detail?id=196809
Solution 3
Completely agree with @Budius. You must mention an application class in manifest. And have your application class extend MultiDexApplication.
There is one more thing needed. Calling attach base context in your MultiDexApplication class
public class MyApplicationClass extends MultiDexApplication... {
....
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(MyApplicationClass.this);
}
...
}
This worked fine for me on pre and post lollipop devices.
Solution 4
you should add multiDexEnabled = true
in to your defaultConfig
in gradle file.
Jakob
Updated on July 05, 2022Comments
-
Jakob almost 2 years
So I am wondering why I encounter the 64k dex method limit when trying to run my app on android versions older than lollipop, when it runs just fine on the more recent versions.
Could it be, because the support libraries are actually being referenced when running on the older versions?
This is my gradle:
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion '23.0.2' lintOptions { checkReleaseBuilds true // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when errors are found: abortOnError false } defaultConfig { applicationId "com.domain.myapp" minSdkVersion 16 targetSdkVersion 23 versionCode 27 versionName "1.2" // Vector compat vectorDrawables.useSupportLibrary = true } buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } dependencies { compile files('libs/commons-io-2.4.jar') compile files('libs/activation.jar') compile files('libs/additionnal.jar') compile files('libs/mail.jar') compile project(':libraries:preferencefragment') // Gmail API compile('com.google.api-client:google-api-client-android:1.20.0') { exclude group: 'org.apache.httpcomponents' } compile('com.google.apis:google-api-services-gmail:v1-rev29-1.20.0') { exclude group: 'org.apache.httpcomponents' } // Play Services compile 'com.google.android.gms:play-services-location:8.4.0' compile 'com.google.android.gms:play-services-maps:8.4.0' compile 'com.google.android.gms:play-services-ads:8.4.0' compile 'com.google.android.gms:play-services-analytics:8.4.0' compile 'com.google.android.gms:play-services-identity:8.4.0' // Support libraries compile 'com.android.support:support-v4:23.3.0' compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:cardview-v7:23.3.0' compile 'com.android.support:design:23.3.0' compile 'com.github.bumptech.glide:glide:3.6.1' compile 'com.anjlab.android.iab.v3:library:1.0.20' compile 'com.sothree.slidinguppanel:library:2.0.3' compile 'com.commit451:PhotoView:1.2.5' compile('com.github.afollestad.material-dialogs:core:0.8.5.7@aar') { transitive = true } }
EDIT:
To clarify: This happens when I try to run the app on an emulator running e.g. KitKat API 19
Crash logs from the gradle console:
... :App:generateDebugInstantRunAppInfo :App:transformClassesWithDexForDebug AGPBI: {"kind":"error","text":"The number of method references in a .dex file cannot exceed 64K.\nLearn how to resolve this issue at https://developer.android.com/tools/building/multidex.html","sources":[{}],"original":"UNEXPECTED TOP-LEVEL EXCEPTION:\ncom.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536\n\tat com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)\n\tat com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)\n\tat com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)\n\tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)\n\tat com.android.dx.merge.DexMerger.merge(DexMerger.java:188)\n\tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)\n\tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)\n\tat com.android.dx.command.dexer.Main.run(Main.java:277)\n\tat com.android.dx.command.dexer.Main.main(Main.java:245)\n\tat com.android.dx.command.Main.main(Main.java:106)\n","tool":"Dex"} FAILED FAILURE: Build failed with an exception. * What went wrong: 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.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED
Crash message from the Message window:
: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.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2