前言

这一篇来介绍一些Gradle进阶的内容,当然进阶内容非常多,这篇文章就总结一些相对重要的、常用的一些知识点,比如Gradle的签名配置和依赖管理。

1.Android签名文件配置

在一般公司中,当团队比较小的时候,App的签名信息都是放到项目中的,甚至会上传到github上,这样做很是方便。但随着团队人数的增多,这样做的风险会越来越大,因为签名信息是重要的资源,这样就不能将签名上传到github上,也就不应该在build.gradle中直接配置签名。

主要有以下的几种解决方法:

1.自定义一个签名配置文件

2.本地~/.gradle/gradle.properties文件中配置签名信息

1.1 自定义签名信息文件

首先,在工程的目录下新建一个文件夹,内部存储签名文件和签名信息文件。签名文件为gradledemo.jks,签名信息文件为keystore.properties。keystore.properties中的配置如下所示。

STORE_FILE=../signfiles/gradledemo.jksKEY_ALIAS=gradleSTORE_PASSWORD=jinjiesanbuquKEY_PASSWORD=jinjiesanbuqu

当然不要忘了在.gitignore中将gradledemo.jks和keystore.properties忽略掉。接着在模块build.gradle中进行配置,如果还不清楚什么是模块build.gradle和项目build.gradle,看写给Android开发的Gradle知识体系这篇文章。

在模块build.gradle中加入如下代码。

apply plugin: 'com.android.application'android { ...}def setSigningProperties(){ def propFile = file('../signfiles/keystore.properties') if (propFile.canRead()){ def Properties props = new Properties() props.load(new FileInputStream(propFile)) if (props!=null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) { android.signingConfigs.release.storeFile = file(props['STORE_FILE']) android.signingConfigs.release.storePassword = props['STORE_PASSWORD'] android.signingConfigs.release.keyAlias = props['KEY_ALIAS'] android.signingConfigs.release.keyPassword = props['KEY_PASSWORD'] } else { throw new Exception("some key missing") } }else { throw new Exception("keystore.properties not found:" + propFile.absolutePath) }}

setSigningProperties方法用于读取keystore.properties文件中的签名文件的信息。

最后在模块build.gradle中的signingconfigs块中调用setSigningProperties方法就可以了。

apply plugin: 'com.android.application'android { ... signingConfigs { release { setSigningProperties() } }}

1.2 本地添加签名信息文件

还可以将签名文件和签名信息文件放到本地中。比如签名文件放到~/.gradle/gradledemo.jks,签名信息文件放到~/.gradle/keystore.properties。这样签名文件和签名信息文件都不会提交到github上。

keystore.properties的内容如下。

GRADLEDOME_RELEASE_STORE_FILE=~/.gradle/release-key.keystoreGRADLEDOM_RELEASE_KEY_ALIAS=key-aliasGRADLEDOM_RELEASE_STORE_PASSWORD=passGRADLEDOM_RELEASE_KEY_PASSWORD=pass

在模块build.gradle中的signingconfigs块中配置签名,如下所示。

signingConfigs { release { storeFile file(GRADLEDOME_RELEASE_STORE_FILE) storePassword GRADLEDOME_RELEASE_STORE_PASSWORD keyAlias GRADLEDOME_RELEASE_KEY_ALIAS keyPassword GRADLEDOME_RELEASE_KEY_PASSWORD } }

除了这两点,还可以将签名文件和签名信息文件放在专门打包的服务器上,在打包的时候读取即可。这个涉及的内容就多了,就不在本文进行说明了。

2.Gradle的库依赖

现在一个Android项目都是需要去引入其他的库,比如jar、aar、Module等等,现在我们分别来介绍下。下面例子的代码如果不特意说明均是写在模块build.gradle中的。

Gradle的本地库依赖

关于jar依赖可以按照如下这么写,可以指定一个也可以指定多个jar。

//依赖引入libs下所有的jarimplementation fileTree(dir:'libs',include:['*.jar'])//指定依赖某一个或几个jarimplementation files('libs/XXX.jar','libs/XXX.jar')

aar依赖需要额外增加一些语句,如下所示。

android { ... repositories {  flatDir { dirs "libs" } }} dependencies {implementation fileTree(dir:'libs',include:['*.aar'])implementation(name:'XXX',ext:'aar')}

Gradle的本地Module依赖

