Android 如何排除可传递的本机库?

Android 如何排除可传递的本机库?,android,gradle,java-native-interface,android-gradle-plugin,Android,Gradle,Java Native Interface,Android Gradle Plugin,假设我的项目依赖于两个库A和B。这些库依赖于库C的同一版本。库C依赖于两个共享库文件D。要使用库C,库A和库B都在其jniLibs目录中包含D 现在,这里的问题是,当我尝试使用配置的依赖项构建此项目时: compile('group:A:1.0@aar') compile('group:B:1.0@aar') { exclude group: 'group', module: 'C' } 我收到一个错误,指出存在重复的D文件。我如何告知gradle只忽略我的一个库中的某些JNILIB?

假设我的项目依赖于两个库A和B。这些库依赖于库C的同一版本。库C依赖于两个共享库文件D。要使用库C,库A和库B都在其jniLibs目录中包含D

现在,这里的问题是,当我尝试使用配置的依赖项构建此项目时:

compile('group:A:1.0@aar')
compile('group:B:1.0@aar') {
    exclude group: 'group', module: 'C'
}

我收到一个错误,指出存在重复的D文件。我如何告知gradle只忽略我的一个库中的某些JNILIB?JNILBS可传递依赖项是否有排除模拟?

我通过gradle实现了这一点,强制gradle只使用它发现的共享库的第一个版本:

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

我可以通过gradle实现这一点,强制gradle只使用它发现的共享库的第一个版本:

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

“为了使用库C,库A和库B都将D包含在它们的jniLibs目录中”——真的吗?这是a和B中的一个bug。它们自己的AAR中都不需要本机库。你控制A还是B?@Commonware我控制库B。我可以删除它,但库B的其他使用者将被迫提供共享库,或者有办法解决这个问题吗?C应该是AAR,C的AAR应该包含
。因此
文件。是这样吗?如果是这样,那么我不明白为什么A或B需要AAR中的
.so
文件。如果C的AAR没有
。所以
文件,这就是C的问题。如果C不是AAR,那么答案可能是将C+D包装成AAR,并且a和B依赖于该AAR。啊好的好的@CommAh好的@commonware!我不相信C被打包成AAR,是的,你是对的,这是C的问题(如果是这样的话)。然而,在最坏的情况下,我可以将C+D包装成A和B都可以依赖的AAR。谢谢你的帮助!“为了使用库C,库A和库B都将D包含在它们的jniLibs目录中”——真的吗?这是a和B中的一个bug。它们自己的AAR中都不需要本机库。你控制A还是B?@Commonware我控制库B。我可以删除它,但库B的其他使用者将被迫提供共享库,或者有办法解决这个问题吗?C应该是AAR,C的AAR应该包含
。因此
文件。是这样吗?如果是这样,那么我不明白为什么A或B需要AAR中的
.so
文件。如果C的AAR没有
。所以
文件,这就是C的问题。如果C不是AAR,那么答案可能是将C+D包装成AAR,并且a和B依赖于该AAR。啊好的好的@CommAh好的@commonware!我不相信C被打包成AAR,是的,你是对的,这是C的问题(如果是这样的话)。然而,在最坏的情况下,我可以将C+D包装成A和B都可以依赖的AAR。谢谢你的帮助!