如何使用gradle为所有模块定义常见的android属性

时间:2013-12-05 15:51:00

标签: android gradle

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

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 18
    }
}

如何将此代码移动到主build.gradle脚本(项目脚本)?此代码适用于所有子模块。

8 个答案:

答案 0 :(得分:45)

您可以在项目的根目录(即包含所有模块的文件夹)中创建build.gradle,并使用它来配置rootProject。

例如,如果你有:

MyApp
  - Module1/
      - build.gradle
  - Module2/
      - build.gradle
  - settings.gradle

您可以在settings.gradle旁边添加build.gradle。

在上面的示例中,您实际上有3个Gradle项目: Module1 Module2 rootProject

所以在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
}

答案 1 :(得分:26)

在最顶层的build.gradle中定义它似乎可以正常工作

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

答案 2 :(得分:13)

这适用于Android Studio 0.8.9。使用默认的gradle包装器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。[var name]添加可在子项目中读取的变量。我添加了前缀" global _"所以更容易看到我的属性。 (另请注意,我使用等号将值赋给变量)

在每个子项目/模块中,gradle文件如下所示:

android {
    compileSdkVersion global_compileSdkVersion
    buildToolsVersion global_buildToolsVersion
    ...
}

请注意!

Android Studio IDE似乎并不了解" ext"在子项目中,但gradle确实如此。所以它在查看gradle文件时显示为警告,但构建仍然有效。因为它不知道" ext"它似乎并不知道您添加的可变数据,因此这些也将在IDE中作为警告加下划线。但它有效:)

答案 3 :(得分:7)

有趣的是,我没有找到可行的解决方案,因为我应该在Android Studio中使用它。但是我在这里只提供了这个解决方案,因此在Android Studio编辑器中没有任何警告并且有效。

在每个人的root 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那样工作。

答案 4 :(得分:6)

在主项目的build.gradle中,你应该写下一个东西:

project.extensions.add("buildToolsVersion", "19.0.3")

在子项目中,您可以使用此扩展程序:

buildToolsVersion rootProject.buildToolsVersion

您可以找到here

的更多信息

答案 5 :(得分:4)

为您的项目创建自定义属性。要设置单个属性,请使用:

project.ext.compileSdkVersion = 21

设置多个属性使用:

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

答案 6 :(得分:2)

简单地引用' android'如果顶级构建不是android构建,那么从顶级构建关闭不起作用。 ' android'方法在评估之后才可用。最初,我有一个基于设置afterEvaluate的工作解决方案,但它不再有效(Android Studio 0.6.0):

  

已经创建了Android任务。     调用android.applicationVariants时会发生这种情况,     android.libraryVariants或android.testVariants。     一旦调用了这些方法,就不可能     继续配置模型。

答案 7 :(得分:1)

在更新的Android Studio中有一种更简单的方法。您在顶层项目层次结构中有一个名为“gradle.properties”的文件。只需在那里定义您的参数:

common_parameter='I am common"

并在模块的gradle文件(build.gradle)中使用它:

module_parameter = common_parameter

就是这样。