如何在Android构建中排除指定JNI库:AAR与androidTest APK
解决方案
一、优化AAR打包:排除libfoo_test.so
你之前用Zip任务重新打包AAR的方法可行,但可以用Android Gradle Plugin(AGP)原生的打包配置实现,更简洁高效,避免额外的Zip任务开销:
android { libraryVariants.all { variant -> variant.packageLibrary.configure { exclude("**/libfoo_test.so") } } }
这段代码会在AAR的打包阶段直接过滤掉所有架构下的libfoo_test.so,无需后续重新打包。
二、为androidTest APK排除libfoo.so
AGP的packagingOptions确实默认作用于主APK,但可以通过androidTestVariants配置测试APK的打包规则,同时不影响Android Studio运行测试的流程:
方法1:全局配置所有测试变体
如果需要对所有测试变体生效,添加以下配置:
android { androidTestVariants.all { testVariant -> testVariant.packagingOptions.exclude("**/libfoo.so") } }
方法2:精准定位Debug测试包
如果只需要针对Debug环境的测试APK(即<projectname>-debug-androidTest.apk),可以直接指定对应任务:
tasks.named("packageDebugAndroidTest").configure { exclude("**/libfoo.so") }
进阶:从根源减少编译开销
如果你的原生库是通过externalNativeBuild(CMake/ndk-build)编译的,还可以让测试变体只编译libfoo_test.so,完全跳过libfoo.so的编译,进一步加快构建速度:
android { androidTestVariants.all { testVariant -> testVariant.externalNativeBuild { cmake { targets "libfoo_test" } // 若使用ndk-build,替换为: // ndkBuild { // targets "libfoo_test" // } } } }
这样测试变体的编译阶段只会处理测试所需的原生库,从源头减少编译时间和产物体积。
内容的提问来源于stack exchange,提问作者Hsilgos
相关产品推荐
相关产品推荐

