巧妙地基于风味排除JNI库

时间:2019-01-14 15:20:32

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

我有一个Android项目,该项目使用了一些很大的本机库。 我在这个项目中有几种口味,其中有些没有使用这些库,因此我想将它们从APK中排除。

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

我不得不提到一个布尔值buildConfigField(在此示例中称为DO_IT)。如果DO_IT为假,则将排除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中风味块EG之外的例程中排除基于buildConfigField defaultConfig的库。

2 个答案:

答案 0 :(得分:1)

我使用这种模式。

项目build.config

buildscript {
    ext.DO_IT = true;
}

Module(app)build.config

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

NB.1 Extra properties部分提到了extExtraPropertiesExtension的Gradle。

NB.2每个风味设置(例如包括库在内)都应在project build.config中进行控制,因为Android Studio / Gradle尝试一次读取所有风味中的所有设置,并导致冲突或其他问题。

NB.3请记住,Android Studio不会删除已经发送到设备的库(.so)文件。它包含测试结果。检查设备上/ 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并进行同步。

答案 1 :(得分: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"
        }
    }
    

其他选择是为packagingOptionsSet doNotStrip packagingOptions to a specific buildType

添加gradle参数