广告位联系
返回顶部
分享到

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

Android 来源:互联网搜集 作者:秩名 发布时间:2020-03-23 19:14:33 人浏览
摘要

常用依赖 ? 1 2 3 4 5 6 7 8 9 10 11 //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:2

常用依赖

?
1
2
3
4
5
6
7
8
9
10
11
//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依赖相同的库

?
1
2
3
4
5
6
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(直接排除匹配到的文件,不建议使用)

?
1
2
3
4
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文件,文件名可自定义

具体内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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中添加引用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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, 只是粘贴代码的时候删除了一些,知道用法就行了)


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/wapchief/article/details/84974219
相关文章
  • Kotlin的Collection与Sequence操作异同点介绍

    Kotlin的Collection与Sequence操作异同点介绍
    在Android开发中,集合是我们必备的容器,Kotlin的标准库中提供了很多处理集合的方法,而且还提供了两种基于容器的工作方式:Collection 和
  • 实现一个Kotlin函数类型方法

    实现一个Kotlin函数类型方法
    接口与函数类型 业务开发中,经常会有实现一个函数式接口(即接口只有一个方法需要实现)的场景,大家应该都会不假思索的写出如下代
  • Android10 App启动Activity源码分析
    ActivityThread的main方法 让我们把目光聚焦到ActivityThread的main方法上。 ActivityThread的源码路径为/frameworks/base/core/java/android/app/ActivityThread。 1 2
  • Android10客户端事务管理ClientLifecycleManager源码解析

    Android10客户端事务管理ClientLifecycleManager源码解析
    在Android 10 App启动分析之Activity启动篇(二)一文中,简单地介绍了Activity的生命周期管理器是如何调度Activity进入onCreate生命周期的流程。这
  • Kotlin对象的懒加载方式by lazy与lateinit异同介绍

    Kotlin对象的懒加载方式by lazy与lateinit异同介绍
    属性或对象的延时加载是我们相当常用的,一般我们都是使用 lateinit 和 by lazy 来实现。 他们两者都是延时初始化,那么在使用时那么他们两
  • Android类加载流程分析

    Android类加载流程分析
    本文分析的代码基于Android8.1.0源码。 流程分析 从loadClass开始,我们来看下Android中类加载的流程 /libcore/ojluni/src/main/java/java/lang/ClassLoader.ja
  • Android实现读写USB串口数据的代码

    Android实现读写USB串口数据的代码
    最近在研究USB方面的内容;先后做了关于Android读写HID、串口设备的DEMO。本文比较简单,主要介绍的是Android实现读取串口数据的功能 废话不
  • Epoxy - 在RecyclerView中构建复杂界面
    Diffing 对于复杂数据结构支持的多个视图类型展示在屏幕上, Epoxy此时是尤其有用的. 在这些场景中, 数据可能会被网络请求, 异步 Observable, 用
  • Android性能优化的详细介绍

    Android性能优化的详细介绍
    性能优化是一个app很重要的一部分,一个性能优良的app从被下载到启动到使用都能给用户到来很好的体验。自然我们做性能优化也是从被下
  • Android进阶宝典-插件化2(Hook启动插件中四大组件

    Android进阶宝典-插件化2(Hook启动插件中四大组件
    在上一节,我们主要介绍了如果通过反射来加载插件中的类,调用类中的方法;既然插件是一个apk,其实最重要的是启动插件中的Activity、
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计