.dex文件中的方法引用数超过64K

时间:2016-05-25 07:20:18

标签: android heap dex android-multidex

我的项目中包含播放服务和firebase库之后正在处理我的Android应用程序我收到此错误并且无法运行我的代码

  

:应用程序:prePackageMarkerForDebug   :应用:transformClassesWithDexForDebug   要在进程中运行dex,Gradle守护程序需要更大的堆。   它目前有大约910 MB。   要加快构建速度,请将Gradle守护程序的最大堆大小增加到2048 MB以上。   为此,请在项目gradle.properties中设置org.gradle.jvmargs = -Xmx2048M。   有关详细信息,请参阅https://docs.gradle.org/current/userguide/build_environment.html   错误:.dex文件中的方法引用数不能超过64K。   了解如何在https://developer.android.com/tools/building/multidex.html解决此问题   :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:进程'命令'/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bin/java''以非零退出值2结束

我的build.gradle文件在这里:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "xyz.in.network"
    minSdkVersion 16
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        multiDexEnabled true
    }
}
}

dependencies {
   compile fileTree(dir: 'libs', include: ['*.jar'])
   testCompile 'junit:junit:4.12'
   compile project(':libs:ViewPagerIndicator')
   compile 'com.google.android.gms:play-services:9.0.0'
   compile 'com.android.support:appcompat-v7:23.4.0'
   compile 'com.android.support:design:23.4.0'
   compile 'com.google.android.gms:play-services-maps:9.0.0'
   compile 'com.google.android.gms:play-services-location:9.0.0'
   compile 'com.android.support:cardview-v7:23.4.0'
   compile 'com.getbase:floatingactionbutton:1.10.1'
   compile 'com.squareup.picasso:picasso:2.5.2'
   compile 'com.android.volley:volley:1.0.0'
   compile 'com.google.firebase:firebase-messaging:9.0.0'
   compile 'com.android.support:multidex:1.0.1'
   }

   apply plugin: 'com.google.gms.google-services'

我的manifestfile就在这里

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name="android.support.multidex.MultiDexApplication"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
<activity android:name=".Util.DisconnectedNetwork"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.Transparent"></activity>

    <service android:name=".FCM.FirebaseMessagingHandler">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>

    <service android:name=".FCM.FirebaseRegistrationTokenHandler">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

</application>

将堆大小增加到2048M后。 Gradle给出了这个错误

  

错误:任务':app:transformClassesWithDexForDebug'的执行失败。   com.android.build.api.transform.TransformException:com.android.ide.common.process.ProcessException:java.util.concurrent.ExecutionException:com.android.dex.DexIndexOverflowException:方法ID不在[0,0xffff]中: 65536

我按照Android开发者网站上给出的所有说明但仍然遇到此问题。如何解决这个问题?

3 个答案:

答案 0 :(得分:14)

您需要在android默认配置中启用multidex

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'

    defaultConfig {
        applicationId "com.example.case"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 43
        versionName "4.0.13"

        // Enabling multidex support.
        multiDexEnabled true
    }

当您在日常例程中构建应用程序时,通常使用debug默认风格。因此,如果您的应用程序具有超过65k的方法,您需要在所有风格上启用它。

作为旁注,您可能希望在调试版本中使用Proguard,因此您不必在其上启用multiDex。

完整的app / build.gradle(documentation

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

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

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

最后一部分:在清单中添加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">
        ...
    </application>
</manifest>

答案 1 :(得分:5)

我的应用程序遇到了类似的错误,因此我在Android Studio中安装了一个名为Methods Count(http://www.methodscount.com/)的插件。它显示了每个依赖项使用的方法引用数,并显示了编译路径

compile 'com.google.android.gms:play-services:9.0.1'

在其上拥有超过69,000个参考

我将其更改为显示您的一个依赖项:

compile 'com.google.android.gms:play-services:9.0.0'

它显示 69,520方法引用作为此编译路径的依赖项。

您可能没有使用编译路径的范围,并且可能能够指定更多聚焦路径以消除一大堆已使用的方法引用,并在65k最大值之下获得路径。个性化服务列表为here

在我的情况下,我只能想象我在大约一年前添加了gms服务,当时我将Firebase整合到我的应用程序中,但在Firebase网站上找不到相同的参考。

只是意识到对你的问题的评论就说明了将依赖性分解为你所需要的东西。

答案 2 :(得分:3)

你有启用mutlidex的版本风味,你也应该为调试风格

debug {
    multiDexEnabled true
}

release {
    shrinkResources true
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    multiDexEnabled true
}