如何在build.gradle.kts中正确配置doNotStrip避免Native库被剥离
在build.gradle.kts中配置禁止剥离Native库(替代doNotStrip)
正确配置方式
在AGP 7.0及以上版本的build.gradle.kts中,原Groovy语法里的packagingOptions.doNotStrip已被废弃,需改用packaging.jniLibs.keepDebugSymbols配置,具体分两种场景:
禁止剥离所有Native库
如果要保留所有.so文件的调试符号,直接用通配符匹配所有文件:
android { packaging { jniLibs { keepDebugSymbols += "**/*.so" } } }
仅保留特定Native库的符号
针对指定的.so文件配置,需确保路径匹配准确,比如指定多架构下的liba.so:
android { packaging { jniLibs { // 匹配特定架构的目标文件 keepDebugSymbols += "arm64-v8a/liba.so" keepDebugSymbols += "armeabi-v7a/liba.so" // 用通配符匹配所有架构下的libb.so keepDebugSymbols += "*/*/libb.so" } } }
为什么之前的配置未生效
- 你最初尝试的
packagingOptions.doNotStrip是旧版AGP的Groovy语法,在build.gradle.kts中已不再生效; - 后续的
jniLibs.keepDebugSymbols配置如果没起作用,大概率是通配符的匹配逻辑和实际文件路径不匹配,建议先用**/*.so全量匹配测试,确认生效后再缩小范围。
关于stripped_native_libs目录的疑问
即使配置生效,./app/build/intermediates/stripped_native_libs/目录依然会被创建——这是AGP构建流程中的中间产物目录,但此时目录内的.so文件并未被剥离符号。最终打包到APK/AAB中的是保留了调试符号的版本,你可以通过查看APK内的.so文件大小,或用readelf工具检查符号表来验证配置是否生效。
另外补充:Debug构建默认不会剥离Native库符号,但若你手动在buildTypes中设置了ndk.debugSymbolLevel = "stripped",则需要上述配置覆盖;Release构建默认会剥离符号,必须配置keepDebugSymbols才能保留。
内容的提问来源于stack exchange,提问作者Melina
相关产品推荐
相关产品推荐

