Search code examples
androidreact-nativebuild.gradledetox

Entry name 'META-INF/MANIFEST.MF' collided


Description

I keep getting the error below when running detox build -c android

> Task :app:packageDebugAndroidTest FAILED
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:packageDebugAndroidTest'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > Entry name 'META-INF/MANIFEST.MF' collided

Reproduce

  • Go through the steps here to set up detox for android (without the test butler step)
  • Set up the 2 following files as described (minus my dependencies)
  • Run detox build -c android (with or without having built the aosp emulator first)

My files

.detoxrc.json

{
  ...
    "android": {
      "binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
      "build": "cd android && ./gradlew app:assembleDebug app:assembleAndroidTest -DtestBuildType=debug && cd ..",
      "type": "android.emulator",
      "device": {
        "avdName": "Pixel_API_28_AOSP"
      }
    }
  ...

android/app.build.gradle

The first 3 options are failed attempts at fixing the issue. The last option was already present in the project before trying to install Detox.

...
android {
    ...
    packagingOptions {
        // exclude 'META-INF/**'
        // pickFirst 'META-INF/**'
        // merge 'META-INF/**'
        pickFirst "**"
    }
    ...
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    //noinspection GradleDynamicVersion
    implementation "com.facebook.react:react-native:+"  // From node_modules
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
    implementation 'com.facebook.fresco:animated-gif:2.0.0'
    debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.fbjni'
    }
    debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.flipper'
        exclude group:'com.squareup.okhttp3', module:'okhttp'
    }
    debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.flipper'
    }
    addUnimodulesDependencies()

    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath + "hermes-debug.aar")
        releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
        implementation jscFlavor
    }

    androidTestImplementation('com.wix:detox:+')
    androidTestImplementation(project(path: ":detox"))
}
...

Environment

  • Detox: ^17.14.3
  • React Native: 0.63.2
  • com.android.tools.build:gradle: 4.0.1
  • Node: v12.19.0
  • Device: Android AOSP Pixel Emulator API 28
  • OS: MacOS Catalina v10.15.7
  • Test-runner: jest

Other potentially useful info

  • Detox builds and runs tests fine for iOS, but not android
  • Running the build command with --stacktrace doesn't give any further info
  • This is my first time trying to set up detox at all on this project
  • The solution listed in the detox docs hasn't fixed it
  • Lots of stuff I've found about related errors on threads (though none mention detox) has to do with the gradle version. A lot of people suggest downgrading.
  • I can build the actual app on a normal Pixel emulator and the AOSP one using the build command through android studio. This issue only occurs when trying to use the build command through detox-cli

Solution

  • The possible fix is to disable zipflinger introduced in Gradle Plugin 3.6.0-alpha09. Just add a new line in gradle.properties android.useNewApkCreator=false

    Read more about the flag on Google blog or check a similar issue.