0

I tried to add org.witness:android-libproofmode:0.7 and com.squareup.retrofit2:retrofit:2.9.0 dependencies to my Android project. However, the following error occurred after I built the project.

Duplicate class okio.AsyncTimeout found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.AsyncTimeout$1 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.AsyncTimeout$2 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.AsyncTimeout$Watchdog found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Base64 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Buffer found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Buffer$1 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Buffer$2 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.BufferedSink found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.BufferedSource found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.ByteString found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.DeflaterSink found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.ForwardingSink found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.ForwardingSource found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.ForwardingTimeout found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.GzipSink found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.GzipSource found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.InflaterSource found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Okio found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Okio$1 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Okio$2 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Okio$3 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.RealBufferedSink found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.RealBufferedSink$1 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.RealBufferedSource found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.RealBufferedSource$1 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Segment found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.SegmentPool found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.SegmentedByteString found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Sink found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Source found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Timeout found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Timeout$1 found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)
Duplicate class okio.Util found in modules jetified-java-opentimestamps-1.17.jar (com.eternitywall:java-opentimestamps:1.17) and jetified-okio-1.17.2.jar (com.squareup.okio:okio:1.17.2)

I have already tried to exclude the okio module with the following script but it does not help.

implementation("org.witness:android-libproofmode:0.7") {
    exclude group: "com.squareup.okio", module: "okio"
}

If I excluded all okio module in all configurations, the project could be built successfully. Nonetheless, the project still needed some classes in the okio module (e.g. Crashlytics requires it). Thus, excluding the module in all configurations is not a feasible solution.

configurations {
    all*.exclude group: "com.squareup.okio", module: "okio"
}

How should I exclude the okio module in org.witness:android-libproofmode only and successfully build the project? The following is the minimal example app/build.gradle file.

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.project"
        minSdkVersion 26
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8.toString()
    }

    packagingOptions {
        exclude 'lib/x86_64/darwin/libscrypt.dylib'
    }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.10"

    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'

    implementation("com.squareup.retrofit2:retrofit:2.9.0")

    implementation("org.witness:android-libproofmode:0.7")
    // https://stackoverflow.com/questions/56639529/duplicate-class-com-google-common-util-concurrent-listenablefuture-found-in-modu
    implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

    testImplementation 'junit:junit:4.13'

    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
Shuang Wu
  • 130
  • 3
  • 14
  • Have you tried adding transitive = false ? – mirsaidoff Oct 11 '20 at 09:13
  • but, normally, when you exclude the group of library in some dependancy, this should exclude only from that dependancy. That should be ok in your case. – mirsaidoff Oct 11 '20 at 09:14
  • @mirsaidoff I have tried adding `transitive=false` but it will also exclude all transitive dependencies of `android-libproofmode` and thus causes a `ClassNotFound` error in runtime. – Shuang Wu Oct 12 '20 at 02:48

0 Answers0