2014-06-19 16 views
5

Wir verwenden Android Studio 0.6.1 mit Gradle Plugin 0.11. + In unserem aktuellen Projekt, und wir sind in einem Abhängigkeitsproblem mit commons-codec. Wir sind in einer Abhängigkeitsklasse von unserer lokalen Artifactory Instanz ziehen, die einen „Krypto“ Dienst enthält, die die folgenden zwei Codezeilen verwendet:Base64 Abhängigkeiten Problem in Android Studio

byte[] encryptedOutput = cipherFactory.getEncryptCipher().doFinal(plaintext.getBytes()); 
byte[] encryptedCipherText = Base64.encodeBase64URLSafe(encryptedOutput); 

Das Problem ist, dass selbst wenn wir eine bestimmte Abhängigkeit von commons-codec definieren in unsere Gradle Konfiguration, erhalten wir die folgende Ausnahme

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafe 

zunächst wir für ‚commons-codec: commons-codec: 1.9‘ eine Abhängigkeit einschließlich manuell wurden, aber nach Android Studio, wenn ich in den Code Drilldown In der IDE wird die Version dieser Methode in 1.9 betrachtet, aber wenn die App läuft, erhalten wir die Ausnahme. Selbst wenn man die Abhängigkeit zu 1.4 ändert, scheitert es immer noch, obwohl nach den Javadocs diese Methode verfügbar wurde. Selbst das Entfernen der manuellen Abhängigkeit verursacht das Gleiche.

Gibt es eine Möglichkeit, herauszufinden, wo die laufende App diese Abhängigkeit zieht? Dies ist unsere vollständige Abhängigkeitsliste im Moment, und ich kann nicht finden commons-codec aus irgendwelchen

compile files('libs/HockeySDK-3.0.2.jar') 
compile files('libs/PushIOManager.jar') 
compile 'commons-lang:commons-lang:[email protected]' 
compile 'org.codehaus.jackson:jackson-core-asl:[email protected]' 
compile 'org.codehaus.jackson:jackson-mapper-asl:[email protected]' 
compile 'com.google.android.gms:play-services:4.4.52' 
compile 'com.mcxiaoke.volley:library:1.0.4' 
compile 'fr.avianey:facebook-android-api:[email protected]' 
compile 'javax.validation:validation-api:1.0.0.GA' 

ist Meine Befürchtung ist, dass diese Klasse irgendwo mit dem Android SDK begraben, und wir werden keine Möglichkeit haben, außer Kraft zu setzen Verwenden Sie eine Version von commons-codec, die es uns ermöglicht, unsere Bibliothek zu verwenden. Und selbst wenn wir das tun könnten, mache ich mir Sorgen, dass dies ein grundlegendes Problem mit Android selbst verursachen könnte. Wir können (und tun dies) die Quelle für diese Crypto-Service-Klasse in unsere App ziehen und optimieren, um das entsprechende Äquivalent zu verwenden, aber das bedeutet, dass wir jedes Mal, wenn wir eine Änderung an der einen oder anderen Version vornehmen, behalten müssen sie synchron.

Irgendwelche Ideen?

UPDATE: Was in diesem speziellen Fall zu funktionieren scheint, ist die Abhängigkeiten in den Gradle-Build-Dateien zu scannen und sobald die Abhängigkeit gefunden wurde, ist die Überschreibung mit der Version, die Sie verwenden möchten. Zum Beispiel:

def versionOverrides = [ 
    "commons-codec:commons-codec": "1.9", 
] 

subprojects { 
    configurations.all { 
     resolutionStrategy.eachDependency { DependencyResolveDetails details -> 

      def overrideVersion = versionOverrides[details.requested.group + ":" + details.requested.name] 

      if (overrideVersion != null && details.requested.version != overrideVersion) { 
       logger.info "Overriding dependency ${details.requested.group}:${details.requested.name} version ${details.requested.version} --> $overrideVersion" 
       details.useVersion overrideVersion 
      } 
     } 
    } 
} 
+0

Versuchen Sie 'Gradle Abhängigkeiten' –

Antwort

1

Meine Befürchtung ist, dass diese Klasse irgendwo mit dem Android SDK begraben ist und wir keine Möglichkeit haben, um es außer Kraft setzt eine Version von commons-codec zu verwenden, die es uns ermöglichen, unsere zu nutzen Bibliothek.

Dies ist genau das, was passiert.
Der Boot-Klassenlader ist mit Klassen aus der Version 1.3 der Commons Codec-Bibliothek vorgeladen.

Sie können die Commons Codec-Bibliothek neu packen (Klassenpaket/Namespace umbenennen), um diesen Konflikt zu vermeiden. Siehe meine Antwort here für eine detailliertere Beschreibung.

Verwandte Themen