【问题标题】:how to use android-support-multidex.jar for phone prior to Android 5.0 in android studio?如何在 android studio 中将 android-support-multidex.jar 用于 Android 5.0 之前的手机?
【发布时间】:2015-09-24 05:29:27
【问题描述】:

我想在一个 apk 中使用更多 classes.dex 文件构建我的应用程序。所以我按照谷歌帮助页面的说明进行操作。安卓 5.0 没问题,但我不能为安卓 5.0 之前的手机构建。它总是报告:com.android.dex.DexException: Too many classes in --main-dex-list, main dex容量超出。我不知道热建设。我的构建等级:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 21
    //buildToolsVersion "20"
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.android.ccbtest.first"
        minSdkVersion 21
        targetSdkVersion 21
        multiDexEnabled true
    }
    dexOptions {
        preDexLibraries = false
    }
    afterEvaluate {
        tasks.matching {
            it.name.startsWith('dex')
        }.each { dx ->
            if (dx.additionalParameters == null) {
                dx.additionalParameters = []
            }
            dx.additionalParameters += '--multi-dex' // enable multidex

            // optional
            // dx.additionalParameters += "--main-dex list=$projectDir/<filename>".toString() // enable the main-dex-list
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }
    }

dependencies {
    compile files('libs/ccbtest.jar')
    compile files('libs/ccbtest1.jar')
    compile files('libs/ccbtest2.jar')
    compile files('libs/ccbtest3.jar')
    compile files('libs/ccbtest4.jar')
    compile files('libs/ccbtest5.jar')
    compile files('libs/ccbtest6.jar')

    // Multi-dex Lib
    compile 'com.android.support:multidex:1.0.0'
}

如果我将 minSdkVersion 21 从 21 修改为 20。它将失败。

我想在 android 5.0 之前的手机中使用。请帮我解决这个问题。

谢谢。

br

重量

【问题讨论】:

  • 只要确保您遵循here 列出的所有步骤即可。特别要注意,您需要将清单指向MultiDexApplication 或在现有的应用扩展中调用MultiDex.install(...)
  • 嗨,HM,谢谢。但我真的不知道从 minSdkVersion 21 修改为 minSdkVersion 20 后构建会失败的原因。
  • 基本上这样做的原因是不能支持dalvik。这会导致所有 Multidex 问题

标签: android gradle android-multidex


【解决方案1】:

首先,作为 oberflansch commented,删除您传递给 afterEvaluate 的闭包。一旦您指定了multiDexEnabled = true,Android gradle 插件将自动处理所有 dx 配置。

Too many classes in --main-dex-list, main dex capacity exceeded 错误很可能表明您的 main dex 文件 超出了 65536 个方法的限制。

我过去也遇到过同样的问题,最终不得不修补 Android gradle 插件,使其在 main dex 中不包含 Activity 类。这有点hacky,但效果很好。请参阅my blogpost 了解更多说明。

【讨论】:

  • 嗨,亚历克斯,非常感谢。我在读你的博客。我将尝试您的示例项目。再次感谢。抱歉这么晚才回复,没有工具我无法访问您的博客。
  • 嗨,Alex,根据您的建议进行修改后,现在可以构建了。首先感谢您的帮助。现在所有活动都放入第二个 dex 文件中。我的测试类和方法没有任何规则地放在第一个和第二个 dex 文件中。我不知道在这种情况下是否只有第一个 dex 文件有方法限制。你能解释一下吗?谢谢。
  • @mmm2006 抱歉,我不确定我明白你到底在问什么。你能说得更具体点吗?
  • 嗨,Alex,很抱歉让您感到困惑。我只想知道这个解决方案是如何工作的。它只是将所有活动移动到第二个 dex 文件中。就我而言,所有测试方法(超过 64k)都在一项活动中引用。为什么第二个 dex 文件不会抱怨里面有更多的方法。这是不是更清楚了?提前感谢您的帮助。
  • @mmm2006 再次阅读我链接的博文 - 它包含所有必需的信息(我相信)。简而言之,main dex (classes.dex) 很重要,因为他是唯一在应用程序创建时自动加载的。 Application 类没有直接或间接引用的每个类都可以放在辅助 dex 文件之一(classes2.dex、classes3.dex 等)中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2015-04-03
  • 2021-10-18
  • 2018-08-24
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
相关资源
最近更新 更多