多仓libc++_shared.so版本规范化
c++运行时简介
被墙的原因,先贴一下google的介绍
C++ 运行时库
表 1. NDK C++ 运行时和功能。
名称 | 功能 |
---|---|
libc++ | 现代 C++ 支持。 |
system | new 和 delete 。(在 r18 中已弃用。) |
none | 无头文件,有限 C++。 |
libc++
LLVM 的 libc++ 是 C++ 标准库,自 Lollipop 以来 Android 操作系统便一直使用该库,并且从 NDK r18 开始成为 NDK 中唯一可用的 STL。
注意:如需全面详细了解任何给定版本对 C++ 库的支持级别是否达到了预期,请参阅 C++14 Status、C++17 Status 和 C++2a Status 页面。 请注意,编译器的 C++ 语言支持级别互不相关;请改为参阅 Clang 中的 C++ 支持。
libc++ 的共享库为 libc++_shared.so
,静态库为 libc++_static.a
。
注意:libc++ 不是系统库。如果使用 libc++_shared.so
,必须将其包含在 APK 中。如果使用 Gradle 构建应用,此步骤会自动完成。
libc++ 依据伊利诺伊大学“BSD 式”许可和 MIT 许可双重授权。如需了解详情,请参阅许可文件。
system
system 运行时指的是 /system/lib/libstdc++.so
。请勿将该库与 GNU 的全功能 libstdc++ 混淆。在 Android 系统中,libstdc++ 只是 new
和 delete
。对于全功能 C++ 标准库,请使用 libc++。
注意:系统 STL 将在未来 NDK 版本中移除。请参阅问题 744。
系统 C++ 运行时支持基础 C++ 运行时 ABI。从根本上来说,此库就是提供 new
和 delete
。不同于 NDK 中提供的其他选项,此库不支持异常处理和 RTTI。
除 <cstdio>
等用于 C 库头文件的 C++ 封装容器之外,并无标准库支持。如需 STL,您应使用本页面提供的其他选项。
none
另外,您还可选择不使用 STL。在这种情况下,没有关联或授权要求。不提供 C++ 标准头文件。
选择 C++ 运行时
CMake
CMake 的默认值为 c++_static
。
您可以使用模块级 build.gradle
文件中的 ANDROID_STL
变量指定 c++_shared
、c++static
、none
或 system
。如需了解详情,请参阅有关 CMake 中 ANDROID_STL 的文档。
ndk-build
ndk-build 的默认值为 none
。
您可以使用 Application.mk 文件中的 APP_STL
变量指定 c++_shared
、c++static
、none
或 system
。例如:
APP_STL := c++_shared
ndk-build 仅允许为您的应用选择一个运行时,并且只能在 Application.mk 中进行选择。
关键的地方来了
每个应用一个 STL
过去,NDK 除了支持 libc++,还支持 GNU libstdc++ 和 STLport。如果应用依赖于预构建库,而构建相应库所使用的 NDK 与构建应用使用的 NDK 不同,需确保其兼容性。
一个应用不得使用多个 C++ 运行时。不同的 STL 互不兼容。举例来说,libc++ 中 std::string
的布局不同于 gnustl。根据某种 STL 编写的代码无法使用以另一种 STL 编写的对象。以上仅举一例,其他不兼容情况不胜枚举。
一个应用不得使用多个c++运行时,所以说,如果app是多仓依赖的情况下,如果多个依赖库使用了不同的c++运行时,一般会导致app运行时崩溃或者出现各种奇葩的问题。app统一stl规范不得不为之。
如何统一STL呢?
1.尽量使用官方推荐的做法,使用c++_shared
2.保证c++shared运行时版本,在module级别的build.gradle中添加ndkVersion约束
ndkVersion "21.0.6113669"
3.发布aar时,排除c++_shared.so库
packagingOptions {
exclude '**/libc++_shared.so'
}
4.专门发布一个aar,该aar中包含libc++_shared.so,供app工程依赖,保证c++_shared.so打包至apk中
比如一个简单的demo-aar(https://github.com/whulzz1993/cppshared)
5.在工程build.gradle中添加相应版本的so库
packagingOptions {
pickFirst 'lib/*/libc++_shared.so'
}