基于gradle中产品风味的包装选项

时间:2016-02-22 07:42:13

标签: android android-studio gradle build.gradle

我使用打包选项来排除某些库。是否可以根据产品风味选择包装。例如 -

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

我们如何实现这一目标。

4 个答案:

答案 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
        }
    }
}