Gradle构建Android工程

参考链接:

Android Gradle插件是Google专门为Android工程做的一个Gradle的第三方插件。它可以完成测试、部署、签名和分发打包apk.

关于Gradle构建原理和过程请看《Gradle构建过程浅析》

构建流程

AndroidGradle构建流程

如上图,典型的Android应用模块构建流程通常依循如下步骤:

  1. 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中包括运行在 Android 设备上的字节码),将所有其他内容转换成已编译资源。
  2. APK 打包器将 DEX 文件和已编译资源合并成单个 APK。不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上。
  3. APK 打包器使用调试或发布密钥库签署您的 APK.
  4. 在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时的内存占用。

顶级构建文件

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
    }
}

上面的repositories是第三方插件的托管仓库,dependencies是插件jar包地址。

除了上面配置,默认生成的Android工程中还有如下配置:

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

上面的 allprojects{} 中用于配置影响到整个工程的所有build.gradle的公共配置。

运行gradle clean时,执行此处定义的task,该任务继承自Delete,删除根目录中的build目录。

模块级构建文件

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
}

上面 com.android.application 就是前面提到的plugin id, android{ } 是Android插件提供的一个扩展类型,可以自定义一些特定配置。

除了上面配置外,默认生成的Android工程中还有如下配置:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

dependencies { } 是模块级别的配置,在其中声明本模块的依赖。

属性文件

Gradle 还包括两个属性文件,位于项目根目录,可用于指定适用于 Gradle 构建工具包本身的设置。

gradle.properties

配置项目范围 Gradle 设置,例如 Gradle 后台进程的最大堆大小,更多请参考:构建环境

local.properties

为构建系统配置本地环境属性,例如 SDK 安装路径。该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境,所以一般不应手动修改该文件,或者将其纳入版本控制。

构建配置文件

创建新项目后,Android Studio 会自动为创建其中的部分文件,并填充合理的默认值。

AndroidGradle项目目录结构

android中的扩展类型:

类型描述
AppExtension安卓的applicaiton扩展插件
LibraryExtensioncom.android.library 的扩展插件
TestExtensioncom.android.test 的扩展插件
FeatureExtensioncom.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

packagingOptions {
    exclude('META-INF/NOTICE')
    exclude('META-INF/LICENSE')
}

例2: 配置打release包的签名文件和别名密码

signingConfigs {
    release {
        storeFile file(project.relativePath("./sign.jks"))
        storePassword "xxxxxx"
        keyAlias "xxxxxx"
        keyPassword "xxxxxx"
    }
}

例3:配置工程的Java编译版本

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

例4:设置lint是否应该在发现错误时退出进程

lintOptions {
    abortOnError false
}