NDK 升級(jí)變化
一籍琳、 r10c
- 添加clang 3.5 的支持璧疗,NDK_TOOLCHAIN_VERSION=clang 會(huì)使用3.5版本的clang
- 棄用gcc 4.6 ,并且會(huì)在后續(xù)版本中移除gcc 4.6
- 已知問題:gcc 4.9編譯時(shí),使用-Os會(huì)導(dǎo)致崩潰
二、r10d
- 32 位ABI 默認(rèn)使用4.8編譯凤瘦,64位ABI默認(rèn)使用4.9編譯
- 已經(jīng)修復(fù)r10c 出現(xiàn)的指定-Os 出現(xiàn)的崩潰問題
三冤竹、r10e
- 添加clang3.6,默認(rèn)使用clang3.6,移除clang3.4
- 移除gcc4.6
- 在ld.gold鏈接時(shí)拂封,針對(duì)所有架構(gòu)添加線程支持,默認(rèn)不添加
要添加多線程編譯鹦蠕,使用--threads
默認(rèn)不實(shí)用多線程編譯冒签,--no-threads
四、r11
- 強(qiáng)烈建議使用clang钟病,并且clang更新到3.8svn
- 已經(jīng)棄用gcc萧恕,由clang替代,gcc 也不會(huì)在升級(jí)
- 已經(jīng)移除gcc4.8,現(xiàn)在所有的gcc編譯都使用4.9
- 已經(jīng)將構(gòu)建系統(tǒng)使用-isystem
- 向API21 添加Vulkan 支持
- 已知問題
1. x86 ASAN 目前無法運(yùn)作
2. Clang肠阱、x86票唆、stlport_static 與 -O0 以上優(yōu)化級(jí)別的組合會(huì)導(dǎo)致 dynamic_cast 測(cè)試失敗
3. 在ARM32 上使用c++_shared 時(shí),異常處理會(huì)失效辖所,根本原因在于惰说,libc++abi 用于 ARM32 的 LLVM 展開程序與 libgcc 不兼容
五、r11b
- 修復(fù) libc++工具鏈缘回,之前已知缺少__cxxabi_config.h
六吆视、r11c
- 修復(fù)腳本問題典挑,ndk-gdb,ndk-which等
七、r12
- ndk-build 建議使用clang編譯啦吧,在之后的版本中會(huì)移除gcc
- 已知問題
1. x86 AddressSanitizer 工具無法使用
2. c++_static 異常對(duì)android 9和14無效
3. RenderScript 工具不存在
八您觉、r13b
- gcc 不在支持, NDK_TOOLCHAIN_VERSION默認(rèn)使用clang
- 因?yàn)間unstl 中有一部分和clang不兼容,以后可能會(huì)移除gunstl
九授滓、 r14b
- 統(tǒng)一了頭文件琳水,以前每個(gè)Android版本都有自己的頭文件,現(xiàn)在使用統(tǒng)一的頭文件般堆,默認(rèn)未開啟
- gcc 被棄用在孝,使用gcc,通過-D__ANDROID_API__=$API指定具體的API
十淮摔、r15c
- 不在支持Android2.3(android-9),現(xiàn)在最低的版本是android 4.0(android-14)
- 默認(rèn)使用統(tǒng)一頭文件
十一私沮、r16b
- 棄用armeabi、MIPS和橙、MIPS64的支持
- 棄用舊的頭文件仔燕,使用統(tǒng)一頭文件
十二、r17c
- gnustl 和 stlport 已棄用
- 已移除對(duì) ARMv5 (armeabi)魔招、MIPS 和 MIPS64 的支持
十三晰搀、r18b
- 移除gcc
- gnustl、gabi++ 和 stlport 已移除
- 對(duì)android 14和15的支持已經(jīng)移除
升級(jí)過程
- 在項(xiàng)目中办斑,使用了一部分舊的頭文件外恕,當(dāng)升級(jí)到r16b時(shí),因?yàn)轭^文件統(tǒng)一的原因俄周,有一部分頭文件不在兼容吁讨。
https://android.googlesource.com/platform/ndk/+/ndk-release-r16/docs/UnifiedHeadersMigration.md
按照文檔中描述的辦法,使用deprecated-headers可以編譯通過 - 不能使用android-9峦朗,最低使用android-14
- 因?yàn)橹绊?xiàng)目中已知使用gunstl,但是在后續(xù)版本中移除了gunstl,所以修改為c++_static和c++_shared
遇到的問題
- 頭文件被移除問題的問題
通過deprecated-headers 兼容建丧,但是注意,只能使用 gnustl 進(jìn)行編譯
- gnustl_static 改為 c++_static 時(shí)波势,出現(xiàn)各種未知問題
導(dǎo)入了deprecated-headers翎朱,最后解決辦法只能是刪除deprecated-headers,并且修改所有被移除的頭文件
- 引用的一部分庫(kù)尺铣,使用的gcc 編譯的
在r13b 以后拴曲,ndk-build默認(rèn)使用clang,而且在r18b以后凛忿,刪除了c++,所以引用的庫(kù)也需要通過clang編譯