Android 以智能方式排除基于味道的JNI库

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 "

我有一个Android项目,它使用了一些很大的本地lib。 我在这个项目中有几种风格,其中一些没有使用这些LIB,所以我想将它们从APK中排除

我知道实现这一点的几种方法,但我想在
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感觉就像谷歌版的苹果开发者体验:至少每年一次打破一切