Android Studio 中的Gradle构建系统示例

相信有很多像我一样的朋友在使用Android Studio时,对 Gradle 和 Gradle Android 插件的版本号和作用不是很清楚,本篇文章的将对这些进行解释,最后通过一个实际的项目工程来说明其中的配置块的含义,并通过源代码的角度去剖析脚本的结构。

一.第一部分:Q&A

1.Gradle是什么?

Gradle 是一个JVM平台上的自动化的构建工具,支持多项目构建,强有力依赖管理(本地或者远程依赖),构建脚本使用Groovy语言编写。

在Android Studio的 project 视图下的 gradle/ wrapper/gradle-wrapper.properties 路径下声明了项目使用的Gradle版本号,这里使用的是 3.3版本

distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

2.Gradle Android Plugin 是什么?

在项目根目录中的build.gradle文件中有如下设置:

dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
  }

这里声明的是项目对 Gradle Android Plugin 的依赖,其版本号为2.3.3。Gradle的Android插件提供了许多专为构建Android的操作项。

classpath表明的是类路径,该Android Plugin for Gradle 的对应文件位置在Android Studio根目录下的:gradle/m2repository/com/android/tools/build/gradle/对应版本号/gradle-3.0.0.jar

附上我电脑上的路径

可以看到,我们依赖的仅仅就是jar文件,build.gradle的脚本是使用Groovy语言编写的,Groovy编写的程序可以运行在JVM虚拟机中。而Android Plugin for Gradle是专门为构建Android项目提供库文件。

平时我们经常使用的比如 buildToolsVersion、compileSdkVersion,buildTypes{ }、sourceSets { }、defaultConfig{ }等方法函数(是的,就是方法,这是Groovy语言中的闭包和函数调用时的特性,现在无需关心,后面第三部分有讲到这个),都是Gradle Android Plugin 这个库提供的方法。可不要以为Gradle仅仅是用来构建Android项目。

3.Android Studio中的compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion这些配置项是什么?

  1. compileSdkVersion 26 :编译项目使用的Android SDK的版本号为26,可以使用对应版本号提供的API进行编程
  2. minSdkVersion 14 :定义最小可以运行app的android系统版本号为14
  3. targetSdkVersion 26 :指定测试app的android系统版本号为26
  4. buildToolsVersion "26.0.2" :指定Android Studio中 sdk 构建工具的版本号、命令行工具等构建工具,在使用Android plugin 3.0.0版本或以上时,该属性可以不用设置,插件会提供默认版本号。

在导入github上面的工程时,如果该工程所需要的Gradle版本、Android Plugin版本、buildToolsVersion版本,SDK 版本与你本地不符合时,往往会卡死,所以在导入之前可以更改为你本地的版本,在进行导入即可。

4. Gradle Wrapper是什么?

The Gradle Wrapper allows you to execute Gradle builds on machines where Gradle is not installed. This is useful for example for some continuous integration servers. It is also useful for an open source project to keep the barrier low for building it. The wrapper is also very interesting for the enterprise. It is a zero administration approach for the client machines. It also enforces the usage of a particular Gradle version thus minimizing support issues.
Gradle Wrapper 可以在没有安装Gradle的机器上执行Gradle 构建,经常在持续性构建平台上所使用,例如jenkis。同时对于客户端机器来说零成本管理。

Gradle User Guide

第二部分. 关于Android Studio 工程项目你需要知道的一些东西

  1. Android Studio项目工程包含一个Application module,包含若干个Library module。 Library module可以是Android library,也可以是java library。
  2. Android Library : 包含Android项目中的源代码、资源文件、manifest文件,被编译为AAR文件。AAR文件可做为Android 应用模块的依赖。
  3. java library : 仅包含java源文件,编译的结果为JAR文件,可作为Android 应用模块的依赖或者java 项目的依赖。
  4. 每个module都可以被单独的构建,测试与调试,同时moudle可用来作为其他工程使用的library。

第三部分 .实际工程分析

通过github上的timber项目分析各模块下的build.gradle配件文件的含义。可以直接到github上搜索找到该项目。

