在Gradle for React-Native中解决重复依赖项

时间:2017-02-24 17:45:24

标签: android gradle react-native opentok

我正在开发一个React-Native应用程序,我们正在尝试使用两个视频聊天库(OpenTok和Skylink)。两者都使用org.webrtc(libjingle),在构建过程中我们遇到了一个问题:

10:37:08.661 [DEBUG] [com.android.build.gradle.internal.transforms.JarMerger] addJar(/home/(hidden)/Projects/work/(hidden)/android/app/build/intermediates/exploded-aar/com.facebook.fresco/fbcore/0.11.0/jars/classes.jar): entry com/facebook/datasource/SimpleDataSource.class
10:37:08.661 [DEBUG] [com.android.build.gradle.internal.transforms.JarMerger] addJar(/home/(hidden)/Projects/work/(hidden)/android/app/build/intermediates/exploded-aar/com.facebook.fresco/fbcore/0.11.0/jars/classes.jar): entry com/facebook/fbcore/BuildConfig.class
10:37:08.661 [DEBUG] [com.android.build.gradle.internal.transforms.JarMerger] addJar(/home/(hidden)/Projects/work/(hidden)/android/app/build/intermediates/exploded-aar/com.opentok.android/opentok-android-sdk/2.10.1-REL-2756/jars/libs/libjingle_peerconnection_java.jar)
10:37:08.661 [DEBUG] [com.android.build.gradle.internal.transforms.JarMerger] addJar(/home/(hidden)/Projects/work/(hidden)/android/app/build/intermediates/exploded-aar/com.opentok.android/opentok-android-sdk/2.10.1-REL-2756/jars/libs/libjingle_peerconnection_java.jar): entry org/webrtc/NetworkMonitor.class
10:37:08.665 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':app:transformClassesWithJarMergingForDebug'
10:37:08.665 [LIFECYCLE] [class org.gradle.TaskExecutionLogger] :app:transformClassesWithJarMergingForDebug FAILED
10:37:08.665 [INFO] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] :app:transformClassesWithJarMergingForDebug (Thread[main,5,main]) completed. Took 0.523 secs.
10:37:08.665 [DEBUG] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] Task worker [Thread[main,5,main]] finished, busy: 2.954 secs, idle: 0.226 secs
10:37:08.672 [ERROR] [org.gradle.BuildExceptionReporter] 
10:37:08.709 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE: Build failed with an exception.
10:37:08.710 [ERROR] [org.gradle.BuildExceptionReporter] 
10:37:08.710 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
10:37:08.710 [ERROR] [org.gradle.BuildExceptionReporter] Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
10:37:08.710 [ERROR] [org.gradle.BuildExceptionReporter] > com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: org/webrtc/NetworkMonitor.class
10:37:08.710 [ERROR] [org.gradle.BuildExceptionReporter] 
10:37:08.710 [ERROR] [org.gradle.BuildExceptionReporter] * Try:
10:37:08.710 [ERROR] [org.gradle.BuildExceptionReporter] Run with --stacktrace option to get the stack trace. 
10:37:08.711 [LIFECYCLE] [org.gradle.BuildResultLogger] 
10:37:08.711 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD FAILED
10:37:08.711 [LIFECYCLE] [org.gradle.BuildResultLogger] 
10:37:08.712 [LIFECYCLE] [org.gradle.BuildResultLogger] Total time: 16.878 secs
10:37:08.836 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Closing cache fileHashes.bin (/home/(hidden)/Projects/work/(hidden)/android/.gradle/2.14.1/taskArtifacts/fileHashes.bin)
10:37:08.836 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Closing cache fileSnapshots.bin (/home/(hidden)/Projects/work/(hidden)/android/.gradle/2.14.1/taskArtifacts/fileSnapshots.bin)
10:37:08.836 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Closing cache taskArtifacts.bin (/home/(hidden)/Projects/work/(hidden)/android/.gradle/2.14.1/taskArtifacts/taskArtifacts.bin)
10:37:08.836 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on task history cache (/home/(hidden)/Projects/work/(hidden)/android/.gradle/2.14.1/taskArtifacts).
10:37:08.837 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.memcache.InMemoryCachedRepositoryFactory] In-memory dependency metadata cache closed. Repos cached: 1316, cache instances: 10, modules served from cache: 18503, artifacts: 3602
10:37:08.840 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.resolveengine.store.CachedStoreFactory] Resolution result cache closed. Cache reads: 0, disk reads: 0 (avg: 0.0 secs, total: 0.0 secs)
10:37:08.840 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.resolveengine.store.CachedStoreFactory] Resolution result cache closed. Cache reads: 0, disk reads: 146 (avg: 0.0 secs, total: 0.125 secs)
10:37:08.840 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.resolveengine.store.ResolutionResultsStoreFactory] Deleted 2 resolution results binary files in 0.003 secs
10:37:08.840 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Closing cache module-metadata.bin (/home/(hidden)/.gradle/caches/modules-2/metadata-2.16/module-metadata.bin)
10:37:08.840 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Closing cache artifact-at-repository.bin (/home/(hidden)/.gradle/caches/modules-2/metadata-2.16/artifact-at-repository.bin)
10:37:08.840 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Closing cache module-versions.bin (/home/(hidden)/.gradle/caches/modules-2/metadata-2.16/module-versions.bin)
10:37:08.840 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Closing cache module-artifacts.bin (/home/(hidden)/.gradle/caches/modules-2/metadata-2.16/module-artifacts.bin)
10:37:08.840 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on artifact cache (/home/(hidden)/.gradle/caches/modules-2).
10:37:08.840 [DEBUG] [org.gradle.cache.internal.DefaultCacheAccess] Cache Generated Gradle JARs cache (/home/(hidden)/.gradle/caches/2.14.1/generated-gradle-jars) was closed 0 times.
10:37:08.840 [DEBUG] [org.gradle.cache.internal.DefaultCacheAccess] Cache Plugin Resolution Cache (/home/(hidden)/.gradle/caches/2.14.1/plugin-resolution) was closed 0 times.
10:37:08.841 [DEBUG] [org.gradle.api.internal.tasks.compile.daemon.CompilerDaemonManager] Stopping 0 compiler daemon(s).
10:37:08.841 [INFO] [org.gradle.api.internal.tasks.compile.daemon.CompilerDaemonManager] Stopped 0 compiler daemon(s).

