Gradle构建详解

最近遇到了clone项目gradle构建的问题,google众说纷纭,花了一些精力最终解决;想了下与其单独只说此次遇到的问题及解决方式,不如整体系统的梳理清楚,彻底解决今后遇到构建引发的一系列问题。gradle整体来说不难,主要比较广,杂。

1、首先说一下脚本

image.png

image.png

这几个文件在新建工程中自动生成,帮助我们可以直接实现命令,如在terminal中实现./gradlew ***,所以即使gradle未构建成功,也可实现命令行输出。

附:在命令行输出与在终端进入工程目录输出命令是一样的

2、gradle版本和android gradle插件版本

(1)gradle版本

gradle-wrapper.properties中包含参数及gradle版本下载地址,最后一句重要distributionUrl=https://services.gradle.org/distributions/gradle-4.4-all.zip,这就是gradle版本与File下面的project structure的工程gradle版本一样

image.png

(2)android gradle插件版本

是根目录下的build.gradle中的classpath 'com.android.tools.build:gradle:2.3.3',因为gradle中可以适用于C++、android等等各种工程的构建,所以本身当然不包含android用到的相关方法,这就需要用插件来实现,如下:android就是插件中的,dependencies就是gradle里面的。

image.png

3、buildscript与allprojects

image.png

二者都包含repositories和dependencies,那么有什么区别呢?又分别有什么意义呢?

(1)repositories与dependencies

repositories是依赖库,包含jcenter()与mavenCentral(),若有自己建的maven库,直接加载url即可。那么jcenter()和mavenCentral又是什么,两者有什么区别呢?可以理解为公共的maven库,不过mavenCentral是老的,之前新建工程时,会自动生成,现在新建工程自动生成的是jcenter(),原因是mavenCentral对开发者要求比较高,上传也比较麻烦,而jcenter很容易。

dependencies我们就比较熟悉了,是依赖包引入,如

compile fileTree(include: ['*.jar'], dir: 'libs')意思是将libs目录下的jar文件编译进项目中

compile project(':app')是加moudle

compile '::***' 询问maven库这个包是否存在,若存在则在插件中下载aar,到本地,然后将其一起与项目编译

附:gradle3.0中使用implementation、api,老版本使用的compile,api与compile等同,而implementation在moudle间不共享

image.png

image.png

(2)buildscript与allprojects

buildscript是gradle脚本自用,allprojects是项目本身用;一般情况下,二者的repositories长一样;buildscript中的的dependencies是插件(如:classpath 'com.android.tools.build:gradle:2.3.3'在repositories的jcenter中下载),allprojects中的一般不写dependencies,如moudle中有公共部分,可以再这里写。

4、apply

上文虽然在gradle脚本中加载了插件,但如何在moudle中引用呢?这里就要用到apply了,apply常用的有两种引用:

apply form:'***' 表示引用文件

apply plugin:'***' 引用插件,如:

apply plugin: 'com.android.application'其实就是apply plugin: com.android.build.gradle.AppPlugin

apply plugin: 'com.android.library'就是apply plugin: com.android.build.gradle.LibraryPlugin

5、android{}

(1)compileSdkVersion ——API level

(2)buildToolsVersion——google用gradle提供的接口写了android gradle插件,其中用到sdk中的构建工具。

(3)defaultConfig

minSdkVersion——支持的最小的api level,小于最小版本的不能使用app

targetSdkVersion——基于这个api level开发的

signingConfigs——签名配置

(4)buildTypes——打不同阶段的apk包(release、debug)

minifyEnabled——是否需要混淆

proguardFiles——混淆文件

6、ext

ext {

BASE = 1

}

使用:compile "com.didi.onecar:onecarbase:${BASE}"

附:若在单独写的文件中,需要在使用前添加apply form:文件名引入

你可能感兴趣的:(Gradle构建详解)