.dex文件中方法引用的数量不能超过64k API 17


154

我正在使用SugarORM库构建一个应用程序,但是当我尝试为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指定将SugarORM与proguard一起使用
Shaan_B 16-4-22

19
升级到api 23之后才获得此权限。使用Android根本无法实现高效。每个SDK都会破坏内容。AS的每次更新都会破坏内容。错误消息无法使用。AS坏了。垃圾,垃圾,垃圾。
RunLoop

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.我建议最好的答案(并接受)!
乔恩·古德温

Answers:


330

您有太多方法。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
}

同样在您ManifestMultiDexApplication类中,将multidex支持库中的类添加到application元素中

    <?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类,请将父类从更改ApplicationMultiDexApplication
如果无法执行此操作,请在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
Cmd单击MultiDexApplication,我看到反编译的.class文件已经完全执行了您描述的attachBaseContext()覆盖。因此,没有必要再重写,我想..
丈量

4
如果我没有太多方法怎么办。我的应用程序没有太多方法。我相信甚至没有达到目标。
霓虹灯Warge

6
我只做了这两部分:“ multiDexEnabled true”,并在我的build.grandle文件中编译“ com.android.support:multidex:1.0.0”。我不必更改清单文件中的任何内容,也不必执行您提到的有关覆盖attachBaseContext等的其他事项。但是您的解决方案为我解决了这个问题!谢谢。
Jaime Montoya

2
@NeonWarge可能是由于您的依赖性。也许您已经包含了整个Google Play服务?检查此答案以获取详细信息
mr5

128

在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

1
它使构建成功,但是应用程序在启动后崩溃。
瓦桑斯

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 Map Objects教程之前,它一直运行良好。突然我无法编译了。这个解决方案已经为我解决了。您到底是如何解决的?
maccaroo

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文件中添加两个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
}

它对我有用,如果您使用的minSdkVersion低于21(低于lolipop,),则您必须做两个额外的简单事情

1.首先添加此依赖项

编译'com.android.support:multidex:1.0.1'

在您的build.gradle中。

2.最后,在清单中将以下一行添加到您的应用程序中

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然后它将在较低版本中工作.. :)快乐编码


1

补充一点,在添加对multidex的支持之前-确保您没有添加不必要的依赖项。

例如 在官方的Facebook分析指南中

他们明确指出您应该添加以下依赖项:

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

实际上是整个 FacebookSDK-因此,例如,如果您仅需要Google Analytics(分析),则需要将其替换为:

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

Facebook部分SDK选项


完全同意。以我的情况为例,我只需要“使用facebook登录”按钮,并使用整个facebook sdk即可。我已将其替换为,facebook-core并且facebook-login错误消失了。
cleybertandre

0

对我来说,升级Gradle可以正常工作。在Android网站上查找更新, 然后将其添加到您的build.gradle(Project)中,如下所示

 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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.