Android Studio中的Gradle依赖深入讲解
作者:张明云 发布时间:2022-09-01 11:16:37
前言
Android studio依赖项目是使用gradle管理的,依赖一个项目、一个jar包、一个工程,都可以在这里进行配置,本文将给大家详细介绍关于Android Studio中Gradle依赖的相关内容,下面话不多说了,来一起看看详细的介绍吧
一、不同类型的library引入方案:
1、本地Module library依赖:
通过这种方式依赖的弊端是每次都需要构建module,当module比较多时构建非常耗时,建议控制module的依赖数量,避免构建耗时
//module需要在项目根目录下的settings.gradle中通过include引入
implementation project(':librarydict')
2、本地二进制library依赖:jar和aar:
本地的jar和aar需要放在module的libs文件夹下,通过这种方式依赖的弊端是不知道jar和aar的版本号,如果要按照这种方式依赖,建议将jar/aar的名字加上版本信息,方便确认版本
依赖jar:
// 可以一条依赖引入libs下所有的jar
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 也可以指定依赖某一个或几个jar
implementation files('libs/dict-v120.jar', 'libs/download-v151.jar')
依赖aar:
// 在module的build.gradle中增加如下语句:
repositories {
flatDir {
dirs 'libs'
}
}
// 可以一条依赖引入libs下所有的aar
implementation fileTree(dir: 'libs', include: ['*.aar'])
// 也可以指定依赖某一个aar
implementation (name: 'library-download', ext: 'aar')
3、远程二进制library依赖:
为了安全起见,建议搭建公司内部的私有maven仓库,统一管理依赖的library,公司内部的公共library不要使用公共的maven仓库。通过这种方式依赖相比于前两种方案都要更优,且配置灵活,可以根据实际需求调整
// 依赖明确的版本,标明group、name和version
implementation group: 'com.android.demo', name: 'library-dict', version: '1.2.0'
// 通常按照如下方式简写即可
implementation 'com.android.demo:library-dict:1.2.0'
// 也可以不指定版本,将version改为"+",当远程仓库有更新的版本后,构建时会拉取最新的版本。
// 好处是可以始终依赖最新的library;弊端是有可能library的改动导致编译不过或者功能变更不
// 稳定,因为每次都需要检查是否有最新版本,所以构建效率会低一些
implementation 'com.android.demo:library-dict:+'
// 对于有多个APP,依赖内部统一SDK的情况时,可以将gradle文件放在服务器,远程控制统一依
// 赖版本,避免因为各个APP依赖的SDK版本不统一导致很难管理和维护
// 远程http://172.28.2.93/remote/library-config.gradle:
ext.libraryBuildConfig = [
deps: [
"dict-library" : 'com.android.demo:library-dict:1.2.0',
"download-library" : 'com.android.demo:library-download:1.5.1',
]
]
// 项目根目录下的build.gradle全局引入:
apply "http://172.28.2.93/remote/library-config.gradle"
ext {
dependencies = [
"dict-library" : libraryBuildConfig.deps.'dict-library',
"download-library" : libraryBuildConfig.deps.'download-library',
]
}
// 在module的build.gradle中依赖:
implementation rootProject.ext.dependencies["dict-library"]
implementation rootProject.ext.dependencies["download-library"]
总结如下:
二、不同依赖配置方式的区别:compile、implementation、api
从Android Gradle plugin 3.0开始,对于依赖包的配置方式,引入了implementation和api,使用Android Studio新建项目时,原来用compile的地方全部默认被替换成了implementation 比如:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:27.1.1'
compile 'com.android.support.constraint:constraint-layout:1.1.3'
}
变成下面的样子:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
}
网上查资料时,依赖配置方式还有:provided、api、apk、compileOnly、runtimeOnly、渠道名+Compile,差异主要在于构建内容和参与构建的时机,多样的配置方式满足了开发者的花样需求,具体区别如下:
1、implementation:
依赖包中依赖的library只能在依赖包内部使用,主工程无法访问依赖包依赖的library中的类和方法。使用场景:SDK开发中对第三方library有依赖,希望控制SDK的大小、不想因为和宿主工程引用的同一个依赖包版本不同导致编译冲突时特别适合。
因为当依赖包依赖的library有改动时,只会重新编译library和依赖包,不需要重新编译宿主,所以构建速度会快一些。
对于各个渠道还可以单独依赖属于渠道特有的包,通过渠道名+implementation指定,比如debugImplementation、releaseImplementation、testImplementation。
2、api(原compile):
会将依赖包中依赖的其它library一同编译和打包到apk中,宿主工程可以使用依赖包中依赖的其它library的类和方法
对于各个渠道还可以单独依赖属于渠道特有的包,通过渠道名+api/compile指定,比如debugApi、releaseApi、testApi
3、compileOnly(provided):
主要是为了方便程序编译通过的,不会打包到apk中,使用场景:android系统有这个API,但编译时需要引入才能构建通过,比如系统的APK依赖framework.jar、gson库等
4、runtimeOnly(原apk):
只是打包到apk中,不参与编译,不能在代码中直接调用依赖包的代码,否则会在编译时出错。一般很少使用
来源:https://zhuanlan.zhihu.com/p/44371449