当项目中有多个Module时,我们需要在settings.gradle中引入,如下所示。

include ':app'include ':library1', ':library2'

接着在模块build.gradle引入。

implementation project(':library1')

Gradle的远程库依赖

当在Android Studio中新建一个项目时,会在项目build.gradle有如下代码:

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

这些代码都是默认的,在buildscript和allprojects块中,通过repositories来引入谷歌的Maven库和JCenter库。首先会从谷歌的Maven库去寻找相应的库,如果找不到会从JCenter库中去寻找。

然后在模块build.gradle加入如下的代码,就可以引入远程库。

implementation group:'com.android.support',name:'appcompat-v7',version:'28.0.0'//简写implementation 'com.android.support:appcompat-v7:28.0.0'

3.Gradle的库依赖管理

随着Gradle依赖的库越来越多,那么必然会产生一些问题,比如依赖冲突的问题,为了解决依赖冲突,我们需要先了解Gradle的库依赖管理的几个技术点。

3.1 Gradle的依赖传递

Gradle默认是支持依赖传递的,所以当用到Gradle依赖时一定会涉及到它,是必须要知道的一个知识点。

那什么是依赖传递呢?举一个最简单的例子。

projectC依赖projectB,projectB依赖projectA,那么projectC就依赖了projectA。

依赖传递会产生一些问题,比如重复依赖、依赖错误等问题,那么我们可以通过transitive来禁止依赖传递。

 implementation('com.xxx.xxx:xxx:3.6.3') { transitive false }

上面禁止了com.xxx.xxx:xxx:3.6.3库的依赖传递,还可以使用如下语句来关闭当前模块的所有库的依赖传递:

configurations.all { transitive = false}

只不过这样就需要手动添加当前模块的每个库的依赖项,一般不会这么做。

3.2 Gradle的依赖检查

有了依赖检查,我们可以解决依赖产生的问题。依赖检查有很多种方式,分别来介绍下。

使用Gradle的命令行

可以直接使用Gradle的命令行来进行依赖检查,拿Windows平台来说,使用cmd进入项目的根目录,执行gradle :app:dependencies即可,其中app是我们新建工程时默认的模块的名称。日志输出很多,下面截取一部分:

+--- com.android.support:appcompat-v7:28.0.0| +--- com.android.support:support-annotations:28.0.0 //1| +--- com.android.support:support-compat:28.0.0 //2| | +--- com.android.support:support-annotations:28.0.0| | +--- com.android.support:collections:28.0.0| | | --- com.android.support:support-annotations:28.0.0| | +--- android.arch.lifecycle:runtime:1.1.1| | | +--- android.arch.lifecycle:common:1.1.1| | | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0 //3| | | +--- android.arch.core:common:1.1.1| | | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0| | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0| | --- com.android.support:versionedparcelable:28.0.0| | +--- com.android.support:support-annotations:28.0.0| | --- com.android.support:collections:28.0.0 (*)

上面是appcompat-v7:28.0.0库的依赖树的一小部分,appcompat-v7:28.0.0依赖了注释1处和注释2的库,注释2处的库又依赖了com.android.support:support-annotations:28.0.0和com.android.support:collections:28.0.0,因此当我们引入appcompat-v7:28.0.0时,会自动下载所有它依赖传递的库。注释3处说明,Gradle在依赖传递时,会自动提升依赖传递的库的版本,默认使用最高版本的库。

使用Gradle面板

除了命令行,还可以使用Android Studio中的右侧的Gradle面板,找到app模块,展开后找到help目录中的dependencies,如下图所示。

双击或者右键选择第一个选项即可执行命令,日志就会在AS中Run窗口中打印出来。

现在再举个例子,拿我们熟悉的retrofit举例,在模块build.gradle中引入retrofit:

implementation 'com.squareup.retrofit2:retrofit:2.6.0'

执行依赖检查命令,打印的关于retrofit的日志如下:

+--- com.squareup.retrofit2:retrofit:2.6.0| --- com.squareup.okhttp3:okhttp:3.12.0| --- com.squareup.okio:okio:1.15.0

可以很清楚看到retrofit:2.6.0依赖okhttp:3.12.0,而okhttp:3.12.0依赖okio:1.15.0。

这时我们使用3.1小节的transitive试试,修改build.gradle:

 implementation ('com.squareup.retrofit2:retrofit:2.6.0') { transitive false }

