2014-05-15 6 views
12

sto cercando di importare https://github.com/Kickflip/kickflip-android-sdk utilizzando Gradle nella mia generazione Android e sto ottenendo:Esclusione di file .class dal Gradle dependecy

IMPREVISTO TOP-LEVEL ECCEZIONE: com.android.dex.DexException: Più file dex definiscono Lorg/apache/commons/codec/binary/Base64;

Commons.codec è una dipendenza del mio progetto, ma non direttamente del progetto kick-flip, penso che provenga da uno dei vasi inclusi. Posso vedere i file .class se apro classes.jar di Kickflip.

Come escludere Base64.class dall'importazione da kickflip nella build finale? Ho cercato di usare ziptree per escludere le cose ma non sono riuscito a far funzionare nulla.

Grazie

mio build.gradle è:

apply plugin: 'android' 

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.0.3" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 

    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES.txt' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/notice.txt' 
     exclude 'META-INF/license.txt' 
     exclude 'META-INF/dependencies.txt' 
     exclude 'META-INF/LGPL2.1' 
     exclude 'META-INF/ASL2.0' 
    } 

    android.applicationVariants.all{ variant -> 
     // This is an annoying hack to get around the fact that the Gradle plugin does not support 
     // having libraries with different minSdkVersions. Play Services has a min version of 9 (Gingerbread) 
     // but Android Maps Utils supports 8 (Froyo) still 
     variant.processManifest.doFirst { 
     File manifestFile = file("${buildDir}/exploded-aar/io.kickflip/sdk/0.9.9/AndroidManifest.xml") 
      if (manifestFile.exists()) { 
       println("Replacing minSdkVersion in Android Maps Utils") 
       String content = manifestFile.getText('UTF-8') 
       content = content.replaceAll(/minSdkVersion="18"/, 'minSdkVersion=\"10\"') 
       manifestFile.write(content, 'UTF-8') 
       println(content) 
      } 
     } 
    } 
} 

dependencies { 
    compile 'com.android.support:support-v4:19.1.0' 
    compile 'io.kickflip:sdk:0.9.9' 
    compile fileTree(dir: 'libs', include: '*.jar') 
    compile project(':libs:typeface-textview:library') 
    compile project(':libs:gpuimage') 
    compile 'com.google.android.gms:play-services:4.3.23' 
    compile 'com.nineoldandroids:library:2.4.0' 
    compile 'com.koushikdutta.urlimageviewhelper:urlimageviewhelper:1.0.4' 
    compile ('fr.avianey:facebook-android-api:3.14.0') { 
     exclude module: 'support-v4' 
    } 
    compile 'com.github.japgolly.android:svg-android:2.0.1' 
    compile 'org.scribe:scribe:1.3.5' 
    compile 'commons-codec:commons-codec:1.8' 
} 
+0

vedo che il kickflip richiede la versione minima Android SDK 18. E il tuo file di build definisce minSdkVersion 10. Questo potrebbe essere un problema. – Genry

+0

Ho provato anche a costruirlo. Sembrano dire che gli strumenti di build 19.1 devono essere usati e stanno dicendo di compilare da una linea di comando Gradle. Sono su Android Studio quindi gli esempi si lamentano solo del fatto che la versione gradle sia obsoleta per essere supportata. Il pulsante di download semplice per Eclipse è stato rimosso da developer.android.com. – Giuseppe

+0

In Eclipse ho ricevuto più errori di dex che di solito ha a che fare con il linkage della libreria errato o forse una libreria che viene inclusa più volte. Questo è forse il motivo per cui stanno suggerendo l'uso di una build da riga di comando Gradle. – Giuseppe

risposta

-1

Probabilmente il problema è di classe Base64 incluso due volte. È nel "google-http-client" (view it). Prova ad escludere questa classe. Se sei fortunato, essendo una classe Util, non è usato nel codice.

Prova questo nella vostra build.gradle:

package com.google.api.client.util; 

sourceSets { 
    main { 
     java { 
      exclude 'com.google.api.client.util.Base64.java' 
      exclude 'org.apache.commons.codec.binary.Base64.java' 
     } 
    } 
} 

NOTA: Non ancora provato, ma suona come una possibilità

+0

prova non funziona –