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