编译Android版Crashpad遇libc++_shared.so缺失及库体积异常求助
解决Crashpad Android编译的两个核心问题
一、库大小差异的原因及处理
你编译的700Kb库是剥离了调试符号的Release版本,而官方示例里的26Mb库包含完整调试符号(用于精准解析崩溃堆栈)。如果需要和示例大小接近的库,编译时需保留调试符号:
- 在
gn gen的参数中添加symbol_level=2(生成完整调试符号),如果要Debug版本可以显式设置is_debug=true(Debug模式默认保留符号); - 编译完成后,不要用
strip工具剥离符号,直接保留生成的原始.so文件。
二、libc++_shared.so找不到的解决方案
问题根源是Crashpad默认用静态libc++库编译,但你的APP用的是动态libc++_shared.so,导致依赖不匹配。必须在Crashpad编译阶段就指定使用动态libc++:
1. 修改gn gen的参数
执行gn gen时,添加关键配置参数:
gn gen out/arm64-v8a --args="\ target_os=\"android\" \ target_cpu=\"arm64\" \ android_ndk=\"/path/to/your/ndk\" \ android_api_level=21 \ use_libcxx_shared=true \ symbol_level=2 \ is_debug=false"
use_libcxx_shared=true:强制Crashpad使用动态libc++_shared.so,和你的APP配置保持一致;- 确保
android_ndk路径指向你当前APP使用的NDK版本,避免版本不兼容。
2. 验证CMake配置
你的CMake配置本身没问题,但要额外注意:
- 所有依赖Crashpad的Native库,都要使用相同的
-DANDROID_STL=c++_shared参数; - 在APP的
build.gradle中,确保defaultConfig里的NDK版本和编译Crashpad时用的一致:
defaultConfig { ndk { abiFilters 'arm64-v8a' version "your_ndk_version" } }
3. 检查库的依赖
编译完成后,用NDK的readelf工具验证libcrashpad_handler.so的依赖:
/path/to/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-readelf -d libcrashpad_handler.so | grep NEEDED
如果输出包含libc++_shared.so,说明编译配置正确。此时重新打包APP,libc++_shared.so会被自动打包到APK对应ABI目录下。
三、关于官方文档是否过时
当前Bugsplat的Android集成文档确实未明确提及use_libcxx_shared参数,这是因为早期Crashpad默认使用静态libc++,但现在Android开发更推荐动态libc++以减小APK体积。你不需要额外传入extra_cflags,核心是通过use_libcxx_shared=true统一依赖环境。
内容的提问来源于stack exchange,提问作者Sheikh
相关产品推荐
相关产品推荐

