使用具有不同版本Android依赖项的相同库的两个或多个库之间的冲突

时间:2018-04-14 09:03:07

标签: android-studio gradle android-gradle react-native-android onesignal

我正在使用react native进行移动应用程序,在使用npm install安装oneignal之前,它一切运行良好,构建成功但是在安装库之后我收到以下错误。

错误:

  

清单合并失败:属性   meta-data#android.support.VERSION@value value =(26.0.1)from   [com.android.support:cardview-v7:26.0.1] AndroidManifest.xml:25:13-35     也出现在[com.android.support:support-v4:26.1.0]   AndroidManifest.xml:28:13-35 value =(26.1.0)。建议:添加   '工具:替换="机器人:值"'到元素   AndroidManifest.xml:23:9-25:38覆盖。

依赖关系列表安装Onesignal之前(工作版) https://gist.github.com/lulzimfazlija/543843cc8e36a0957ed5bc3238ab0ee0

依赖列表安装Onesignal后(不工作版) https://gist.github.com/lulzimfazlija/12b7f8d83c2ca680f420d3411cea729a

我知道这与库之间的冲突有关,但我无法解决它!

我尝试了什么:

  compile('com.android.support:cardview-v7:26.0.1'){
    exclude module: 'support-annotations'
  }
  compile('com.android.support:recyclerview-v7:26.0.1'){
    exclude module: 'support-annotations'
  }

  compile('com.android.support:customtabs:26.0.1'){
    exclude module: 'support-annotations'
  }

  compile('com.android.support:exifinterface:26.0.1'){
    exclude module: 'support-annotations'
  }

此更改后我收到了什么错误:

  

清单合并失败:属性   meta-data#android.support.VERSION@value value =(26.0.1)from   [com.android.support:exifinterface:26.0.1]   AndroidManifest.xml:25:13-35也出现在   [com.android.support:support-v4:26.1.0] AndroidManifest.xml:28:13-35   值=(26.1.0)。建议:添加'工具:replace =" android:value"'至    AndroidManifest.xml:23:9-25:38中的元素覆盖。

期待结果:建立成功!

编辑app.build.gradle:

buildscript {
  repositories {
    maven { url 'https://maven.fabric.io/public' }
  }

  dependencies {
    classpath 'io.fabric.tools:gradle:1.+'
  }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'com.neenbedankt.android-apt'

repositories {
  maven { url 'https://maven.fabric.io/public' }
}

android {
  compileSdkVersion 26
  buildToolsVersion '26.0.1'

  defaultConfig {
    applicationId 'com.ferrometal11'
    targetSdkVersion 25
    versionCode 1
    versionName '0.1.0'
    ndk {
      abiFilters 'armeabi-v7a', 'x86'
    }
    multiDexEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    // Deprecated. Used by net.openid:appauth
    manifestPlaceholders = [
      'appAuthRedirectScheme': 'host.exp.exponent'
    ]
    manifestPlaceholders = [onesignal_app_id: "xxxx-cc74-430c-b7fd-6d9e0869fd6b",
                            onesignal_google_project_number: "REMOTE"]
  }
  dexOptions {
    javaMaxHeapSize System.getenv("DISABLE_DEX_MAX_HEAP") ? null : "8g"
    keepRuntimeAnnotatedClasses false
  }
  productFlavors {
    // Define separate dev and prod product flavors.
    dev {
      // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
      // to pre-dex each module and produce an APK that can be tested on
      // Android Lollipop without time consuming dex merging processes.
      minSdkVersion 21
    }
    devRemoteKernel {
      minSdkVersion 21
    }
    dev19 {
      // For debugging / development on older SDK versions. Increases build
      // time so use 'dev' if not running on older SDKs.
      minSdkVersion 19
    }
    prod {
      // The actual minSdkVersion for the application.
      minSdkVersion 19
    }
  }
  buildTypes {
    debug {
      debuggable true
    }
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      zipAlignEnabled true
    }
  }
  signingConfigs {
    debug {
      storeFile file('../debug.keystore')
    }
  }
  lintOptions {
    abortOnError false
  }
  packagingOptions {
    pickFirst "**"
  }
}

