如何防止在android gradle中使用多索引

如何防止在android gradle中使用多索引,android,android-gradle-plugin,android-multidex,Android,Android Gradle Plugin,Android Multidex,下面是我的gradle文件。我得到一个多重索引异常。我不想启用multidex,因为我的应用程序没有那么复杂。所以我确信我一定是做错了什么。请有人看看我的gradle文件,指出我能做些什么来避免这个问题 错误: UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 at com.android.dx.merge.DexMe

下面是我的gradle文件。我得到一个多重索引异常。我不想启用multidex,因为我的应用程序没有那么复杂。所以我确信我一定是做错了什么。请有人看看我的gradle文件,指出我能做些什么来避免这个问题

错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
    at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
    at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
    at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
格拉德尔:

buildscript {

        repositories {
    
        maven { url 'https://maven.fabric.io/public' }
    
    }
    
    
    dependencies {
    
        classpath 'io.fabric.tools:gradle:1.+'

        }

    }

    apply plugin: 'com.android.application'
    
apply plugin: 'io.fabric'

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

        maven { url 'https://maven.fabric.io/public' }
    
}
    
    
    
android {

        compileSdkVersion 23
    
    buildToolsVersion "23.0.1"

    
        defaultConfig {

            applicationId "com.company.app.android"
    
        minSdkVersion 14
    
        targetSdkVersion 23

            versionCode 1

            versionName "1.0"

        }
    
    buildTypes {

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

            }

        }

    
    
    }

    
    dependencies {

        compile project(path: ':cloud', configuration: 'android-endpoints')
    
    compile('com.twitter.sdk.android:twitter:1.8.0@aar') {

            transitive = true;

        }

    
        compile 'com.android.support:design:23.0.1'

        compile 'com.android.support:recyclerview-v7:23.0.1'

        compile 'com.android.support:cardview-v7:23.0.1'

        compile 'com.squareup.okhttp:okhttp:2.5.0'

        compile 'com.squareup.picasso:picasso:2.5.2'

        compile 'com.path:android-priority-jobqueue:1.1.2'

        compile 'com.google.android.gms:play-services-gcm:8.1.0'

        compile 'com.google.android.gms:play-services-appindexing:8.1.0'

        compile 'com.google.android.gms:play-services-location:8.1.0'

    }
    
我不想启用multidex,因为我的应用程序没有那么复杂

您直接依赖于11个工件。您对其他人有间接依赖关系(例如,
play services location
拉入
play services maps
),加上任何可能通过Fabric插件设置为依赖关系的内容

简而言之,你的应用程序相当复杂。碰巧你没有写那么复杂的东西

我能做些什么来避免这个问题

使用更少/更小的依赖项

您已经在使用细粒度的Play Services SDK依赖项,否则您早就达到了DEX限制


你可以考虑使用一种可用的方法计数工具,例如,更好地了解哪些库有助于你的成本。

< p>可以用来混淆和删除未使用的类。但是,如果你不想让你的应用程序被“切断”,请记住仔细配置它。Proguard可能非常激进。

这是一个与应用程序引擎连接的项目。我不认为应用引擎gradle会影响android gradle,但这个库只告诉我们解决上述问题的极限?即使是我也面临着同样的问题,如果我们必须包含太多的库,但仍然不想启用多索引,该怎么办?@HBdroid:你没有太多选择。如果您为调试构建启用ProGuard,它可以提供一些帮助。最终,您需要使用更少的库、使用multidex、将应用程序拆分为多个应用程序(每个应用程序都需要库的子集),或者放弃应用程序。@commonware您知道如何禁用multidex吗?我创建了一个新的空android应用程序项目,构建了它,并用APK Analyzer检查了生成的APK文件。在APK文件中,总是有classes2.dex文件和classes.dex。当然,引用计数非常低,并且还尝试扩展Activity类而不是默认的AppCompatActivity,以减少依赖关系,但结果是一样的。此外,当我反编译那些dex文件时,当MainActivity.class在我的设备上按预期工作时,我找不到任何MainActivity.class。我做了几次这些测试,因为我的原始应用程序也有同样的问题。引用计数低的多索引文件。即使我从未应用过ProGuard,也无法在dex文件中找到我的类文件。。我不知道这里发生了什么。世界上为什么会有默认的多重索引。。有什么提示吗?@Jenix:我建议你问一个单独的堆栈溢出问题,在这里你可以解释这些步骤,并提供显示你所看到的内容的屏幕截图。