Skip to content
This repository has been archived by the owner on Aug 11, 2020. It is now read-only.

Conflict with Facebook plugin: Execution failed for task ':transformClassesWithDexForDebug' #535

Open
amit-t opened this issue Aug 26, 2017 · 57 comments · May be fixed by mpacary/phonegap-plugin-barcodescanner#1

Comments

@amit-t
Copy link

amit-t commented Aug 26, 2017

Expected Behaviour

Build Succeeded

Actual Behaviour

  • What went wrong:
    Execution failed for task ':transformClassesWithDexForDebug'.

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;

(Android) What device vendor

Device - Google Pixel

Cordova CLI version and cordova platform version

cordova --version - 7.0.1
cordova platforms - 

Installed platforms:
android 6.2.3
ios 4.3.1

Plugin version

cordova plugin version | grep phonegap-plugin-barcodescanner

phonegap-plugin-barcodescanner 6.0.8 "BarcodeScanner"

Sample Code that illustrates the problem

build.gradle

/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

*/

apply plugin: 'com.android.application'

buildscript {
repositories {
mavenCentral()
jcenter()
}

// Switch the Android Gradle plugin version requirement depending on the
// installed version of Gradle. This dependency is documented at
// http://tools.android.com/tech-docs/new-build-system/version-compatibility
// and https://issues.apache.org/jira/browse/CB-8143
dependencies {
    classpath 'com.android.tools.build:gradle:2.2.3'
}

}

// Allow plugins to declare Maven dependencies via build-extras.gradle.
allprojects {
repositories {
mavenCentral();
jcenter()
}
}

task wrapper(type: Wrapper) {
gradleVersion = '2.14.1'
}

// Configuration properties. Set these via environment variables, build-extras.gradle, or gradle.properties.
// Refer to: http://www.gradle.org/docs/current/userguide/tutorial_this_and_that.html
ext {
apply from: 'CordovaLib/cordova.gradle'
// The value for android.compileSdkVersion.
if (!project.hasProperty('cdvCompileSdkVersion')) {
cdvCompileSdkVersion = null;
}
// The value for android.buildToolsVersion.
if (!project.hasProperty('cdvBuildToolsVersion')) {
cdvBuildToolsVersion = null;
}
// Sets the versionCode to the given value.
if (!project.hasProperty('cdvVersionCode')) {
cdvVersionCode = null
}
// Sets the minSdkVersion to the given value.
if (!project.hasProperty('cdvMinSdkVersion')) {
cdvMinSdkVersion = null
}
// Whether to build architecture-specific APKs.
if (!project.hasProperty('cdvBuildMultipleApks')) {
cdvBuildMultipleApks = null
}
// .properties files to use for release signing.
if (!project.hasProperty('cdvReleaseSigningPropertiesFile')) {
cdvReleaseSigningPropertiesFile = null
}
// .properties files to use for debug signing.
if (!project.hasProperty('cdvDebugSigningPropertiesFile')) {
cdvDebugSigningPropertiesFile = null
}
// Set by build.js script.
if (!project.hasProperty('cdvBuildArch')) {
cdvBuildArch = null
}

// Plugin gradle extensions can append to this to have code run at the end.
cdvPluginPostBuildExtras = []

}

// PLUGIN GRADLE EXTENSIONS START
apply from: "phonegap-plugin-barcodescanner/mobileapp-barcodescanner.gradle"
// PLUGIN GRADLE EXTENSIONS END

def hasBuildExtras = file('build-extras.gradle').exists()
if (hasBuildExtras) {
apply from: 'build-extras.gradle'
}

// Set property defaults after extension .gradle files.
if (ext.cdvCompileSdkVersion == null) {
ext.cdvCompileSdkVersion = privateHelpers.getProjectTarget()
}
if (ext.cdvBuildToolsVersion == null) {
ext.cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()
}
if (ext.cdvDebugSigningPropertiesFile == null && file('debug-signing.properties').exists()) {
ext.cdvDebugSigningPropertiesFile = 'debug-signing.properties'
}
if (ext.cdvReleaseSigningPropertiesFile == null && file('release-signing.properties').exists()) {
ext.cdvReleaseSigningPropertiesFile = 'release-signing.properties'
}