猜你喜欢
- java String的深入理解一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和
- 目录Java 基础语法中的逻辑控制一、逻辑控制语句1. 顺序结构2. 分支结构3. 循环结构二、输入输出方式1. 输出到控制台2. 从键盘输
- 访问者(Visitor)模式:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。访
- 背景项目中要实现横向列表的无限循环滚动,自然而然想到了RecyclerView,但我们常用的RecyclerView是不支持无限循环滚动的,
- ??Chip监听选中状态的监听:setOnCheckedChangeListener,该监听只有设置了checkable 属性为true或者
- 今天本文与大家分享如何得到数组中的最大值和最小值的实例。很适合Java初学者复习数组的基本用法与流程控制语句的使用。具体如下:这个程序主要是
- 一、问题描述在接受 mq 消息的时候,需要做一个重试次数限制,如果超过 maxNum 就发邮件告警,不再重试。 所以我需
- 有时候有一些DOS命令需要我们在执行程序的时候调用,这需要使用C#提供的相关接口。代码如下,很简单,相信大家都能看懂,我就不赘述了。usin
- 登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象。本例中如果有注释不详细的地方,详见其它博客。功能介绍:简单的登录注册系统,
- 本文实例为大家分享了Dijkstra算法实现校园导游程序的具体代码,供大家参考,具体内容如下应用设计性实验1.问题描述校网导游程序: 一个校
- 提示:java.util.zipoutputstream
- 前言面向切面(AOP)Aspect Oriented Programming是一种编程范式,与语言无关,是一种程序设计思想,它也是sprin
- mybatis-plus实现in嵌套sql今天使用jeegboot看源码时发现用户权限部分的代码条件查询的inSql方法的用法:即sql中的
- 把char数组转换成String调用reverseStr()传入一个字符串"let’s"
- 自动完成文本框(AutoCompleteTextView),用于实现允许用户输入一定字符后,显示一个下拉菜单,供用户从中选择,当用户选择某个
- 表达式目录树表达式目录树:语法树,或者说是一种数据结构1.表达式目录树Expression:System.Linq.Expressions;
- 本文实例讲述了Java实现读取及生成Excel文件的方法。分享给大家供大家参考,具体如下:一、读取Excel文件需要先下载poi-3.0.1
- Java 判断字符串中是否包含中文的实例详解 Java判断一个字符串是否有中文是利用Unicode编码来判断,因为中
- 前言碎语今天博主分享一个Kubernetes集全管理软件,也就是Kubernetes web ui。是360团队开源的一款产品,Wayne
- Android 实现记住用户名和密码的功能是通过SharedPreference 存储来实现的。创建一个复选按钮,通过按钮的否选取来进行事件