如果使用play-services编译,NavigationDrawer会失败

时间:2017-03-11 23:54:40

标签: android google-play-services android-coordinatorlayout multidex

我能够编译并运行任何问题,一个NavigationDrawer示例。

接下来,我添加了一个模块,该模块又包含google play-services库(此模块'map'已在另一个proyect中测试并使用,并且工作正常)

但是当我将此模块作为依赖项(compile proyect (':map'))添加到build.gradle时,构建失败。

消息是:

  

“错误:任务'执行失败':app:transformClassesWithDexForDebug'。   com.android.build.api.transform.TransformException:com.android.ide.common.process.ProcessException:java.util.concurrent.ExecutionException:com.android.dex.DexIndexOverflowException:方法ID不在[0,0xffff]中: 65536"

我理解这个错误很好,因为方法的数量超过了64K的最大值。所以我使用'multiDexEnabled true'选项。

现在它编译完美,但是在调试模式下运行,它会在尝试加载CoordinatorLayout布局时抛出运行时异常

这是控制台抛出的内容

java.lang.RuntimeException: Unable to start activity ComponentInfo{net.simplifiedcoding.navigationdrawerexample/net.simplifiedcoding.navigationdrawerexample.MainActivity}: android.view.InflateException: Binary XML file line #11: Binary XML file line #2: Error inflating class android.support.design.widget.CoordinatorLayout
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5443)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    Caused by: android.view.InflateException: Binary XML file line #11: Binary XML file line #2: Error inflating class android.support.design.widget.CoordinatorLayout
    at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
    at net.simplifiedcoding.navigationdrawerexample.MainActivity.onCreate(MainActivity.java:24)

我还尝试将图书馆的声明限制为我打算使用的内容,替换

    compile 'com.google.android.gms:play-services:+'

    compile 'com.google.android.gms:play-services-maps:+'
    compile 'com.google.android.gms:play-services-location:+'
    compile 'com.google.android.gms:play-services-gcm:+'
    compile 'com.google.android.gms:play-services-plus:+'                  

同样的问题。它是构建,但在加载协调器布局时失败。

问题是:

是否可以与包含play-services库的项目一起运行NavigationDrawer,以及multiDexEnabled选项集(无论如何我需要设置此选项,因为我在根项目中有很多方法)< / p>

希望它足够清楚

这是NavigationDrawer的build.grade:

    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"

        defaultConfig {
            applicationId "net.simplifiedcoding.navigationdrawerexample"
            minSdkVersion 16
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            multiDexEnabled true
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:24.2.0'
        compile 'com.android.support:design:24.2.0'
        compile project (':map')
    }

,这是map项目的build.gradle包含作为NavigationDrawer的依赖

    apply plugin: 'com.android.library'

    android {
        compileSdkVersion 'Google Inc.:Google APIs:24'
        buildToolsVersion "24.0.2"

        defaultConfig {
            minSdkVersion 15
            targetSdkVersion 25

        }

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

    dependencies {
        //compile 'com.google.android.gms:play-services:+'
        compile 'com.google.android.gms:play-services-maps:+'
        compile 'com.google.android.gms:play-services-location:+'
        compile 'com.google.android.gms:play-services-gcm:+'
        compile 'com.google.android.gms:play-services-plus:+'
    }

1 个答案:

答案 0 :(得分:0)

除了cricket_007的评论,您可能需要检查Adding Support Libraries中给出的这种警告:

  

使用动态依赖项(例如,php -i)可能会导致意外的版本更新和回归不兼容。我们建议您明确指定库版本(例如,palette-v7:23.0.+)。

此外,检查使用的版本。如Manifest Declaration Changes

中所述
  

如果要包含多个支持库,则最低SDK版本必须是任何指定库所需的最高版本。例如,如果您的应用包含v14 Preference Support libraryv17 Leanback library,那么您的最低SDK版本必须为17或更高。

最后,您可能还想查看此article以获取有关设计支持库的其他见解。