Android 为什么build.gradle不';你看起来不太好吗?

Android 为什么build.gradle不';你看起来不太好吗?,android,android-studio,gradle,groovy,Android,Android Studio,Gradle,Groovy,我读到gradle是用groovy编写的。 但是,我的build.gradle文件看起来不像groovy。 事实上,它看起来根本不像一种语言。 这是我的build.gradle文件: apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.isra

我读到gradle是用groovy编写的。
但是,我的build.gradle文件看起来不像groovy。
事实上,它看起来根本不像一种语言。 这是我的build.gradle文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.israelkariti.location2_1"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
    compile 'com.google.android.gms:play-services-maps:10.2.1'
    testCompile 'junit:junit:4.12'
}
谁能给我解释一下这个语法是怎么回事。
这种语法是如何成为Groovy代码的?
如果我遗漏了一些重要的东西,请详细说明它是如何工作的。

谢谢

好吧,Gradle为其DSL增加了一些魔力,但从技术上讲,每个Gradle脚本都是完全有效的Groovy

要理解像
依赖关系
应用插件:
等所有内容,我们需要了解不同类型的Gradle脚本:

  • 生成脚本(
    Build.gradle
  • 设置脚本(
    Settings.gradle
  • 初始化脚本(例如
    init.gradle
所有这些脚本都在不同的范围内执行,因为它们“应用于”不同的对象。Gradle将此行为称为“附加委托对象”

对于构建脚本(如您询问的脚本),此对象是一个。现在,让我们分析Gradle脚本:

apply插件:“com.android.application”

该接口扩展了接口,该接口定义了采用
映射的
apply
方法。在Groovy中,映射表示法是
[key:value,…]
,可以省略括号,并且
String
类型的映射键不写在引号中。因此,
plugin:'com.android.application'
只不过是一个Groovy映射,它交给了
apply
方法

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    ...
}
我将继续这一部分,并以
android
部分结束,因为这样更容易理解:

dependencies
不是Gradle关键字,它只是前面提到的接口的方法的名称。此方法采用一个
闭包
,它被包装在大括号内。正常的方法调用括号再次被省略。闭包是在对象上执行的。现在我们只需将依赖项添加到配置中。我们可以使用
add
方法并传递配置名称和依赖关系表示法(以及可选的新闭包)

格拉德尔魔法开始了。对于项目中的每个现有配置,将在
DependencyHandler
中添加一个新方法,该方法的名称为相应的配置,因此我们可以简单地使用此方法,而不是一直使用
add
。在为Java开发时,这些配置和方法包括
compile
runtime
testCompile
(以及其他)。
fileTree
再一次仅仅是接口的一种方法

android {
    compileSdkVersion 25
    ...
}
接口定义的方法不是唯一可用的方法。Gradle插件(如您正在使用的Android插件)可以添加扩展或约定。这样,属性和方法可以像属于对象一样被调用。这就是如何通过构建脚本中的闭包来配置
android
部分

android
闭包中,发生了一些额外的Gradle魔法。您可能知道,在Groovy中,可以省略
get
set
部分,直接访问属性(同时仍然调用可能的getter或setter)。Gradle还为每个属性添加了一个名为属性的方法,该方法可用作setter。这样,我们可以调用
compileSdkVersion
方法来设置
compileSdkVersion
属性。再次省略括号。这只是一些语法上的甜点,让我们省略赋值运算符


无论何时启动新的大括号级别,基本上都使用闭包来配置对象。有时创建新对象,有时使用现有特性。有时,您需要阅读文档以准确了解发生了什么。

Gradle不是用groovy编写的。Gradle构建脚本是一个groovy DSL。但是你在努力解决哪一个问题呢?对于依赖项:和Java项目:如果你包括插件和测试,那就足够公平了。主要的核心是Java,不过非常感谢。当你说“这只是一些语法上的甜点,让我们省略赋值运算符”时,你的意思是省略括号吗?用compileSdkVersion 25Groovy替换compileSdkVersion(25)可以省略所有“不必要的”括号,这是一种语言特性。因此,是的,您可以感谢Groovy编写了
compileSdkVersion 25
,而不是
compileSdkVersion(25)
。但通常,
compileSdkVersion
不是一个方法,而是一个属性,因此您可以通过
compileSdkVersion=25
为其赋值。现在Gradle为您生成了上面提到的方法,它是一个框架特性,您可以省略
=
符号。