You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:45:33