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

前言

这一篇来介绍一些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,如下图所示。

c50b134ddbe62803a446a08604a9f79d.png

双击或者右键选择第一个选项即可执行命令,日志就会在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,如下图所示。

3e9f5831dc3b2e1a5ccd6e7a7ec0b342.png

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

b59e198b2aafd3e2dd8ade326db7b732.png

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作者:刘望舒来源:博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎樣制作线段动画_OPPO又开发布会!这两个PPT动画太炫了,荣获网友清一色好评...

前两天,OPPO在线上发布了find X2系列,观看发布会直播的时候,真的有被发布会的开场惊艳到,视觉体验太震撼了。这是我随便录的一个动画,满满的视觉冲击力:在看完发布会之后,我对整场发布会印象最深…

文件服务器的文件设置只读,服务器设置文件为只读

服务器设置文件为只读 内容精选换一换有,该NTP服务器仅限于在华为云控制台上购买的弹性云服务器安装使用。如需在购买的弹性云服务器上安装NTP服务器,您可以选择使用华为云控制台自己提供的NTP服务器,也可以选择其他NTP服务器。安装NTP服务器…

手机修改ntp服务器地址,修改手机ntp服务器ip地址

修改手机ntp服务器ip地址 内容精选换一换本文介绍使用云手机服务时需要了解的基本概念。云手机是一台包含原生安卓操作系统,具有虚拟手机功能的云服务器,简单来说,云手机云服务器Android OS。您可以远程实时控制云手机,实现安卓AP…

window10维护不了华为服务器,win10怎么打开云服务器异常

win10怎么打开云服务器异常 内容精选换一换本节介绍如何查看云服务器的mac地址。云服务器的mac地址不支持修改。登录Linux云服务器。执行以下命令,查看云服务器的mac地址。ifconfig查看MAC地址ifconfig登录Linux云服务器。执行以下命令,查看云服务器的ma…

命令行cd到_前端(只)需要掌握这些命令行(就还行了)

练习windows 用户在任意目录使用 shift 右键 打开 cmd 或者 powershell;或通过其他方式打开命令行cd ~/Desktop 回车恭喜你在命令行里进入了桌面输入命令 mkdir demo1cd demo1 进入目录cd .. 回退到桌面rm -rf demo1 删除目录,其中 -r 表示递归地删除路…

工况密度和标况密度怎么换算_什么是载流量?导线的载流量与电流密度怎么计算?图文详解!...

(1)导线规格在国标《GB/T3956-2008 电缆的导体》中,我们能看到国家对电缆导线的截面积进行标准化。按照国标规定,标称的电缆导线规格如下(单位mm2):0.5、0.75、1、1.5、2.5、4、6、10、16、25、35、50、70、95、120、150、185、240、300、400…

卸载cuda_NVIDIA驱动和CUDA安装

切换到集成显卡(X.Org X server)2. 卸载旧驱动sudo apt-get --purge remove nvidia* sudo apt autoremove # To remove CUDA Toolkit: $ sudo apt-get --purge remove "*cublas*" "cuda*" # To remove NVIDIA Drivers: $ sudo apt-g…

html加粗字体打印失效_论文格式要求及字体大小

点击上方“蓝字”带你去看小星星论文既是探讨问题进行学术研究的一种手段,又是描述学术研究成果进行学术交流的一种工具。下面小编为大家整理了论文格式要求及字体大小,欢迎阅读。1 02封面题目:小二号黑体加粗居中。各项内容:四号…

deepfakes怎么用_[mcj]deepfakesApp使用说明(1)

在众多AI换脸软件中Fakeapp是传播最广,操作最简单的一款,当然他同样也是源于Deepfakes。 这款软件在设计上的确是花了一些心事,只需稍加点拨,哪怕是再小白的人也能学会。下面我就做一个入门教程吧。跟着这个教程来,你肯…

alert 标题_[SwiftUI 知识碎片] Button、Image 和 Alert

译自 Buttons and images更多内容,欢迎关注公众号:Swift花园喜欢文章?不如来个 ➕三连?关注专栏,关注我 Button 和 Image在 SwiftUI 中,按钮可以由两种方式创建,取决于它们的外观。最简单的方式…

mysql数据存储到指定位置_Mysql数据库表分区存储到指定磁盘路径

. 前提:mysql5.6.6以上的版本以上的版本才支持单表指定目录,且目录权限是MySQL:mysql。 在mysql中数据文件存放于在my.cnf中datadir指定的路径,使用的表引擎不同产生的文件格式、表文件个数也会有所差异。 mysql的表引擎有多种,…

roslyn分析字符串代码_.NET 5 源代码生成器——MediatR——CQRS

在这篇文章中,我们将探索如何使用.NET 5中的新source generator特性,使用MediatR库和CQRS模式自动为系统生成API。中介者模式中介模式是在应用程序中解耦模块的一种方式。在基于web的应用程序中,它通常用于将前端与业务逻辑的解耦。在.NET平台…

mysql2008怎么重装_SQL Server2005、2008如何彻底删除卸载并重新安装?

很多小伙伴在删除SQL Server后重新安装总是遇到诸多问题导致安装失败,这是因为你没有将SQL Server彻底删除卸载完毕。本文就如何彻底卸载进行详细介绍,本文以SQL Server2008为例,2005的方法相似。方法/步骤1.按照传统方法将SQL Server 2005、…

mysql主从复制 火墙_MySQL高级知识(十五)——主从复制

前言:本章主要讲解MySQL主从复制的操作步骤。由于环境限制,主机使用Windows环境,从机使用用Linux环境。另外MySQL的版本最好一致,笔者采用的MySQL5.7.22版本,具体安装过程请查询相关资料。1.主从复制的基本原理slave会…

正则只能出现特定字符_python正则表达式的简单使用总结

原文作者:小哲,雷锋网在编程中,经常会涉及到字符串的操作,一个常用的策略就是利用split函数,然后对于特定的字符串进行匹配,但是这种方法格式复杂,可复用性较差。正则表达式是处理字符串匹配一个…

MySQL配置日志服务器_mysql配置数据库日志

mysql配置数据库日志云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天然气等公共资源一样便捷…

mysql dos 下切换连接_如何在dos下连接进入mysql对数据库进行操作

一、:windowsR 进入命令命令提示符输入 net start mysql若出现系统错误,要将命令提示符以管理员身份运行若出现不是内部指令,进入下面环境变量设置界面,配置path路径1.进入系统查看界面,点击高级系统设置2&#xff0c…

java获取文件大小_Java中获取文件大小的详解及实例代码

Java 获取文件大小今天写代码时需要实现获取文件大小的功能,目前有两种实现方法,一种是使用File的length()方法;另外一种是使用FileInputStream的available()方法,当InputStream未进行read操作时,available()的大小应该…

java如何获得当前路径_在java中如何得到当前路径

归纳一些网上取java路径的方法:注明:如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。得到classpath和当前类的绝对路径的一些方法获得CLASSPATH之外路径的方法&#…

java继承总结_JAVA笔记:Java中的继承总结

继承:在Java中使用extends关键字来实现类的继承 ,extends意思就是派生,所以子类也叫派生类,继承的主要目的是扩展类的内容操作格式: class A{}; class B extends A{};子类B可以继承父类A中的公用方法,也可…