【问题标题】:How to define common android properties for all modules using gradle如何使用 gradle 为所有模块定义通用的 android 属性
【发布时间】:2013-12-05 15:50:59
【问题描述】:

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

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 18
    }
}

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

【问题讨论】:

  • 您是否考虑过在顶级 gradle 文件中使用 ext { } 块?

标签: android gradle


【解决方案1】:

您可以在项目的根目录(即包含所有模块的文件夹)创建一个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 plugin 0.12.2 和 gradle 1.1 Could not find method compileSdkVersion() for arguments [20] on root project 'android'.
  • compileSdkVersion 18 更改为 compileSdkVersion = 18
【解决方案2】:

在最顶层的 build.gradle 中定义这个似乎可行

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

【讨论】:

  • 我结合使用了这种方便的方法:stackoverflow.com/questions/20827885/…
  • 这很好用,但是这样子项目就不能覆盖默认值。您应该在设置值之前检查 compileSdkVersion 和 buildToolsVersion 是否存在。
  • 效果很好,这个配置会覆盖所有子项目。
  • 太棒了!我用它来修补 git 子模块中的一个值:project(':submoduleName') { afterEvaluate { project -> android { defaultConfig { minSdkVersion 19 }}}}
【解决方案3】:

这适用于我在 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 中作为警告加下划线。但它有效:)

【讨论】:

    【解决方案4】:

    嗯,有趣的是,我没有找到像我在 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 所期望的那样工作。

    【讨论】:

      【解决方案5】:

      在主项目的 build.gradle 中,你应该写如下内容:

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

      在子项目中你可以使用这个扩展:

      buildToolsVersion rootProject.buildToolsVersion
      

      更多信息你可以找到here

      【讨论】:

      • 这不太行:无法确定任务 ':myproject:mysubproject:compileDebugJava' 的依赖关系。 > android.buildToolsVersion 丢失!可以看到,android 闭包不见了
      【解决方案6】:

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

      project.ext.compileSdkVersion = 21
      

      设置多个属性使用:

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

      【讨论】:

        【解决方案7】:

        如果顶层构建不是 android 构建,则仅从顶层构建引用“android”闭包不起作用。 'android' 方法在评估后才可用。最初,我有一个基于设置配置 afterEvaluate 的工作解决方案,但它不再有效(Android Studio 0.6.0):

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

        【讨论】:

          【解决方案8】:

          在更新的 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.
          猜你喜欢
          • 1970-01-01
          • 2015-10-22
          • 1970-01-01
          • 2018-07-17
          • 1970-01-01
          • 2014-11-14
          • 1970-01-01
          • 1970-01-01
          • 2015-10-22
          相关资源
          最近更新 更多