Android Gradle依赖管理、去除重复依赖、忽略的方式

常用依赖

 //1.直接依赖第三方开源库,一般是托管在 jitpack 或者 jcenter
 implementation 'com.google.code.gson:gson:2.2.4'
 implementation 'com.android.support:cardview-v7:25.0.0'
 implementation 'com.android.support:design:25.0.0'
 //2.直接依赖本地的aar文件,一般是在libs目录下
 implementation(name: 'LiteAVSDK_Professional_5.1.5293', ext: 'aar')
 //3.直接依赖本地的jar文件
 implementation files('libs/bdasr_V3_20170801_60da871.jar')
 //4.依赖本地的model
 implementation project(':wavelibrary')
 implementation project(':android-ffmpeg')

库工程依赖传递问题

1、依赖常用的基本类型有:provided和compile,provided 只在编译生效不会打包到 apk 或 aar 中;compile 是会打包到 apk或 aar 中的(如果是库工程的话有特殊情况,参考下面3).

2、app 工程的当前(compile+) 的依赖都会打包到 app 中

3、库工程中:

1) jar 包:远程依赖不会打包到 aar 中;本地依赖会;

2) aar:远程和本地都不不会打包到 aar中.

3) 如果你要提供你的库工程的 aar 给他人,你需要同时告诉他这个库工程依赖的其他aar 和远程 jar包(因为他们没有打包到 aar 中)

4) 如果通过工程依赖(即compile project(':lib')的方式), 依赖是可以传递的,所以不需要在声明一次依赖.

去掉重复依赖

1.第三方库中同样使用了implementation或者compile依赖相同的库

  implementation('com.allenliu.versionchecklib:library:2.0.5') {
    exclude group: 'com.android.support', module: 'appcompat-v7'
    exclude group: 'com.android.support.constraint', module: 'constraint-layout'
    exclude group: 'org.greenrobot', module: 'eventbus'
    exclude group: 'com.squareup.okhttp3', module: 'okhttp'
  }

2.在不同的库中出现相同的so文件

pickFirst只会打包第一个遇到的冲突的so,merge(碰到冲突会合并)和exclude(直接排除匹配到的文件,不建议使用)

 packagingOptions {
      pickFirst 'lib/arm64-v8a/libgnustl_shared.so'
      pickFirst 'lib/armeabi-v7a/libgnustl_shared.so'
    }

遇到这种错误可以通过上面方法尝试解决

Error:Execution failed for task ‘:app:transformNativeLibsWithMergeJniLibsForDebug'. > More than one

补充知识:Gradle依赖的统一管理,解决依赖冲突

看见别人在用implementation rootProject.ext.dependencies["xxxx"]不知道是什么意思,上网查了一下,原来是为了解决或者说预防gradle依赖冲突的问题。

在项目开发中我们会经常引入多个Module,然而每个Module中又包含了V4、V7,为了升级新版本依赖包只用更改一次,我们决定采用Gradle依赖的统一管理,避免重复繁琐的劳动。

记录get到的新知识,用法如下:

1.在Project目录下新建config.gradle文件,文件名可自定义

具体内容如下:

ext {

  android = [
      compileSdkVersion    : 27,
      buildToolsVersion    : "27.0.0",
      minSdkVersion      : 21,
      targetSdkVersion    : 27,
      versionCode       : 6,
      versionName       : "1.2.2",
      renderscriptTargetApi  : 21
  ]

  version = [
      supportLibraryVersion  : "26.1.1",
      okhttpVersion      : "3.9.0",
      retrofitVersion     : "2.3.0",
      glideVersion      : "4.0.0",
      butterknifeVersion   : "8.8.1",
      fragmentationVersion  : "1.1.9",
  ]

  dependencies = [
      //base
      "appcompat-v7"           : "com.android.support:appcompat-v7:${version["supportLibraryVersion"]}",
      "cardview-v7"            : "com.android.support:cardview-v7:${version["supportLibraryVersion"]}",
      "design"              : "com.android.support:design:${version["supportLibraryVersion"]}",
      "constraint-layout"         : "com.android.support.constraint:constraint-layout:1.0.2",

      //net
      "gson"               : "com.google.code.gson:gson:2.8.2",
      "okhttp"              : "com.squareup.okhttp3:okhttp:${version["okhttpVersion"]}",
      "logging-interceptor"        : "com.squareup.okhttp3:logging-interceptor:${version["okhttpVersion"]}",
      "retrofit"             : "com.squareup.retrofit2:retrofit:${version["retrofitVersion"]}",
      "converter-gson"          : "com.squareup.retrofit2:converter-gson:${version["retrofitVersion"]}",
      "adapter-rxjava2"          : "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitVersion"]}",

      //dao
      "greendao"             : "org.greenrobot:greendao:3.2.2",

      //rx
      "rxjava"              : "io.reactivex.rxjava2:rxjava:2.1.5",
      "rxandroid"             : "io.reactivex.rxjava2:rxandroid:2.0.1",
      "rxbinding"             : "com.jakewharton.rxbinding2:rxbinding:2.1.0",
      "rxpermissions"           : "com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar",

      //di
      "javax_annotation"         : "org.glassfish:javax.annotation:10.0-b28",
      "butterknife"            : "com.jakewharton:butterknife:${version["butterknifeVersion"]}",
      "butterknife-compiler"       : "com.jakewharton:butterknife-compiler:${version["butterknifeVersion"]}",

      //multidex
      "multidex"             : "com.android.support:multidex:1.0.3",

      //kotlin
      "kotlin-stdlib"           : "org.jetbrains.kotlin:kotlin-stdlib:1.2.10",

      //ui test
      "espresso-core"           : "com.android.support.test.espresso:espresso-core:3.0.2",
      "espresso-idling-resource"     : "com.android.support.test.espresso:espresso-idling-resource:3.0.2",

      //unit test , 为了整合mockito和PowerMockito,mockito暂时最高只支持2.8.9
      "junit"               : "junit:junit:4.12",
      "mockito"              : "org.mockito:mockito-core:2.8.9",
      "powermock-module-junit4"      : "org.powermock:powermock-module-junit4:1.7.4"

  ]

}

