Android Studio中的Base64依赖项问题

The*_*eth 5 dependencies android gradle android-studio

我们在当前项目中使用的是带有Gradle插件0.11.+的Android Studio 0.6.1,我们遇到了依赖问题commons-codec.我们从包含"加密"服务的本地Artifactory实例中引入依赖类,该服务使用以下两行代码:

byte[] encryptedOutput = cipherFactory.getEncryptCipher().doFinal(plaintext.getBytes());
byte[] encryptedCipherText = Base64.encodeBase64URLSafe(encryptedOutput);
Run Code Online (Sandbox Code Playgroud)

问题是即使我们commons-codec在Gradle配置中定义了特定的依赖关系,我们也会得到以下异常

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafe
Run Code Online (Sandbox Code Playgroud)

起初,我们手动包括依赖"公地编解码器:公地编解码器:1.9",但根据Android的工作室,当我深入到IDE中的代码,它看起来在该方法的版本1.9,但当应用程序运行时,我们得到例外.甚至将依赖关系更改为1.4仍然会失败,即使根据Javadocs的说法,该方法何时可用.即使完全删除手动依赖也会导致同样的事情发生.

有什么方法可以找出正在运行的应用程序从哪里拉出这种依赖?这是我们目前完整的依赖列表,我找不到commons-codec任何这些

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'
Run Code Online (Sandbox Code Playgroud)

我担心这个类会被安装在Android SDK的某个地方,我们无法覆盖它以使用它的版本来commons-codec允许我们使用我们的库.即使我们能做到这一点,我担心这样做可能会导致Android本身的一些基本问题.我们可以(而且目前做的)有拉升到我们的应用程序,加密服务类的源和调整其使用适当当量,但这意味着我们做出改变,以一种或另一种版本的任何时候,我们不得不保持他们同步.

有任何想法吗?

更新:在这种特定情况下似乎工作的是扫描Gradle构建文件中的依赖项,一旦找到您要查找的依赖项,覆盖就是您要使用的版本.例如:

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*pov 3

我担心这个类被埋藏在 Android SDK 的某个地方,我们将无法覆盖它以使用commons-codec 允许我们使用我们的库的版本。

这正是正在发生的事情。
引导类加载器预加载了 Commons Codec 库 1.3 版中的类。

您可以重新打包(重命名类的包/命名空间)Commons Codec 库以避免这种冲突。请参阅我的回答以获取更详细的描述。