1.Timber项目结构

根目录的setting.gradle文件,告诉Gradle需要构建的模块包括那些

include ':timber',include ':timber-lint',include ':timber-sample'

a.其中timber-sample是Application 模块,对应声明为

apply plugin: 'com.android.application'

b.timber是android library 模块,对应声明为

apply plugin: 'com.android.library'

c.timber-lint是java library模块,对应声明为

apply plugin: 'java-library'

2. build.gradle 文件中结构解释, 大招来了 :)

下面我将通过简单易懂的方式去让使用者理解build脚本文件的结构。

常见的模块下build.gradle文件格式如下:

apply plugin: 'com.android.application'

android {
  compileSdkVersion 25
  buildToolsVersion "26.0.1"
  defaultConfig {

  }
  buildTypes {

  }
}

dependencies {

}

2.1: “apply plugin: 'com.android.application'” 语句解释:

Gradle是使用Groovy所写,这里是调用了 apply方法,Groovy中方法调用时可以省略括号,在你按住Control + 左键(mac为command+左键)时,可以进入到对应的类中,之前上文也提到过,Android Plugin 仅仅是Jar文件,让我们进入看看其中的对应方法是什么?

public interface PluginAware {
  void apply(Map<String, ?> options);
}

在Grovvy中 a.b() 这种格式可以写为a b

所以呢 compileSdkVersion ,apply 等语句都是在调用对应的函数

2.2 xxx { } 格式到底是什么?

def debugClosure(int num, String str, Closure closure){
   //dosomething
} 

debugClosure(1, "groovy", {
 println"hello groovy!"
})

首先"{ }" 在Groovy语言中是“闭包”,简单讲闭包就是用“{ }”扩起来的一段代码段 ,在Groovy中有调用方法的时候有这样一条规定:“在调用方法的时候,如果方法仅有一个参数是Closure类型(也就是闭包),调用的时候,可以把闭包中的执行的代码写到括号中,为xxx({ }),当把括号省略之后就变成了 xxx{ } 格式”。

最前面代码中的"android{ }"语句函数定义在Project类中,函数定义为:

AppExtension android(Closure configuration);

结论:build.gradle脚本文件在运行的其实就是在执行一系列的函数

3. 根目录下build.gradle文件分析

该文件定义的是整个项目的构建配置,该配置同样生效于其他module

3.1 extra 属性

我们可以在项目顶级build.gradle中声明ext 块,在其中定义的属性可以在其他各个模块中去使用,通过这种方式可以一次性更改项目的各个模块的构建配置。

ext {
  compileSdkVersion = 26、
  supportLibVersion = "26.1.0"
}

使用:在其他模块通过rootProject.ext.compileSdkVersion去使用该属性。

3.2 buildScript 块

buildscript {
 repositories {
  jcenter()
  google()
 }

 dependencies {
  classpath deps.androidPlugin
  classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0'
 }
}

其中repositories中声明的是远程仓库的类别,平时我们在dependencies块中使用的类似compile 'io.reactivex:rxjava:1.0.0'语句,它在jcenter仓库中都是唯一存在,在构建的时候,本地如果没有的话,会到jcenter中去进行下载对应的版本。

4. 模块下的build.gradle文件分析

1、defaultConfig 块:定义的是APK各种构建版本的默认设置,这里面的一些属性可在AndroidManifest.xml文件中重载配置

  applicationId 'com.example.myapp'
  minSdkVersion 15
  targetSdkVersion 26
  versionCode 1
  versionName "1.0"
 }

productFlavors 块: 可以配置多种产品类型,比如可以一个是free,另外一种类型是免费

productFlavors {
  free {
   applicationId 'com.example.myapp.free'
  }

  paid {
   applicationId 'com.example.myapp.paid'
  }
 }

buildTypes 块:可以配置多种构建类型的相应的配置项,比如debug、relase版本。

