文章是翻译整理的官网文档developer.android/studio/build/
一、Gradle和Gradle插件
-
Gradle:Gradle是一款帮助开发人员更快更好的编译、自动化运行和分发软件的工具。Gradle具有无与伦比的通用性,可以编译Java、C++,Python或者任何其他你使用的语言。Gradle官网链接。Android Studio创建的APP工程中可以在
gradle/wrapper/gradle-wrapper.properties
文件里配置gradle的版本,如下:
...
distributionUrl = https\://services.gradle.org/distributions/gradle-4.4-all.zip
...
-
Gradle插件:编译Android App的插件叫做Android Plugin for Gradle。 Android Studio的编译系统使用的就是Gradle,Android Plugin for Gradle增加了编译Android APP所需要的特性。 gradle-plugin安卓开发者官网 虽然这个插件一般都是和Android Studio同步更新,但是它可以独立于Android Studio单独运行和更新。Android Studio创建的APP工程中可以在顶层的
build.gradle
文件buildscript里配置依赖的插件版本。如下:
buildscript {
repositories {
// Gradle 4.1开始可以通过google()方法来支持Google的Maven仓库。
// 我们需要从这个仓库下载Android plugin 3.0.0或者更新的版本。
google()
...
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
}
}
不同版本的插件所需要的gradle版本也不一样,对应关系如下:
一般当升级Android Studio的时候会收到升级gradle插件到最新版本的提醒,我们可以直接接受建议升级版本,也可以使用原来工程的配置。不过为了最佳的性能,建议升级到最新的版本。
二、 构建Android APP的配置文件
自定义构建配置需要对一个或多个构建配置文件进行更改。这些纯文本文件使用域特定语言 (DSL) 以 Groovy 语言描述和操作构建逻辑,Groovy是一种适用于 Java 虚拟机 (JVM) 的动态语言。因为 Android Plugin for Gradle 引入了需要的大多数 DSL 元素,所以无需了解 Groovy 便可开始配置构建。如需了解有关 Android 插件 DSL 的更多信息,请阅读 DSL 参考文档。
开始新项目时,Android Studio 会自动为我们创建其中的部分文件,并为它们填充合理的默认值。
Android 应用标准项目结构中包括的 Gradle 构建配置文件有,Gradle设置文件
(settings.gradle)、Gradle构建文件
(顶级和模块级build.gradle文件)、Gradle属性文件
(gradle.properties和local.properties)。想要自定义构建配置,必须了解其中每一个文件的范围和用途及其应定义的基本 DSL 元素。下面我们就一个一个的看。
1. Gradle 设置文件
settings.gradle 文件位于项目根目录,用于指示 Gradle 在构建应用时应将哪些模块包括在内。对大多数项目而言,该文件很简单,只包括以下内容:
include ‘:app’
不过,多模块项目需要指定应包括在最终构建之中的每个模块。
2. Gradle 构建文件
2.1 顶级构建文件
顶级 build.gradle 文件位于项目根目录,用于定义适用于项目中所有模块的构建配置。默认情况下,这个顶级构建文件使用 buildscript {} 代码块来定义项目中所有模块共用的 Gradle 存储区和依赖项。以下代码示例描述的默认设置和 DSL 元素。
/**
* buildscript {} 是配置构建工具Gradle本身所需要的依赖和仓库的代码区块,
* 也就是说不能把APP模块所需要的依赖放到这里。
* 如:这个区块里包含gradle-plugin的依赖,因为这个插件包含了Gradle构建APP模块所需要的附加命令。
*/
buildscript {
/**
* repositories {} 区域配置Gradle用来下载依赖的仓库地址。
* Gradle内置支持的远程仓库有JCenter、Maven Central 和 Ivy,4.1版本开始内置支持google()。
* 也可以使用本地仓库或者配置我们自己的远程仓库地址。
* 下面代码示例Gradle使用JCenter作为查找依赖库的代码仓库。
*/
repositories {
jcenter()
}
/**
* dependencies {} 区域配置了Gradle编译APP工程所需要的依赖。
* 下面代码展示路径依赖3.1.0版本gradle-plugin
*/
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
}
}
/**
* allprojects {} 区域可以配置工程中所有模块都是到的代码仓库和依赖,如,三方插件或者库。
* 如果依赖不是被所有模块都需要,那应该将依赖配到需要它的模块级的build.gradle文件中。
* 在Android Studio新建的工程里,顶级的build.gradle中只配置JCenter为所有模块的默认仓库,但不配置任何依赖。
*/
allprojects {
repositories {
jcenter()
}
}
2.2 模块级构建文件
模块级 build.gradle 文件位于每个 <project>/<module>/ 目录,用于配置适用于其所在模块的构建设置。通过配置这些构建设置来提供自定义打包选项(例如附加构建类型和产品风味),以及替换 main/ 应用清单或顶级 build.gradle 文件中的设置。
以下这个示例 Android 应用模块 build.gradle 文件概述了应该了解的部分基本 DSL 元素和设置。
/**
* 编译配置第一句话意思是在构建工程中引入Android plugin for Gradle
* 这样我们才可以在android {}代码块中使用构建Android APP所需的特定编译选项。
*/
apply plugin: 'com.android.application'
/**
* android {} 中配置构建Android APP所需的特定编译选项。
*/
android {
/**
* compileSdkVersion:指定Gradle编译APP时所使用的Android API的版本。
* 这意味着我们的APP只能使用该版本及其以下版本中的API。
*
* buildToolsVersion:指定Gradle编译APP时所使用的SDK编译工具、命令行工具和编译器的版本。
* 我们需要通过SDK Manager去下载使用到的编译工具。
*/
compileSdkVersion 26
buildToolsVersion "27.0.3"
/**
* defaultConfig{}默认配置和配置编译变体的入口,
* 还可以在这里动态的覆盖main/AndroidManifest.xml的属性。
* 在这个区块还可以设置产品风味,给不同的风味版本配置不同的属性值。
*/
defaultConfig {
/**
* applicationId APP发布安装时的唯一标识.
* 但是在代码中引用的包名依然是在main/AndroidManifest.xml文件中属性package设置的名称。
*/
applicationId 'com.example.myapp'
// 定义APP需要支持的 Android API 最小的版本。
minSdkVersion 15
// 指定用来测试APP的 Android API 版本
targetSdkVersion 26
// 定义APP的版本
versionCode 1
// 定义APP的版本名
versionName "1.0"
}
/**
* buildTypes {} 区块中配置多个编译类型。编译系统默认定义了两个类型:debug and release.。
* debug类型:默认的配置文件中没有展示出来,它包含了debug工具,使用debug key签名APK。
* release类型:使用Proguard设置,默认不签名APK。
*/
buildTypes {
/**
* Android Studio默认配置release编译类型开启代码缩减和指定代码混淆文件。
*/
release {
minifyEnabled true // 开启代码缩减
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
/**
* productFlavors {} 区域可以配置不同的产品风味。
* 这里不同风味版本的配置可以覆盖掉 defaultConfig {} 中的设置。
* 产品风味是可选项,编译系统默认不会自动创建不同的产品风味。
* 下面例子创建了免费版和付费版两种产品风味。
* 每种产品风味都指定了自己的应用ID,这使得两种风味的版本可以同时安装在一个设备上。
*/
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
/**
* splits {} 配置可以针对不同的屏幕密度和不同ABI架构的设备编译不同的APP
*/
splits {
// APP分割机制针对屏幕密度的设置
density {
// 打开或关闭密度分割机制
enable false
// 分割APP不支持如下屏幕密度设备
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
}
abi {
enable true
// 清除默认配置
reset()
// 分割APP支持如下ABI设备
include "armeabi-v7a", "armeabi-v8a"
}
}
}
/**
* dependencies {} 代码块中指定本模块中所需要的依赖
*/
dependencies {
compile project(":lib")
compile 'com.android.support:appcompat-v7:27.1.1'
compile fileTree(dir: 'libs', include: ['*.jar'])
}
3. Gradle 属性文件
Gradle 还包括两个属性文件,位于项目根目录,可用于指定适用于 Gradle 构建工具包本身的设置:
3.1 gradle.properties
我们可以在其中配置项目范围的 Gradle 设置,例如 Gradle 后台进程的最大堆大小。如需了解详细信息,请参阅构建环境。
# Project-wide Gradle settings.
org.gradle.jvmargs=-Xmx2536M
android.useDeprecatedNdk=true
3.2 local.properties
为构建系统配置本地环境属性,例如 SDK 安装路径。由于该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境,因此我们不应该手动修改该文件,不应该将其纳入到版本控制系统中。
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
#Thu Sep 28 20:26:40 CST 2017
ndk.dir=/Users/name/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/name/Library/Android/sdk
三、构建Android APP的流程
如图所示,典型 Android 应用模块的构建流程通常依循下列步骤:
- 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中包括运行在 Android 设备上的字节码),将所有其他内容转换成已编译资源。
- APK 打包器将 DEX 文件和已编译资源合并成单个 APK。不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上。
- APK 打包器使用调试或发布密钥库签署您的 APK:
- 如果您构建的是调试版本的应用(即专用于测试和分析的应用),打包器会使用调试密钥库签署您的应用。Android Studio 自动使用调试密钥库配置新项目。
- 如果您构建的是打算向外发布的发布版本应用,打包器会使用发布密钥库签署您的应用。要创建发布密钥库,请阅读在 Android Studio 中签署您的应用。
- 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时的内存占用。