当前位置: 首页 > 知识库问答 >
问题:

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

闽焕
2023-03-14

目前正在开发我的android应用程序。在我的项目中包括play服务和firebase库之后,我遇到了这个错误,无法运行我的代码

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

这是我的身材。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'

我的文件在这里

<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给出这个错误

错误:任务执行失败:应用程序: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个答案

杜绍元
2023-03-14

您已经为释放风味启用了 mutlidex,您也应该有此行用于调试风味

debug {
    multiDexEnabled true
}

release {
    shrinkResources true
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    multiDexEnabled true
}
空俊语
2023-03-14

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

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

有超过69k的引用

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

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

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

很可能您没有使用编译路径的范围,并且可能能够指定更集中的路径,以消除大量使用的方法引用,并在65k最大值下获得通过。个性化服务列表如下。

就我而言,我只能想象大约一年前当我将Firebase纳入我的应用程序时,我添加了gms服务线,但在Firebase网站上找不到相同的参考资料。

仅仅意识到你的问题上的一个评论说了类似的事情,把依赖分解成你所需要的。

盖翰池
2023-03-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
    }

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

另外,您可能希望在调试版本中使用Proguard,这样就不必在其上启用multiDex。

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 应用程序(或作为您自己的应用程序的父级)

<?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>
 类似资料:
  • 我刚刚完成了我的android应用程序,我在android studio模拟器上运行它。它很好,一切都很好,但我有一个问题-当我想生成签名的apk时,我得到了这两个错误,不能完成apk构建过程。我尝试了很多方法来解决我得到的这两个错误,但是没有结果。 错误截图

  • 问题内容: 我有这样的代码: 为什么我不能在第(5)行中打电话;在第(6)行中将为哪个类调用? 问题答案: 您不能这样做,因为子类的方法不在您的超类中。在这种情况下,尽管String是Object的子类,因为在java.lang.Object类中未声明length(),但无法在其实例上调用length。 但是equals()方法在字符串类中被覆盖,因此将调用Strings的equals()

  • 问题内容: 我知道这个问题已经在这里问过几次了。但是我还没有看到任何可能的解决方案。在我将项目“以Android应用程序身份运行”之前,如果我不清理它,则会收到以下错误,并且必须重新启动Eclipse …并再次清理。 com.jstun.core …是我的src文件夹的一部分,我当然不能删除它。即使我删除该程序包,另一个程序包也会显示为错误,例如: 自更新为ADT 15以来,我已经看到此错误,我正

  • 我错过了Java的一次讲座,主题是类、方法、构造函数等。作业是一项任务: 创建一个类Person,其对象描述人员,并且只包含两个字段:name(String)和生年(int)。在此类中,定义 > 建造师姓名和出生年份; 构造函数只取名称并将出生年份设置为默认值1990; 方法是如果此人是女性,则女性返回true(我们不太明智地假设只有女性和所有女性的名字以字母“a”结尾);否则该方法返回false

  • 我使用这个模块上传文件到亚马逊 https://www.npmjs.com/package/streaming-s3,如果文件小于或等于 5 MB,则工作正常。 我试着上传6 MB大小的PDF文件。它显示上传成功,但当我试图通过aws打开该文件。 它显示无法加载PDF文档 当我在Aws上检查大小时,显示为5MB。 我正在使用以下代码在 AWS 上上传 这对于小于5 MB的文件工作正常。 有什么想法