【问题标题】:Exclude JNI libs based on flavor in a smart way以智能方式排除基于风味的 JNI 库
【发布时间】:2019-06-08 14:30:10
【问题描述】:

我有一个 Android 项目,它使用了一些相当大的原生库。 我在这个项目中有几种风格,其中一些不使用这些库,所以我想将它们从 APK 中排除。

我知道实现此目的的几种方法,但我想在build.gradle 文件中使用一些不错的代码来减少可能出现的错误并了解groovy

我不得不提到有一个布尔值buildConfigField(在这个例子中称为DO_IT)。如果 DO_IT 为 false,则将排除 JNI 库。

这就是我现在的做法:

defaultConfig {
     buildConfigField "boolean", "DO_IT", "true"
}

productFlavors {
    flavor1 {
        // for this flavor JNI libs will be included
    }
    flavor2 {
        // for this flavor JNI libs will NOT be included
        buildConfigField "boolean", "DO_IT", "false"
        ndk {
            abiFilters ''
        }
    }
}

备注:

1 - 考虑到我有很多具有大量属性的口味,我不想复制块

ndk {
   abiFilters ''
}

但我无法设法将此块放入方法中。

2 - 完美的解决方案将仅排除基于DO_IT buildConfigField 的库在defaultConfig 中的风味块EG 之外的例程中。

【问题讨论】:

    标签: android android-studio gradle groovy android-ndk


    【解决方案1】:

    android-soexcluder 应该是要走的路。

    步骤如下:

    1. 修改build.gradle 以添加依赖项。

      buildscript {
         repositories {
            //...
         }
      
         dependencies {
            classpath 'com.jween.gradle:android-soexcluder:1.1'
         }
      }
      
      apply plugin: 'com.android.application'
      apply plugin: 'android-soexcluder'
      
    2. 从您的构建风格中排除 .so

      soexcluder {
      
          // Remove all so files according to the flavor1
          flavor1 {
              exclude "lib/armeabi-v7a/foo.so", "lib/arm64-v8a/bar.so"
          }
      }
      

    其他选项是为packagingOptions添加一个gradle参数:Set doNotStrip packagingOptions to a specific buildType

    【讨论】:

    • 真是太甜了!感谢这个专业提示!
    • 由于 stackoverflow.com/questions/54206898/… 已于 2020 年 2 月中断。 Gradle 感觉就像是 Google 版的 Apple 开发者体验:每年至少打破一切
    【解决方案2】:

    我使用这种模式。

    项目构建.config

    buildscript {
        ext.DO_IT = true;
    }
    

    模块(app) build.config

    productFlavors {
        flavor2 {
            externalNativeBuild {
                cmake {
                    if (DO_IT) {
                        targets "someTarget"
                    }
                }
            }
        }
    }
    

    NB.1 extExtra properties 部分提到,一个 Gradle 的ExtraPropertiesExtension

    NB.2 应在项目 build.config 中控制包括库在内的每种风格设置,因为 Android Studio / Gradle 尝试一次读取所有风格中的所有设置并导致冲突或其他问题。

    NB.3 请记住,Android Studio 不会删除已发送到设备的 library(.so) 文件。它coufuses测试结果。检查设备上的 /data/app/(package)/lib/(cpu arch)/ 和 PC 上的 (project)/app/build/intermediates/cmake/(flavor)/obj/(cpu arch)/ 中的文件。如果您觉得结果有误,请手动清除它们,尤其是在设备上。
    从应用程序/存储设置中清除数据不会清除库。卸载会清除它们,所以我认为手动删除文件更容易。

    NB.4 Android Studio 的设备文件资源管理器的同步菜单无法正确同步 lib​​ 或 (cpu arch) 目录。要查看正确的结果,请选择 /data 或 /data/app 并同步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多