appcompat-v7:22.1.0无法正常工作

时间:2015-04-24 09:32:52

标签: android gradle appcompat-v7-r22.1

如果我在我的gradle文件中写下这段代码

 apply plugin: 'com.android.library'

    android {
        compileSdkVersion 22
        buildToolsVersion '22.0.1'

        defaultConfig {
            minSdkVersion 9
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.android.support:appcompat-v7:22.0.0'
    }

一切都很酷。但如果我改变

compile 'com.android.support:appcompat-v7:22.1.0'

我的应用崩溃了。 Android工作室建议我将版本更改为22.1.0,但如果我更改版本 - 崩溃。

Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\zen_75\AppData\Local\Android\sdk\build-tools\22.0.1\dx.bat --dex --no-optimize --output C:\projects\android-customer\app\build\intermediates\dex\debug --input-list=C:\projects\android-customer\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)

我该如何解决或离开?

编辑:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 22
    buildToolsVersion '22.0.1'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.1.0'
}

我改变文件 - 不工作!!!

2 个答案:

答案 0 :(得分:1)

您的项目中有Over 65K Methods,似乎Google已经为appcomapt-v21.1库添加了很多现在的方法。

无论如何,现在你有这些选择:
 1.使用Multidex,按照以下说明操作,更多信息here
 2.使用ProGuard
 3.减少项目中的方法数量

您必须牢记:

  • Multidex可能无法在运行Android v3.x的设备上运行,请检查所有限制here
  • ProGuard无法保证解决问题
  • 重新编写代码以减少方法的数量并不容易。

添加多索支持

build.gradle

android {
    ...
    ...

    defaultConfig {
        ...
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  ...
  ...
  compile 'com.android.support:multidex:+'
}

的manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="x.xxx.xx">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

PS:您可以使用dex-method-counts计算项目中的方法数量,它会让您清楚了解自己的情况。

答案 1 :(得分:0)

可能的解决方案是开始使用ProGuard的minify功能。请注意,它违反版本1.0.1的Dagger依赖注入。

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

可扩展地测试您的应用程序,因为这会删除未使用的方法,并执行许多其他操作。

http://developer.android.com/tools/help/proguard.html