【问题标题】:packaging options based on product flavor in gradlegradle 中基于产品风味的包装选项
【发布时间】:2016-02-22 07:42:12
【问题描述】:

我正在使用打包选项来排除一些库。是否可以根据产品风味提供包装选项。比如——

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'

我们怎样才能做到这一点。

【问题讨论】:

标签: android android-studio gradle build.gradle


【解决方案1】:

我遇到了同样的问题,然后,我开发了一个 gradle 插件来解决这个问题。 你可以check it(android-soexcluder) out here

超级好用:

soexcluder {
    s2 {
        exclude 'lib/arm64-v8a/libs6.so'
    }

    s6 {
        exclude 'lib/armeabi/libs2.so'
    }
}

除此之外,repository 中甚至还有一个示例项目

【讨论】:

  • 你会不会碰巧有一些东西不仅要排除 .so,还有任何文件,例如资产文件夹中的文件? 'exclude 'assets/file1.mp3' 这样的行会起作用吗?
【解决方案2】:

基于@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'
                }
            }
        }

  }

【讨论】:

  • 在我的情况下,它从所有口味中排除了库。如果您只构建特定的风味,它可能会起作用,但是当您构建所有 apk 时,最终的“排除”列表将应用于所有 apk。
【解决方案3】:

我遇到了同样的问题,我在依赖关闭中添加了代码短语。这个概念是在执行任务时检测风味类型。并找到 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
        }
    }
}

【讨论】:

    【解决方案4】:

    偶然发现同样的问题,但想删除一些资产文件,运行 Android Studio 4.0。

    实际上,根据变体/风味排除 .so 文件非常容易:

    productFlavors {
        flavor1 {
            packagingOptions {
                exclude 'lib/x86/libshared.so'
            }
        }
    }
    

    很遗憾,它不适用于资产!?

    【讨论】:

    • 我试过了,排除适用于所有口味,而不仅仅是一种。
    猜你喜欢
    • 2016-04-08
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多