如何使用Gradle为所有模块定义通用的Android属性

66

我在AndroidStudio中创建了一个简单项目,其中包含几个模块。每个模块的gradle脚本都包含以下代码:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 18
    }
}

我该如何将这段代码移动到主build.gradle脚本(项目的脚本)中?这段代码对所有子模块都是通用的。


你有考虑在顶层的Gradle文件中使用ext { }块吗? - IgorGanapolsky
9个回答

64
你可以在项目的根目录(即包含所有模块的文件夹)中创建一个build.gradle文件,并使用它来配置你的rootProject。
例如,如果你有:
MyApp
  - Module1/
      - build.gradle
  - Module2/
      - build.gradle
  - settings.gradle
你可以在settings.gradle旁边添加一个build.gradle
上面的例子中实际上有3个Gradle项目:Module1Module2rootProject
因此,在这个build.gradle文件中,你可以这样做:
// use the ext object to add any properties to the project
project.ext {
   compileSdkVersion = 18
}

然后在你的模块中,你可以这样做:

android {
    // here we reference the root project with the "rootProject" object.
    compileSdkVersion rootProject.ext.compileSdkVersion
}

这个在Gradle插件0.12.2和Gradle 1.1上不起作用。“无法找到方法compileSdkVersion(),在根项目'android'中的参数[20]。” - Roman
8
ه°†compileSdkVersion 18و›´و”¹ن¸؛compileSdkVersion = 18م€‚ - VenomVendor

34

把这个定义放在最上层的build.gradle文件中似乎是有效的。

subprojects {
    afterEvaluate {project ->
        if (project.hasProperty("android")) {
            android {
                compileSdkVersion 22
                buildToolsVersion '22.0.1'
            }
        }
    }
}

我将这个方便的方法与这个链接一起使用:https://dev59.com/UGEi5IYBdhLWcg3w6f6e - CasualT
2
这个程序在其他方面表现良好,但是这样就没有子项目可以覆盖默认值。在设置值之前,您应该检查compileSdkVersion和buildToolsVersion是否存在。 - Kung Foo
它的表现良好,此配置将覆盖所有子项目。 - androidmalin
太好了!我用它来修补git子模块中的一个值:project(':submoduleName') { afterEvaluate { project -> android { defaultConfig { minSdkVersion 19 }}}} - Giszmo

13

这对我在Android Studio 0.8.9中有效,使用默认的gradle wrapper 1.12-all。

App是由Lite和Pro使用的库,其中Lite / Pro是我正在制作的应用程序的两种不同版本。 我想在所有模块之间共享配置。 全局配置位于根gradle.build文件中,所有子项目/模块都可以读取这些属性。

我的项目结构如下:

Project/
 gradle.build
 settings.gradle
 App/
  gradle.build
 Lite/
  gradle.build
 Pro/
  gradle.build
在 Project/gradle.build 文件中,我添加了一个子项目配置:
subprojects {
    ext.global_compileSdkVersion = 19
    ext.global_buildToolsVersion = "20.0.0"
    ...
}

ext。[变量名]添加了可以在子项目中读取的变量。我添加了前缀“global_”,这样更容易看到我的属性。(还要注意,我使用等号将值分配给变量)

在每个子项目/模块中,gradle文件看起来像这样:

android {
    compileSdkVersion global_compileSdkVersion
    buildToolsVersion global_buildToolsVersion
    ...
}

注意!

Android Studio集成开发环境好像不知道子项目中的“ext”,但Gradle知道。因此,在查看Gradle文件时,它会显示为警告,但是构建仍将正常工作。因为它不知道“ext”,所以它似乎也不知道您添加的变量,因此这些变量也将在IDE中作为警告下划线显示。但是它可以工作 :)


11

有趣的是,我在 Android Studio 中没有找到符合我的预期的解决方案。但是我在这里提供的这个解决方案可以正常工作,在 Android Studio 编辑器中没有任何警告。

像每个人一样,在根 build.gradle 文件中进行定义:

buildscript {
    ext {
        projectAppCompatVersion = 'com.android.support:appcompat-v7:23.3.0'
        projectSupportVersion = 'com.android.support:support-v4:23.3.0'
        projectCompileSdkVersion = 23
        projectMinSdkVersion = 22      // 15 android 4.0.3 for release
        projectTargetSdkVersion = 23   //23 requires permission requests , 22 for release
        projectBuildToolsVersion = "24.0.0rc2"
    }
 }

并且可以无警告地访问:

compileSdkVersion project.properties.projectCompileSdkVersion
buildToolsVersion project.properties.projectBuildToolsVersion

然而,在Android Studio中,代码补全和变量解析并不像我期望的那样工作。


6
在主项目的 build.gradle 文件中,您应该编写类似下面的内容:
project.extensions.add("buildToolsVersion", "19.0.3")

在子项目中,您可以使用以下扩展:

buildToolsVersion rootProject.buildToolsVersion

更多信息可以在这里找到


这个似乎不起作用:无法确定任务':myproject:mysubproject:compileDebugJava'的依赖项。
缺少android.buildToolsVersion!正如您所看到的,缺少android闭包。
- Markw

5
创建一个适合您项目的自定义属性。要设置单个属性,请使用以下命令:
project.ext.compileSdkVersion = 21

要设置多个属性,请使用以下方法:

project.ext {
    compileSdkVersion = 21
    buildToolsVersion = "21.0.1"
    targetSdkVersion = 21
}

2
在更新的Android Studio中,有一种更简单的方法。你可以在项目的顶层层次结构中找到一个名为“gradle.properties”的文件来定义你的参数。只需在该文件中定义即可:
common_parameter='I am common"

并在模块的 Gradle 文件(build.gradle)中使用它,如下所示:

module_parameter = common_parameter

这就是全部了。

使用gradle 2.14.1对我不起作用,我收到以下错误信息: `Error:(24, 1) A problem occurred evaluating root project 'MyRootProject'.
Could not set unknown property 'common_parameter' for project ':MySubLibraryProject' of type org.gradle.api.Project.`
- arberg

2
仅仅从顶层构建中引用“android”闭包是行不通的,如果顶层构建不是一个Android构建。在评估之前,“android”方法是不可用的。最初,我有一个基于afterEvaluate设置配置的解决方案,但它不再起作用(Android Studio 0.6.0):
Android任务已经被创建。这发生在调用android.applicationVariants、android.libraryVariants或android.testVariants时。一旦调用了这些方法,就无法继续配置模型。

0

您可以在项目级别的 gradle.properties 中定义版本,例如:

In gradle.properties file:

TARGET_SDK_VERSION = 33
COMPILE_SDK_VERSION = 33
BUILD_TOOLS_VERSION = 33.0.0

然后,在模块的 build.gradle 中使用它:

android {
    compileSdkVersion COMPILE_SDK_VERSION.toInteger()
    buildToolsVersion BUILD_TOOLS_VERSION

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion TARGET_SDK_VERSION
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    ...

注意编译Sdk版本,需要额外调用.toInteger()方法。


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