执行依赖检查命令,打印的关于retrofit的日志如下:

+--- com.squareup.retrofit2:retrofit:2.6.0

使用Gradle View插件

如果你觉得前两种方式查看不方便、不直观,还可以使用Android Studio的Gradle View插件。

在AS中选择File-->Settings-->Plugins中搜索gradle view,找到Gradle View插件安装并重启AS,如下图所示。

接下来选择View-–>Tools Windows--Gradle View,这时就可以在AS的底部发现Gradle View窗口,里面会显示当前项目的所有依赖树,如下图所示。

3.3 Gradle的依赖冲突

依赖冲突产生的原因多是库的版本问题,举个例子,如果在build.gradle中这么写:

 implementation 'com.squareup.retrofit2:retrofit:2.6.0' implementation 'com.squareup.okio:okio:1.14.0'

在3.2小节中,我们知道retrofit:2.6.0依赖的okio的版本是1.15.0,而这里引入的okio的版本为1.14.0,引入的版本不同就会产生依赖冲突。依赖冲突的解决的关键有两点,一个是Gradle的依赖检查,这个在3.2小节已经讲过了,另一个是利用Gradle的关键字,合理利用它们是解决依赖冲突的关键,在3.1小节已经介绍了 transitive,现在介绍其余的。

3.3.1 force

有时候我们不是想要排除某个库,而是需要强制使用统一的库的版本,force可以强制设置模块的库的版本,在模块build.gradle中加入如下代码。

configurations.all { resolutionStrategy { force 'com.squareup.okio:okio:2.1.0' }}dependencies {...}

强制当前模块的okio的版本为2.1.0,使用依赖检查来查看下retrofit的依赖:

+--- com.squareup.retrofit2:retrofit:2.6.0| --- com.squareup.okhttp3:okhttp:3.12.0| --- com.squareup.okio:okio:1.15.0 -> 2.1.0--- com.squareup.okio:okio:1.14.0 -> 2.1.0

可以看到okio的版本都被强制升级到了2.1.0,这样就可以解决一些依赖冲突的问题。

3.3.2 exclude

有些时候需要排除库依赖传递中涉及的库,此时不能靠关闭依赖传递来解决问题,这时可以使用exclude。

我们知道com.android.support:appcompat-v7:28.0.0依赖于com.android.support:support-annotations:28.0.0、com.android.support:support-compat:28.0.0、com.android.support:cursoradapter:28.0.0等库,这时我们不想再依赖support-annotations库,可以这么写。

configurations { all*.exclude group: 'com.android.support', module: 'support-annotations'}dependencies {...}

使用依赖检查来查看com.android.support:appcompat-v7:28.0.0的依赖:

+--- com.android.support:appcompat-v7:28.0.0| +--- com.android.support:support-compat:28.0.0| | +--- com.android.support:collections:28.0.0| | +--- android.arch.lifecycle:runtime:1.1.1| | | +--- android.arch.lifecycle:common:1.1.1| | | --- android.arch.core:common:1.1.1| | --- com.android.support:versionedparcelable:28.0.0| | --- com.android.support:collections:28.0.0| +--- com.android.support:collections:28.0.0| +--- com.android.support:cursoradapter:28.0.0

和3.2节的日志对比下,可以发现com.android.support:appcompat-v7:28.0.0不再依赖com.android.support:support-annotations:28.0,目的达到了。

原文:http://liuwangshu.cn/application/android-gradle/2-gradle-dependency.html作者:刘望舒来源:博客园

