簡體   English   中英

基於 gradle 中產品風味的包裝選項

[英]packaging options based on product flavor in 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
    }
}

現在在上面的代碼中,我只想排除為s6風格生成的 apk 中的'lib/armeabi/libs2.so' ,並且只想排除為s2風格生成的 apk 中的'lib/arm64-v8a/libs6.so'

我們怎樣才能做到這一點。

我遇到了同樣的問題,然后,我開發了一個 gradle 插件來解決這個問題。 你可以在這里查看(android-soexcluder)

它非常易於使用:

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

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

除此之外, 存儲庫中甚至還有一個示例項目

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

  }

我遇到了同樣的問題,我在依賴項閉包中添加了代碼短語。 這個概念是在執行任務時檢測風味類型。 並找到 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
        }
    }
}

偶然發現了同樣的問題,但想刪除一些資產文件,運行 Android Studio 4.0。

排除每個變體/風格的 .so 文件實際上非常容易:

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

可悲的是,它不適用於資產!?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM