我有一个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
的库。
答案 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部分提到了ext
,
ExtraPropertiesExtension的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应该是要走的路。
步骤如下:
修改build.gradle
以添加依赖项。
buildscript {
repositories {
//...
}
dependencies {
classpath 'com.jween.gradle:android-soexcluder:1.1'
}
}
apply plugin: 'com.android.application'
apply plugin: 'android-soexcluder'
从构建风格中排除.so
soexcluder {
// Remove all so files according to the flavor1
flavor1 {
exclude "lib/armeabi-v7a/foo.so", "lib/arm64-v8a/bar.so"
}
}
其他选择是为packagingOptions
:Set doNotStrip packagingOptions to a specific buildType