Android:排除应用程序的依赖项,仅由内部使用它的其他依赖项使用

Posted

技术标签:

【中文标题】Android:排除应用程序的依赖项,仅由内部使用它的其他依赖项使用【英文标题】:Android : Exclude dependency for the application and use only by the other dependency which is using it internally 【发布时间】:2021-11-28 05:10:24 【问题描述】:

我正在开发一个必须添加 XYZ 依赖项的项目。 XYZ 依赖在内部使用com.google.android.material:material,我没有在我的应用级别build.gradle 中直接添加com.google.android.material:material 依赖

现在,当我在我的项目中添加 XYZ 依赖项时,我的 UI 很混乱,因为 XYZ 依赖项使用了 com.google.android.material:material 依赖项。

我的问题是,如何排除 com.google.android.material:material 依赖项并仅在内部由 XYZ 使用该依赖项,以免我的 UI 变得混乱。

我知道我可以通过这种方式排除整个依赖:

    implementation ("XYZ:1.0.7") 
     exclude group: 'com.google.android.material', module: 'material'

但这也会从 XYZ 中删除 com.google.android.material,我不希望这样,因为 XYZ 在它的 UI 中需要这种依赖。我只想为我的应用程序删除它,以便我的应用程序的 UI 保持原样。

看这个:

在添加XYZ依赖之前(UI如预期):

添加XYZ依赖后(UI乱了):

【问题讨论】:

【参考方案1】:

您可以使用 jarjar tool 为依赖项 jar 排除一个类。

Here是一个如何使用的例子

ependencies 
        compile jarjar.repackage 
            from ('org.apache.hive:hive-exec:0.13.0.2.1.5.0-695') 
                exclude group: 'net.hydromatic', module: 'optiq-core'
                // transitive = false
            

            archiveBypass "commons*.jar"
            archiveExclude "slf4j*.jar"

            classDelete "org.apache.thrift.**"

            classRename 'org.json.**', 'org.anarres.hive.json.@1'
            classRename 'org.iq80.**', 'org.anarres.hive.iq80.@1'
            classRename 'org.codehaus.jackson.**', 'org.anarres.hive.jackson.@1'
            classRename 'com.google.**', 'org.anarres.hive.google.@1'
            classRename 'javolution.**', 'org.anarres.hive.javolution.@1'
            classRename 'com.esotericsoftware.kryo.**', 'org.anarres.hive.kryo.@1'
        
    

【讨论】:

我无法实现它,因为找不到合适的示例而出现错误。我该如何使用它?假设我有一个库“io.supercharge:shimmerlayout:2.1.0”并且我想排除“com.google.android.material:material:1.1.0”那么我该如何在 gradle 文件中实现它?

以上是关于Android:排除应用程序的依赖项,仅由内部使用它的其他依赖项使用的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Gradle 构建中,如何从包含的 jar 文件中排除依赖项?

从 Gradle 依赖项中排除 .class 文件

Android Studio - Gradle 实现 (...) exclude ... 不起作用(无法从依赖项中排除组)

Android:如何创建一个没有冲突依赖的库

当内部类依赖于R.java时,Gradle在Android Javadocs中排除R.java

如何在安装项目中排除依赖项?