Android Studio 1.0 在 dexDebug 或 dexRelease 构建失败

Posted

技术标签:

【中文标题】Android Studio 1.0 在 dexDebug 或 dexRelease 构建失败【英文标题】:Android Studio 1.0 failing build at dexDebug or dexRelease 【发布时间】:2015-02-06 15:27:50 【问题描述】:

我最近从 android Studio 0.9.2 升级到 1.0(包括 Gradle 插件的 1.0.0 版),但在构建我的项目时遇到了问题。

每当我构建时,我都会在 dexDebug 或 dexRelease 步骤收到以下异常:

UNEXPECTED TOP-LEVEL ERROR:
    java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.util.HashMap.createEntry(HashMap.java:897)
        at java.util.HashMap.addEntry(HashMap.java:884)
        at java.util.HashMap.put(HashMap.java:505)
        at com.android.dx.rop.type.Type.putIntern(Type.java:857)
        at com.android.dx.rop.type.Type.intern(Type.java:365)
        at com.android.dx.rop.type.Type.internClassName(Type.java:415)
        at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:289)
        at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:299)
        at com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolParser.java:150)
        at com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(ConstantPoolParser.java:124)
        at com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPoolParser.java:115)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:482)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.processClass(Main.java:704)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
        at com.android.dx.command.dexer.Main.access$300(Main.java:82)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
        at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
        at com.android.dx.command.dexer.Main.processOne(Main.java:632)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:505)
        at com.android.dx.command.dexer.Main.runMultiDex(Main.java:332)
        at com.android.dx.command.dexer.Main.run(Main.java:243)
        at com.android.dx.command.dexer.Main.main(Main.java:214)
        at com.android.dx.command.Main.main(Main.java:106)

我尝试将 Android Studio 的堆大小增加到 -Xmx4096m,但无济于事。 在带有 0.14 版本的 gradle 插件构建的 Android Studio 0.9.2 中运行良好。

这是我项目的 build.gradle 文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:1.0.0'
    

这是我的模块的 build.gradle 文件:

apply plugin: 'android'

repositories 
    mavenCentral()


dependencies 
    compile 'com.android.support:appcompat-v7:21.+'
    compile 'com.android.support:cardview-v7:21.0.+'
    compile 'com.android.support:recyclerview-v7:21.0.+'
    compile 'com.android.support:multidex:1.+'
    compile 'com.google.android.gms:play-services:6.5.+'
    compile 'org.jsoup:jsoup:1.8.+'
    compile 'commons-io:commons-io:2.4'
    compile 'org.apache.commons:commons-lang3:3.3.2'
    compile 'com.rometools:rome:1.5.0'
    compile 'com.google.apis:google-api-services-blogger:v3-rev44-1.19.0'
    compile 'com.google.http-client:google-http-client-gson:1.19.0'
    compile 'org.apache.commons:commons-collections4:4.0'
    compile 'com.parse.bolts:bolts-android:1.1.2'
    compile files('libs/android-query.0.26.8.jar')
    compile files('libs/Parse-1.7.1.jar')


android 
    compileSdkVersion 21
    buildToolsVersion "21.1.1"
    defaultConfig 
        // Enabling multidex support.
        multiDexEnabled true
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 1040009
        versionName "1.4"

    
    buildTypes 
        release 
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-dcrapp.txt'
            shrinkResources true
        

        debug 
            minifyEnabled false
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-dcrapp.txt'
        
    

    sourceSets 
        main 
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        


        //Bugfix for Gradle build bug
        packagingOptions 
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
        

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    


task copyMappingFiles(type: Copy)

copyMappingFiles 
    from 'build\\outputs\\mapping\\release'
    into 'mappings\\'+android.defaultConfig.versionCode
    include('mapping.txt')


assembleRelease.finalizedBy copyProguardFiles

此问题的原因可能是什么?如何解决?

【问题讨论】:

【参考方案1】:

Android Studio 似乎内存不足,请尝试在 AndroidStudio.app/Contents/bin/studio.vmoptions 中增加内存大小

-Xms256m
-Xmx1024m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=96m
-XX:+UseCompressedOops

根据Android Studio - How to increase Allocated Heap Size中的答案建议

另外你可能想添加

dexOptions 
    javaMaxHeapSize "4g"

到你的模块 build.gradle 按照Android Studio Google JAR file causing GC overhead limit exceeded error

【讨论】:

或 gradle 守护进程内存不足。检查占用内存最多的任务管理器。 已经尝试过第一个选项。第二个选项(dexOptions.javaMaxHeapSize)确实解决了这个问题。似乎是 gradle deamon 内存不足。非常感谢!现在我想知道为什么它首先会发生。除了 gradle 插件版本,我没有更改项目本身的任何内容。新的 gradle 版本只是使用更多的内存吗? 很有可能,我会阅读这个版本的 gradle 的文档和发行说明@gradle.org/documentation【参考方案2】:

看起来 dexing 内存不足。试试:

android 
    dexOptions 
        javaMaxHeapSize "2048M"
    

有关其他选项,请参阅 Gradle 插件用户指南中的 dex options。

【讨论】:

以上是关于Android Studio 1.0 在 dexDebug 或 dexRelease 构建失败的主要内容,如果未能解决你的问题,请参考以下文章

[Android] 环境配置之正式版Android Studio 1.0

在 Android Studio 1.0 中添加 JAR [重复]

如何在 Android Studio 1.0 中找到过滤器 Logcat 配置?

cordova+Android Studio 1.0+ionic+win7(转)

Android Studio3.1.0升级问题记录

Android Studio3.1.0升级问题记录