我使用打包选项来排除某些库。是否可以根据产品风味选择包装。例如 -
android {
productFlavors {
flavorDimensions 'models'
S2 {
flavorDimension 'models'
minSdkVersion 22
....
}
S6 {
flavorDimension 'models'
minsdkversion 22
....
}
}
packagingOptions {
exclude 'lib/armeabi/libs2.so'
exclude 'lib/arm64-v8a/libs6.so
}
}
现在在上面的代码中,我想只排除为'lib/armeabi/libs2.so'
风格生成的apk中的s6
,并且只想在为'lib/arm64-v8a/libs6.so'
风格生成的apk中排除s2
我们如何实现这一目标。
答案 0 :(得分:9)
我遇到了同样的问题,然后,我开发了一个gradle插件来解决这个问题。 你可以check it(android-soexcluder) out here
它非常易于使用:
soexcluder {
s2 {
exclude 'lib/arm64-v8a/libs6.so'
}
s6 {
exclude 'lib/armeabi/libs2.so'
}
}
除此之外,repository
中还有一个示例项目答案 1 :(得分:3)
基于@Dodolong 解决方案:
packagingOptions {
...
gradle.startParameter.getTaskNames().each { task ->
if (task.contains('assemble')) {
if (task.contains('s2')) {
exclude 'lib/**/my_cool_lib1.so'
} else if (task.contains('s6')) {
exclude 'lib/**/my_cool_lib2.so'
}
}
}
}
答案 2 :(得分:0)
偶然发现同一问题,但想删除一些运行Android Studio 4.0的资产文件。
实际上,按变体/口味排除.so文件非常容易:
productFlavors {
flavor1 {
packagingOptions {
exclude 'lib/x86/libshared.so'
}
}
}
可悲的是,它不适用于资产!?
答案 3 :(得分:0)
我遇到了同样的问题,我在依赖项关闭中添加了代码短语。该概念是在执行任务时检测风味类型。并找到productFlavors实例以排除库。
android {
productFlavors {
flavorDimensions 'models'
S2 {
flavorDimension 'models'
minSdkVersion 22
....
}
S6 {
flavorDimension 'models'
minsdkversion 22
....
}
}
}
dependencies {
gradle.startParameter.getTaskNames().each { task ->
println 'task name is :' + task
if (task.contains('assemble')) {
def android = project.extensions.findByName("android")
if(android != null) {
com.android.build.gradle.internal.dsl.PackagingOptions packagingOptions = android["packagingOptions"]
if (packagingOptions != null) {
if(task.contains("S2")){
packagingOptions.exclude('lib/lib_for_s2.so')
} else if(task.contains("S6")) {
packagingOptions.exclude'lib/lib_for_s6.so')
}
}
}
println 'libraries will be excluded: ' + packagingOptions.excludes
}
}
}