// Don't use modern jsc-android since it still has some critical bugs that
// crash applications when the string for the JS bundle is loaded and when
// locale-specific date functions are called.
// configurations.all {
//   resolutionStrategy {
//     force 'org.webkit:android-jsc:r216113'
//   }
// }


task exponentPrebuildStep(type: Exec) {
  workingDir '../'
  if (System.getProperty('os.name').toLowerCase().contains('windows')) {
    commandLine 'cmd', '/c', '.\\detach-scripts\\prepare-detached-build.bat'
  } else {
    commandLine './detach-scripts/prepare-detached-build.sh'
  }
}
preBuild.dependsOn exponentPrebuildStep


dependencies {
    compile project(':react-native-onesignal')
  compile fileTree(dir: 'libs', include: ['*.jar'])

  compile 'com.android.support:multidex:1.0.1'



  // Our dependencies from ExpoView
  // DON'T ADD ANYTHING HERE THAT ISN'T IN EXPOVIEW. ONLY COPY THINGS FROM EXPOVIEW TO HERE.
  compile 'com.android.support:appcompat-v7:26.1.0'
  compile 'com.facebook.android:facebook-android-sdk:4.7.0'
  compile('com.facebook.android:audience-network-sdk:4.22.1') {
    exclude module: 'play-services-ads'
  }
  provided 'org.glassfish:javax.annotation:3.1.1'
  compile 'com.jakewharton:butterknife:7.0.1'
  compile 'de.greenrobot:eventbus:2.4.0'
  compile 'com.amplitude:android-sdk:2.9.2' // Be careful when upgrading! Upgrading might break experience scoping. Check with Jesse. See Analytics.resetAmplitudeDatabaseHelper
  compile 'com.squareup.picasso:picasso:2.5.2'
  compile 'com.google.android.gms:play-services-gcm:12.0.1'
  compile 'com.google.android.gms:play-services-analytics:12.0.1'
  compile 'com.google.android.gms:play-services-maps:12.0.1'
  compile 'com.google.android.gms:play-services-auth:12.0.1'
  compile 'com.google.android.gms:play-services-location:12.0.1'
  compile 'com.google.android.gms:play-services-ads:12.0.1'
  apt 'com.raizlabs.android:DBFlow-Compiler:2.2.1'
  compile "com.raizlabs.android:DBFlow-Core:2.2.1"
  compile "com.raizlabs.android:DBFlow:2.2.1"
  compile "com.madgag.spongycastle:core:1.53.0.0"
  compile "com.madgag.spongycastle:prov:1.53.0.0"
  debugCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
  // debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta1'
  releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
  compile 'com.facebook.device.yearclass:yearclass:1.0.1'
  compile 'commons-io:commons-io:1.3.2'
  compile 'me.leolin:ShortcutBadger:1.1.4@aar'
  compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
  compile 'com.theartofdev.edmodo:android-image-cropper:2.4.7'
  compile 'com.yqritc:android-scalablevideoview:1.0.1'
  compile 'commons-codec:commons-codec:1.10'
  compile 'com.segment.analytics.android:analytics:4.3.0'
  compile 'com.google.zxing:core:3.2.1'
  compile 'net.openid:appauth:0.4.1'
  compile 'com.airbnb.android:lottie:2.2.0'
  compile 'io.branch.sdk.android:library:2.6.1'
  compile('io.nlopez.smartlocation:library:3.2.11') {
    transitive = false
  }
  compile 'com.android.support:exifinterface:26.1.0'
  compile 'com.squareup.okhttp3:okhttp:3.4.1'
  compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1'
  compile 'com.squareup.okhttp3:okhttp-ws:3.4.1'
  compile 'com.squareup.okio:okio:1.9.0'

  // Testing
  androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.1'
  // We use a modified build of com.android.support.test:runner:1.0.1. Explanation in maven-test/README
  androidTestCompile 'com.android.support.test:runner:1.0.1'
  androidTestCompile 'com.android.support:support-annotations:26.1.0'
  androidTestCompile 'com.google.code.findbugs:jsr305:3.0.0'
  androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
  androidTestCompile 'com.azimolabs.conditionwatcher:conditionwatcher:0.2'


    //My change
//  compile('host.exp.exponent:expoview:26.0.0@aar') {
//    transitive = true
//  }
//
//  compile('com.android.support:cardview-v7:26.0.1'){
//    exclude module: 'support-annotations'
//  }
//  compile('com.android.support:recyclerview-v7:26.0.1'){
//    exclude module: 'support-annotations'
//  }
//
//  compile('com.android.support:customtabs:26.0.1'){
//    exclude module: 'support-annotations'
//  }
//
//  compile('com.android.support:exifinterface:26.0.1'){
//    exclude module: 'support-annotations'
//  }
//
//  compile ('com.android.support:cardview-v7:26.1.0') {
//    exclude group: 'com.android.support'
//    // if you need to exlude appcompat-v7
////    exclude module: 'appcompat-v7'
//    exclude module: 'support-annotations'
//  }
//  compile ('com.android.support:appcompat-v7:26.1.0'){
//    exclude module: 'support-annotations'
//  }
//  compile ('com.android.support:exifinterface:26.1.0'){
//    exclude module: 'support-annotations'
//  }

//  compile("com.android.support:support-v4:26.1.0") { force = true }
//  compile("com.android.support:customtabs:26.1.0") { force = true }






}