2.在Project的build.gradle中添加

apply from: "config.gradle"

3.在modle的build.gradle中添加引用

apply plugin: 'com.android.application'

android {
  compileSdkVersion rootProject.ext.android["compileSdkVersion"]
  buildToolsVersion rootProject.ext.android["buildToolsVersion"]

  defaultConfig {
    applicationId "json.chao.com.wanandroid"
    minSdkVersion rootProject.ext.android["minSdkVersion"]
    targetSdkVersion rootProject.ext.android["targetSdkVersion"]
    versionCode rootProject.ext.android["versionCode"]
    versionName rootProject.ext.android["versionName"]
    //AndroidJunitRunner必须要显示指定在defaultConfig中,使用Gradle依赖管理无法使其生效
    testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    renderscriptTargetApi rootProject.ext.android["renderscriptTargetApi"]
    renderscriptSupportModeEnabled true  // Enable RS support
    multiDexEnabled true
    vectorDrawables.useSupportLibrary = true
  }
}

  dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')

    //base
    implementation rootProject.ext.dependencies["appcompat-v7"]
    implementation rootProject.ext.dependencies["cardview-v7"]
    implementation rootProject.ext.dependencies["design"]
    implementation rootProject.ext.dependencies["constraint-layout"]

    //net
    implementation rootProject.ext.dependencies["gson"]
    implementation rootProject.ext.dependencies["okhttp"]
    implementation rootProject.ext.dependencies["retrofit"]
    implementation rootProject.ext.dependencies["converter-gson"]
    implementation rootProject.ext.dependencies["adapter-rxjava2"]

    //dao
    implementation rootProject.ext.dependencies["greendao"]

    //rx
    implementation rootProject.ext.dependencies["rxjava"]
    implementation rootProject.ext.dependencies["rxandroid"]
    implementation rootProject.ext.dependencies["rxbinding"]
    implementation rootProject.ext.dependencies["rxpermissions"]

    //UI测试
    androidTestImplementation (rootProject.ext.dependencies["espresso-core"]) {
      exclude group: 'com.android.support', module: 'support-annotations'
    }
    implementation (rootProject.ext.dependencies["espresso-idling-resource"]) {
      exclude module: 'support-annotations'
    }
}