// Cast to appropriate types.
ext.cdvBuildMultipleApks = cdvBuildMultipleApks == null ? false : cdvBuildMultipleApks.toBoolean();
ext.cdvMinSdkVersion = cdvMinSdkVersion == null ? null : Integer.parseInt('' + cdvMinSdkVersion)
ext.cdvVersionCode = cdvVersionCode == null ? null : Integer.parseInt('' + cdvVersionCode)

def computeBuildTargetName(debugBuild) {
def ret = 'assemble'
if (cdvBuildMultipleApks && cdvBuildArch) {
def arch = cdvBuildArch == 'arm' ? 'armv7' : cdvBuildArch
ret += '' + arch.toUpperCase().charAt(0) + arch.substring(1);
}
return ret + (debugBuild ? 'Debug' : 'Release')
}

// Make cdvBuild a task that depends on the debug/arch-sepecific task.
task cdvBuildDebug
cdvBuildDebug.dependsOn {
return computeBuildTargetName(true)
}

task cdvBuildRelease
cdvBuildRelease.dependsOn {
return computeBuildTargetName(false)
}

task cdvPrintProps << {
println('cdvCompileSdkVersion=' + cdvCompileSdkVersion)
println('cdvBuildToolsVersion=' + cdvBuildToolsVersion)
println('cdvVersionCode=' + cdvVersionCode)
println('cdvMinSdkVersion=' + cdvMinSdkVersion)
println('cdvBuildMultipleApks=' + cdvBuildMultipleApks)
println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile)
println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile)
println('cdvBuildArch=' + cdvBuildArch)
println('computedVersionCode=' + android.defaultConfig.versionCode)
android.productFlavors.each { flavor ->
println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode)
}
}

android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}

defaultConfig {
    versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode"))
    applicationId privateHelpers.extractStringFromManifest("package")

    if (cdvMinSdkVersion != null) {
        minSdkVersion cdvMinSdkVersion
    }
}

lintOptions {
  abortOnError false;
}

compileSdkVersion cdvCompileSdkVersion
buildToolsVersion cdvBuildToolsVersion

if (Boolean.valueOf(cdvBuildMultipleApks)) {
    productFlavors {
        armv7 {
            versionCode defaultConfig.versionCode*10 + 2
            ndk {
                abiFilters "armeabi-v7a", ""
            }
        }
        x86 {
            versionCode defaultConfig.versionCode*10 + 4
            ndk {
                abiFilters "x86", ""
            }
        }
        all {
            ndk {
                abiFilters "all", ""
            }
        }
    }
}
/*

ELSE NOTHING! DON'T MESS WITH THE VERSION CODE IF YOU DON'T HAVE TO!

else if (!cdvVersionCode) {
  def minSdkVersion = cdvMinSdkVersion ?: privateHelpers.extractIntFromManifest("minSdkVersion")
  // Vary versionCode by the two most common API levels:
  // 14 is ICS, which is the lowest API level for many apps.
  // 20 is Lollipop, which is the lowest API level for the updatable system webview.
  if (minSdkVersion >= 20) {
    defaultConfig.versionCode += 9
  } else if (minSdkVersion >= 14) {
    defaultConfig.versionCode += 8
  }
}
*/

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_6
    targetCompatibility JavaVersion.VERSION_1_6
}

