最近遇到了clone项目gradle构建的问题,google众说纷纭,花了一些精力最终解决;想了下与其单独只说此次遇到的问题及解决方式,不如整体系统的梳理清楚,彻底解决今后遇到构建引发的一系列问题。gradle整体来说不难,主要比较广,杂。
1、首先说一下脚本
这几个文件在新建工程中自动生成,帮助我们可以直接实现命令,如在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版本一样
(2)android gradle插件版本
是根目录下的build.gradle中的classpath 'com.android.tools.build:gradle:2.3.3',因为gradle中可以适用于C++、android等等各种工程的构建,所以本身当然不包含android用到的相关方法,这就需要用插件来实现,如下:android就是插件中的,dependencies就是gradle里面的。
3、buildscript与allprojects
二者都包含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间不共享
(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:文件名引入