章节主题:
- 理解Gradle files
- 开始构建任务
- 自定义构建
一,理解Gradle files
在AS里创建新工程,产生默认gradle文件, settings.gradle和build.gradle在project顶级目录,另一个build.gradle在app module目录下。
1.The settings.gradle
在新建的project下只包含一个Android App,settings.gradle一般只包含一句:
include ':app'
settings file在initialization阶段被执行,在文件里应该声明包含哪些modules,如上个例子,app module包含在内,单独module项目settings.file 是不必要的,但是在多module下,必须指定project包含的module。
在执行的时候,Gradle为每个settings file都创建一个settings对象,执行里面必要的方法。
2.顶层build.gradle
buildscript block是实际构建的配置位置,将repositories配置为JCenter,repositories是配置依赖关系的存储库位置的。 JCenter是一个著名的Maven仓库。
dependencies block用来配置构建过程本身需要的依赖,这意味着您不应该在顶级构建文件中包含您的应用程序或库所需的依赖关系。默认定义的唯一依赖项是Gradle的Android插件。这是每个Android模块所必需的,因为这个插件可以执行与Android有关的任务。
allprojects block用来配置所有module需要的属性。
最后一个clean任务用来清除build目录下构建所产生的文件。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
3.module层build.gradle
当前project只包含一个Android app module。
apply plugin: 'com.android.application'
android {
compileSdkVersion 23 //编译app的Android API版本
buildToolsVersion "23.0.1" //构建工具和编译器的版本(如aapt,zipalign,dx和renderscript等工具)
//defaultConfig块配置应用程序的核心属性。此块中的属性将覆盖AndroidManifest.xml清单文件中的相应条目
defaultConfig {
applicationId "com.my.test" //应用的唯一标识
minSdkVersion 15 //运行APP需要的最小API 版本
targetSdkVersion 23 //目标版本,告诉系统在此版本上APP已经通过测试,不需要特别的兼容行为。和compileSdkVersion无关
versionCode 1 //版本code
versionName "1.0" //版本友好名
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
}
该层的build.gradle主要包含3个block
1)plugin
在第一行声明了 Android application plugin,和顶层的build.gradle配置了依赖关系。 Android application plugin是由Google Android Tools team开发维护,提供了Android applications and libraries的构建,测试和打包需要的所有Task。
2)android
applicationId和AndroidManifest.xml中package name的区别:
applicationId与packageName的区别
3)buildTypes
给App构建或打包不同的版本类型,见第4章Creating Build Variants
4)dependencies
dependencies block是 Gradle 配置的标准块,所以没在Android block下。dependencies 配置了app或者library需要的所有依赖。详情见3章Managing Dependencies
二,开始构建任务
在控制台输入gradlew tasks查看所有任务,在Android project下包含 Android tasks, build tasks, build setup tasks, help tasks, install tasks,verification tasks and other tasks。说过你想查看他们之间的依赖,你可以运行 gradlew tasks --all。
1.Base tasks
base plugin定义 assemble和clean,Java base plugin定义check和build。这些任务不在基本插件中实现,不执行任何操作,它们用于定义插件执行实际任务的约定:
- assemble:组装项目输出
- clean: 清空项目输出
- check :运行所有check。比如unit test, instrumentation tests等
- build :assemble+check
2.Android tasks
Android plugin继承了base tasks并实现了这些操作:
- assemble:为每个类型产生APK
- clean: 清空build产出物,如APK file
- check :执行Lint检查,如有问题可中止运行
- build :assemble+check
assemble默认依赖于assembleDebug和assembleRelease,如果你添加了多种build types,assemble会触发所有的build type。
Android新添Tasks
connectedCheck 在一个连接的设备上运行测试
deviceCheck 其他插件在远程设备上运行测试的占位符Task
installDebug and installRelease 安装特定版本应用
uninstall卸载
运行check task会产生一个包含警告和错误的Lint 报告, 在app/build/outputs目录下。
当组装发布版时,Lint发现错误时会引起APP的crash,可以根据控制台输出或输出的文档的错误信息做相应的修复。
在Android Studio中可以双击任务名运行任务
三,自定义构建
在 Android Studio中更改settings.gradle or build.gradle后会触发 Sync Project with Gradle Files 按钮, Android Studio Sync实际运行了generateDebugSources task。
1.可操作属性
- testApplicationId (the instrument test APK application ID)
- testInstrumentationRunner (6章,Running Tests)
- signingConfig (4章, Creating Build Variants)
- proguardFile and proguardFiles (9章, Advanced Build Customization)
2.BuildConfig and resources
在SDK 17后,build tools会产生一个BuildConfig类,包含一些默认常量。对debugging时很有作用。
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.my.test";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
自己也可以在配置文件里配置需要的字段。比如配置测试和正式服务器地址。也可配置res的值
android {
buildTypes {
debug {
buildConfigField "String", "API_URL", "\"http://test.example.com/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
resValue "string", "app_name", "Example DEBUG" //res值配置
}
release {
buildConfigField "String", "API_URL", "\"http://example.com/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "false"
resValue "string", "app_name", "Example" //res值配置
}
}
}
3. Project-wide settings
可以在project目录配置自定义属性,使用ext block。在module层可以使用该配置
ext {
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
}
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
}