NDK 升级变化
一、 r10c
- 添加clang 3.5 的支持,NDK_TOOLCHAIN_VERSION=clang 会使用3.5版本的clang
- 弃用gcc 4.6 ,并且会在后续版本中移除gcc 4.6
- 已知问题:gcc 4.9编译时,使用-Os会导致崩溃
二、r10d
- 32 位ABI 默认使用4.8编译,64位ABI默认使用4.9编译
- 已经修复r10c 出现的指定-Os 出现的崩溃问题
三、r10e
- 添加clang3.6,默认使用clang3.6,移除clang3.4
- 移除gcc4.6
- 在ld.gold链接时,针对所有架构添加线程支持,默认不添加
要添加多线程编译,使用--threads
默认不实用多线程编译,--no-threads
四、r11
- 强烈建议使用clang,并且clang更新到3.8svn
- 已经弃用gcc,由clang替代,gcc 也不会在升级
- 已经移除gcc4.8,现在所有的gcc编译都使用4.9
- 已经将构建系统使用-isystem
- 向API21 添加Vulkan 支持
- 已知问题
1. x86 ASAN 目前无法运作
2. Clang、x86、stlport_static 与 -O0 以上优化级别的组合会导致 dynamic_cast 测试失败
3. 在ARM32 上使用c++_shared 时,异常处理会失效,根本原因在于,libc++abi 用于 ARM32 的 LLVM 展开程序与 libgcc 不兼容
五、r11b
- 修复 libc++工具链,之前已知缺少__cxxabi_config.h
六、r11c
- 修复脚本问题,ndk-gdb,ndk-which等
七、r12
- ndk-build 建议使用clang编译,在之后的版本中会移除gcc
- 已知问题
1. x86 AddressSanitizer 工具无法使用
2. c++_static 异常对android 9和14无效
3. RenderScript 工具不存在
八、r13b
- gcc 不在支持, NDK_TOOLCHAIN_VERSION默认使用clang
- 因为gunstl 中有一部分和clang不兼容,以后可能会移除gunstl
九、 r14b
- 统一了头文件,以前每个Android版本都有自己的头文件,现在使用统一的头文件,默认未开启
- gcc 被弃用,使用gcc,通过-D__ANDROID_API__=$API指定具体的API
十、r15c
- 不在支持Android2.3(android-9),现在最低的版本是android 4.0(android-14)
- 默认使用统一头文件
十一、r16b
- 弃用armeabi、MIPS、MIPS64的支持
- 弃用旧的头文件,使用统一头文件
十二、r17c
- gnustl 和 stlport 已弃用
- 已移除对 ARMv5 (armeabi)、MIPS 和 MIPS64 的支持
十三、r18b
- 移除gcc
- gnustl、gabi++ 和 stlport 已移除
- 对android 14和15的支持已经移除
升级过程
- 在项目中,使用了一部分旧的头文件,当升级到r16b时,因为头文件统一的原因,有一部分头文件不在兼容。
https://android.googlesource.com/platform/ndk/+/ndk-release-r16/docs/UnifiedHeadersMigration.md
按照文档中描述的办法,使用deprecated-headers可以编译通过 - 不能使用android-9,最低使用android-14
- 因为之前项目中已知使用gunstl,但是在后续版本中移除了gunstl,所以修改为c++_static和c++_shared
遇到的问题
- 头文件被移除问题的问题
通过deprecated-headers 兼容,但是注意,只能使用 gnustl 进行编译
- gnustl_static 改为 c++_static 时,出现各种未知问题
导入了deprecated-headers,最后解决办法只能是删除deprecated-headers,并且修改所有被移除的头文件
- 引用的一部分库,使用的gcc 编译的
在r13b 以后,ndk-build默认使用clang,而且在r18b以后,删除了c++,所以引用的库也需要通过clang编译
网友评论