构建Gradle:找不到方法packagingOptions()的参数根项目“fasterDev”。

17

我在应用程序中使用单个build.gradle文件。 关于版本1.6,它正常工作。 但我想将其用于模块的位置更新。

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

dependencies {
    compile 'com.google.android.gms:play-services:fp9.0.0'
}

这是我的 build.gradle 文件。

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
    }
}
apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 15
    buildToolsVersion "21.1.2"

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

}

packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'
}  
任何关于这个的教程或建议吗?
日志:
org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: org.gradle.api.internal.MissingMethodException: Could not find method packagingOptions() for arguments [build_b54s9k8r9uto6awxmkxnu2ipo$_run_closure3@3a2d3196] on root project 'fasterDev'.
    at org.gradle.api.internal.AbstractDynamicObject.methodMissingException(AbstractDynamicObject.java:68)
2个回答

50
您已经在android闭包之外提供了packagingOptions,这就是Gradle认为它是某个根项目方法的原因。
只需将其移动到android闭包中,如下所示:
android {
    ...

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }      
}

感谢您的时间和建议。但是,如果我按照您的建议将其放置在Android中,我会得到“APK中复制的重复文件”和日志:您可以在build.gradle中忽略这些文件: android { packagingOptions { exclude 'lib/armeabi-v7a/gdbserver' } }您能否对此提出更多建议? - NovusMobile
1
这意味着你首先遇到的异常已经解决了,构建脚本现在是正确的。你只需要改进提供的配置。你尝试过排除 lib/armeabi-v7a/gdbserver 吗?如果这是一个 .so 本地库,那么尝试将 exclude 更改为 pickFirst,这将包含该库的第一个出现。 - Stanislav
很好。非常感谢。除了pickFirst,这个是新的对我来说。如果您有任何关于它的文章,请分享链接。 - NovusMobile
我仍然无法解决这个问题,但我正在尝试同样的方法。 - NovusMobile

3
较新版本的 AGP(Android Gradle 插件)中,排除功能已被弃用并替换为 resources.excludes 属性。 Kotlin DSLbuild.gradle.kts):
android {
  // ...
  packagingOptions {
    resources.excludes += "META-INF/LICENSE*"
    resources.excludes += "META-INF/NOTICE.txt"
    // OR
    // resources.excludes += setOf(
    //   "META-INF/LICENSE*",
    //   "META-INF/NOTICE.txt"
    // )
  }
}

谢谢,这对我有帮助,不过在最新的SDK中,答案的语法稍有不同。https://dev59.com/xNH7oIgBc1ULPQZFlvIX#75718985 - Gleichmut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接