Android中如何对native库链接的第三方so依赖执行minify压缩?
Android第三方原生依赖库strip/minify配置方案
AGP默认仅对项目源码编译生成的原生库执行strip操作,预制引入的第三方so默认会跳过该流程,可通过以下两种方案实现第三方so的压缩:
方案1:修改AGP构建配置(推荐,适配AGP 7.0+)
在app模块的build.gradle中新增以下配置:
android { // 保留原有配置不变,新增以下packagingOptions块 packagingOptions { jniLibs { // 若需要保留部分so的调试符号,添加下方规则,不需要可删除 // keepDebugSymbols += "**/libxxx.so" // 强制开启所有jni库的strip操作,包含第三方预制so stripDebugSymbols = true } } }
若使用AGP 4.2及更低版本,替换为以下配置:
android { ndk { stripDebugSymbols = true } }
方案2:自定义Gradle Task手动strip
若AGP版本存在适配问题,可新增自定义task调用NDK自带的strip工具执行压缩:
// 请根据你的NDK版本、宿主编译系统调整strip工具路径 // Windows路径示例:def stripToolPath = "${android.ndkDirectory}/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe" // Mac路径示例:def stripToolPath = "${android.ndkDirectory}/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" def stripToolPath = "${android.ndkDirectory}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip" // 注册自定义strip任务,Debug变体示例,Release变体将对应字段替换为Release即可 tasks.register('stripThirdPartySo', Exec) { dependsOn 'mergeDebugNativeLibs' doFirst { fileTree("${buildDir}/intermediates/merged_native_libs/debug/out").each { soFile -> if (soFile.name.endsWith('.so')) { commandLine stripToolPath, '--strip-unneeded', soFile.absolutePath } } } } // 将自定义任务插入构建流程 tasks.whenTaskAdded { task -> if (task.name == 'stripDebugDebugSymbols') { task.dependsOn stripThirdPartySo } }
注意事项
- 操作前备份原始第三方so,部分依赖内部动态符号加载的第三方库strip后可能出现运行时崩溃
- NDK r23及以上版本优先使用
llvm-strip工具,旧版本NDK使用对应架构binutils目录下的strip工具 - 若需要保留指定符号,可给strip命令添加
--keep-symbols=符号列表文件路径参数自定义保留规则 - 验证生效方式:构建完成后对比
merged_native_libs和stripped_native_libs目录下对应so的体积,或执行readelf -S so文件路径检查是否还存在debug节区
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

