参考链接:
- [1] . 《Android Developer》
- [2] . 《Android Plugin DSL》
Android Gradle插件是Google专门为Android工程做的一个Gradle的第三方插件。它可以完成测试、部署、签名和分发打包apk.
关于Gradle构建原理和过程请看《Gradle构建过程浅析》
构建流程
如上图,典型的Android应用模块构建流程通常依循如下步骤:
- 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中包括运行在 Android 设备上的字节码),将所有其他内容转换成已编译资源。
- APK 打包器将 DEX 文件和已编译资源合并成单个 APK。不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上。
- APK 打包器使用调试或发布密钥库签署您的 APK.
- 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时的内存占用。
顶级构建文件
|
|
上面的repositories是第三方插件的托管仓库,dependencies是插件jar包地址。
除了上面配置,默认生成的Android工程中还有如下配置:
|
|
上面的 allprojects{} 中用于配置影响到整个工程的所有build.gradle的公共配置。
运行gradle clean时,执行此处定义的task,该任务继承自Delete,删除根目录中的build目录。
模块级构建文件
|
|
上面 com.android.application 就是前面提到的plugin id, android{ } 是Android插件提供的一个扩展类型,可以自定义一些特定配置。
除了上面配置外,默认生成的Android工程中还有如下配置:
|
|
dependencies { } 是模块级别的配置,在其中声明本模块的依赖。
属性文件
Gradle 还包括两个属性文件,位于项目根目录,可用于指定适用于 Gradle 构建工具包本身的设置。
gradle.properties
配置项目范围 Gradle 设置,例如 Gradle 后台进程的最大堆大小,更多请参考:构建环境
local.properties
为构建系统配置本地环境属性,例如 SDK 安装路径。该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境,所以一般不应手动修改该文件,或者将其纳入版本控制。
构建配置文件
创建新项目后,Android Studio 会自动为创建其中的部分文件,并填充合理的默认值。
android中的扩展类型:
类型 | 描述 |
---|---|
AppExtension | 安卓的applicaiton扩展插件 |
LibraryExtension | com.android.library 的扩展插件 |
TestExtension | com.android.test 的扩展插件 |
FeatureExtension | com.android.feature 的扩展插件 |
android中可用的配置模块:
模块 | 描述 |
---|---|
aaptOptions{ } | aapt是一个可以将资源文件编译成二进制文件的工具。aaptOptions表示aapt工具设置的可选项参数。 |
adbOptions { } | adb的可选项参数 |
buildTypes { } | 需要构建的类型,比如release、debug,更多配置请参考BuildType |
compileOptions { } | 指定java编译器类型,更多配置请参考CompileOptions |
dataBinding { } | 通过声明的方式将UI组件绑定到应用程序数据,更多配置请参考Data Binding Library |
defaultConfig { } | application的所有配置属性,更多配置请参考ProductFlavor |
dexOptions { } | 指定dex工具选项,例如启用库预处理 |
externalNativeBuild { } | native编译支持 |
jacoco { } | JaCoCo可选项参数 |
lintOptions { } | 指定lint工具选项,更多配置请参考LintOptions |
packagingOptions { } | packaging的可选参数,更多配置请参考PackagingOptions |
productFlavors { } | 产品风格配置 |
signingConfigs { } | 签名文件的可选项参数 |
sourceSets { } | 资源文件目录指定(Android中有自己的AndroidSourceSets,这个一般用于assets,jin等目录) |
splits { } | splits类型 |
testOptions { } | 测试可选项参数 |
部分举例
例1:apk打包不包含META-INF/NOTICE 和 META-INF/LICENSE
|
|
例2: 配置打release包的签名文件和别名密码
|
|
例3:配置工程的Java编译版本
|
|
例4:设置lint是否应该在发现错误时退出进程
|
|