app:Android Studio上的dexDebug错误

时间:2015-11-12 06:00:41

标签: android android-studio android-gradle

我在Mac OS X上运行Android Studio 1.4。一直运行正常,直到我从管理器更新了一些SDK,然后当我尝试编译我的应用程序时,我得到以下错误。

我的gradle设置

compileSdkVersion 22
buildToolsVersion '22.0.1'

错误:

Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    /Users/Haroon/Desktop/adt-bundle-mac-x86_64-20140321/sdk/build-tools/22.0.1/dx --dex --no-optimize --output /Users/Haroon/Desktop/ShopFront-Android/app/build/intermediates/dex/debug --input-list=/Users/Haroon/Desktop/ShopFront-Android/app/build/intermediates/tmp/dex/debug/inputList.txt
  Error Code:
    2
  Output:
    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:454)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
        at com.android.dx.command.dexer.Main.run(Main.java:246)
        at com.android.dx.command.dexer.Main.main(Main.java:215)
        at com.android.dx.command.Main.main(Main.java:106)

更新

我正在尝试在我的应用中实现TabLayout,如果我排除了支持设计库,那么该应用会编译:

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

3 个答案:

答案 0 :(得分:1)

我认为你达到了dex方法计数限制(65,536计数)。

您可以在defaultConfig中添加它来修复它

multiDexEnabled true

这是你的依赖

compile 'com.android.support:multidex:1.0.1'

最后将它安装在Application类

   @Override
   protected void attachBaseContext(Context base) {
       super.attachBaseContext(base);
       MultiDex.install(this);
   }

答案 1 :(得分:1)

您的logcat是什么抛出

  

com.android.dex.DexIndexOverflowException:方法ID不在[0,   0xffff]:65536           在com.android.dx.merge.DexMerger $ 6.updateIndex(DexMerger.java:502)           在com.android.dx.merge.DexMerger $ IdMerger.mergeSorted(DexMerger.java:277)           在com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)           在com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)           在com.android.dx.merge.DexMerger.merge(DexMerger.java:189)           在com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)

Gradle available in Android SDK Build Tools 21.1 及更高版本的Android插件支持multidex作为构建配置的一部分。在尝试为 multidex 配置应用之前,请务必使用SDK管理器 将 Android SDK构建工具工具和Android支持存储库更新到最新版本

设置应用开发项目以使用multidex配置需要您对应用开发项目进行一些修改。特别是您需要执行以下步骤:

  1. 更改Gradle版本配置以启用multidex
  2. 修改您的清单以引用MultiDexApplication类
  3. 修改您的应用Gradle构建文件配置以包含支持库并启用multidex输出。

        android {
        compileSdkVersion 22
        buildToolsVersion "22.0.1"
    
        defaultConfig {
            ...
            minSdkVersion 14
            targetSdkVersion 21
            ...
    
            // Enabling multidex support.
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
    

    阅读官方文件 MultiDex

    如果您的Application类正在扩展其他类并且您不想或不能更改它, override attachBaseContext() ,如下所示:

    public class MyApplication extends MultiDexApplication { 
       @Override 
       protected void attachBaseContext(Context base) { 
          super.attachBaseContext(base); 
          MultiDex.install(this); 
       } 
    }
    

    结论

      

    虽然该库在大多数情况下修复了DEX 64K问题,但应该如此   被视为最后的手段。在尝试使用它之前,你应该这样做   审核您的项目是否存在不需要的依赖项,并删除未使用的项   使用ProGuard尽可能使用代码。

答案 2 :(得分:0)

您已超过65536的方法限制。 您需要在应用程序中启用Multidex。

compile 'com.android.support:multidex:1.0.1'添加到您的依赖项。

此外,您需要在 build.gradle 中将multidex enabled设置为true。

defaultConfig {
        applicationId "xxxxxxxxxxxx"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

如果你有一个Application类,那么使用MultiDexApplication而不是Application扩展id。 如果没有,则将其添加到清单中的应用程序标记中,如:

<?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>

有关详细答案,请参阅This