在OpenTok build.gradle中,我们有:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
}

dependencies {
    compile 'com.facebook.react:react-native:+'
    compile('com.opentok.android:opentok-android-sdk:2.10.+') {
        exclude group: 'org.webrtc'
    }
    compile project(':react-native-permission-helper')
}

对于SkyLink build.gradle

apply plugin: 'com.android.library'

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
    }
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
}

dependencies {
    compile fileTree(include: '*.jar', excludes: ['libjingle_peerconnection.jar', 'libjingle_peerconnection_java.jar'], dir: 'libs')
    compile(group: 'sg.com.temasys.skylink.sdk', name: 'skylink_sdk', version: '0.9.7-RELEASE', ext: 'aar')
    compile 'com.facebook.react:react-native:+'
    compile project(':react-native-permission-helper')
}

但是这种配置仍然无效。在最后的构建步骤中,仍然包含两个“libjingle_peerconnection.jar”。我能帮忙解决这个问题吗?我们可以控制gradle构建脚本,但不能控制第三方SDK。

1 个答案:

答案 0 :(得分:0)

我能够通过将以下任务添加到我的主build.gradle

来修复此问题(尽管是以一种黑客的方式)
tasks.create("excludeTask") << {
    File file = file("${buildDir}/intermediates/exploded-aar/com.opentok.android/opentok-android-sdk/2.10.1-REL-2756/jars/libs/libjingle_peerconnection_java.jar");
    println("Excluding file " + file)
    if (file.exists()) {
        file.delete();
    }
}

tasks.whenTaskAdded({
    if (it.name.matches(/^process.*Resources$/)) {
        it.dependsOn excludeTask
    }
})

这会在链接

之前删除重复的JAR