如何防止在android gradle中使用multi-dex

时间:2015-10-24 17:55:03

标签: android android-gradle multidex android-multidex

以下是我的gradle文件。我得到一个MultiDexException。我不想启用multidex,因为我的应用程序并不复杂。所以我确信我一定做错了。有人请看我的gradle文件,并指出我可以做些什么来避免这个问题?

ERROR:

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'

    }
    

2 个答案:

答案 0 :(得分:4)

  

我不想启用multidex,因为我的应用程序并不复杂

您对11个工件有直接依赖关系。您对其他人有间接依赖关系(例如,Dim oShell Set oShell = CreateObject("WScript.Shell") i = 0 Do While i = 0 oShell.run "Notepad.exe" WScript.Sleep(10000) Loop 拉入play-services-location),以及任何可能因您的Fabric插件而设置为依赖关系的内容。

简而言之,您的应用程序相当复杂。只是碰巧没有写出那么多的复杂性。

  

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

使用更少/更小的依赖项。

您已经使用了细粒度的Play Services SDK依赖项,否则您很久以前就会达到DEX限制。

您可以考虑使用其中一种可用的方法计数工具,例如this Gradle plugin,以便更好地了解哪些库会影响您的成本。

答案 1 :(得分:0)

您可以使用Proguard来混淆和删除未使用的类。但请记住,如果您不希望自己的应用被截断,请务必仔细配置。非常。 Proguard非常具有侵略性。