// This has to be down here for some reason
apply plugin: 'com.google.gms.google-services'

补充评论: 一旦添加了编译项目(':react-native-onesignal'),构建就会中断,所以这就是破坏所有内容并导致依赖项之间冲突的行

3 个答案:

答案 0 :(得分:1)

使用支持库版本26.0.1,您需要使用版本 26.1.0 。如果有另一个支持库而不是26.1.0,则需要将其排除在:

compile ('com.package.library:1.1.1') {
    exclude group: 'com.android.support'
    // if you need to exlude appcompat-v7
    //exclude module: 'appcompat-v7'
    exclude module: 'support-annotations'
    exclude module: 'cardview-v7'
}

答案 1 :(得分:1)

我设法通过更改我的谷歌服务依赖项来解决这个问题:

compile ('com.google.android.gms:play-services-gcm:9.8.0'){
    force true   
}   
compile ('com.google.android.gms:play-services-analytics:9.8.0'){
    force true   
}   
compile ('com.google.android.gms:play-services-maps:9.8.0'){
    force true   
}   
compile ('com.google.android.gms:play-services-auth:9.8.0'){
    force true   
}   
compile ('com.google.android.gms:play-services-location:9.8.0'){
    force true   
}   
compile ('com.google.android.gms:play-services-ads:9.8.0'){
    force true   
}

答案 2 :(得分:0)

将它放在根项目中:

Map<String,String> versionOverrides = [
        'com.android.support:support-v4' : '26.0.1'
]

def overrideDependencies = { Project project ->
    project.configurations.all {
        // See https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html
        resolutionStrategy {
            eachDependency { DependencyResolveDetails details ->
                String overrideVersion = versionOverrides.get(details.requested.group + ":" + details.requested.name)
                if (overrideVersion != null && details.requested.version != overrideVersion) {
                    logger.debug("Overriding dependency ${details.requested.group}:${details.requested.name} " +
                            "version ${details.requested.version} --> $overrideVersion")
                    details.useVersion overrideVersion
                }
            }
        }
    }
}

subprojects { project ->
    overrideDependencies(project)
}