2015-06-01 2 views
9

Я использовал несколько Android-библиотек и модулей в своем проекте. У каждого есть свой собственный v4.Support lib. Я получаю java.util.zip.ZipException: дублировать запись. Когда я ищу дубликат файла класса в проекте, есть несколько файлов этих классов, так как из-за нескольких библиотек v4.support в каждой библиотеке. Я знаю, что этот вопрос задавали много раз, но для меня ничего не работает.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' 
    } 
} 

И я получаю ошибки, как это. Каждый раз, когда я очищаю проект, он успешно выполняется. Но когда я пытаюсь дать команду Run, она показывает следующие типы ошибок.

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

ответ

7

Как я обходился над своей проблемой и нашел способ ее преодолеть. Основная причина для packageAllDebugClassesForMultiDex ошибка такая же, что и во всех других сообщениях в Stackoverflow, то есть вы должны иметь некоторые файлы классов, которые доступны более одного раза в проекте. В моем случае у меня так много модулей в вышеупомянутом проекте, как Facebook, Google Pay Services и скользящее меню и т. Д. У всех этих модулей есть собственная копия файла jar v4.support. Что я сделал, это удалить все файлы v4.support из всех этих библиотек libs folder. Затем добавьте зависимость от v4.support lib из моей sdks i.e. com.android.support libs из структуры проекта Android Studio. Для этого ..

  • 1 * Перейти к файлу> Структура проекта.
  • 2 * Выберите каждый из этих модулей по одному.

  • 3 * В последней вкладке с именем Dependency, Удалить компилировать дереве файлов (реж: 'LIBS', включают в себя: '* .jar'), если у вас только v4.support Lib (или probleomatic один) в LIBS папку этого модуля.

  • 4 * Добавить v4.support LIB нажав + затем добавить библиотеки и выберите v4.support LIBS из вашего SDKs.

Его сделано. Очистите проект и постройте его снова. упаковкаAllDebugClassesForMultiDex проблема поступил.

Что касается транзитивной зависимости, если вы знаете точную зависимость, которая вызывает дубликат файл по ошибке DEX при построении проекта, вы можете исключить его как Белу

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

Если вы хотите какую-либо переходная зависимости в любом модуле , например.

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

В моем случае. для студии Android я нажал Ctrl + N и искал имя класса, которое в этом случае является TransportMediatorCallback, взятое из «дублированной записи: андроид/поддержка/v4/media/TransportMediatorCallback.class " Он присутствовал в нескольких файлах jar (3, если быть точным). Я удалил 2 и разрешил зависимости в других библиотечных пакетах, просто указал на эти библиотеки, используя ../source_library_package/libs/library_name.jar –

+0

@ RohitRokde, Correct. Таким образом, мы можем найти, какие библиотеки дублируются в нашем приложении. –

+0

Что делать, если зависимости не указаны в модулях в структуре проекта? Это может произойти из-за транзитивных зависимостей в других баночках. –

Смежные вопросы