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

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

android { compileSdkVersion 18 buildToolsVersion "18.1.1" defaultConfig { minSdkVersion 7 targetSdkVersion 18 } } 

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

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

例如,如果你有:

 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 } 

在最上面的build.gradle中定义这个似乎是可行的

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

这适用于Android Studio 0.8.9。 使用默认的gradle wrapper 1.12-all。

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

我的项目结构是:

 Project/ gradle.build settings.gradle App/ gradle.build Lite/ gradle.build Pro/ gradle.build 

在项目/ gradle.build我已经添加了一个子项目configuration:

 subprojects { ext.global_compileSdkVersion = 19 ext.global_buildToolsVersion = "20.0.0" ... } 

ext。[var name]添加了可以在子项目中读取的variables。 我已经添加了前缀“global_”,以便更容易看到我的属性。 (另外请注意,我正在使用等号将值赋给variables)

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

 android { compileSdkVersion global_compileSdkVersion buildToolsVersion global_buildToolsVersion ... } 

注意!

Android Studio IDE似乎并不知道子项目中的“ext”,但是gradle确实如此。 因此,在查看gradle文件时显示为警告,但构build仍然可用。 因为它不知道“ext”,所以它似乎并不知道你添加的可变参数,所以这些在IDE中也会被强调为警告。 但它的作品:)

嗯有趣的是,我没有find解决scheme,因为我在Android Studio中应该这样做。 但只有这里我提出的解决scheme工作,所以在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 

但代码完成和variables分辨率不工作,因为我期望android工作室。

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

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

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

 buildToolsVersion rootProject.buildToolsVersion 

更多信息你可以在这里find

为您的项目创build一个自定义属性。 设置一个属性使用:

 project.ext.compileSdkVersion = 21 

设置多个属性使用:

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

如果顶级构build不是Android构build,只需从顶层构build引用“android”闭包不起作用。 “android”方法在评估之后才可用。 最初,我有一个工作的解决scheme,基于设置后评估但不能再工作(Android Studio 0.6.0):

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

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

 common_parameter='I am common" 

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

 module_parameter = common_parameter 

而已。