2015-06-01 8 views
9

पर काबू पाने के लिए मैंने अपनी परियोजना में कई एंड्रॉइड पुस्तकालयों और मॉड्यूल का उपयोग किया है। प्रत्येक के पास अपना स्वयं का v4 है। समर्थन lib। मुझे java.util.zip.ZipException मिल रहा है: डुप्लिकेट प्रविष्टि। जब मैं प्रोजेक्ट में डुप्लिकेट क्लास फ़ाइल की खोज करता हूं, तो प्रत्येक पुस्तकालयों में एकाधिक v4.support lib की वजह से इन कक्षाओं की कई फ़ाइलें होती हैं। मुझे पता है कि इस सवाल से कई बार पूछा गया है लेकिन मेरे लिए कुछ भी काम नहीं कर रहा है।java.util.zip.ZipException: डुप्लिकेट प्रविष्टि:

मेरा प्रश्न है: इन एकाधिक v4.support फ़ाइलों को कैसे निकालें? मैं केवल v4.support lib को एक बार रखना चाहता हूं और अन्य सभी मॉड्यूल को वहां से संदर्भित करना चाहिए। मुझे यह कैसे हासिल होगा?

बाद

मेरी build.gradle स्क्रिप्ट

// 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' 
    } 
} 

है और मैं इस तरह त्रुटियों हो रही है। प्रत्येक बार जब मैं प्रोजेक्ट को साफ़ करता हूं तो यह सफलतापूर्वक अनुपालन करता है। लेकिन जब मैं रन कमांड देने का प्रयास करता हूं तो यह निम्न प्रकार की त्रुटि दिखाता है।

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

उत्तर

7

जैसे ही मैं अपनी उपरोक्त समस्या का समाधान करता हूं और इसे दूर करने का एक तरीका ढूंढता हूं। पैकेज के लिए मुख्य कारणAllDebugClassesForMultiDex त्रुटि वही है जो आपको स्टैक ओवरफ्लो में अन्य सभी पोस्टों में मिलती है यानी आपके पास कुछ क्लास फाइलें होंगी जो परियोजना में एक से अधिक बार उपलब्ध हैं। मेरे मामले में मेरे पास उपरोक्त प्रोजेक्ट में फेसबुक, Google पे सेवा और स्लाइडिंग मेनू इत्यादि के रूप में बहुत सारे मॉड्यूल हैं .. इन सभी मॉड्यूल में v4.support jar फ़ाइल की अपनी प्रति है। मैंने जो किया वह सभी पुस्तकालयों libs फ़ोल्डर से सभी v4.support फ़ाइलों को हटा दिया गया था। फिर एंड्रॉइड स्टूडियो प्रोजेक्ट स्ट्रक्चर से मेरे sdks i.e. com.android.support libs से v4.support lib पर निर्भरता जोड़ें। इसके लिए ..

  • 1 * फ़ाइल> परियोजना संरचना पर जाएं।
  • 2 * इन मॉड्यूल में से प्रत्येक एक को एक-एक करके चुनें।

  • 3 * निर्भरता नामित पिछले टैब में, संकलन FileTree निकालें (dir: 'libs', में शामिल हैं: '* .jar') अगर आप था केवल libs में lib (या probleomatic एक) v4.support उस मॉड्यूल का फ़ोल्डर।

  • 4 * + क्लिक करके, फिर पुस्तकालयों को जोड़ने और अपनी SDKs से v4.support libs चयन द्वारा v4.support lib जोड़ें।

यह किया गया। परियोजना को साफ करें और इसे फिर से बनाएं। पैकेजAllDebugClassesForMultiDex समस्या चली गई है।

सकर्मक निर्भरता के लिए, यदि आप सटीक निर्भरता जो डेक्स त्रुटि में डुप्लिकेट फ़ाइल का कारण परियोजना के निर्माण, जबकि पता है, आप इसे बेलो

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

के रूप में बाहर कर सकते हैं आप किसी भी मॉड्यूल में किसी भी सकर्मक निर्भरता चाहते हैं उदाहरण के लिए।

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

मेरे मामले में। एंड्रॉइड स्टूडियो के लिए, मैंने Ctrl + N दबाया और कक्षा के नाम की खोज की, जो इस मामले में ट्रांसपोर्ट मैडिएटर कॉलबैक "डुप्लिकेट एंट्री: एंड्रॉइड/सपोर्ट/वी 4/मीडिया/ट्रांसपोर्ट मैडिएटर कैलबैक" से लिया गया है।कक्षा " यह एकाधिक जार फ़ाइलों (3 सटीक होने के लिए) में मौजूद था। मैंने 2 हटा दिया और अन्य लाइब्रेरी पैकेजों में निर्भरताओं को हल करने के लिए, बस उन पुस्तकालयों को इंगित करके ../source_library_package/libs/library_name.jar –

+0

@ RohitRokde, सही है। इस तरह हम पाते हैं कि कौन से libs हमारे ऐप में डुप्लिकेट किए गए हैं। –

+0

क्या होगा यदि परियोजना संरचना में मॉड्यूल में निर्भरता सूचीबद्ध नहीं है? यह अन्य जारों में संक्रमणीय निर्भरताओं के कारण हो सकता है। –

संबंधित मुद्दे