gradle引入子module配置_原创 | 看完此文,你对Gradle的理解又升级了相关推荐

  1. gradle 引入jar时自动引入父依赖_原创 | 看完此文,你对Gradle的理解又升级了

    前言 这一篇来介绍一些Gradle进阶的内容,当然进阶内容非常多,这篇文章就总结一些相对重要的.常用的一些知识点,比如Gradle的签名配置和依赖管理. 1.Android签名文件配置 在一般公司中, ...

  2. docker没有下载完全_看完此文,妈妈还会担心你docker入不了门?

    上周对象突然心血来潮说想养个小宠物,我问想养啥她又说随便,你看着办!!!这我真的比较难办啊!但是咱们程序员能有个对象就不错了,还不赶紧宠着,我只能照办咯! 我去到了一家宠物店,半天也没有找到合适的目标 ...

  3. python word2vec怎么用_小白看Word2Vec的正确打开姿势|全部理解和应用

    有个用心的读者最近做了一篇论文,想知道Word2Vec的相关理论和应用方法,作为一个有强迫症的我,去翻查了大量的文献资料,决定从Word2Vec的上下文来温习一下这个NLP的基础以及做相关的知识体系的 ...

  4. 打包失败,Gradle构建失败问题良心解决,看完这个一定让你轻松

    打包失败问题良心解决,看完这个一定让你轻松 问题 CommandInvokationFailure: Gradle build failed. C:\Program Files\Java\jdk1.8 ...

  5. 计算机系笔记本电脑配置,笔记本电脑硬件配置全解析, 看完让你轻松选择笔记本...

    您现在用的是什么笔记本?您是否打算购买笔记本?本文章主要针对笔记本配置详细的介绍.不管是否有笔记本都可以看一下此文章,您让更清楚的了解及选择笔记本. 目前市场上有,轻薄本.游戏本.商务本等分类.一般便 ...

  6. Android _《看完不忘系列》之Retrofit,android面试题及答案2019

    //运行期生成一个实现WanApi接口的类(字节码),并反射创建其实例 WanApi wanApi = retrofit.create(WanApi.class); //得到Retrofit的call ...

  7. python程序设计简明教程知识点_[转载]看完《python简明教程》笔记及第一个python程序...

    主要是摘抄了一些书上需要注意的地方: 1.Python 是一门解释性语言. 在计算机内部, Python 解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行. 2.版 ...

  8. 孩子学python后的变化_干货 | 看了此文,家长就知道为啥要让孩子学Python?

    原标题:干货 | 看了此文,家长就知道为啥要让孩子学Python? 关注教改动向的家长们肯定都发现,Python这个词最近可谓是异常火热. 浙江.厦门.武汉等多地教育局通知,将在中小学生新学期课本中加 ...

  9. 看完此文,妈妈还会担心你docker入不了门?

    本文在个人技术博客不同步发布,详情可猛戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩...   上周对象突然心血来潮说想养个小宠物,我问想养啥她又说随便,你看着办!!!这我 ...

最新文章

  1. BZOJ 2190: [SDOI2008]仪仗队( 欧拉函数 )
  2. Drawer的使用(一):xml文件中使用
  3. oracle存储过程 学习笔记
  4. Maven环境配置及IntelliJ IDEA中的Maven部署(亲自测试)
  5. C语言按下列公式计算 求A20的值,2011年全国计算机二级C语言模拟试题及答案(10)...
  6. Java ResourceBundle getLocale()方法与示例
  7. SimpleDateFormat线程不安全及解决方案
  8. jquery模板插件jTemplates代替拼html
  9. 旷视科技 CSG 算法负责人姚聪:深度学习时代的文字检测与识别技术 | AI 研习社 103 期大讲堂...
  10. 天下数据服务器搭建网站,王者天下架设教程1-服务端配置.doc
  11. VsCode模仿简单百度网页(html)
  12. Firefox火狐浏览器优化加速about:config配置
  13. 4.widows对象
  14. 《攻城Online》快速原型:服务端设计
  15. 常见SOC启动流程分析
  16. 寿星万年历源代码(JAVA/VB NET)
  17. 宏基因组分箱CheckM评估结果的提取
  18. Unity加载优化-将基于LZMA的ab压缩方案修改为LZ4压缩的过程
  19. Struts2 ognl判断集合对象是否为空的方法
  20. 马氏距离 vs 欧氏距离

热门文章

  1. 爬取了10W条数据,我们整理出了这份北上广深租房图鉴
  2. 雾计算精华问答 | 雾计算是如何构成的?
  3. c语言里有js的预编译环节吗,C语言第十一讲,预处理命令.
  4. 树莓派开始玩转linux pdf_用树莓派构建 Kubernetes 集群 | Linux 中国
  5. minio 单机安装、部署 centos7环境
  6. idea 利用vue.js插件创建vue初始化项目
  7. Linux 安装、卸载JDK
  8. 第十篇: 高可用的服务注册中心(Finchley版本)V2.0_dev
  9. Excel VBA 处理图形图表详解
  10. Java-分析类初始化