【问题标题】:How to avoid library conflicts when someone uses my android library当有人使用我的android库时如何避免库冲突
【发布时间】:2016-04-07 10:47:40
【问题描述】:

我正在为 android 开发一个库,该库将在许多应用程序中使用。 该库依赖于其他一些库。 例如,它使用 Dagger 1.2,因此如果包含我的库的应用程序将使用 Dagger 2.0,则项目将不会因为冲突而构建。 我能做什么?

我用这个工作区 gradle 尝试了 Jarjar

buildscript {
    repositories {
        jcenter()
        mavenLocal()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'net.vrallev.gradle:jarjar-gradle:1.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这是应用 gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.xxx.yyy.sdklauncherapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile project(':library')
    compile 'com.google.dagger:dagger:2.2'
}

这是我的 gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

apply plugin: 'net.vrallev.jarjar'

jarjar {
    jarJarFile 'jarjar-1.4.jar'
    rules = [
            'rule com.squareup.dagger.** ext.com.squareup.dagger.@1'
    ]
    srcExcludes = ['META-INF/**']

    outputName 'build_repackaged.jar'

    outputDir 'libs'

    ignoreJarJarResult false
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.android.support:support-v4:23.1.1'
    jarjar 'com.squareup.dagger:dagger:1.2.2'
}

【问题讨论】:

  • 现在,我们现在遇到了同样的问题。我们尝试了一些jarjar 工具,Gradle 的FatJar,并没有通过解决方案来实现。现在,我们正在尝试在编译时使用 jarjar 脚本的 espresso solution 库,但我们还没有正确的解决方案。
  • 其他方法是 Picasso 库,它在导入时具有零依赖关系,它使用 okhttp 库。当上传到 maven 存储库时,它将依赖项更改为可选。但是,我们没有任何成功
  • 谢谢@beni,如果我们取得了一些进展,我会告诉你的。我希望你也这样做;)

标签: android android-studio android-gradle-plugin conflicting-libraries jarjar


【解决方案1】:

我正在与@Beni 一起解决同样的问题,我们得到了一些可行的解决方案来解决这个问题。坏消息与 gradle 版本插件有关。使用此解决方案,您将绑定到 gradle 1.3 版本,因为我们使用的 espresso gradle 脚本正在寻找 1.3 gradle 版本中存在的任务,而不是以下版本。

所以这不是有史以来最好的方法,但它有效并解决了我们的问题。无论如何,如果有人可以帮助不绑定到任何 gradle 版本,那就太好了。

我给你一个我们解决方案的链接:https://github.com/GigigoGreenLabs/JarJarDagger2Example

你有类似 jarjar 的工具可以使用,看看:

https://github.com/musketyr/gradle-fatjar-plugin

Gradle shadow 插件或 maven shade 插件,如果你使用的是 maven。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 2021-04-15
    • 2019-02-21
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2019-05-16
    • 2018-11-24
    相关资源
    最近更新 更多