Android jar、so导包冲突

jar包冲突

报错信息
Duplicate class com.google.gson.stream.MalformedJsonException found in modules jetified-gson-2.8.6 (com.google.code.gson:gson:2.8.6) and**** (******.jar)


Error:Could not find method exclude() for arguments [{group=com.google.code.gson, module=gson}] on directory '{include=*.jar, dir=libs}' of type org.gradle.api.internal.file.collections.DefaultConfigurableFileTree.
解决办法

最后试来试去,才发现exclude需要写在App 主Module 的build.gradle文件中才能生效,而且注意 project(‘:Speech’) 外面那层括号:

apply plugin: 'com.android.application'     //注意这是主Module

repositories {
    mavenCentral()
}

dependencies {
    // Module dependency
    implementation(project(':Speech')){
        //解决Gson重复依赖问题,与passport-1.4.2.jar有冲突
        exclude group: 'com.google.code.gson', module: 'gson'       
    }
}

so库冲突

报错信息
More than one file was found with OS independent path 'lib/x86/libfbjni.so'. If you are using jniLibs and CMake IMPORTED targets, 
解决方案

这种是网上普遍的解决方案,有的时候虽然so库名字相同,但是逻辑不同,名字重复的时候选择第一个不太科学;

packagingOptions {
         pickFirst 'lib/armeabi-v7a/libfbjni.so'
         pickFirst 'lib/arm64-v8a/libfbjni.so'
         pickFirst 'lib/x86_64/libfbjni.so'
         pickFirst 'lib/x86/libfbjni.so'
}

我们可以在:app主项目build.gradle文件最后中添加以下脚本打印出所有so库目录,对可以修改so库删除或者改名进行屏蔽。

tasks.whenTaskAdded { task ->
    if (task.name == 'mergeDebugNativeLibs') {
        println("------------------- mergeDebugNativeLibs -------------------")
        task.doFirst {
            println("------------------- find so files start -------------------")
            it.inputs.files.each { file ->
                printDir(new File(file.absolutePath))
            }
            println("------------------- find so files end -------------------")
        }
    }
}

def printDir(File file) {
    if (file != null) {
        if (file.isDirectory()) {
            file.listFiles().each {
                printDir(it)
            }
        } else if (file.absolutePath.endsWith(".so")) {
            println "find so file: $file.absolutePath"
        }
    }
}

你可能感兴趣的:(Android jar、so导包冲突)