buildTypes {
  release {
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 为Android Studio编写自定义Gradle插件的教程

    Google已经建议Android开发全部转向Android Studio开发,Android Studio 是使用gradle编译.打包的,那么问题来了,gradle可是有一堆东西...,为了彻底了解gradle,今天就来学习下如何写自己的gradle插件(当然插件源码是使用groovy写的),先看如下代码目录: 如上图所示,plugin目录是插件源码目录,sample是用来测试插件的. 1.在目录plugin/src/main/groovy/com/micky/gradle/下新建插件类My

  • Android Studio使用教程(六):Gradle多渠道打包

    由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: 复制代码 代码如下: <meta-data     android:name="UMENG_CHANNEL"     android:value="Channel_ID" /&g

  • 详解Androidstudio3.0 关于Gradle报错的问题(小结)

    前言 升级Android Studio to 3.0 canary 1版本后,之前一个正常的Project,一直报错,报错内容如下 Error:Failed to complete Gradle execution. Cause: The version of Gradle you are using (3.3) does not support the forTasks() method on BuildActionExecuter. Support for this is available

  • Android studio利用gradle打jar包并混淆的方法详解

    本文主要介绍了Android studio利用gradle打jar包并混淆的方法,下面话不多说,来看看详细的介绍吧. 首先打jar包的配置很简单,使用jar的task,可以参考gradle官方文档,具体代码如下: task buildJar(type: Jar, dependsOn: ['assembleRelease']) { destinationDir = file('build/outputs/jar/') appendix = "" baseName = "&quo

  • Android Studio使用教程(四):Gradle基础

    其实很早之前也写了一篇Gradle的基础博客,但是时间很久了,现在Gradle已经更新了很多,所以暂且结合Stduio 1.0正式版与最新的Gradle语法来详细讲解下,小伙伴们直接跟我一步步来学习吧. 什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 安装Gradle 在Android Studio系列教程一–下载与安装中新建项目成功后会下载Grad

  • AndroidStudio 使用过程中出现的异常(Gradle sync failed)处理办法

    AndroidStudio使用过程中出现的异常 异常信息: Gradle sync failed: Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer to the user guide chapter on th

  • AndroidStudio更新出现Refreshing 'xxx' Gradle Project状态解决办法

    前言 开发项目之前,我用的是AndroidStuio2.1.0版本,项目开发完后,按耐不住就更新编译环境了.编译环境更新至AndroidStuio2.2.2. 更新完后,激动的打开AndroidStudio,原来的项目就处于如下状态: 本来以为这是更新后的正常情况,结果一直处于这种状态.然后搜索了一下网上,总结到一个简单方便的解决方法: 第一步: 关闭项目,进入AndroidStudio安装目录下的gradle文件夹中,查看新版本AndroidStudio的gradle版本,如下图: 复制上面的

  • Android Studio使用教程(五):Gradle命令详解和导入第三方包

    Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看.编译并导入第三方开源项目的方法. Sublime + Terminal编译并查看源码 首先来给大家介绍一种简便并且个人最喜欢的一种办法.很多时候我们在GitHub上看到一个不错的开源项目,一般有两种需求,阅读源码和查看运行效果,如果是单纯的查看源码我更喜欢用一些轻量级编辑器,如vim,sublime等,vim不是很熟练,所以个人一种都习惯用sublime来查看

  • Android Studio 中的Gradle构建系统示例

    相信有很多像我一样的朋友在使用Android Studio时,对 Gradle 和 Gradle Android 插件的版本号和作用不是很清楚,本篇文章的将对这些进行解释,最后通过一个实际的项目工程来说明其中的配置块的含义,并通过源代码的角度去剖析脚本的结构. 一.第一部分:Q&A 1.Gradle是什么? Gradle 是一个JVM平台上的自动化的构建工具,支持多项目构建,强有力依赖管理(本地或者远程依赖),构建脚本使用Groovy语言编写. 在Android Studio的 project

  • Android Studio中的Gradle依赖深入讲解

    前言 Android studio依赖项目是使用gradle管理的,依赖一个项目.一个jar包.一个工程,都可以在这里进行配置,本文将给大家详细介绍关于Android Studio中Gradle依赖的相关内容,下面话不多说了,来一起看看详细的介绍吧 一.不同类型的library引入方案: 1.本地Module library依赖: 通过这种方式依赖的弊端是每次都需要构建module,当module比较多时构建非常耗时,建议控制module的依赖数量,避免构建耗时 //module需要在项目根目录

  • Android Studio 中Gradle配置sonarqube插件(推荐)

    目录 一,使用公共Maven仓库: 二,使用私有Maven仓库: Sonarqube作为一个很实用的静态代码分析工具,在很多项目中都使用.Android自然也不例外.这里就分享下使用Android Studio时如何在Gradle里配置Sonarqube. 以下分别就使用公共maven仓库和私有maven仓库两种情况来简单说明下: 一,使用公共Maven仓库: 这个比较简单. 打开gradle sonarqube插件官方网址:https://plugins.gradle.org/plugin/o

  • Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    Note:这篇文章是基于Android Studio 3.01版本的,NDK是R16. step1:创建一个包含C++的项目 其他默认就可以了. C++ Standard 指定编译库的环境,其中Toolchain Default使用的是默认的CMake环境:C++ 11也就是C++环境.两种环境都可以编库,至于区别,后续会跟进,当前博文使用的是CMake环境. Exceptions Support 如果选中复选框,则表示当前项目支持C++异常处理,如果支持,在项目Module级别的build.g

  • android studio创建C++项目的实现示例

    目录 一.创建Native C++工程 二.配置工程环境 三.运行代码 四.下载C++运行依赖的工具包 五.创建虚拟机 六.运行代码 问题一:如果启动虚拟机后,而左上角的虚拟机没有加载出来. 问题二:java文件无法运行,或者adb无法运行 一.创建Native C++工程 二.配置工程环境 三.运行代码 选择左上角的工程,将Android换成Project 四.下载C++运行依赖的工具包 如图所示,选择NDK和CMake,并点击Apply,此时会出现弹窗,告诉你要安装的包的名称.版本等信息,此

  • android项目从Eclipse迁移到Android studio中常见问题解决方法

    (1)将Eclipse项目导入到Android studio 中出现9-patch image问题解决方法: 在build.gradle里添加以下两句: aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false 用来关闭Android Studio的PNG合法性检查的,直接不让它检查. (2)Android Studio 错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface

  • Android Studio中配置OpenCV库开发环境的教程

    1.下载 进入官网(http://opencv.org/)下载OpenCV4Android并解压.目录结构如下图所示. 其中,sdk目录即是我们开发opencv所需要的类库:samples目录中存放着若干opencv应用示例(包括人脸检测等),可为我们进行android下的opencv开发提供参考:doc目录为opencv类库的使用说明及api文档等:而apk目录则存放着对应于各内核版本的OpenCV_2.4.3.2_Manager_2.4应用安装包.此应用用来管理手机设备中的opencv类库,

  • Android Studio手动配置Gradle的方法

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置. 面向Java应用为主.当前其支持的语言限于Java.Groovy和Scala,计划未来将支持更多的语言. 下面是一些Gradle的功能 按约定声明构建和建设: 强大的支持多工程的构建: 强大的依赖管理(基于Apache Ivy),提供最大的便利去构建工程: 全力支持已有的 Maven 或者Ivy仓库基础建

  • Android Studio中统一管理版本号引用配置问题

    方式一: 在gradle.properties中写入: #测试环境 ENV_TEST=test #开发环境 ENV_DEV=dev #生产环境 ENV_ONLINE=online APPLICATION_ID=com.xxx.xxxx COMPILE_SDK_VERSION=26 TARGET_SDK_VERSION=26 MIN_SDK_VERSION=15 SUPPORT_V4_SUPPORT=com.android.support:support-v4:26.1.0 SUPPORT_ANN

  • Android Studio 3.0 Gradle 配置变更

    多渠道打包变更 flavorDimensions "default" productFlavors { xxxx { dimension "default" } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] } 更改打包命名及路径 android.applicationVariants.all { variant -> if (va

随机推荐