【问题标题】:How to fix DEX 64K Methods Limit in minSdkVersion 21?如何修复 minSdkVersion 21 中的 DEX 64K 方法限制?
【发布时间】:2016-07-21 07:45:50
【问题描述】:

创建 APK 文件时出现此错误:

错误:.dex 文件中的方法引用数不能超过 64K。 通过https://developer.android.com/tools/building/multidex.html了解如何解决此问题

我参考了这个tutorial 来解决这个问题,但我仍然收到这个错误。

我在我的项目中这样使用 MultiDex:

在 sdk 16 的 biuld.gradle 中:

apply plugin: 'com.android.application'

repositories {
    jcenter()
    mavenCentral()
}

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"
    defaultConfig {
        applicationId "com.saly.test"

        minSdkVersion 16
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"

        multiDexEnabled true

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':volley')
    compile 'com.android.support:multidex:1.0.1'
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.android.support:design:24.0.0'
    compile 'com.android.support:recyclerview-v7:24.0.0'
    compile 'com.android.support:cardview-v7:24.0.0'
    compile 'com.android.support:support-v4:24.0.0'
    compile 'com.google.android.gms:play-services:9.2.1'
    compile 'com.google.android.gms:play-services-location:9.2.1'
    compile 'com.google.android.gms:play-services-gcm:9.2.1'
    compile 'com.google.android.gms:play-services-maps:9.2.1'
    compile 'com.onesignal:OneSignal:2.+@aar'
}

在 sdk 16 的清单中:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...>

    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">

        ...

    </application>
   </manifest>

现在我得到了新的错误:

错误:意外的顶级错误:错误:java.lang.OutOfMemoryError:GC 超出开销限制错误:在 com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:289) 错误:在 com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolParser.java:150) 错误:在 com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(ConstantPoolParser.java:124) 错误:在 com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPoolParser.java:115) 错误:在 com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:491) 错误:在 com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406) 错误:在 com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388) 错误:在 com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251) 错误:在 com.android.dx.command.dexer.Main.parseClass(Main.java:772) 错误:在 com.android.dx.command.dexer.Main.access$1500(Main.java:85) 错误:在 com.android.dx.command.dexer.Main$ClassParserTask.call(Main.java:1700) 错误:在 com.android.dx.command.dexer.Main.processClass(Main.java:755) 错误:在 com.android.dx.command.dexer.Main.processFileBytes(Main.java:723) 错误:在 com.android.dx.command.dexer.Main.access$1200(Main.java:85) 错误:在 com.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(Main.java:1653) 错误:在 com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284) 错误:在 com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166) 错误:在 com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144) 错误:在 com.android.dx.command.dexer.Main.processOne(Main.java:677) 错误:在 com.android.dx.command.dexer.Main.processAllFiles(Main.java:569) 错误:在 com.android.dx.command.dexer.Main.runMultiDex(Main.java:366) 错误:在 com.android.dx.command.dexer.Main.run(Main.java:275) 错误:在 com.android.dx.command.dexer.Main.main(Main.java:245) 错误:在 com.android.dx.command.Main.main(Main.java:106) :app:transformClassesWithDexForDebug FAILED 错误:执行失败 任务':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:进程'命令 'C:\Program Files\Java\jdk1.8.0_66\bin\java.exe'' 完成 非零退出值 3

然后我将最小 sdk 更改为 21 以修复此错误,但它不起作用。

这是我的 sdk 21 的 build.gradle:

apply plugin: 'com.android.application'

repositories {
    jcenter()
    mavenCentral()
}

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"
    defaultConfig {
        applicationId "com.saly.test" 

        minSdkVersion 21
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':volley')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.android.support:design:24.0.0'
    compile 'com.android.support:recyclerview-v7:24.0.0'
    compile 'com.android.support:cardview-v7:24.0.0'
    compile 'com.android.support:support-v4:24.0.0'
    compile 'com.google.android.gms:play-services:9.2.1'
    compile 'com.google.android.gms:play-services-location:9.2.1'
    compile 'com.google.android.gms:play-services-gcm:9.2.1'
    compile 'com.google.android.gms:play-services-maps:9.2.1'
}

我该如何解决这个错误?

提前致谢。

【问题讨论】:

标签: java android


【解决方案1】:

只需添加这些行

dexOptions {
    javaMaxHeapSize "4g"
}

在你的gradle脚本里面的任何地方

android { 
....

dexOptions {
    javaMaxHeapSize "4g"
}

....
}

【讨论】:

    【解决方案2】:

    你需要做的就是添加:

    android {
        compileSdkVersion 24
        buildToolsVersion "24.0.0"
    
        defaultConfig {
            ...
            minSdkVersion 14
            targetSdkVersion 21
            ...
    
            // Enabling multidex support.
            multiDexEnabled true
        }
    }
    
    dependencies {
       compile 'com.android.support:multidex:1.0.1'
    }
    

    这个给AndroidManifest.xml:

    <?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">
            ...
        </application>
    </manifest>
    

    或者如果您有您自己的 Application 类实现,请像这样覆盖 Application 中的 attachBaseContext 方法:

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

    【讨论】:

    • 感谢您的回复,我之前也这样做过,但正如我所描述的,我收到了新错误UNEXPECTED TOP-LEVEL ERROR
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2014-12-09
    • 1970-01-01
    • 2013-03-06
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多