Android Studio 2.3 的平台已经已经是相对稳定的发布版,新的功能不断推出,包括对NDK 的完美支持。它看起来有一些重大的改变也正在等待合适的孵化时机,如:新的 Gradle 构建工具以及新设计的 DSL (gradle 脚本代码结构)
理解Gradle脚本
当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具。当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件,两个build.gradle,一个settings.gradle,build.gradle分别放在了根目录和moudle目录下,下面是gradle文件的构成图:
MyApp├── build.gradle├── settings.gradle└── app└── build.gradle
根目录的build.gradle
该gradle文件是定义在这个工程下的所有模块的公共属性,它默认包含二个方法:
buildscript {repositories {jcenter() }dependencies {classpath 'com.android.tools.build:gradle:1.2.3'}
}
allprojects {repositories {jcenter() }
}
buildscript方法是定义了全局的相关属性,repositories定义了jcenter作为仓库。一个仓库代表着你的依赖包的来源,例如maven仓库。dependencies用来定义构建过程。这意味着你不应该在该方法体内定义子模块的依赖包,你仅仅需要定义默认的Android插件就可以了,因为该插件可以让你执行相关Android的tasks。
allprojects方法可以用来定义各个模块的默认属性,你可以不仅仅局限于默认的配置,未来你可以自己创造tasks在allprojects方法体内,这些tasks将会在所有模块中可见。
模块内的build.gradle
模块内的gradle文件只对该模块起作用,而且其可以重写任何的参数来自于根目录下的gradle文件。Android
该方法包含了所有的Android属性,而唯一必须得属性为compileSdkVersion和buildToolsVersion:
-
compileSdkVersion:编译该app时候,你想使用到的api版本。
-
buildToolsVersion:构建工具的版本号。
构建工具包含了很多实用的命令行命令,例如aapt,zipalign,dx等,这些命令能够被用来产生多种多样的应用程序。你可以通过sdk manager来下载这些构建工具。
Gradle能够很轻松的构建不同版本的app,使用构建变种。举个例子,其能够很轻松的创建一个免费版本和付费版本的app。这两个版本需要分隔的标示码,所以他们能够以不同的app出现在各大应用商店,当然他们也能够同时安装在一个手机中。资源代码和R文件必须拥有相同的包名,否则你的资源代码将需要改变,这就是为什么Android开发团队要将package name的两大功能拆分开。在AndroidManifest文件中定义的package name依然被用来作为包名和R文件的包名。而applicationid将被用在设备和各大应用商店中作为唯一的标示。
接下来将是minSdkVersion和targetSdkVersion。这两个和AndroidManifest中的<uses-sdk>很像。minSdkVersion定义为最小支持api。
versionCode将会作为版本号标示,而versionName毫无作用。
所有的属性都是重写了AndroidManifest文件中的属性,所以你没必要在AndroidManifest中定义这些属性了。
buildTypes方法定义了如何构建不同版本的app,我们将在下一篇博客中有所介绍。
依赖包
依赖模块作为gradle默认的属性之一(这也是为什么其放在了Android的外面),为你的app定义了所有的依赖包。默认情况下,我们依赖了所有在libs文件下的jar文件,同时包含了AppCompat这个aar文件。我们将会在下一篇博客中讨论依赖的问题。
让我们开始tasks吧
如果你想知道你多少tasks可以用,直接运行gradlew tasks,其会为你展示所有可用的tasks。当你创建了一个Android工程,那么将包含Android tasks,build tasks,build setup tasks,help tasks,install tasks,verification tasks等。
基本的tasks
android插件依赖于Java插件,而Java插件依赖于base插件。
base插件有基本的tasks生命周期和一些通用的属性。
base插件定义了例如assemble和clean任务,Java插件定义了check和build任务,这两个任务不在base插件中定义。
这些tasks的约定含义:
-
assemble: 集合所有的output
-
clean: 清除所有的output
-
check: 执行所有的checks检查,通常是unit测试和instrumentation测试
-
build: 执行所有的assemble和check
Java插件同时也添加了source sets的概念。
Android tasks
android插件继承了这些基本tasks,并且实现了他们自己的行为:
-
assemble 针对每个版本创建一个apk
-
clean 删除所有的构建任务,包含apk文件
-
check 执行Lint检查并且能够在Lint检测到错误后停止执行脚本
-
build 执行assemble和check
默认情况下assemble tasks定义了assembleDebug和assembleRelease,当然你还可以定义更多构建版本。除了这些tasks,android 插件也提供了一些新的tasks:
-
connectedCheck 在测试机上执行所有测试任务
-
deviceCheck 执行所有的测试在远程设备上
-
installDebug和installRelease 在设备上安装一个特殊的版本
-
所有的install task对应有uninstall 任务
Android Gradle 构建工具
Android Gradle 构建工具是一个运行时用于处理 module 下的 build.gradle
文件的,在这个文件传递到 Gradle 去做进一步操作之前进行的。
Gradle Build Tools 在项目中的 build.gradle
声明就像下面这样:
dependencies {classpath 'com.android.tools.build:gradle:1.2.3'
}
每个版本的 Gradle Build Tools 可以与下面列出的受支持的 Gradle 版本协同工作。
Android Gradle build tools | Gradle |
---|---|
1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
1.2+ | 2.2.1+ |
在 Android Gradle Build Tools 中定义了语法规则,和我们使用的语法规则在 build.gradle
文件中来写 Gradle 脚本。
build.gradle
文件中更改 build tools 的版本:
dependencies {classpath 'com.android.tools.build:gradle-experimental:0.1.0'
}
请注意, 新版本的 build tools 要与刚刚发布的 Gradle 3.3 一起使用才行,所以你需要首先安装 Gradle3.3,在你的项目的 gradle/gradle-wrapper.properties
文件下修改 distributionUrl
这一行:
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip