如何使用Gradle将Android配置注入每个子项目?

如何使用Gradle将Android配置注入每个子项目?,android,gradle,android-gradle-plugin,Android,Gradle,Android Gradle Plugin,不要在每个子项目中重复android配置块: android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersion 9 targetSdkVersion 14 } } 我更愿意将其放在顶级/根gradle构建文件中,如: subprojects{ android { compileSdkVersion

不要在每个子项目中重复android配置块:

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 14
    }
}
我更愿意将其放在顶级/根gradle构建文件中,如:

subprojects{
    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.0"

        defaultConfig {
            minSdkVersion 9
            targetSdkVersion 14
        }
    }
}
但是,这不起作用(

错误:
“。找不到参数的方法android()。”

解决方案是:

subprojects{
    afterEvaluate {
        android {
            compileSdkVersion 19
            buildToolsVersion "19.0.0"

            defaultConfig {
                minSdkVersion 9
                targetSdkVersion 14
            }
        }
    }
}
据我所知,这是因为在评估时处理/使用android{…}意味着它必须在根构建文件中的子项目中出现(即显式编写或作为“应用插件”的一部分包含)。更准确地说,这意味着顶级项目必须定义它(这可能不是,因为它本身可能不是“android”或“android库”构建)。但是,如果我们在评估之后将其推到,那么它可以直接使用每个子项目中可用的内容

这个问题+解决方案还假设所有子项目都是某种形式的android项目(在我的例子中是真的,但不一定是其他的)。 更安全的答案是使用:

subprojects{
    afterEvaluate {
        if(it.hasProperty('android')){
            android {
                compileSdkVersion 19
                buildToolsVersion "19.0.0"

                defaultConfig {
                    minSdkVersion 9
                    targetSdkVersion 14
                }
            }
        }
    }
}

这在其他方面工作得很好,但这样子项目就无法覆盖默认值。在设置值之前,您应该检查compileSdkVersion和buildToolsVersion是否存在。为True,但另一方面,如果有人意外尝试覆盖子项目中的内容,他们将无法逃脱;)由于某些原因,Android Gradle Plugin 3.5.2不接受这一点,但抱怨子模块不包含CompileSDK版本(以及我尝试定义的所有其他版本)