Android 以智能方式排除基于味道的JNI库
我有一个Android项目,它使用了一些很大的本地lib。 我在这个项目中有几种风格,其中一些没有使用这些LIB,所以我想将它们从APK中排除 我知道实现这一点的几种方法,但我想在Android 以智能方式排除基于味道的JNI库,android,android-studio,gradle,groovy,android-ndk,Android,Android Studio,Gradle,Groovy,Android Ndk,我有一个Android项目,它使用了一些很大的本地lib。 我在这个项目中有几种风格,其中一些没有使用这些LIB,所以我想将它们从APK中排除 我知道实现这一点的几种方法,但我想在build.gradle文件中使用一些不错的代码来减少可能的错误并学习groovy 我必须提到,有一个布尔值buildConfigField(在本例中称为DO_IT)。如果DO_IT为false,则将排除JNI LIB 我现在就是这样做的: defaultConfig { buildConfigField "
build.gradle
文件中使用一些不错的代码来减少可能的错误并学习groovy
我必须提到,有一个布尔值buildConfigField
(在本例中称为DO_IT
)。如果DO_IT
为false,则将排除JNI LIB
我现在就是这样做的:
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-pefect解决方案只会在flavors块之外的例程中基于DO_IT
buildConfigField
排除LIB,例如在defaultConfig
中,我使用此模式
Project build.config
buildscript {
ext.DO_IT = true;
}
productFlavors {
flavor2 {
externalNativeBuild {
cmake {
if (DO_IT) {
targets "someTarget"
}
}
}
}
}
模块(应用程序)build.config
buildscript {
ext.DO_IT = true;
}
productFlavors {
flavor2 {
externalNativeBuild {
cmake {
if (DO_IT) {
targets "someTarget"
}
}
}
}
}
注1:附录A第节中提到了ext
格拉德尔的
注意:2每种风格的设置,如包含库,应该在project build.config中进行控制,因为Android Studio/Gradle试图一次读取所有风格的所有设置,并导致冲突或其他问题
注意3请记住,Android Studio不会删除已经发送到设备的库(.so)文件。这是测试结果。检查设备上的/data/app/(package)/lib/(cpu-arch)/和pc上的(project)/app/build/intermediates/cmake/(flavor)/obj/(cpu-arch)/中的文件。如果您觉得结果错误,请手动清除这些文件,尤其是在设备上。“从应用程序/存储中清除数据”设置不会清除库。卸载将清除它们,所以手动删除文件更容易 注意:Android Studio的设备文件资源管理器的“同步”菜单无法正确同步lib或(cpu arch)目录。要查看正确的结果,请选择/data或/data/app并同步。应该是正确的方法 步骤如下:
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"
}
}
另一个选项是为
包装选项添加一个gradle参数
:,这太好了!谢谢你的专业提示!截至2020年2月,由于以下原因已损坏。Gradle感觉就像谷歌版的苹果开发者体验:至少每年一次打破一切