我使用打包选项来排除一些库。可以根据产品的口味来选择包装吗?例如:
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
}
}现在在上面的代码中,我想在为s6风格生成的apk中只排除'lib/armeabi/libs2.so',在为s2风格生成的apk中只排除'lib/arm64-v8a/libs6.so'
我们怎样才能做到这一点。
发布于 2016-03-15 11:27:16
我遇到了同样的问题,然后,我开发了一个gradle插件来解决这个问题。你可以使用check it(android-soexcluder) out here
它非常容易使用:
soexcluder {
s2 {
exclude 'lib/arm64-v8a/libs6.so'
}
s6 {
exclude 'lib/armeabi/libs2.so'
}
}除此之外,repository中甚至还有一个示例项目
发布于 2021-01-23 02:13:39
基于@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'
}
}
}
}发布于 2020-09-29 11:05:51
我遇到了同样的问题,我在依赖闭包中添加了代码短语。其概念是在任务执行时检测风格类型。并查找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
}
}
}https://stackoverflow.com/questions/35548217
复制相似问题