2015-06-01 11 views
9

Ich habe mehrere Android-Bibliotheken und Module in meinem Projekt verwendet. Jeder hat seine eigene v4.Support-Lib. Ich erhalte java.util.zip.ZipException: doppelten Eintrag. Wenn ich im Projekt nach der doppelten Klassendatei suche, gibt es mehrere Dateien dieser Klassen, weil mehrere v4.support-Bibliotheken in jeder Bibliothek vorhanden sind. Ich weiß, dass diese Frage schon oft gestellt wurde, aber nichts funktioniert für mich.java.util.zip.ZipException: Doppeleintrag: Wie zu überwinden

Meine Frage ist: Wie diese mehrere v4.support Dateien zu entfernen? Ich möchte diese v4.support-Lib nur einmal und alle anderen Module sollten es von dort verweisen. Wie erreiche ich das?

Es folgt mein build.gradle Skript

// Top-level build file where you can add configuration options common to all sub-projects/modules. 
buildscript { 
    repositories { 
     mavenCentral() 
     maven { url 'https://maven.fabric.io/public' } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.1.0' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 
     //classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+' 
     classpath 'io.fabric.tools:gradle:1.15.2' 
    } 
} 

apply plugin: 'android' 
apply plugin: 'com.android.application' 
apply plugin: 'android-apt' 
apply plugin: 'io.fabric' 

repositories { 
    maven { url 'https://maven.fabric.io/public' } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: '*.jar') 
    compile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
     transitive = true 
    } 
    compile('com.android.support:multidex:1.0.0') 
    //compile ('com.android.support:appcompat-v7:22.1.0') 
    compile project(':..:..:..:..:..:..:android_libraries:appcompat') 
    compile project(':..:..:..:..:..:..:android_libraries:facebook') 
    compile project(':..:..:..:..:..:..:android_libraries:google_play_services:libproject:google-play-services_lib') 
    compile project(':..:..:..:..:..:..:android_libraries:SlidingMenu') 
    compile project(':..:..:..:..:..:..:android_libraries:StickingGridViewLibrary') 
    compile project(':..:..:..:..:..:..:android_libraries:view_pager_library') 
    compile project(':..:..:..:..:..:..:android_libraries:ZXing2.3') 
    compile project(':..:..:..:..:..:..:android_libraries:xyz') 
    compile project(':..:..:..:..:..:..:android_libraries:apptentive') 

} 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.0" 

    defaultConfig { 
     versionCode 1 
     versionName "1.0" 
     minSdkVersion 15 
     targetSdkVersion 21 

     // Enabling multidex support. 
     multiDexEnabled true 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 

    ant.importBuild './../../../../../../buildscripts/wlbuild.xml' 


    apt { 
     arguments { 
      androidManifestFile variant.outputs[0].processResources.manifestFile 
      // if you have multiple outputs (when using splits), you may want to have other index than 0 

      resourcePackageName 'com.kohls.mcommerce.opal' 

      // If you're using Android NBS flavors you should use the following line instead of hard-coded packageName 
      // resourcePackageName android.defaultConfig.applicationId 

      // You can set optional annotation processing options here, like these commented options: 
      // logLevel 'INFO' 
      // logFile '/var/log/aa.log' 
     } 
    } 
    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      resources.srcDirs = ['src'] 
      aidl.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 

     // Move the tests to tests/java, tests/res, etc... 
     instrumentTest.setRoot('tests') 

     // Move the build types to build-types/<type> 
     // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... 
     // This moves them out of them default location under src/<type>/... which would 
     // conflict with src/ being used by the main source set. 
     // Adding new build types or product flavors should be accompanied 
     // by a similar customization. 
     debug.setRoot('build-types/debug') 
     release.setRoot('build-types/release') 
    } 
    buildDir = './../../../../../../build/native' 

    lintOptions { 
     abortOnError false 
    } 
    dexOptions { 
     incremental true 
     javaMaxHeapSize "4g" 
    } 
    packagingOptions { 
     exclude 'META-INF/LICENSE.txt' 
    } 
} 

Und ich Fehler wie diese zu bekommen. Jedes Mal, wenn ich das Projekt säubere, erfüllt es sich erfolgreich. Aber wenn ich versuche, Run-Befehl zu geben, zeigt es die folgenden Arten von Fehler an.

Execution failed for task ':packageAllDebugClassesForMultiDex'. 
> java.util.zip.ZipException: duplicate entry: android/support/v4/media/TransportMediatorCallback.class 

Antwort

7

Wie ich mein oben genanntes Problem umgehen und einen Weg finden, es zu überwinden. Hauptgrund für packageAllDebugClassesForMultiDex Fehler ist der gleiche, den Sie in allen anderen Posts in Stackoverflow finden, d. H. Sie müssen einige Klassendateien haben, die mehr als einmal im Projekt verfügbar sind. In meinem Fall habe ich so viele Module im oben genannten Projekt wie Facebook, Google Pay-Dienste und Schiebe-Menü usw. ... Alle diese Module haben eine eigene Kopie der v4.support JAR-Datei. Was ich getan habe, war alle v4.support Dateien aus all diesen Bibliotheken libs Ordner zu löschen. Fügen Sie dann die Abhängigkeit zu v4.support lib aus meiner sdks, d. H. Com.android.support libs aus der Android Studio-Projektstruktur hinzu. Für diese ..

  • 1 * Gehen Sie zu Datei> Projektstruktur.
  • 2 * Wählen Sie jedes dieser Module einzeln aus.

  • 3 * In der letzten Registerkarte mit dem Namen Abhängigkeit, entfernen filetree kompilieren (dir: 'libs', schließen ein: * .jar ') wenn Sie hatte nur v4.support lib (oder der probleomatic eins) in Libs Ordner dieses Moduls.

  • 4 * Hinzufügen v4.support lib durch klicken + dann Bibliotheken hinzufügen und v4.support Libs aus Ihrem sdks wählen.

Es ist fertig. Säubern Sie das Projekt und bauen Sie es erneut auf. packageAllDebugClassesForMultiDex Problem ist weg.

Was transitive Abhängigkeit, wenn Sie die genaue Abhängigkeit wissen, welche die doppelte Datei in dex Fehler verursachen, während das Projekt erstellen, können Sie es ausschließen als belo

compile(project(':..:..:..:..:..:..:android_libraries:walletsdkandroidmodule')) { 
     exclude group: 'com.google.code.gson' 
    } 

Wenn Sie transitive Abhängigkeit in jedem Modul wollen , z.B.

compile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
     transitive = true 
    } 
+3

In meinem Fall. Für Android Studio habe ich Strg + N gedrückt und nach dem Klassennamen gesucht, der in diesem Fall TransportMediatorCallback ist, der aus "Doppeleintrag: Android/support/v4/media/TransportMediatorCallback" stammt.Klasse " Sie war in mehreren JAR-Dateien vorhanden (3, um genau zu sein). Ich entfernte 2 und zum Auflösen der Abhängigkeiten in anderen Bibliothekspaketen, zeigte einfach auf diese Bibliotheken mit ../source_library_package/libs/library_name.jar –

+0

@ RohitRokde, Correct.Auf diese Weise können wir herausfinden, welche Bibliotheken dupliziert sind in unserer App. –

+0

Was ist, wenn die Abhängigkeiten nicht in den Modulen in der Projektstruktur aufgelistet sind? Dies kann wegen transitiver Abhängigkeiten in anderen JARs passieren. –

Verwandte Themen