(两个文件中有不对应的依赖方法,that's ok, 只是粘贴代码的时候删除了一些,知道用法就行了)

以上这篇Android Gradle依赖管理、去除重复依赖、忽略的方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解关于Android Studio中安装和gradle的一些坑

    本人从开始用Android Studio到现在已经快一年了吧,在我刚开始用的时候Android Studio还是1.2的版本.当时安装会因为国内墙的缘故,导致下载SDK步骤卡死无法安装. 最近的版本似乎都没出现这个问题,但是还是要吐槽一下最近的2.2.3的更新.这个版本安装包自带的SDK里build tools版本是25.0.2,支持的最低gradle版本是3.3,然而安装包内自带的gradle版本是3.2,所以单纯这个用安装包你并不能建立任何完整的项目,连自带的Helloworld项目都会报错

  • Android使用Gradle依赖配置compile、implementation与api的区别介绍

    前言 AndroidStudio升级到3.0之后,gradle版本也随之升级到了3.0.0版本. 当gradle插件升级到3.0.0及以上后,我们会发现在gradle中添加依赖的时候,会推荐你使用implementation或者api,而不再推荐你使用compile,今天就来简单介绍下这两者的使用与区别! classpath 'com.android.tools.build:gradle:3.0.0' 在新建一个Android工程的时候,build.gradle中的依赖默认为implementa

  • Android Gradle依赖管理、去除重复依赖、忽略的方式

    常用依赖 //1.直接依赖第三方开源库,一般是托管在 jitpack 或者 jcenter implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.android.support:cardview-v7:25.0.0' implementation 'com.android.support:design:25.0.0' //2.直接依赖本地的aar文件,一般是在libs目录下 implementation(name

  • 详解Android使用Gradle统一配置依赖管理

    在介绍使用 Gradle 统一配置依赖管理前我们先来简单介绍一下 Gradle, Gradle 是一个基于 JVM 的构建工具,也是一款非常灵活强大的构建工具,支持  jcenter.maven.Ivy 仓库,支持传递性依赖管理(即 A 依赖 B,B 依赖 C,那么 A 也就可以依赖 C,不用再单独去依赖),而不需要远程仓库或者是 pom.xml 和 ivy.xml 配置文件,抛弃了各种繁琐,基于 Groovy,build 脚本使用 Groovy 编写 而在我们的 Android studio

  • Maven分模块开发与依赖管理和聚合和继承及属性深入详细介绍

    目录 前言 分模块开发 1.1 分模块开发理念 1.按照功能拆分 2.按照模块拆分 1.2 分模块开发实现 2.依赖管理 2.1 依赖传递与冲突问题 2.2 可选依赖和排除依赖 3.聚合和继承 3.1 聚合 3.2 继承 3.3 聚合VS继承 4.属性 4.1 定义父工程属性 4.2 修改依赖的version 5.配置文件加载属性 5.1 父工程定义属性 5.2 jdbc.properties文件中引用属性 5.3 设置maven过滤文件范围 前言 对于复杂庞大的项目,maven的熟练使用可以大

  • Maven依赖管理的用法介绍

    目录 一.依赖传递 1. 直接依赖与间接依赖 2. 依赖传递冲突时的优先规则 (1) 路径优先 (2) 声明优先 (3) 后声明覆盖先声明 二.依赖管理 1. 可选依赖 2. 排除依赖 3. 可选依赖与排除依赖的异同点 一.依赖传递 1. 直接依赖与间接依赖 pom.xml 声明了的依赖是直接依赖,依赖中又包含的依赖就是间接依赖(直接依赖的直接依赖),间接依赖虽然未被声明,但也是依赖所必须的依赖,同时间接依赖中的资源也可以直接使用 比如 A 依赖了 B,B 依赖了 C,那么 A 也就间接的依赖了

  • Go语言依赖管理三要素示例解析

    目录 背景 GOPATH 模式 GO Vendor模式 Go Module模式 依赖管理三要素 依赖配置 go.mod go mod命令 go get命令 快速使用go module 小结 背景 开发项目时应学会站在巨人的肩膀上,即有效利用开发组件进行或工具提升自己的研发效率 对于较简单的单体函数而言,只需要依赖原生的SDK即可完成开发 对于实际开发的工程较于复杂,应将精力投放在实现的业务逻辑之上 工程项目不可能基于标准库0-1编码搭建 管理依赖库 GOPATH 模式 GOPATH为环境变量 包

  • Android Gradle 三方依赖管理详解

    目录 发展历史 最原始的依赖 使用 .gradle 配置 使用 gradle.properties 配置 使用 buildSrc 配置 使用 Composing Builds 配置 Version Catalogs 配置 开始使用 使用 settings.gradle.kts 配置 使用 libs.versions.toml 配置 使用插件配置 插件配置 插件使用 重写版本 使用方式 总结 发展历史 Gradle 的依赖管理是一个从开始接触 Android 开发就一直伴随着我们的问题(作者是An

  • Android统一依赖管理的三种方式总结

    目录 简述 传统apply from的方式(也是我以前项目中使用) buildSrc方式 什么是buildSrc 小结 Composing builds 什么是Composing builds 小结 Composing builds项目实战 在项目中新建一个model,用于管理配置信息 新建一个ConfigPlugin的类,不用具体的实现 编辑configPluginmodel中的build.gradle文件 修改根目录的settings.gradle文件 项目目录引入插件 在configPlu

  • SpringBoot2.x的依赖管理配置

    前提 这篇文章是<SpringBoot2.x入门>专辑的第1篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 主要梳理一下SpringBoot2.x的依赖关系和依赖的版本管理,依赖版本管理是开发和管理一个SpringBoot项目的前提. SpringBoot其实是通过starter的形式,对spring-framework进行装箱,消除了(但是兼容和保留)原来的XML配置,目的是更加便捷地集成其他框架,打造一个完整高效的开发生态. SpringBoot依

  • 如何使用PHP依赖管理工具Composer

    前言 别再到处搜PHP类扩展包了,对于现代语言而言,包管理器基本上是标配.Java 有 Maven,Python 有 pip,Ruby 有 gem,Nodejs 有 npm.PHP 的则是 PEAR,不过 PEAR 坑不少: 依赖处理容易出问题 配置非常复杂 难用的命令行接口 好在我们有 Composer,PHP依赖管理的利器.它是开源的,使用起来也很简单,提交自己的包也很容易. 举个例子,平时我们开始的时候如果不是用框架,想要一个验证码,就要先去Gihutb或者其他地方找一个验证码类,然后在项

  • golang开发go包依赖管理godep使用教程

    目录 介绍 安装 包管理使用 godep 拉取依赖 restore 用于开发 检出依赖 save godep 编译运行 build Godeps目录的作用 godep其他命令 介绍 godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息,并在go命令前加壳来做到依赖管理 godep 建议在 golang 1.6 以后使用 godep 依赖 vendor 具体查看 https://stackoverflow.com/questions/37237036/how-shoul

随机推荐