if (cdvReleaseSigningPropertiesFile) {
    signingConfigs {
        release {
            // These must be set or Gradle will complain (even if they are overridden).
            keyAlias = ""
            keyPassword = "__unset" // And these must be set to non-empty in order to have the signing step added to the task graph.
            storeFile = null
            storePassword = "__unset"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
    addSigningProps(cdvReleaseSigningPropertiesFile, signingConfigs.release)
}
if (cdvDebugSigningPropertiesFile) {
    addSigningProps(cdvDebugSigningPropertiesFile, signingConfigs.debug)
}

}

dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
// SUB-PROJECT DEPENDENCIES START
debugCompile(project(path: "CordovaLib", configuration: "debug"))
releaseCompile(project(path: "CordovaLib", configuration: "release"))
compile "com.android.support:support-v4:24.1.1+"
compile "com.facebook.android:facebook-android-sdk:4.+"
compile "com.google.android.gms:play-services-auth:+"
compile "com.google.android.gms:play-services-identity:+"
// SUB-PROJECT DEPENDENCIES END
}

def promptForReleaseKeyPassword() {
if (!cdvReleaseSigningPropertiesFile) {
return;
}
if ('__unset'.equals(android.signingConfigs.release.storePassword)) {
android.signingConfigs.release.storePassword = privateHelpers.promptForPassword('Enter key store password: ')
}
if ('__unset'.equals(android.signingConfigs.release.keyPassword)) {
android.signingConfigs.release.keyPassword = privateHelpers.promptForPassword('Enter key password: ');
}
}

gradle.taskGraph.whenReady { taskGraph ->
taskGraph.getAllTasks().each() { task ->
if (task.name == 'validateReleaseSigning' || task.name == 'validateSigningRelease') {
promptForReleaseKeyPassword()
}
}
}

def addSigningProps(propsFilePath, signingConfig) {
def propsFile = file(propsFilePath)
def props = new Properties()
propsFile.withReader { reader ->
props.load(reader)
}

def storeFile = new File(props.get('key.store') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'storeFile'))
if (!storeFile.isAbsolute()) {
    storeFile = RelativePath.parse(true, storeFile.toString()).getFile(propsFile.getParentFile())
}
if (!storeFile.exists()) {
    throw new FileNotFoundException('Keystore file does not exist: ' + storeFile.getAbsolutePath())
}
signingConfig.keyAlias = props.get('key.alias') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'keyAlias')
signingConfig.keyPassword = props.get('keyPassword', props.get('key.alias.password', signingConfig.keyPassword))
signingConfig.storeFile = storeFile
signingConfig.storePassword = props.get('storePassword', props.get('key.store.password', signingConfig.storePassword))
def storeType = props.get('storeType', props.get('key.store.type', ''))
if (!storeType) {
    def filename = storeFile.getName().toLowerCase();
    if (filename.endsWith('.p12') || filename.endsWith('.pfx')) {
        storeType = 'pkcs12'
    } else {
        storeType = signingConfig.storeType // "jks"
    }
}
signingConfig.storeType = storeType

}

for (def func : cdvPluginPostBuildExtras) {
func()
}

// This can be defined within build-extras.gradle as:
// ext.postBuildExtras = { ... code here ... }
if (hasProperty('postBuildExtras')) {
postBuildExtras()
}
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '25.3.1'
}
}
}
}

@iowaz
Copy link

iowaz commented Aug 26, 2017

I have the same issue, last week it was building correctly.

@danilopolani
Copy link

danilopolani commented Aug 26, 2017

Same here. Yesterday was fine, today this breaks the build. My version of the plugin is 6.0.6.

@yosi-dediashvili
Copy link

Same story here. Not sure what got updated, and where :\

@yosi-dediashvili
Copy link

@amit-t, can you share the plugin list you have? I have a feeling that it might be related to other plugin causing a mess?

@iowaz
Copy link

iowaz commented Aug 26, 2017

@yosi-dediashvili , here's go mine:

com.telerik.plugins.nativepagetransitions 0.6.5 "Native Page Transitions"
cordova-android-play-services-gradle-release 0.0.2 "cordova-android-play-services-gradle-release"
cordova-android-support-gradle-release 0.0.2 "cordova-android-support-gradle-release"
cordova-plugin-camera 2.4.1 "Camera"
cordova-plugin-compat 1.1.0 "Compat"
cordova-plugin-contacts 2.3.1 "Contacts"
cordova-plugin-device 1.1.6 "Device"
cordova-plugin-facebook4 1.9.1 "Facebook Connect"
cordova-plugin-file 4.3.3 "File"
cordova-plugin-file-transfer 1.6.3 "File Transfer"
cordova-plugin-geolocation 2.4.3 "Geolocation"
cordova-plugin-splashscreen 4.0.3 "Splashscreen"
cordova-plugin-statusbar 2.2.3 "StatusBar"
cordova-plugin-vibration 2.1.5 "Vibration"
cordova-plugin-whitelist 1.3.2 "Whitelist"
cordova-plugin-wkwebview-engine 1.1.4-dev "Cordova WKWebView Engine"
cordova-plugin-x-socialsharing 5.1.8 "SocialSharing"
cordova-sqlite-storage 2.0.4 "Cordova sqlite storage plugin"
es6-promise-plugin 4.1.0 "Promise"
info.protonet.imageresizer 0.1.1 "Image Resizer"
ionic-plugin-keyboard 2.2.1 "Keyboard"
phonegap-plugin-barcodescanner 6.0.7 "BarcodeScanner"
phonegap-plugin-push 1.10.5 "PushPlugin"

@iowaz
Copy link

iowaz commented Aug 26, 2017

See, the problem is that Facebook SDK recently included ZXing as a dependency.

jeduan/cordova-plugin-facebook4#550

@yosi-dediashvili
Copy link

yosi-dediashvili commented Aug 26, 2017

OK, so the issue here is with the underlying module. The barcodescanner-lib-aar: https://github.com/EddyVerbruggen/barcodescanner-lib-aar/tree/master/barcodescanner/src/main/java/com/google/zxing

Seems like instead of depending on the barcode lib, it's including the whole source, essentially redefining everything, and that's why the build fails (there's the lib being included because of the Facebook SDK, and the lib getting redefined by the barcode lib).

Seems like forcing version 4.25.0 of the Facebook SDK (if you don't need 4.26.0), solves this. Add a after_platform_add hook:

if [ -d "platforms/android" ]; then
  echo '
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == "com.facebook.android") {
          details.useVersion "4.25.0"
        }
    }
}
' > platforms/android/build-extras.gradle
fi

@amit-t
Copy link
Author

amit-t commented Aug 26, 2017

@yosi-dediashvili - Here is my list

cordova-plugin-calendar 4.6.0 "Calendar"
cordova-plugin-camera 2.4.1 "Camera"
cordova-plugin-compat 1.1.0 "Compat"
cordova-plugin-console 1.0.7 "Console"
cordova-plugin-datepicker 0.9.3 "DatePicker"
cordova-plugin-device 1.1.6 "Device"
cordova-plugin-facebook4 1.9.1 "Facebook Connect"
cordova-plugin-googleplus 5.1.1 "Google SignIn"
cordova-plugin-inappbrowser 1.7.1 "InAppBrowser"
cordova-plugin-splashscreen 4.0.3 "Splashscreen"
cordova-plugin-statusbar 2.2.3 "StatusBar"
cordova-plugin-whitelist 1.3.2 "Whitelist"
cordova-plugin-wkwebview-engine 1.1.4-dev "Cordova WKWebView Engine"
ionic-plugin-keyboard 2.2.1 "Keyboard"
phonegap-plugin-barcodescanner 6.0.8 "BarcodeScanner"

@Ross-Rawlins
Copy link

Where does the hook get added? in the build gradle?

@danilopolani
Copy link

@Ross-Rawlins you can create the path hooks/after_platform_add/ in your project root and inside that create a file called facebook4-fix.sh (the name doesn't matter, but it must be .sh) and put the code inside that file.

Then remove and readd android platform.
If you are using Ionic the folder may already exists with a detailed README, just make sure to delete it from .gitignore or, if you are using git, the hooks will never be sent with the push.

@Ross-Rawlins
Copy link

oh i added the file build-extras.gradle and its all working now?

@danilopolani
Copy link

@Ross-Rawlins yes, but if you choose to create manually the file, remember to exclude it from .gitignore (which ignores all the platforms).

Put !platforms/android/build-extras.gradle after platforms/, for example:

tmp/
temp/
platforms/
!platforms/android/build-extras.gradle
plugins/
plugins/android.json

P.S. This is extracted from a Ionic project .gitignore, it may change if you aren't using it

@dgaurav-163
Copy link

I am getting same problem, Where I have to add hack in code repository. I have already build-extras.gradle file inside cordova-plugin-file -> src -> android -> build.extras.gradle. same file is blank so what I have to add in tthis file? Did nou understand why you are adding hack for facebook.

Kindly suggest!

@danilopolani
Copy link

@dgaurav-163 the "hack" is for Facebook because it now includes the barcodescanner, so there are two duplicates.

You have to copy-paste that code inside your platforms/android/build-extras.gradle file, not the one of the plugin.

@Maik3345
Copy link

Maik3345 commented Aug 29, 2017

if [ -d "platforms/android" ]; then
  echo '
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == "com.facebook.android") {
          details.useVersion "4.25.0"
        }
    }
}
' > platforms/android/build-extras.gradle
fi

create the hook not work for me, but adding this in the end of the build.gradle and work correctly!!

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == "com.facebook.android") {
          details.useVersion "4.25.0"
        }
    }
}

@danilopolani
Copy link

Maik did you removed android and added again with the command platform rm android and platform add android? The hook is called only when you add the platform, not when you deploy the app

@Maik3345
Copy link

yeah, remove the platform but not work the hook, but add this code in the gradle and work.

@Ross-Rawlins
Copy link

Ross-Rawlins commented Aug 30, 2017 via email

@dgaurav-163
Copy link

same issue will remove when I add multiDexEnabled true in build.gradle inside defaultConfig.

defaultConfig {
minSdkVersion 14 //lower than 14 doesn't support multidex
targetSdkVersion 22

         // Enabling multidex support.
         multiDexEnabled true
     }

try this, may be it will help

@amit-t
Copy link
Author

amit-t commented Aug 30, 2017

I was able to fix it by doing the below :-
in the file "project.properties"
Change the below three lines ...

cordova.system.library.2=com.facebook.android:facebook-android-sdk:+
cordova.system.library.3=com.google.android.gms:play-services-auth:+
cordova.system.library.4=com.google.android.gms:play-services-identity:+

TO

cordova.system.library.2=com.facebook.android:facebook-android-sdk:4.25.0
cordova.system.library.3=com.google.android.gms:play-services-auth:9.0.0
cordova.system.library.4=com.google.android.gms:play-services-identity:9.0.0

@vagnerbertoni
Copy link

just fix facebook plugin version
<gap:plugin name="cordova-plugin-facebook4" source="npm" spec="1.7.4">

@lorecioni
Copy link

lorecioni commented Aug 31, 2017

I followed the solution proposed by @amit-t and got it work! Thank you!
The only change I made:

cordova.system.library.2=com.facebook.android:facebook-android-sdk:4.25.0

@macdonst macdonst added the bug label Sep 1, 2017
@baptistedeleplace
Copy link

Thanks @vagnerbertoni !

@upuxaa
Copy link

upuxaa commented Sep 13, 2017

I couldn't figure it out...just added this plugin and it worked: https://github.com/NazarKozak/cordova-plugin-multidex

@dgaurav-163
Copy link

Thanks @Maik3345. your solution worked for me. 👍

@AnthonyLombard
Copy link

I dont have the facebook plugin and I still get this error< have tried everything above to no avail.

Here is my plugin list

