Open amit-t opened 7 years ago
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"
@AndreiTelteu , thank you!
@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
@AndreiTelteu could your changes be integrated into the main cordova-plugin-facebook4 with optional parameters to enable/disable ZXING ?
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.
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.
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.
Expected Behaviour
Build Succeeded
Actual Behaviour
(Android) What device vendor
Device - Google Pixel
Cordova CLI version and cordova platform version
Installed platforms: android 6.2.3 ios 4.3.1
Plugin version
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
*/
apply plugin: 'com.android.application'
buildscript { repositories { mavenCentral() jcenter() }
}
// 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 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'] } }
}
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) }
}
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' } } } }