Problemas de dependencias de Base64 en Android Studio

Estamos usando Android Studio 0.6.1 con Gradle plugin 0.11. + En nuestro proyecto actual, y nos encontramos con un problema de dependencia con commons-codec . Estamos extrayendo una clase de dependencia de nuestra instancia local de Artifactory que contiene un servicio "cripto" que utiliza las dos líneas siguientes de código:

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

El problema es que incluso si definimos una dependencia específica de commons-codec en nuestra configuración de Gradle, obtenemos la siguiente excepción

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

En primer lugar, incluimos manualmente una dependencia para 'commons-codec: commons-codec: 1.9', pero según Android Studio cuando exploro el código en el IDE, está viendo la versión de ese método en 1.9, pero Cuando se ejecuta la aplicación, obtenemos la excepción. Incluso cambiando la dependencia a 1.4 todavía falla, aunque según los Javadocs es cuando ese método estaba disponible. Incluso la eliminación de la dependencia manual por completo hace que ocurra lo mismo.

¿Hay alguna manera de averiguar de dónde la aplicación en ejecución está tirando de esta dependencia? Esta es nuestra lista de dependencia completa en este momento, y no puedo encontrar commons-codec de ninguno de estos

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

Mi temor es que esta clase esté enterrada en alguna parte con el SDK de Android y no tendremos forma de anularla para usar una versión de commons-codec que nos permita usar nuestra biblioteca. Y aunque pudiéramos hacer eso, me preocupa que esto pueda causar algún problema fundamental con el propio Android. Podemos (y actualmente lo hacemos) tener la fuente para que la clase de servicio de criptografía haya entrado en nuestra aplicación y la haya modificado para usar el equivalente apropiado, pero esto significa que cada vez que realicemos un cambio en una u otra versión, tendríamos que mantener Sincronizarlos.

¿Algunas ideas?

ACTUALIZACIÓN: Lo que parece funcionar en este caso específico es escanear las dependencias en los archivos de compilación de Gradle y una vez que se encuentra la dependencia que está buscando, la anulación es con la versión que desea usar. Por ejemplo:

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

    Mi temor es que esta clase esté enterrada en alguna parte con el SDK de Android y no tendremos forma de anularla para usar una versión de commons-codec que nos permita usar nuestra biblioteca.

    Esto es exactamente lo que está sucediendo.
    El cargador de clase de inicio está precargado con clases de la versión 1.3 de la biblioteca Commons Codec.

    Puede reempaquetar (cambiar el nombre del paquete / espacio de nombres de las clases) la biblioteca Commons Codec para evitar este conflicto. Vea mi respuesta aquí para una descripción más detallada.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.