cordova-plugin-compat 1.1.0 "Compat"
cordova-plugin-device 1.1.5 "Device"
cordova-plugin-dialogs 1.3.2 "Notification"
cordova-plugin-multidex 1.0 "Cordova Multi Dex"
cordova-plugin-whitelist 1.3.2 "Whitelist"
phonegap-plugin-barcodescanner 6.0.6 "BarcodeScanner"

I just added multidex as above comment said it may work

@wilsolutions
Copy link

Using com.facebook.android:facebook-android-sdk:4.25.0 works =) but

FB SDK is now on version com.facebook.android:facebook-android-sdk:4.37.0 so, we need to upgrade.

Is it possible to make the barcodescanner plugin to use the same version of the zxing library (com.google.zxing:core:3.3.0) as the FB SDK?

@jcesarmobile jcesarmobile changed the title Execution failed for task ':transformClassesWithDexForDebug' Conflict with Facebook plugin: Execution failed for task ':transformClassesWithDexForDebug' Nov 12, 2018
@xale76
Copy link

xale76 commented Dec 11, 2018

please someone could help me?
even if I add

I got still the error!

@yurik94
Copy link

yurik94 commented Dec 16, 2018

Any news?

@FlossyWeb
Copy link

+1

@JustasKuizinas
Copy link

Did no one solve this?

@viking2917
Copy link

@JustasKuizinas See workarounds mentioned in this issue: #606. Key seems to be retreating to Facebook login plugin v 1.7.4. Not a fix but can work with older facebook plugin versions.

@JavierPAYTEF
Copy link

This issue is still happening. But now it's worst because the facebook4 plugin introduced some new features that make it incompatible with SDK version 4.25, so now you also have to install an older version of the plugin itself.
Is there no way around the use of the aar file? Is the codebase to big to include the code instead?

@JavierPAYTEF
Copy link

In case anyone needs it the last compatible version is 3.2.0 (the current is 4.2.1).
You can install it like this:

cordova plugin add cordova-plugin-facebook4@3.2.0 --save --variable APP_ID="123456789" --variable APP_NAME="yourappname" --variable FACEBOOK_ANDROID_SDK_VERSION="4.25.0"

You might also need to add multidex, like some other answers explain. There are cordova plugins for that as well.

@idpsycho
Copy link

idpsycho commented Feb 24, 2019

Nothing worked. I tried every suggestion I found in this thread, on stackoverflow, and on the internet. Nothing helped me. phonegap-plugin-barcodescanner just wont coexist with cordova-plugin-facebook4. I ended up removing phonegap-plugin-barcodescanner and used cordova-plugin-qrscanner instead.

Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

Reproduce by:

ionic start x blank
cd x
ionic cordova plugin add cordova-plugin-facebook4
ionic cordova build android // works fine
ionic cordova plugin add phonegap-plugin-barcodescanner
ionic cordova build android // breaks

@thaismartins
Copy link

Nothing worked. I tried every suggestion I found in this thread, on stackoverflow, and on the internet. Nothing helped me. phonegap-plugin-barcodescanner just wont coexist with cordova-plugin-facebook4. I ended up removing phonegap-plugin-barcodescanner and used cordova-plugin-qrscanner instead.

Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

Reproduce by:

ionic start x blank
cd x
ionic cordova plugin add cordova-plugin-facebook4
ionic cordova build android // works fine
ionic cordova plugin add phonegap-plugin-barcodescanner
ionic cordova build android // breaks

Same scenario and error here 😢

Any solution?

@viking2917
Copy link

@thaismartinsprojects if you have not already, you might review the workarounds mentioned in this issue: #606

@thaismartins
Copy link

@thaismartinsprojects if you have not already, you might review the workarounds mentioned in this issue: #606

Thank you, @viking2917! I finally found a solution. Not that best one, but it works.

Adding in build.gradle:

compile ("com.facebook.android:facebook-android-sdk:4.40.0"){
    exclude group: 'com.google.zxing'
}

@viking2917
Copy link

@thaismartinsprojects interesting. thanks for sharing that!

@tppshaka77
Copy link

