Gradle在Android项目中的构建应用
Posted AndroidZack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle在Android项目中的构建应用相关的知识,希望对你有一定的参考价值。
什么是Gradle
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
android 构建系统编译应用资源和源代码,然后将它们打包成可供您测试、部署、签署和分发的 APK。Android Studio 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程,同时也允许您定义灵活的自定义构建配置。每个构建配置均可自行定义一组代码和资源,同时对所有应用版本共有的部分加以重复利用。Android Plugin for Gradle 与这个构建工具包协作,共同提供专用于构建和测试 Android 应用的流程和可配置设置。
构建流程
下面这幅图来自Google官网。
自定义构建
在AS中Gradle可以充分自定义,主要从五个方面着手:构建类型,产品渠道,构建变体,清单条目,依赖项,签名,ProGuard,APK 拆分。
1、构建类型
你可以在模块级 build.gradle 文件的 android {} 代码块内部创建和配置构建类型。当您创建新模块时,Android Studio 会自动为您创建调试和发布这两种构建类型。尽管调试构建类型不会出现在构建配置文件中,Android Studio 会将其配置为 debuggable true。这样,您可以在安全的 Android 设备上调试应用并使用通用调试密钥库配置 APK 签署。如下图,我在项目中定义了四种类型:
注:当您对构建配置文件进行更改时,Android Studio 会要求您为项目同步新配置。要同步项目,您可以在您做出更改后立即点击通知栏中出现的 Sync Now,也可以点击工具栏中的 Sync Project 。如果 Android Studio 通知配置出现错误,会显示 Messages 窗口,具体描述该问题。下面几类修改之后也要执行该操作。
2、产品渠道
创建产品渠道与创建构建类型类似:只需将它们添加到 productFlavors {} 代码块并配置您想要的设置。产品渠道支持与 defaultConfig 相同的属性,这是因为 defaultConfig 实际上属于 ProductFlavor 类。这意味着,您可以在 defaultConfig {} 代码块中提供所有风味的基本配置,每种渠道均可替换任何默认值,例如 applicationId。
下面是我项目中友盟多渠道打包的demo:
当然我们还可以改变其他属性:
不同的渠道版本号和packagename不同。
3、构建变体
构建变体是构建类型与产品渠道的交叉产物,是 Gradle 在构建应用时使用的配置。您可以利用构建变体在开发时构建产品渠道的调试版本,或者构建已签署的产品渠道发布版本进行分发。您并不直接配置构建变体,而是配置组成变体的构建类型和产品渠道。创建附加构建类型或产品渠道也会创建附加构建变体。下面是我构建四个不同变体分支的配置。
签名配置
不同分支编译签名相关也可以不同,这样在产品发布时是一套签名,测试调式时是另外一套签名,放置混淆。
类型配置
不同分支变体有不同的构建类型:
源集配置
可以在app模块下配置不同资源文件,如values下颜色或者字符串,这样不同分支可以有不同风格。其实也可以在此自定义build-types下面放置不同分支下有差异的具体.java类。AS在编译的时候会优先选择build-types下面的,覆盖调app/src/main/java/中相应类。
把对应sourceset包含进去:
4、清单条目
这里我把他放在sourceset配置当中。
5、依赖项
模块依赖项
compile project(':volley')
行声明了一个名为“volley”的本地 Android 库模块作为依赖项,并要求构建系统在构建应用时编译并包含该本地模块。
远程二进制依赖项
compile 'com.android.support:appcompat-v7:25.0.1'
行通过指定其 JCenter 坐标,针对 Android 支持库的 25.0.1 版本声明了一个依赖项。默认情况下,Android Studio 会将项目配置为使用顶级构建文件中的 JCenter 存储区。当你将项目与构建配置文件同步时,Gradle 会自动从 JCenter 中抽取依赖项。或者,你也可以通过使用 SDK 管理器下载和安装特定的依赖项。
本地二进制依赖项
compile fileTree(dir: 'libs', include: ['*.jar'])
行告诉构建系统在编译类路径和最终的应用软件包中包含app/libs/
目录内的任何 JAR 文件。如果您有模块需要本地二进制依赖项,请将这些依赖项的 JAR 文件复制到项目内部的<moduleName>/libs
中。
6、签名,ProGuard,APK 拆分
签名和混淆在上面构建不同分支变体中有锁体现,不在说明。混淆具体配置如图:
APK拆分
可以自动构建不同的 APK,并且每个 APK 只包含特定屏幕密度或应用二进制界面 (ABI) 所需的代码和资源。由于项目中我没有用到,也不想说明,具体见:https://developer.android.com/studio/build/configure-apk-splits.html
其实最权威的的还是得去官网上学习,网上搜出来的博客大多是这一点那一点的。我这篇文章也只是局限于自己的需求。
以上是关于Gradle在Android项目中的构建应用的主要内容,如果未能解决你的问题,请参考以下文章
在带有 Gradle 的 Android 项目中使用 JaCoCo
如何在没有 Gradle 的 Eclipse 中的 Android 项目上启用 multidex
Android Gradle 插件组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )