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

为何GNU libstdc++库意外出现在我们的Android应用中?

为什么配置了LLVM libc的Android应用中仍检测到GNU libstdc?

问题简述

按IDE配置,GNU libstdc本不应出现在Android应用中,但自动生成的开源依赖列表里却出现了适配gcc3/gcc4的GNU libstdc STL条目(GPL许可),需要排查原因。

背景

项目使用Android Studio结合JNI编译C代码(用到string等标准库),依据Android文档添加开源通知后,发现上述异常依赖。根据官方说明,Android 5.0(Lollipop)起系统使用LLVM libc,NDK r18后它是NDK中唯一可用的STL,当前NDK版本为21.4.7075529。

当前配置详情

build.gradle配置

...
android {
    compileSdkVersion 33
    ndkVersion "21.4.7075529"
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                ...
                arguments "-DANDROID_STL=c++_shared","-DANDROID_TOOLCHAIN=clang"
            }
        }
    }
}

CMakeLists.txt配置

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

排查方向

  • 第三方预编译库依赖:如果项目中引入了第三方.so文件,这些库可能是用旧NDK(gcc工具链)编译并链接了libstdc++。可通过命令readelf -d your_lib.so | grep NEEDED检查每个第三方库的依赖项。
  • 构建缓存残留:Android Studio的构建缓存可能保留了旧的编译产物。尝试执行Build -> Clean Project + Build -> Rebuild Project,或手动删除项目根目录下的build文件夹和.cxx文件夹。
  • Java依赖的间接传递:部分Java依赖可能内置了基于libstdc++编译的JNI库。通过./gradlew app:dependencies查看项目完整依赖树,排查可疑依赖。
  • 检测工具误报:部分开源依赖检测工具可能混淆了libc与libstdc的符号或标识。可手动解压APK,检查lib/[abi]/目录下是否存在libstdc++.so——如果不存在,大概率是工具误报。
  • CMake配置遗漏:检查项目中是否有子模块或其他CMakeLists.txt未继承主配置,比如单独设置了STL选项或使用了旧工具链。

内容的提问来源于stack exchange,提问作者cptjacksparrow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:50:39