@thaismartinsprojects if you have not already, you might review the workarounds mentioned in this issue: #606

Thank you, @viking2917! I finally found a solution. Not that best one, but it works.

Adding in build.gradle:

compile ("com.facebook.android:facebook-android-sdk:4.40.0"){
    exclude group: 'com.google.zxing'
}

Hello, could you explain me where to put that code? i have been trying to solve this issue, but when i try to use

compile ("com.facebook.android:facebook-android-sdk:4.40.0"){
exclude group: 'com.google.zxing'
}

It doesnt make any effect since the build.grandle gets rebuilt everytime i try cordova build.

Thanks

@AndreiTelteu
Copy link

AndreiTelteu commented Mar 28, 2019

I have a fix for this !
I forked the facebook plugin and excluded that library with exclude group: 'com.google.zxing'.
Here is my fork: https://github.com/AndreiTelteu/cordova-plugin-facebook4-no-zxing
To install my fork, do this:

cordova plugin rm cordova-plugin-facebook4
cordova plugin add cordova-plugin-facebook4-no-zxing --save --variable APP_ID="123456789" --variable APP_NAME="myApplication"

@YaroslavG
Copy link

@AndreiTelteu , thank you!

@cvaliere
Copy link

@AndreiTelteu very nice, thank you!
is there any way that your build.gradle uses the FACEBOOK_ANDROID_SDK_VERSION preference?
also, is there any way to add a FACEBOOK_ANDROID_SDK_EXCLUDE_ZXING preference, which would default to false, and use it to exclude zxing or not?
with those 2 improvements, your changes could be integrated in the main facebook4 plugin

@JustasKuizinas
Copy link

@AndreiTelteu could your changes be integrated into the main cordova-plugin-facebook4 with optional parameters to enable/disable ZXING ?

@chancezeus
Copy link

In my opinion, since the root cause is that this plugin provides it's own (slightly customized) aar version of the library instead of linking to the maven dependency, it's up to this plugin to be configured so it'll add the com.google.zxing group to the compile excludes.

If the plugin maintainer(s) simply add the snippet below to the src/android/barcodescanner.gradle file it should resolve this conflict as well as conflicts with other plugins that import the zxing library from maven.

configurations {
    compile.exclude group: 'com.google.zxing'
}

If at all possible, I'd actually suggest doing a "clean" import of zxing instead, but that depends on what kind of customizations there are in the "aar" file and if these customizations could also be done without the use of said aar file.

mpacary added a commit to mpacary/phonegap-plugin-barcodescanner that referenced this issue Sep 30, 2019
Exclude com.google.zxing group to avoid conflicts with other Cordova plugins. Should fix phonegap#535 and phonegap#614
@mpacary
Copy link

mpacary commented Sep 30, 2019

Reproduced a very similar problem with same root cause. Error messages in particular were:

> Task :app:transformClassesWithDexBuilderForDebug

D8: Program type already present: com.google.zxing.DecodeHintType

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
  Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes.
  Program type already present: com.google.zxing.DecodeHintType

Versions:

Cordova 9.0.0 (cordova-lib@9.0.1)
cordova-android@8.1.0
cordova-plugin-facebook4@6.0.0
phonegap-plugin-barcodescanner@8.1.0

Many thanks @chancezeus for this analysis. I've suggested the change in src/android/barcodescanner.gradle as PR for a minimal fix.

For reference, #614 seems a duplicate.

@Arthurferrera
Copy link

I have a fix for this !
I forked the facebook plugin and excluded that library with exclude group: 'com.google.zxing'.
Here is my fork: https://github.com/AndreiTelteu/cordova-plugin-facebook4-no-zxing
To install my fork, do this:

cordova plugin rm cordova-plugin-facebook4
cordova plugin add cordova-plugin-facebook4-no-zxing --save --variable APP_ID="123456789" --variable APP_NAME="myApplication"

Thanks, it worked here.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Development

Successfully merging a pull request may close this issue.