本頁提供了 NDK 的異動資訊 (包括所有目前已發布的穩定版),方便您查詢相關變更。如要下載最新的 NDK 穩定版或目前可用的 Beta 版,請參閱「NDK 下載」頁面。
如需更完整的資訊,請參閱 android-ndk-announce Google 網路論壇,並訂閱接收發布公告。
Android NDK r29(2025 年 10 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
Android NDK r28(2025 年 2 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
Android NDK r27 LTS(2024 年 7 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
Android NDK r26 LTS (2023 年 9 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
- 不再支援 KitKat (API 19 和 20)。
Android NDK r25 LTS (2022 年 7 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
- 包含 Android 13 API。
- 已根據 LLVM 14 開發,將 LLVM 更新至 clang-r450784d。
Android NDK r24 (2022 年 3 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
-
GNU 組合器 (GAS) 已經移除。如果使用
-fno-integrated-as建構,您將必須移除該標記。請參閱 Clang 遷移注意事項瞭解如何使組件與 LLVM 相容的建議事項。 - GDB 已移除。請改用 LLDB。請注意,根據預設,ndk-gdb 會使用 LLDB,且 Android Studio 僅曾支援過 LLDB。
- 不再支援 Jelly Bean (API 16、17 和 18)。NDK 支援的最低 OS 為 KitKat (API 級別 19)。
- 不再支援非 Neon 裝置。只有極少數非常舊的裝置不支援 Neon,因此除了效能提升之外,大多數應用程式都不會留意裝置是否支援 Neon。
- 已停止支援 RenderScript 版本。RenderScript 已在 Android 12 中淘汰。如果您應用程式使用了 RenderScript,而您尚未完成移轉程序,則可使用 NDK r23 LTS。
-
GNU 組合器 (GAS) 已經移除。如果使用
Android NDK r23 LTS (2021 年 8 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
-
已移除 GNU binutils,這不包括 GNU 組合器 (GAS)。GAS 將在下一個版本中移除。使用
-fno-integrated-as進行建構時,如果無法移除該標記,請回報錯誤。 -
已終止支援 GDB。GDB 將從下一個版本中移除。請改用 LLDB。請注意,根據預設,
ndk-gdb會使用 LLDB。 - NDK r23 是支援非 Neon 裝置的最後一個版本。從 NDK r24 開始,將使用 Neon 建構 sysroot 中的 armeabi-v7a 程式庫。只有極少數非常舊的裝置不支援 Neon。因此除了效能提升之外,大多數應用程式都不會留意裝置是否支援 Neon。
- 下一個 NDK 版本將不支援 Jelly Bean (API 16、17 和 18)。NDK r24 支援的最低 OS 為 KitKat (API 級別 19)。
-
已移除 GNU binutils,這不包括 GNU 組合器 (GAS)。GAS 將在下一個版本中移除。使用
Android NDK r22b (2021 年 3 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
-
GNU binutils 已淘汰,並將從即將推出的 NDK 版本中移除。請注意,GNU 組合器 (
as) 亦是如此。使用-fno-integrated-as進行建構時,如果無法移除該標記,請回報錯誤。如果您是直接使用as,請改用clang。 - 目前預設使用 LLD 連接器。 ndk-build 和我們的 CMake 工具鏈檔案也已改用 llvm-ar 和 llvm-strip。
- ndk-gdb 目前使用 lldb 做為偵錯工具。gdb 已淘汰,後續版本將會移除。如需改回 gdb,可使用 --no-lldb 選項,但請回報錯誤,並說明無法使用 lldb 的原因。
-
現已支援
std::filesystem。目前有兩個已知問題:
-
GNU binutils 已淘汰,並將從即將推出的 NDK 版本中移除。請注意,GNU 組合器 (
Android NDK r21e LTS (2021 年 1 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
-
不再支援 32 位元 Windows。這項變更不會影響大多數使用者。如果您仍需使用 32 位元版本的 Windows 建構 NDK 應用程式,請繼續使用 NDK r20。
如要進一步瞭解 Android 開發人員工具中的這項變更,請參閱相關主題的網誌文章。
-
LLD 現已開放測試。
Android 開放原始碼計畫已將預設的連接器改為 LLD,隨後 NDK 也會改用 LLD (具體時間未定)。如要測試應用程式中的 LLD,請在建立連結時傳遞
-fuse-ld=lld。請注意,問題 843 會影響使用 LLD 搭配 binutils strip 和 objcopy 的建構作業,而不會影響使用 llvm-strip 和 llvm-objcopy 的建構作業。 -
我們會在即將發布的版本中移除舊版工具鏈安裝路徑。這些路徑自 NDK r19 起已過時,並會在 NDK 中佔據大量空間。要移除的路徑如下:
- platforms
- sources/cxx-stl
- sysroot
- toolchains (toolchains/llvm 除外)
make_standalone_toolchain.py使用者 (不過自 r19 開始就不再需要使用該指令碼) 都不會受到影響。 如要瞭解如何從舊版工具鏈版面配置遷移,請參閱您目前使用的 NDK 版本的建構系統維護指南。 - 自 2019 年 8 月起,上傳到 Play 商店的 APK 一律必須具備 64 位元的版本。請立即開始移植您的程式,以免屆時出現意外問題。詳情請參閱這篇網誌文章。
- 現在起,可從我們的維基與我們的網站上下載經簽署和公證的 macOS 應用程式套件。請注意,由於只有套件可以使用 RPATH 及通過公證,因此 macOS 的傳統 NDK 套件「無法」取得公證。SDK 將繼續使用傳統套件,因為應用程式套件需要變更版面配置,而這會導致其與 Android Studio 不相容。透過 SDK Manager 下載此 NDK 時,NDK 不會受到隔離,因此 Gatekeeper 目前允許使用此 NDK。如要取得 macOS 版 NDK,SDK Manager 目前是最為可靠的方式。
-
Android NDK r20b (2019 年 6 月)
變更記錄Android NDK r19c (2019 年 1 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
-
開發人員應開始使用 LLD 測試應用程式。Android 開放原始碼計畫已將預設的連接器改為 LLD,而下一版的 NDK 也將預設使用 LLD。一旦 LLD 完成發布流程,且期間內沒有發生重大未解決的問題 (預計為 r21),BFD 和 Gold 將會移除。如要測試應用程式中的 LLD,請在建立連結時傳遞
-fuse-ld=lld。注意:lld 目前不支援 Windows 上的壓縮符號。問題 888。Clang 也無法在 Windows 上產生壓縮符號,而這可能導致在使用 Darwin 或 Linux 建構的構件時引發問題。 - 自 2019 年 8 月起,上傳到 Play 商店的 APK 一律必須具備 64 位元的版本。請立即開始移植您的程式,以免屆時出現意外問題。詳情請參閱這篇網誌文章。
-
問題 780:不再需要使用獨立工具鏈。Clang、binutils、sysroot 和其他工具鏈元件現皆已安裝至
$NDK/toolchains/llvm/prebuilt/<host-tag>,並且 Clang 會自動找到這些內容。請勿針對 API 26 ARM 建立獨立的工具鏈,正確的做法是直接從 NDK 叫用編譯器: 對於 r19,工具鍊也會安裝在舊路徑上,以便讓建構系統適應新的版面配置。舊路徑將在 r20 中移除,但$ $NDK/toolchains/llvm/prebuilt/
/bin/armv7a-linux-androideabi26-clang++ src.cpp make_standalone_toolchain.py指令碼不會移除。這個指令碼目前非必要,但會發出含有上述資訊的警示,因此仍會保留以維持現有工作流程。 如果您使用的是 ndk-build、CMake 或獨立工具鏈,您的工作流程將不會有任何變更。這項變更對第三方建構系統的維護人員來說非常實用,他們現在應可刪除部分特定 Android 程式碼。詳情請參閱建構系統維護人員指南。 - 已移除 ndk-depends。我們認為 ReLinker 可以更有效地解決舊版 Android 裝置上的原生程式庫載入問題。
- 問題 862:重新導向 Clang 的 GCC 包裝函式指令碼已經移除,原因是功能不足,無法做為替換方案使用。
-
開發人員應開始使用 LLD 測試應用程式。Android 開放原始碼計畫已將預設的連接器改為 LLD,而下一版的 NDK 也將預設使用 LLD。一旦 LLD 完成發布流程,且期間內沒有發生重大未解決的問題 (預計為 r21),BFD 和 Gold 將會移除。如要測試應用程式中的 LLD,請在建立連結時傳遞
Android NDK r18b (2018 年 9 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
- 已移除 GCC。
-
LLD 現已開放測試。
Android 開放原始碼計畫目前正在將預設的連接器改為 LLD,隨後 NDK 也將改用 LLD (具體時間未定)。如要測試應用程式中的 LLD,請在建立連結時傳遞
-fuse-ld=lld。 - 已移除 gnustl、gabi++ 和 stlport。
- 已取消 ICS (android-14 和 android-15) 的支援。使用執行檔的應用程式不必再同時提供 PIE 和非 PIE 執行檔。
- 自 2019 年 8 月起,上傳到 Play 商店的 APK 一律必須具備 64 位元的版本。請立即開始移植您的程式,以免屆時出現意外問題。詳情請參閱這篇網誌文章。
Android NDK r17c (2018 年 6 月)
變更記錄- 下載內容
-
- 請按一下這裡以下載此版本。
- 公告事項
-
- 已停止支援 GCC,並將在 NDK r18 中移除 GCC。
-
libc++ 現已成為 CMake 和獨立工具鏈的預設 STL。如果您是手動選取不同的 STL,我們強烈建議您改用
libc++。請注意,ndk-build 仍預設為沒有 STL。詳情請參閱這篇網誌文章。 - gnustl 和 stlport 已淘汰,並將從 NDK r18 中移除。
- 已停止支援 ARMv5 (armeabi)、MIPS 和 MIPS64。如果嘗試構建此類 ABI,將導致發生錯誤。
- r18 將停止支援 ICS (android-14 和 android-15)。
- 自 2019 年 8 月起,上傳到 Play 商店的 APK 一律必須具備 64 位元的版本。請立即開始移植您的程式,以免屆時出現意外問題。詳情請參閱這篇網誌文章。
Android NDK r16b (2017 年 12 月)
變更記錄- 下載內容
- 請按一下這裡以下載此版本。
- 公告事項
-
- 已移除淘汰的標頭。 統一標頭現簡稱為「標頭」。如需遷移提示,請參閱統一標頭遷移附註。
- 已停止支援 GCC。雖然 GCC 目前不會從 NDK 中移除,但不會再收到向後移植內容。gnustl 的某些部分仍與 Clang 不相容,因此只有在 libc++ 夠穩定、可以成為預設 STL 時,才能移除 GCC。從 r18 移除其他 STL 時,將會移除 GCC。
libc++已通過測試階段,現為 NDK 中的首選 STL。從 r17 開始,libc++將成為 CMake 與獨立工具鏈的預設 STL。如果手動選取不同的 STL,我們強烈建議改用libc++。詳情請參閱這篇網誌文章。- 停止支援 ARM5 (armeabi)、MIPS 和 MIPS64。這些項目將不再預設使用 ndk-build 建構,但在明確命名的前提下仍可建構,且會包含在「all」、「all32」和「all64」。r17 已移除對上述各項的支援。如果以任何 ABI 做為目標,CMake 和 ndk-build 都會發出警告。
- API
-
已新增適用於 Android 8.1 的原生 API。如要進一步瞭解這些 API,請參閱原生 API 總覽。
如要進一步瞭解這個版本的新功能和變更內容,請參閱變更記錄。
Android NDK r15c (2017 年 7 月)
變更記錄- 下載內容
- 請按一下這裡以下載此版本。
- 公告事項
-
- 預設啟用統一標頭。如要瞭解如何使用這些標頭,請參閱統一標頭。
- 已停止支援 GCC。雖然 GCC 目前不會從 NDK 中移除,但不會再收到向後移植內容。gnustl 的某些部分仍與 Clang 不相容,因此只有在 libc++ 穩定到可以成為預設 STL 時,才能移除 GCC。
- 不再支援 Android 2.3 (
android-9)。NDK 中的最低 API 級別目標現為 Android 4.0 (android-14)。如果設定的APP_PLATFORM低於android-14,系統會改用android-14。 - NDK 的 CMake 現在支援建構以 YASM 編寫的組合程式碼,以在 x86 和 x86-64 架構中運作。詳情請參閱建構組合程式碼。
注意:已淘汰的標頭將從即將推出的版本中移除。如果您遇到與這些標頭有關的任何問題,請提交錯誤。
如需遷移提示,請參閱統一標頭遷移附註。
- API
-
已新增適用於 Android 8.0 的原生 API。如要進一步瞭解這些 API,請參閱原生 API 總覽。
如要進一步瞭解這個版本的新功能和變更內容,請參閱變更記錄。
Android NDK r14b (2017 年 3 月)
變更記錄- 下載內容
- 請按一下這裡以下載此版本。
- 公告事項
-
- 統一標頭:這個版本加入了平台標頭,這些標頭與 Android 平台保持同步,並可確保時時保持最新狀態和準確性。僅針對標頭的錯誤修正現在會影響所有 API 級別。加入統一標頭修正了早期 NDK 版本中的不一致問題,例如:
- M 和 N 中的標頭實際上是 L 的標頭。
- 標頭中的函式宣告與其平台層級不符;標頭宣告的函式不存在,或無法宣告可用的函式。
- 一些舊 API 級別缺少部分常數或包含不正確的常數,但這些常數皆會出現在新 API 中。
根據預設,系統不會啟用這些新的統一標頭。如要瞭解如何啟用及使用這些標頭,請參閱統一標頭。
- GCC 淘汰:這個版本已停止對 GCC 的有效支援。雖然 GCC 目前不會從 NDK 中移除,但不會再收到向後移植內容。gnustl 的某些部分仍與 Clang 不相容,因此除非 libc++ 穩定到可以成為預設 STL,否則不會完全移除 GCC。
- 統一標頭:這個版本加入了平台標頭,這些標頭與 Android 平台保持同步,並可確保時時保持最新狀態和準確性。僅針對標頭的錯誤修正現在會影響所有 API 級別。加入統一標頭修正了早期 NDK 版本中的不一致問題,例如:
如要進一步瞭解這個版本的新功能和變更內容,請參閱變更記錄。
Android NDK r13b (2016 年 10 月)
- 下載內容
- 這裡封存了此版本的下載內容。
- 公告事項
-
- 已停止支援 GCC。雖然 GCC 目前不會從 NDK 中移除,但不會再收到向後移植內容。gnustl 的某些部分仍與 Clang 不相容,因此只有在 libc++ 穩定到可以成為預設 STL 時,才能移除 GCC。達到上述條件後,可能會移除 GCC。
- 已新增 simpleperf,這是適用於 Android 的一種 CPU 分析器。
- r13b
-
-
進一步修正缺少
__cxa_bad_cast的問題。
-
進一步修正缺少
- NDK
-
NDK_TOOLCHAIN_VERSION現已預設為 Clang。- libc++ 已更新為 r263688。
- 我們已重設為 (接近) 無錯的上游。這應該會移除大量錯誤,但我們仍需先清除 libandroid_support,才會建議將其當做預設 STL。
-
make-standalone-toolchain.sh現在只是此工具的 Python 版本包裝函式。但在行為方面存在一些差異。 詳情請參閱修訂訊息。 - 已移除某些不支援 ABI 的程式庫 (mips64r2、mips32r6、mips32r2 和 x32)。但是,可能仍有一些這樣的程式庫存在。
- 已解決以下問題:針對 ARM android-21+ 建構靜態執行檔時發生 crtbegin_static.o 問題,導致在連結時缺少 atexit (問題 132)
- 在 build/cmake/android.builder.cmake 中新增 CMake 工具鏈檔案。
- 已知問題
Android NDK r12b (2016 年 6 月)
- 下載內容
- 這裡封存了此版本的下載內容。
- 公告事項
ndk-build指令在 r13 中預設使用 Clang。我們將在後續版本中移除 GCC。make-standalone-toolchain.sh指令碼將從 r13 中移除。請確認make_standalone_toolchain.py符合您的需求。- 向 GitHub 回報問題。
- 我們修正了
ndk-gdb.py(問題 118)。 -
我們已更新
NdkCameraMetadataTags.h,使其不再加入無效列舉值。 - 已修正 ndk-build 中的一項錯誤,該錯誤會導致針對使用 libc++ 的靜態資料庫發出錯誤警告。如要進一步瞭解這項變更,請參閱這裡的註解。
- 已為 android-24 更新 OpenSLES 標頭。
- NDK
- 我們已停止支援 armeabi-v7a-hard ABI。詳情請參閱此說明。
- 已移除所有 GB 之前平台層級的 sysroot。我們在 r11 中即已不再支援這些 sysroot,但實際上並未將其移除。
- 在 ARM32 上使用 c++_shared 時的例外狀況處理多數情況下可正常進行。展開程式現會連結至每個連結的物件,而不是 libc++ 本身。如要進一步瞭解這項例外狀況處理,請參閱已知問題。
- 已刪減預設編譯器標記 (問題 27)。
- 如需這些變更的完整資訊,請參閱這份變更清單。
- 已新增獨立工具鏈的 Python 實作項目:
build/tools/make_standalone_toolchain.py。- Windows 使用者不再需要 Cygwin,亦可使用這項功能。
- 我們將從 r13 中移除 bash 變種版本,因此請立即測試新版本。
- 根據預設,Clang 偵錯版本已啟用
-fno-limit-debug-info。這項變更應可提升 LLDB 的偵錯能力。 --build-id現預設為啟用。- 版本 ID 會顯示在原生當機報告中,方便您輕鬆辨識正在執行的程式碼版本。
NDK_USE_CYGPATH應該不會再導致 libgcc 方面的問題 (Android 問題 195486)。-Wl、--warn-shared-textrel和-Wl,--fatal-warnings選項現在預設為啟用。如果您有共用的文字再定位,應用程式就無法在 Android 6.0 (API 級別 23) 或以上版本中載入。但是,不得針對 64 位元應用程式使用文字再定位。- 預先編譯的標頭應該可以更妥善運作 (問題 14 和問題 16)。
- 已移除無法存取的 ARM (非縮圖) STL 程式庫。
- 已向 android-24 新增 Vulkan 支援。
- 已向 android-24 新增 Choreographer API。
- 已為採用
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED或更高級別的裝置新增libcamera2API。詳情請參閱相機特性。 - Clang
- Clang 已更新為 3.8svn (r256229,版本 2812033)。
- 32 位元 Windows 套件中的
clang.exe和clang++.exe執行檔實際上是 64 位元。32 位元執行檔的名稱為clang_32.exe。
- 32 位元 Windows 套件中的
- GCC
- 已與 ChromeOS GCC @ google/gcc-4_9 r227810 保持同步。
- 從 ToT (r231296) 向後移植了涵蓋範圍掃毒修補程式。
- 已修正 libatomic,避免使用
ifuncs(問題 31)。 - Binutils
- 已將「找到並修正了 Erratum 843419」資訊訊息設為靜音。
- 已加入選項
--long-plt,修正在連結大型 arm32 二進位檔時出現的內部連接器錯誤。 - 已針對 AArch64 修正錯誤的執行時間虛設常式。該錯誤會造成針對特大型 DSO 計算的跳轉地址有誤。
- 已加入預設選項
--no-apply-dynamic,以解決早期 Android 版本中的動態連結器錯誤。 dynamic_cast的 NDK r11 KI 不適用於 Clang。我們已修正 x86、stlport_static和最佳化功能的問題。- GDB
- 已更新至 GDB 7.11。詳情請參閱 GDB 新聞頁面。
- 修正了
ndk-gdb.py的一些錯誤。 - 已知問題
- x86 ASAN 仍無法正常運作。詳情請參閱這份變更清單中的討論內容。
c++_shared例外狀況展開仍不適用於 Android 2.3 (API 級別 9) 或 Android 4.0 (API 級別 14) 中的 ARM。- 即使有 android-24,但仍未公開適用於 Android 6.0 (API 級別 23) 和 Android 7.0 (API 級別 24) 的 Bionic 標頭和程式庫。 這些平台仍為 Android 5.0 (API 級別 21) 的標頭和程式庫 (並非 r11 中的迴歸)。
- RenderScript 工具不存在 (並非 r11 中的迴歸) (問題 7)。
- 這份變更記錄並未完整列出所有待處理的錯誤。
__thread 現應可實際運作。
Android NDK r12 (2016 年 6 月)
- 下載內容
- 這裡封存了此版本的下載內容。
- 公告事項
ndk-build指令預設會在即將推出的版本中使用 Clang。我們將在後續版本中移除 GCC。- 我們將在即將推出的版本中移除
make-standalone-toolchain.sh指令碼。如有使用這個指令碼,請盡早遷移至make_standalone_toolchain.py。 - NDK
- 已停止支援 armeabi-v7a-hard ABI。請參閱此說明文件中的說明。
- 已移除 Android 2.3 (API 等級 9) 之前平台層級的所有 sysroot。 我們在 NDK r11 中即已不再支援這些 sysroot,但實際上並未將其移除。
- 已更新在 ARM32 上使用 c++_shared 時的例外狀況處理功能,使大多數處理作業皆可正常運作 (請參閱已知問題)。展開程式現已連結至每個連結的物件,而不是 libc++ 本身。
- 已刪減預設編譯器標記 (NDK 問題 27)。您可以在變更 207721 中查看有關本次更新的詳細資料。
- 已在
build/tools/make_standalone_toolchain.py中新增獨立工具鏈的 Python 實作。在 Windows 中,您不再需要 Cygwin,亦可使用這項功能。請注意,我們將在日後推出的版本中移除 bash 變種版本,因此請立即測試新版本。 - 已設定 Clang 偵錯版本預設啟用
-fno-limit-debug-info選項。這項變更有助提升 LLDB 的偵錯能力。 - 將
--build-id設為預設選項。這個選項會使 ID 顯示在原生當機報告中,方便您輕鬆辨識正在執行的程式碼版本。 - 已修正
NDK_USE_CYGPATH問題,使其不再導致發生 libgcc 方面的問題 (問題 195486)。 - 預設啟用下列選項:
-Wl,--warn-shared-textrel和-Wl,--fatal-warnings。 如果您有分享的文字再定位,應用程式就無法在 Android 6.0 (API 級別 23) 以上版本中載入。請注意,64 位元應用程式一律無法使用這項設定。 - 已修正一些問題,以使先行編譯標頭發揮最佳效果 (NDK 問題 14、NDK 問題 16)。
- 已移除無法存取的 ARM (非縮圖) STL 程式庫。
- 已向 android-24 新增 Vulkan 支援。
- 已向 android-24 新增 Choreographer API。
- 已針對支援
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED或更高功能等級的裝置新增 libcamera2 API。 詳情請參閱CameraCharacteristics參考資料。 - Clang
- Clang 已更新為 3.8svn (r256229,版本 2812033)。32 位元 Windows 套件中的
clang.exe和clang++.exe執行檔實際上是 64 位元。32 位元執行檔的名稱為clang_32.exe。 - 已修正
__thread,使其可以實際運作。 - GCC
- 已將編譯器與 ChromeOS GCC @ google/gcc-4_9 r227810 同步。
- 從 ToT (r231296) 向後移植了涵蓋範圍掃毒修補程式。
- 已修正
libatomic,以避免使用 ifuncs (NDK 問題 31)。 - Binutils
- 已將「找到並修正了 Erratum 843419」資訊訊息設為靜音。
- 已加入選項
--long-plt,修正連結大型 arm32 二進位檔時出現的內部連接器錯誤。 - 已針對
AArch64修正錯誤的執行時間虛設常式。該錯誤會造成針對特大型動態共享物件 (DSO) 計算的跳轉地址有誤。 - 已加入預設選項
--no-apply-dynamic,以解決早期 Android 版本中的動態連結器錯誤。 - 修正 NDK r11 的已知問題,其中
dynamic_cast無法與 Clang、x86、stlport_static 和最佳化功能搭配使用。 - GDB
- 已更新至 GDB 7.11 版。如要進一步瞭解這個版本,請參閱 GDB 最新消息。
- 已修正
ndk-gdb.py指令碼中的一些錯誤。 - 已知問題
- x86 Address Sanitizer (ASAN) 目前無法正常運作。詳情請參閱問題 186276。
c++_shared例外狀況展開不適用於 Android 2.3 (API 級別 9) 或 Android 4.0 (API 級別 14) 中的 ARM。- 即使有 android-24,但仍未公開適用於 Android 6.0 (API 級別 23) 及以上版本的 Bionic 標頭和程式庫。 這些平台仍使用 Android 5.0 (API 級別 21) 標頭和程式庫,這一點與 NDK r11 一致。
- RenderScript 工具不存在,這一點與 NDK r11 一致 (NDK 問題 7)。
NdkCameraMetadataTags.h標頭檔案中意外列出了相機中繼資料標記列舉值ACAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP,該值將在下一個版本中移除。請改用ACAMERA_STATISTICS_LENS_SHADING_MAP值。
Android NDK r11c (2016 年 3 月)
Android NDK r11b (2016 年 3 月)
- NDK
- Clang
-
- Errata
- 與我們在 r11 版本資訊中回報的內容相反,
__thread無法運作。這是因為我們傳輸的 Clang 版本缺少針對模擬傳輸層安全標準 (TLS) 支援的錯誤修正。
Android NDK r11 (2016 年 3 月)
- Clang
-
- 重要公告
- 新增
- Clang 現已支援模擬傳輸層安全標準 (TLS)。
- 編譯器現在使用 pthread 執行緒專屬資料模擬 ELF TLS,以支援
__thread。 - C++11
thread_local在某些情況下適用,但不適用於含有重要解構函式的資料,因為這類情況下需要 libc 提供支援。在 Android 6.0 (API 級別 23) 或更新版本上執行時,這項限制不適用。 - 從共用程式庫存取 TLS 變數時,模擬 TLS 目前仍無法與 Aarch64 搭配使用。
- 編譯器現在使用 pthread 執行緒專屬資料模擬 ELF TLS,以支援
- Clang 現已支援模擬傳輸層安全標準 (TLS)。
- GCC
-
- 重要公告
- 現已淘汰 NDK 中的 GCC,改用 Clang。
- NDK 不會升級至 5.x,也不接受非關鍵向後移植。
- 我們會根據具體情況,對 4.9 版的誤編譯和內部編譯器錯誤進行維護。
- 移除
- 已移除 GCC 4.8。所有目標現在都採用 GCC 4.9。
- 其他變更
- 已將 google/gcc-4_9 同步到 r224707。google/gcc-4_9 之前已與 r214835 保持同步。
- NDK
-
- 重要公告
- NDK 套件中不再包含範例。 不過,您可以前往 GitHub 取得這些範例。
- NDK 套件中不再包含說明文件。 不過,您可以前往 Android 開發人員網站取得這些文件。
- 新增
- 已將原生追蹤 API 新增至
android-23。 - 已將原生多網路 API 新增至
android-23。 - 從 API 級別 21 開始,已啟用 libc、m 和 dl 以提供版本化符號。
- 已將 Vulkan 標頭和程式庫新增至 API 級別 N。
- 已將原生追蹤 API 新增至
- 移除
- 已停止支援
_WCHAR_IS_8BIT。 - 已移除 sed。
- 已移除 mclinker。
- 已移除 Perl。
- 已從所有版本的 NDK libc、m 和 dl 中移除這些程式庫的平台版本不支援的所有符號。
- 已移除對 mips64r2 的部分支援。其餘支援將於日後移除。
- 已停止支援
- 其他變更
- 已將 ARM 獨立工具鏈變更為預設使用 arm7。
- 只要將
-target選項指定為armv5te-linux-androideabi,即可還原舊行為。
- 只要將
- 已將建構系統變更為使用
-isystem加入平台。- bionic 所引發的警告將不再破壞應用程式建構作業。
- 已修正二進位檔透過 gabi++ 擲回例外狀況時發生的分段錯誤。(問題 179410)
- 已將 libc++ 的內嵌命名空間變更為
std::__ndk1,以免平台 libc++ 發生 ODR 問題。 - 所有 libc++ 程式庫現在都使用 libc++abi 進行建構。
- 已將預設的
APP_PLATFORM提升為 Gingerbread。- 預計日後推出的版本將不再支援 Froyo 和更舊版本。
- 已將 ARM 獨立工具鏈變更為預設使用 arm7。
- 已針對 64 位元更新 gabi++
_Unwind_Exception結構。 - 已在 cpufeatures 中新增下列功能:
- 偵測 SSE4.1 和 SSE4.2。
- 偵測 x86_64 上的 CPU 功能。
- 已將 libc++abi 更新為上游 r231075。
- 已從 ToT Bionic 更新
byteswap.h、endian.h、sys/procfs.h、sys/ucontext.h、sys/user.h和uchar.h。 - 已在所有 API 級別間同步
sys/cdefs.h。 - 已針對 arm 修正
fegetenv and fesetenv。 - 已針對 mips64 和 x86_64 修正
crtend_*的終點指標大小/對齊方式。
- 重要公告
- Binutils
-
- 新增
- 已新增選項:
--pic-veneer。
- 已新增選項:
- 移除
- 32 位元 Windows 套件中不再包含 ld.gold。您可以改為從 64 位元 Windows 套件取得 ld.gold。
- 變更
- 已統一 Android 和 ChromiumOS 之間的 binutils 來源。如要進一步瞭解這項變更,請查看這裡的註解。
- 已提高 aarch64 的 Gold 穩定性。請在連結時使用
-fuse-ld=gold,以便使用 Gold,而不是 bfd。 下一個版本可能會切換預設值。 - 已縮短 Gold ARM 後端大型二進位檔的連結時間 (若是可進行偵錯的 Chrome 瀏覽器,連結時間縮短幅度最多達 50%)。
- 新增
- GDB
-
- 移除
- 已移除 ndk-gdb,並改用 ndk-gdb.py。
- 變更
- gdb 已更新至 7.10 版。
- 已提升效能。
- 已提供更完善的錯誤訊息。
- 已修正相對專案路徑。
- 已阻止 Ctrl-C 終止背景執行的 gdbserver。
- 已改善 Windows 支援。
- 移除
Android NDK r10e (2015 年 5 月)
- 下載內容
- 這裡封存了此版本的下載內容。
- 重要變更:
-
- 已將 Cortex-A53 Erratum 843419 的解決方法整合至
aarch64-linux-android-4.9連接器。如要進一步瞭解這個解決方法,請參閱 cortex-a53 erratum 843419 適用的解決方法。 - 已新增 Clang 3.6;
NDK_TOOLCHAIN_VERSION=clang現在預設選擇該版本的 Clang。 - 已移除 Clang 3.4。
- 已移除 GCC 4.6。
- 已針對所有架構在
ld.gold中實作多執行緒支援。無論是否支援多執行緒,目前皆可連結;依照預設,不支援多執行緒。- 如要利用多個執行緒執行編譯作業,請使用
--threads選項。 - 若不利用多執行緒進行編譯,請使用
--no-threads選項。
- 如要利用多個執行緒執行編譯作業,請使用
- 已針對所有架構,將 GDB/gdbserver 升級至 7.7 版。
- 已移除 32 位元 Darwin 的 NDK 套件。
- 已將 Cortex-A53 Erratum 843419 的解決方法整合至
- 重要錯誤修正:
-
- 已修正因主執行緒外 OpenMP 迴圈所引發的當機問題。
- 已修正以下情況下發生的 GCC 4.9 內部編譯器錯誤 (ICE):使用者宣告了
#pragma GCC optimize ("O0"),但在指令列上指定了不同的最佳化等級。優先採用pragma。 - 已修正過去經常導致系統當機並包含下列錯誤訊息的錯誤:
in add_stores, at var-tracking.c:6000
- 已導入以下 Clang 3.5 問題的解決方法:LLVM 自動向量會產生
llvm.cttz.v2i64(),該指令在 ARM 指令集中沒有對應項目。
- 其他錯誤修正:
-
- 修正以下標頭和程式庫:
- 已修正
media/NdkMediaDrm.h中的PROPERTY_*。 - 已修正
mips64的sys/ucontext.h。 - 已捨棄針對
__builtin_isnan和__builtin_isinf的 Clang 版本檢查。 - 已新增
android-21/arch-mips/usr/include/asm/reg.h和android-21/arch-mips64/usr/include/asm/reg.h。 - 已修正 GCC 4.9 針對 x86 產生的陣列邊界錯誤警告,並已重新啟用 GCC 4.9 針對 ARM 產生的陣列邊界警告。針對 ARM 的警告先前已無條件停用。
- 已修正
mips和mips64的 Clang 3.5 以建立可寫入的.gcc_except_table區段,以便比對 GCC 行為。這項變更可避免收到下列有關連結器的警告:.../ld: warning: creating a DT_TEXTREL in a shared object
- 針對在 Clang 為
mips64執行編譯作業時引發當機的compiler-rt問題,已向後移植修正。詳情請參閱 LLVM 問題 20098。 - 已修正非 ASCII 註解中發生的 Clang 3.5 當機問題。(問題 81440)
- 已修正
stlport collate::compare,傳回-1和1。這個程式碼先前會傳回任意帶符號數。 - 已修正 64 位元 ABI 的
ndk-gdb。(問題 118300) - 已修正 RenderScript 的 HelloComputeNDK 範例在 Android 4.4 (Android API 級別 19) 上產生的當機問題。如需更多資訊,請參閱這個頁面。
- 已修正 GCC 的
libc++ __wrap_iter。詳情請參閱 LLVM 問題 22355。 - 已修正對 ABI
x86_64的.asm支援。 - 已針對 GCC 4.8
stlport問題實行解決方法。(問題 127773) - 已移除 Windows 中專案路徑的結尾目錄分隔符
\\(問題 160584)。 - 已修正從
gradle執行ndk-build.cmd指令編譯單一.c檔案時發生的no rule to make target錯誤。(問題 66937) - 已新增下列主機工具鏈中缺少的
libatomic.a和libgomp.a程式庫:aarch64-linux-android-4.9mips64el-linux-android-4.9mipsel-linux-android-4.9x86_64-4.9
- 其他變更:
-
- 已為
aarch64新增ld.gold。預設連結器仍為ld.bfd。 如要顯式啟用ld.gold,請將-fuse-ld=gold加入LOCAL_LDFLAGS或APP_LDFLAGS變數。 - 使用
binutils-2.25建構 MIPS 和 MIPS64 工具鏈,提供更完善的 R6 支援。 - 已將
-fstandalone-debug(完整偵錯資訊) 設為 Clang 的預設選項。 - 已針對 GCC 4.9、Clang 3.5 和 Clang 3.6 的 ARM、AArch64、X86 和 X86_64 工具鏈,將
-fstack-protector替換為-fstack-protector-strong。 - 已將
--package指令列切換鈕新增至ndk-gdb,允許建構系統覆寫套件名稱。(問題 56189) - 已淘汰適用於 MIPS 的
-mno-ldc1-stc1。這個選項可能無法與新的-fpxx和-mno-odd-spreg選項或是 FPXX ABI 搭配使用。 - 已將 MIPS MSA 和 R6 偵測新增至
cpu-features。
- 已為
Android NDK r10d (2014 年 12 月)
- 重要變更:
-
- 已將 GCC 4.8 設定為所有 32 位元 ABI 的預設 GCC。已淘汰 GCC 4.6,並會在下一個版本中將其移除。如要還原先前的行為,請將
NDK_TOOLCHAIN_VERSION=4.6新增至 ndk-build,或在指令列中執行make-standalone-toolchain.sh時新增--toolchain=arm-linux-androideabi-4.6。GCC 4.9 仍是 64 位元 ABI 的預設 GCC。 - 已預設停止讓所有 x86[_64] 工具鏈新增
-mstackrealign。NDK 工具鏈會假設進行 16 位元組堆疊對齊。預設使用的工具和選項會強制執行這項規則。使用者編寫組合程式碼時必須保持堆疊對齊,並確保其他編譯器也符合這項規則。 (GCC 錯誤 38496) - 已針對 ARM 和 x86 ABI 的 Clang 3.5 支援新增 Address Sanitizer 功能。 如要進一步瞭解這項變更,請參閱 Address Sanitizer 專案。
- 從 API 級別 21 開始,已加入在建構時使用
-fPIE -pie的要求。在 API 級別 16 及以上級別中,ndk-build 會在建構時使用PIE。這項變更將產生許多影響,詳情請參閱開發人員預覽版問題 888 中的討論資訊。 這些影響並不適用於共用程式庫。
- 已將 GCC 4.8 設定為所有 32 位元 ABI 的預設 GCC。已淘汰 GCC 4.6,並會在下一個版本中將其移除。如要還原先前的行為,請將
- 重要錯誤修正:
-
- 針對 aarch64-linux-android-4.9 連接器中的 A53 Errata #835769 進行更多相關修正。其中,當指定
-mfix-cortex-a53-835769(預設已啟用) 時,GCC 會傳送新選項--fix-cortex-a53-835769。 詳情請參閱這篇 binutils 訊息和這篇 binutils 訊息。 - 已記錄針對 API 級別 21 中發生的 libc++
sscanf/vsscanf懸掛問題進行的修正。這個修正本身已在 r10c 中實作 (問題 77988)。 - 已修正指定
-Os時,GCC 4.9 發生 AutoFDO (-fauto-profile) 當機的問題。(問題 77571)
- 針對 aarch64-linux-android-4.9 連接器中的 A53 Errata #835769 進行更多相關修正。其中,當指定
- 其他錯誤修正:
-
- 修正以下標頭和程式庫:
- 已將
posix_memalign新增至 API 級別 16。此外,已將stdlib.h中的原型新增至 API 級別 16 到 19 (問題 77861)。 - 已修正
stdatomic.h,使其只針對 C++11 加入<atomic>。 - 已修改以下標頭以供獨立使用:
sys/user.h以及針對 API 級別 21 的gl2ext.h、dlext.h、fts.h、sgidefs.h。 - 已修改
sys/user.h,將mxcsr_mask重新命名為mxcr_mask,以及將u_ar0的資料類型 從 - 已將
sysconf()傳回值類型從int變更為long。 - 已修正 ndk-build 對
LOCAL_ARM_MODE的thumb處理方式:在 r10d 中,除非符合下列任一條件,否則 ndk-build 會預設新增LOCAL_LDFLAGS+=-mthumb: - 您已將
LOCAL_ARM_MODE設定為等於arm。 - 您正在 (透過包含
android:debuggable="true"的APP_OPTIM=debug和AndroidManifest.xml等設定) 建構偵錯版本,其中 ARM 模式為預設模式,以便與先前的工具鏈保持相容 (問題 74040)。 - 已修正 ndk-build 中的
LOCAL_SRC_FILES,以便使用 Windows 絕對路徑。 (問題 74333) - 已從 ndk-gdb 中移除 bash 專屬程式碼 (問題 73338)。
- 從
make-standalone-toolchain.sh中移除 bash 專屬程式碼。 (問題 74145) - 已修訂與
System.loadLibrary()遞移依附元件修正有關的說明文件 (問題 41790)。 - 已修正導致 64 位元套件無法在 Ubuntu 14.04 和 OS X 10.10 (Yosemite) 上解壓縮的問題。(問題 78148)
- 已修正
LOCAL_PCH問題,提升 Clang 支援功能 (問題 77575)。 - 已清楚說明 ld.gold 發出的「requires executable stack」警告 (問題 79115)
unsigned long變更為 struct user_regs_struct*。
Android NDK r10c (2014 年 10 月)
- 重要變更:
-
- 針對下載結構進行了下列變更:
- 每個套件現在皆包含適用於其各自平台的 32 位元和 64 位元標頭、程式庫和工具。
- 現在,不須單獨下載含有偵錯資訊的 STL 程式庫。
- 已將先前稱為「
Android-L」的所有內容變更為正式版本名稱:android-21。 - 透過重定基底到 GCC 存放區的
google分支版本以更新 GCC 4.9。與 GCC 4.9 上游版本的主要差異包括: -O2選項現在會開啟向量化,不會進行循環剝離,但會以較為積極的方式展開。- 已增強 FDO 和 LIPO
- 已為所有主機新增 Clang 3.5 支援:
NDK_TOOLCHAIN_VERSION=clang現在會選擇 Clang 3.5。請注意: - ARM 和 x86 預設使用整合式編譯器。如果這會造成問題,請使用
-fno-integrated-as做為解決方法。 - Clang 3.5 會針對未使用的標記 (例如 GCC 支援的
-finline-functions選項) 發出更多警告。 - 在使用 ART 做為虛擬機器的 Android 5.0 裝置上進行偵錯時,可以透過指定輸入
art-on選項進入 ART 偵錯模式。詳情請參閱 NDK 所屬目錄中的prebuilt/common/gdb/common.setup。 - 已停止支援 Clang 3.3。
- 已淘汰 GCC 4.6,並可能會從日後發布的版本中將其移除。
- 將 mclinker 更新至支援相同程式碼折疊 (「ICF」) 的 2.8 版本。使用
--icf選項指定 ICF。 - 已擴大 x86 和 x86_64 中的
arm_neon.h支援,涵蓋約 93% 的 NEON 內建函式。如要進一步瞭解 NEON 支援服務,請執行下列動作:- 前往「NDK 程式設計師指南」(
docs/Programmers_Guide/html/),然後進入「架構與 CPU」>「Neon」查看相關資訊。 - 查看
samples/中已更新的hello-neon範例。 - 請參閱 Intel 指南,瞭解如何從 ARM NEON 移植到 Intel SSE。
- 前往「NDK 程式設計師指南」(
- 已記錄針對
headers/libs/android-21中_FORTIFY_SOURCE的支援,r10 中 (這時android-21仍稱為Android-L) 已存在這個程式碼,但沒有任何相關說明文件。
詳情請參閱下方的「重要錯誤修正」。
從使用 GCC 的專案進行遷移時,您可以使用
-Wno-invalid-command-line-argument和-Wno-unused-command-line-argument忽略未使用的標記,直到能夠決定這些標記的後續用途再進行處理。 - 重要錯誤修正:
-
- 已修正 GCC4.9/aarch64 的內部編譯器錯誤,這個錯誤會導致顯示下列錯誤訊息 (問題 77564):
- 已修正 GCC4.9/arm 產生錯誤程式碼的問題 (問題 77567)。
- 已修正 GCC4.9/mips 的內部編譯器錯誤,這個錯誤與內嵌組件有關 (問題 77568)。
- 已修正 GCC4.9/arm 針對
x = (cond) ? y : x產生錯誤程式碼的問題。 (問題 77569) - 已修正 GCC4.9/aarch64 和 Clang3.5/aarch64,並將其做為 Cortex-A53 erratum (835769) 問題的預設解決方法。您可以透過指定
-mno-fix-cortex-a53-835769停用這個解決方法。
internal compiler error: in simplify_const_unary_operation, at simplify-rtx.c:1539
- 其他錯誤修正:
-
- 已針對
android-21進行下列標頭和程式庫修正:- 已新增更多電視按鍵碼:
android/keycodes.h - 已向
android/sensor.h新增更多常數和六個新的感應器函式:ASensorManager_getDefaultSensorEx、ASensor_getFifoMaxEventCount、ASensor_getFifoReservedEventCount、ASensor_getStringType、ASensor_getReportingMode以及ASensor_isWakeUpSensor。 - 已修正
stdatomic.h,藉此提升與 GCC 4.6 的相容性,並支援<atomic>標頭。 - 已將
sys/ucontext.h和sys/user.h新增至所有 API 級別。signal.h標頭現在包含<sys/ucontext.h>。您可以移除struct ucontext現有的任何定義。 - 已將
posix_memalign新增至 API 級別 17、18 和 19。 - 已將下列函式新增至所有架構:
android_set_abort_message、posix_fadvise、posix_fadvise64、pthread_gettid_np。 - 已將必要權限新增至
native-media/AndroidManifest.xml範例 (問題 106640)。 - 已將
clock_nanosleep和clock_settime新增至 API 級別 21。(問題 77372) - 已從所有架構中移除下列符號:
get_malloc_leak_info、free_malloc_leak_info、__srget、__swbuf、__srefill、__swsetup、__sdidinit、__sflags、__sfp、__sinit、__smakebuf、__sflush、__sread、__swrite、__sseek、__sclose、_fwalk、__sglue、__get_thread、__wait4、__futex_wake、__open、__get_tls、__getdents64以及dlmalloc。 - 已從 64 位元架構中移除下列函式:
basename_r、dirname_r、__isthreaded、_flush_cache(mips64)。 - 將下列函式從 32 位元架構中移除:
__signalfd4。 - 已將下列函式中的第三個引數類型從
size_t變更為int:strtoll_l、strtoull_l、wcstoll_l和wcstoull_l。 - 已將下列函式還原至 64 位元架構:
arc4random、arc4random_buf和arc4random_uniform。 - 已將
cxa_*以及new和delete運算子移回libstdc++.so。這項變更會還原 r9d 行為;之前的 r10 版本中包含預留位置檔案。
- 已新增更多電視按鍵碼:
- 已在 GCC 4.8 和 4.9 中還原對 mips 的 MXU 支援。r10 和 r10b 已不再提供這項支援,因為這些版本的 GCC 是使用不支援 MXU 的 binutils-2.24 編譯而成。不過,現在已經支援 MXU 了。
- 已修正
make-standalone-toolchain.sh中的--toolchain=,現在可以正確支援使用指定 Clang 版本的字尾。 - 已修正 libc++/armeabi
strtod()函式。 - 已修正
docs/中的 NDK 說明文件。
- 已針對
- 其他變更:
-
- 已增強
cpu-features,以便偵測針對下列指令集的 ARMv8 支援:AES、CRC32、SHA2、SHA1 和 64 位元 PMULL/PMULL2。(問題 106360) - 已修改 ndk-build,以便使用
*-gcc-ar,而這個程式碼可以在 GCC 4.8、GCC 4.9 和 Clang 中使用。Clang 會指定這個程式碼,而不是*-ar。這項設定將會改善 LTO 支援。 - 已從 GCC 編譯器中移除
include-fixed/linux/a.out.h和include-fixed/linux/compiler.h標頭。 (問題 73728) - 已修正在 Mac OS X 上使用 GCC 4.8 時發生的
-flto相關問題。錯誤訊息如下: - 已修正
build-binary.mk.中的錯字 (問題 76992)
.../ld: error: .../libexec/gcc/arm-linux-androideabi/4.9/liblto_plugin.so Symbol not found: _environ
- 已增強
- 重要已知問題:
-
- 在 GCC4.9 中指定 -Os (
-fauto-profile) 可能會導致當機。 (問題 77571)
- 在 GCC4.9 中指定 -Os (
Android NDK r10b (2014 年 9 月)
- 重要事項:
-
- 由於可下載套件設有 512 MB 大小限制,因此下列 32 位元項目不包含在 32 位元 NDK 下載套件中,而是包含在 64 位元下載套件中:
- Android-L 標頭
- GCC 4.9
- 目前,NDK 提供的唯一 Renderscript 支援適用於 32 位元 Renderscript 與 Android 4.4 (API 級別 19) 組合。您無法透過任何其他的 Renderscript (32 位元或 64 位元) 與 Android 版本組合建構 HelloComputeNDK (唯一 Renderscript 範例)。
- 如要編譯 native-codec,您必須使用 64 位元 NDK 套件,當中包含所有 Android-L 標頭。
- 重要錯誤修正:
- 其他錯誤修正:
-
- 已從所有版本的 GCC 的
include-fixed/目錄中移除stdio.h。(問題 73728。) - 已從
platforms/android-L/arch-*/usr/include/linux/netfilter*/目錄中的 Windows 套件中移除重複的標頭檔案。(問題 73704。) - 已修正導致 Clang 建構 HelloComputeNDK 的問題。
- 已修正 atexit (問題 66595)。
- 已針對
docs/和sources/third_party/googletest/README.NDK中的文件進行多項修正 (問題 74069)。 - 已針對 Android-L 標頭進行下列修正:
- 已將下列函式新增至
ctype.h和wchar.h:dn_expand()、grantpt()、inet_nsap_addr()、inet_nsap_ntoa()、insque()、nsdispatch()、posix_openpt()、__pthread_cleanup_pop()、__pthread_cleanup_push()、remque()、setfsgid()、setfsuid()、splice()、tee()、twalk()(問題 73719) 以及 42 個*_l()函式。 - 「
cmsg_nxthdr」已重新命名為「__cmsg_nxthdr」。 - 已移除
__libc_malloc_dispatch。 - 已將
ptrace()原型變更為long ptrace(int, ...);。 - 已移除
sha1.h。 - 已延長
android/dlext.h中的android_dlextinfo。 - 已針對
stdlib.h、time.h、wchar.h和complex.h中接收或傳回浮點型或雙精度類型值的函式,為__NDK_FPABI__加上註解。
- 已從所有版本的 GCC 的
- 其他變更:
-
- 已更新
mipsel-linux-android-4.9和mips64el-linux-android-4.9,實作新的 multilib 目錄版面配置,並支援 gdb-7.7 - 已增強
cpu-features功能,以便偵測更多 arm64 功能。(變更清單 100339。)
- 已更新
Android NDK r10 (2014 年 7 月)
- 重要變更:
-
- 已新增 3 個新的 ABI (皆為 64 位元):arm64-v8a、x86_64、mips64。 請注意:
- GCC 4.9 是 64 位元 ABI 的預設編譯器。Clang 目前為 3.4 版。
NDK_TOOLCHAIN_VERSION=clang可能不支援 arm64-v8a 和 mips64。 - Android-L 是第一個支援 64 位元的級別。請注意,這個 API 級別是一個暫時的級別,僅適用於 L 預覽版。在 L 版本中,我們會將其更換為實際的 API 級別號碼。
- 這個版本現在包含
APP_ABI的all32和all64設定。APP_ABI=all32相當於APP_ABI=armeabi,armeabi-v7a,x86,mips。APP_ABI=all64相當於APP_ABI=arm64-v8a,x86_64,mips64。APP_ABI=all會選取所有 ABI。
- Android-L 中的新 GNU libstdc++ 包含以下所有
<tr1/cmath>。在定義您自己的數學函式之前,請先檢查_GLIBCXX_USE_C99_MATH_TR1中是否已存在名稱相同的函式,避免連結器發生「多重定義」錯誤。 - 已更新 ARMv8 核心的 cpu-features 程式庫。現有的 cpu-features 程式庫可能無法偵測 ARMv8 平台上是否存在 NEON。使用新版本重新編譯程式碼。
- 已新增
platforms/android-L/API 目錄。這項方案的內容包括: - 已更新 Bionic 標頭,但尚未從 Android API 級別 3 (Cupcake) 變更為 19 (KitKat)。這個 L 級別新版本將與 Android 開放原始碼計畫保持同步。
- 新的媒體 API 和 native-codec 範例。
- 已更新 SLES/OpenSLES 的
Android.h標頭,以利 AudioPlayer 支援單精度浮點音訊格式。 - 針對
libGLESv3.so.的 GLES 3.1 和 AEP 副檔名 - GLES2 和 GLES3 標頭已更新至最新的官方 Khronos 版本。
- 將 GCC 4.9 編譯器新增至 32 位元/64 位元 ABI。如前所述,GCC 4.9 是 64 位元 ABI 的預設 (唯一) 編譯器。對於 32 位元 ABI,您必須明確啟用 GCC 4.9,因為 GCC 4.6 仍是預設編譯器。
- 針對 ndk-build,只要將
NDK_TOOLCHAIN_VERSION=4.9新增至Application.mk,或從指令列將其匯出為環境變數,即可啟用 32 位元 GCC 4.9 建構功能。 - 針對獨立工具鏈,請使用
make-standalone-toolchain.sh指令碼中的--toolchain=選項。例如:--toolchain=arm-linux-androideabi-4.9. - 在 GCC 4.8/4.9 和 x86* 中,將 GDB 升級至 7.6 版。由於 GCC 4.6 中的 GDB 版本仍為 GDB-7.3.x (ARM 和 MIPS 的預設版本),您必須設定
NDK_TOOLCHAIN_VERSION=4.8或4.9,以使 ndk-gdb 選取 GDB 7.6。 - 已新增提供 SSSE3 支援的
-mssse3建構選項,並將其設為 ABI x86 的預設選項 (從 SSE3 升級)。Google 發布的映像檔不包含 SSSE3 操作說明。 - 已將 GCC 4.8 更新為 4.8.3。
- 已透過從 gabi++ 切換為 libc++abi,改善 ARM libc++ EH 支援。詳情請參閱說明文件的「C++ 支援」部分。請注意:
- Clang 3.4 和 GCC 4.8 現在會通過除語言代碼以外的所有測試。詳情請參閱說明文件中的「C++ 支援」部分。
- X86 和 MIPS libc++ 的 libc++ 程式庫仍使用 gabi++。
- GCC 4.7 以上版本現在可以使用 <atomic>。
- 如果使用
<list>,則必須新增-fno-strict-aliasing,因為__list_imp::_end_ 會違反 TBAA 規則。(問題 61571。) - 自 GCC 4.6 起,LIBCXX_FORCE_REBUILD:=true 不會再重新建構 libc++。如要重新建構,您必須使用其他編譯器。請注意,Clang 3.3 未經測試。
- mclinker 現在是 2.7 版,並且提供 aarch64 Linux 支援。
- 已針對
LOCAL_PCH指定的標頭新增先行編譯標頭。(問題 25412)。
- 重要錯誤修正:
-
- 已修正 libc++,因此現在可以編譯
std::feof等 (問題 66668)。 - 已修正 Clang 3.3/3.4 atomic 程式庫呼叫,這類呼叫會導致某些 ABI armeabi libc++ 測試發生當機。
- 已修正 Clang 3.4 在讀取先行編譯標頭時發生當機的問題。(問題 66657)。
- 已針對以下方面修正 Clang 3.3/3.4
-O3宣告: - 已修正下列 Clang 3.3/3.4 當機問題:
llvm-3.2/llvm/include/llvm/MDBuilder.h:64: llvm::MDNode* llvm::MDBuilder::createBranchWeights(llvm::ArrayRef(問題 57381)。): Assertion Weights.size() >= 2 && "Need at least two branch weights!" Assertion failed: (!Fn && "cast failed but able to resolve overload expression!!"), function CheckCXXCStyleCast, file Volumes/data/ndk-toolchain/src/llvm-3.3/llvm/tools/clang/lib/Sema/SemaCast.cpp, line 2018. (問題 66950)。 - 已修正 libc++,因此現在可以編譯
- 其他錯誤修正:
-
- 已修正標頭:
- 已將 32 位元
ssize_t修正為int,而不是long int。 - 已修正
WCHAR_MIN和WCHAR_MAX,以便依據執行這些程式碼的架構使用適當符號: - X86/MIPS:有符號。
- ARM:無符號。
- 如要強制 X86/MIPS 預設為無符號,請使用
-D__WCHAR_UNSIGNED__。 - 如要強制
wchar_t為 16 位元,請使用-fshort-wchar。 - 已從 32 位元
libc.so中移除不存在的符號,並已新增適用於 Android API 級別 12 以上級別的pread64、pwrite64和ftruncate64(問題 69319)。詳情請參閱 Android 開放原始碼計畫變更清單 94137 中的相關修訂訊息。 - 已修正有關重新定義
putchar的 GCC 警告。警告訊息如下所示: - 已修正
make-standalone-toolchain.sh --stl=libc++,使其可以: - 已修正 GCC/Windows,以便只在需要在外部程式中產生程序時才能引用引數。這項變更可降低超過 32K 長度限制的可能性。
- 已修正無法調整
APP_PLATFORM環境變數的問題。 - 已修正 crazy_linker 中
IsSystemLibrary()的實作方式,使其使用strrchr()(而不是strchr()) 找出程式庫路徑的實際基本名。 - 已修正 native-audio 無法在偵錯模式下進行建構的問題。
- 已修正 gdb 無法輸出極端浮點數的問題 (問題 69203)。
- 已修正 Clang 3.4 無法使用
-Wl,-shared(而非無編譯問題的-shared) 進行編譯的問題。問題在於,如果-shared和-static都不存在,Clang 便會為 Android 目標新增-pie。這個行為是不正確的,將導致連結器指出-shared和-pie無法同時存在。
include/stdio.h:236:5: warning: conflicts with previous declaration here [-Wattributes] int putchar(int);(變更清單 91185)。 - 其他變更:
-
- 已將
arm_neon.h新增至 x86 工具鏈,現在這個工具鏈可模擬約 47% 的 Neon。目前不支援 64 位元類型。詳情請參閱 x86 說明文件中的「ARM Neon 內建函式支援」部分。 - 已將 ARM/GOT_PREL 最佳化設定 (出現在從 GCC google 分支版本中建構的 GCC 4.6 中) 移植到 ARM GCC 4.8/4.9。在存取全域變數時,這項最佳化作業有時會減少指令數量。如需範例,請參閱
$NDK/tests/build/b14811006-GOT_PREL-optimization/中的 build.sh 指令碼。 - 已新增 STL gabi++、stlport 和 libc++ 的 ARM 版本。現在這些同時具有 ARM 模式和 Thumb 模式。
- 您現在可以使用
--toolchain=x86_64-linux-android-4.9(相當於--toolchain=x86_64-4.9) 呼叫 make-standalone-toolchain.sh 指令碼。
- 已將
Android NDK r9d (2014 年 3 月)
- 重要變更:
-
- 已新增 Clang 3.4 編譯器的支援。
NDK_TOOLCHAIN_VERSION=clang選項現在會選擇 Clang 3.4。GCC 4.6 目前仍是預設編譯器。 - 已新增
APP_ABI=armeabi-v7a-hard,並提供額外的 multilib 選項-mfloat-abi=hard。這些選項可搭配 ARM GCC 4.6/4.8 和 Clang 3.3/3.4 (使用 4.8 版本的組合器、連結器和 libs) 使用。使用這些選項時,請注意下列變更: - 執行
ndk-build指令碼時,請為 apeabi-v7a 目標新增以下選項: 已建構的程式庫將複製到TARGET_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1 TARGET_LDFLAGS += -Wl,--no-warn-mismatch -lm_hard
libs/armeabi-v7a。為了使 make 的行為符合預期,不得將armeabi-v7a和armeabi-v7a-hard同時指定為 make 目標 (即為,在 APP_ABI= 行上指定)。 這種做法會造成系統忽略其中一項。請注意,APP_ABI=all仍相當於armeabi armeabi-v7a x86 mips。 make-standalone-toolchain.sh指令碼會複製/hard目錄中的其他程式庫。已將上述CFLAGS和LFLAGS新增至 makefile,使 GCC 或 Clang 能夠連結到/hard中的程式庫。- 已新增 yasm 組合器,以及適用於 x86 目標的
LOCAL_ASMFLAGS和EXPORT_ASMFLAGS標記。ndk-build指令碼會使用prebuilts/*/bin/yasm*建構具有.asm副檔名的LOCAL_SRC_FILES。 - 已將 MClinker 更新為 2.6.0,而這個版本已新增
-gc-sections支援。 - 已新增實驗性 libc++ 支援功能 (上游 r201101)。如要使用這項新功能,請按照下列步驟操作:
- 在
Application.mk中新增APP_STL := c++_static或APP_STL := c++_shared。 您可以透過LIBCXX_FORCE_REBUILD := true從來源進行重新建構 - 執行
make-standalone-toolchain.sh --stl=libc++,使用 libc++ headers/lib 建立獨立工具鏈。
CPLUSPLUS-SUPPORT.html。 (問題 36496) - 在
- 已新增 Clang 3.4 編譯器的支援。
- 重要錯誤修正:
-
- 已修正 GCC 4.6/4.8 ARM EABI 非預期例外狀況處理常式擲回的未捕獲問題。(GCC 問題 59392)
- 已修正 GCC 4.8,現在可以針對包含依附元件、非類型範本引數的範本正確解析局部特化。(GCC 問題 59052)
- 已向先行建構的 Python 新增更多模組 (問題 59902):
- Mac OS X:
zlib、bz2、_curses、_curses_panel、_hashlib、_ssl - Linux:
zlib、nis、crypt、_curses和_curses_panel
- Mac OS X:
- 已修正 x86 和 MIPS gdbserver
event_getmsg_helper。 - 已修正 RenderScript NDK 工具鏈中的許多問題,包括舊裝置的相容性問題和 C++ 反射問題。
- 其他錯誤修正:
-
- 標頭修正:
- 已針對 Android API 13 以上級別修正
android/asset_manager.h中缺少#include <sys/types.h>的問題 (問題 64988) - 已針對 Android API 14 以上級別修正
android/rect_manager.h中缺少#include的問題。 - 已將
JNICALL新增至jni.h中的JNI_OnLoad和JNI_OnUnload。請注意,JNICALL定義為__NDK_FPABI__。詳情請參閱sys/cdefs.h。 - 已更新下列標頭,現在無須手動加入其依附元件即可加入這些標頭 (問題 64679):
- 已為所有架構新增
sys/cachectl.h。MIPS 開發人員現可加入這個標頭,而且不用編寫#ifdef __mips__。 - 已修正
platforms/android-18/include/android/input.h,方法是將__NDK_FPABI__新增至接受或傳回浮點值/雙精度值的函式。 - 已修正 MIPS
struct stat,之前針對 Android 級別 12 及以上級別將其錯誤地設為 64 位元版本的對應設定。這項錯誤設定是在版本 r9c 中加入的迴歸。 - 已針對 Android API 級別 9 及以下級別定義
__PTHREAD_MUTEX_INIT_VALUE、__PTHREAD_RECURSIVE_MUTEX_INIT_VALUE和__PTHREAD_ERRORCHECK_MUTEX_INIT_VALUE。 - 已針對 API 18 及以上級別將
scalbln、scalblnf和scalblnl新增至 x86libm.so。 - 已修正
sources/android/support/include/iconv.h中的錯字。 (問題 63806)
android/tts.h EGL/eglext.h fts.h GLES/glext.h GLES2/gl2ext.h OMXAL/OpenMAXSL_Android.h SLES/OpenSLES_Android.h sys/prctl.h sys/utime.h
- 已針對 Android API 13 以上級別修正
- 已修正呼叫
std::terminate()使用的 gabi++std::unexpected(),以便使用者定義的std::terminate()處理常式有機會執行呼叫。 - 已修正用於擷取
std::nullptr的 gabi++。 - 已修正 Teapot 和 MoreTeapots 範例:
- 透過變更鏡面反射變數以使用中等精確度,已順暢解決 Tegra 2 和 3 晶片問題。鏡片反射強度值現在可以小於 1.0。
- 已變更範例,因此按下音量鍵即可還原沉浸模式,並使
SYSTEM_UI_FLAG_IMMERSIVE_STICKY失效。螢幕旋轉不會觸發onSystemUiVisibilityChange,因此不會還原沈浸模式。
- 已修正
ndk-build指令碼以便新增-rpath-link=$SYSROOT/usr/lib和-rpath-link=$TARGET_OUT,進而使用ld.bfd連結執行檔。(問題 64266) - 已從所有 STL 版本中移除
-Bsymbolic。 - 已透過將
SHELL設為環境變數 (而非傳送至忽略這項設定的python.exe) 以修正ndk-gdb-py.cmd。 (問題 63054) - 已修正
make-standalone-toolchain.sh指令碼,使--stl=stlport選項複製 gabi++ 標頭而非對其執行符號連結;cmd.exe和 MinGW 殼層無法解讀 cygwin 建立的符號連結。
- 標頭修正:
- 其他變更:
-
- 已為先前僅供用於
cmd.exe殼層中的所有*cmd指令碼套用執行權限,以防開發人員偏好在 cygwin 中使用ndk-build.cmd,而非建議的ndk-build指令碼。 - 針對指定到達目錄不存在的情況,已透過移動 (而非複製) 加快
make-standalone-toolchain.sh指令碼的速度。
- 已為先前僅供用於
Android NDK r9c (2013 年 12 月)
這是一個僅修正錯誤的版本。
- 重要錯誤修正:
-
- 已修正 GCC 4.8 ARM 中太早還原堆疊指標的問題。這個問題會阻止頁框指標穩定存取堆疊框架中的變數。(GCC 問題 58854)
- 已修正有關 GCC 4.8 libstdc++ 的問題:std::nth_element 中的錯誤導致系統產生程式碼時發生隨機分段錯誤 (問題 62910)。
- 已使用
-fuse-ld=mcld修正 cc1/cc1plus 中的 GCC 4.8 ICE,以確保不再發生下列錯誤:cc1: internal compiler error: in common_handle_option, at opts.c:1774
- 已修正針對
__builtin數學函式的-mhard-float支援。如需持續瞭解使用 STL 修正-mhard-float的相關資訊,請追蹤問題 61784。
- 其他錯誤修正:
-
- 標頭修正:
- 已將
poll.h中的poll原型變更為poll(struct pollfd *, nfds_t, int);。 - 已針對 Android API 級別 12 和 19,將
utimensat新增至libc.so。現在,所有 Android API 級別 12 至 19 皆包含這些程式庫。 - 已針對 Android API 級別 19,將
futimens加入libc.so。 - 已針對 Android API 級別 8 及以上級別,將缺少的
clock_settime()和clock_nanosleep()新增至time.h。 - 已在
time.h.中新增CLOCK_MONOTONIC_RAW, CLOCK_REALTIME_COARSE, CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME, CLOCK_REALTIME_ALARM,和CLOCK_BOOTTIME_ALARM - 已移除過時的
CLOCK_REALTIME_HR和CLOCK_MONOTONIC_HR.
- 已將
- 在 Teapot、MoreTeapots 和
source/android/ndk_helper範例中:- 已更改這些程式碼,使其針對 armeabi-v7a 使用硬浮點 abi。
- 已更新應用程式,以便在 Android API 級別 19 及以上級別中使用使用沈浸模式。
- 已修正
/system/lib/libdvm.so中的一個Check_ReleaseStringUTFChars問題,這個問題會造成 x86 裝置當機。
- 已修正透過符號連結參照 NDK 套件時,cygwin 中發生的
ndk-build失敗問題。 - 已修正以下問題:當
LOCAL_SRC_FILES包含絕對路徑時,Windowscmd.exe中發生ndk-build.cmd失敗 (問題 69992)。 - 已修正
ndk-stack指令碼,現在即使因為找不到日常安排、檔案名稱或行號而無法剖析頁框,這個指令碼亦可繼續執行。無論哪種情況都會輸出??。 - 已修正 windows-x64_64 目標的
ndk-stack堆疊,使其不再錯將頁框行與stack:區段中不含pc、eip或ip的行進行比對。例如:I/DEBUG ( 1151): #00 5f09db68 401f01c4 /system/lib/libc.so
- 已修正 gabi++,以使其:
- 不使用 Malloc() 來分配 C++ 執行緒本機物件。
- 在 userdebug/eng Android 平台建構作業中的 libc.debug.malloc 為非零值時,避免 gabi++ 中出現死結情形。
- 標頭修正:
- 其他變更:
-
- 已新增
LOCAL_EXPORT_LDFLAGS。 - 已引入
NDK_PROJECT_PATH=null設定,以便用於將選項明確傳送至ndk-build的整合式建構系統。使用這項設定時,ndk-build不會嘗試尋找NDK_PROJECT_PATH.。這項設定也會阻止變數從 NDK_PROJECT_PATH 衍生預設設定。因此,現在必須明確指定下列變數 (及相關預設變數,如有):NDK_OUT, NDK_LIBS_OUT, APP_BUILD_SCRIPT, NDK_DEBUG(非必要,預設為 0),以及Application.mk中包含的其他APP_*。 - 現在可使用以逗號分隔的清單列舉
APP_ABI。例如:APP_ABI := "armeabi,armeabi-v7a"
- 可以透過使用
-g選項,使用非必要單獨套件android-ndk-r9c-cxx-stl-libs-with-debugging-info.zip中的偵錯資訊重新建構所有 STL。這個選項可協助ndk-stack指令碼改善整個 STL 上的堆疊傾印。這項變更不會影響剝離後最終檔案的程式碼/大小。 - 已增強
hello-jni範例,用於在編譯期間回報APP_ABI。 - 在確定性模式下使用
ar工具 (選項-D) 以建構靜態程式庫。(問題 60705)
- 已新增
Android NDK r9b (2013 年 10 月)
- 重要變更:
-
- 已針對 Android API 級別 18 及以下所有級別更新
include/android/*h和math.h,包括新增 13、15、16 和 17 級別。 如要瞭解已新增的 API,請參閱變更 68012 和變更 68014 的修訂訊息 (問題 47150、58528 和 38423)。 - 已新增針對 Android API 級別 19 的支援,包括 Renderscript 繫結。
- 已在現有 armeabi-v7a ABI 中新增針對
-mhard-float的支援。如要進一步瞭解 Clang 及最新限制,請參閱tests/device/hard-float/jni/Android.mk。 - 已從 GNU 編譯器系列 (GCC) 4.8 遷移至 4.8.2,並已新增診斷顏色支援。如要啟用診斷顏色,請設定
-fdiagnostics-color=auto、-fdiagnostics-color=always,或匯出GCC_COLORS,如下所示: 詳情請參閱「與語言無關聯的 GCC 選項」。GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
- 已新增兩個範例來示範 OpenGL ES 3.0 功能:Teapot 和 MoreTeapots。這些範例可以在搭載 Android 4.1 (API 級別 16) 及以上版本的裝置上執行。
- 已淘汰 GCC 4.7 和 Clang 3.2 支援,並將在下一個版本中將其移除。
- 已針對 Android API 級別 18 及以下所有級別更新
- 重要錯誤修正:
-
- 已修正 ARM GCC 4.6
thumb2無法產生 16 位元相對跳轉表格的問題。(GCC 問題) - 已修正
g++.dg/cpp0x/lambda/lambda-defarg3.C上的 GCC 4.8 內部編譯器錯誤 (ICE)。 (變更 62770、GCC 問題) - 已修正 Windows 32 位元
*-gdb.exe執行檔無法啟動的問題 (問題 58975)。 - 已修正建構項目符號資料庫時的 GCC 4.8 ICE 問題。錯誤訊息如下:
(問題 58916、GCC 問題)internal compiler error: verify_flow_info failed
- 已修改 GDB/ARM 版本,以便針對前列程式碼的展開不使用
ARM.exidx資料,並已新增指令 (set arm exidx-unwinding),以便控制 exxx 為基礎的堆疊展開 (問題 55826)。 - 已修正不正確地重複使用 HI 和 LO 註冊的 Clang 3.3 MIPS 編譯器問題。
- 已修正
dbx_reg_number中的 MIPS 4.7 ICE 問題。錯誤訊息如下: (GCC 修補程式)external/icu4c/i18n/decimfmt.cpp:1322:1: internal compiler error: in dbx_reg_number, at dwarf2out.c:10185
- 已修正 ARM GCC 4.6
- 其他錯誤修正:
-
- 標頭修正
- 已根據規範 (X86/MIPS 版本有符號),將 ARM
WCHAR_MIN和WCHAR_MAX修正為無符號。定義_WCHAR_IS_ALWAYS_SIGNED即可還原舊行為。(問題 57749) - 已修正
include/netinet/tcp.h,以便加入TCP_INFO狀態列舉。 (問題 38881) - 已修正
cdefs_elh.h巨集_C_LABEL_STRING,以便在使用 c++11 模式時停止在 GCC 4.8 工具鏈中產生警告 (問題 58135、問題 58652)。 - 已從
inttypes.h標頭中移除不存在的imaxabs和imaxdiv函式。 - 已修正
pthread_exit()傳回值和pthread_self()的問題 (問題 60686)。 - 已新增缺少的
mkdtemp()函式,這個函式已存在於bionic標頭stdlib.h中。
- 已根據規範 (X86/MIPS 版本有符號),將 ARM
- 已修正在 Android API 級別 11 上使用 Clang 建構
samples/gles3jni的問題。 - 已修正 MCLinker,允許下列選項多次出現:
-gc-sections和--eh-frame-hdr。 - 已修正 MCLinker,以便接受
--no-warn-mismatch選項。 - 已修改
cpu-features選項,不再假設所有 VFPv4 裝置都支援 IDIV。 現在,這個選項只會將 IDIV 新增至加入許可清單的 Nexus 4 等裝置 (問題 57637)。 - 已修正以下問題:
android_native_app_glue.c在事件預先調派作業中並未正確記錄錯誤。 - 已將
gabi++terminate 和 unexpected_handler 上的所有作業修正為執行緒安全。 - 已修正 Clang
-integrated-as選項的數個問題,使其能夠通過ssax-instructions和fenv的測試。 - 已修正 GCC 4.6/4.7/4.8 編譯器,現在即使是對靜態執行檔,也能傳送連接器選項
--eh-frame-hdr。詳情請參閱 GCC 修補程式。 - 已修正
CPU-ARCH-ABIS.html中額外的單引號。詳情請見NDK-DEPENDS.html(問題 60142)。 - 已修正 Windows 上 ndk-build 輸出內容中的額外引號 (問題 60649)。
- 已修正 Clang 3.3,以便編譯 ARM 的內建 atomic 作業 (例如
__atomic_fetch_add、__atomic_fetch_sub和__atomic_fetch_or)。 - 已修正自訂
vfprintf的 Clang 3.3 ICE (Clang 問題)。
- 標頭修正
- 其他變更:
-
- 已為所有 GCC 版本啟用 OpenMP。如要使用這項功能,請在建構作業設定中新增下列標記:
如需查看程式碼範例,請參閱LOCAL_CFLAGS += -fopenmp LOCAL_LDFLAGS += -fopenmp
tests/device/test-openmp - 已明顯縮減
ld.mcld的大小 (大小為 1.5 MB,而ld.bfd為 3.5 MB,ld.gold為 7.5 MB),以使速度加快約 20%。 - 已新增
LOCAL_CONLYFLAGS和APP_CONLYFLAGS,用於指定僅適用於 C 而不適用於 C++ 的選項。現有的LOCAL_CFLAGS和APP_CFLAGS也可用於 C++ 編譯 (避免大部分選項皆須指定兩次),因此-std=gnu99等選項可能無法在 g++ 版本中執行也無法發出警告,而在 clang++ 版本中則會發生錯誤。 - 已新增
gabi++陣列輔助函式。 - 已修改 GCC 版本,讓所有
libgcc.a檔案都使用-funwind-tables進行建構,以便允許展開堆疊時經過先前已封鎖的點 (例如__aeabi_idiv0)。 - 已利用新的
-mmxu選項,在 MIPS GCC4.6/4.7/4.8 中新增 Ingenic MXU 支援。 - 已擴充 MIPS GCC4.6/4.7/4.8
-mldc1-sdc1,以便同時控制 ldxc1/sdxc1 - 已新增超級連接器。詳情請參閱
sources/android/crazy_linker/README.TXT。 - 已修正
bitmap-plasma,以便繪製到全螢幕,而不是 200x200 像素區域。 - 已透過建立相同檔案的符號連結,將 linux 和 darwin 工具鏈大小縮減 25%。
- 已為所有 GCC 版本啟用 OpenMP。如要使用這項功能,請在建構作業設定中新增下列標記:
Android NDK r9 (2013 年 7 月)
- 重要變更:
-
- 已新增針對 Android 4.3 (API 級別 18) 的支援。詳情請參閱
STABLE-APIS.html以及samples/gles3jni/README中的新程式碼範例。 - 已針對 OpenGL ES 3.0 新增標頭和程式庫,OpenGL ES 3.0 受 Android 4.3 (API 級別 18) 及以上版本支援。
- 已將 GNU 編譯器系列 (GCC) 4.8 編譯器新增至 NDK。由於 GCC 4.6 仍為預設編譯器,您必須明確啟用這個選項:
- 針對
ndk-build版本,請匯出NDK_TOOLCHAIN_VERSION=4.8或在Application.mk中新增這個程式碼。 - 針對獨立版本,請使用
make-standalone-toolchain.sh中的--toolchain=選項,例如:--toolchain=arm-linux-androideabi-4.8
注意:
-Wunused-local-typedefs選項由-Wall啟用。如果使用編譯時間宣告 (例如第 311 行的sources/cxx-stl/stlport/stlport/stl/config/features.h),請務必新增__attribute__((unused))。詳情請參閱變更 55460注意:在 GCC 4.7 以上版本中,ARM 編譯器會對 ARMv6 以上版本的建構目標預設產生未對齊的存取碼。在使用不支援這項功能的核心進行建構時,您可能須新增
-mno-unaligned-access建構選項。 - 針對
- 已新增 Clang 3.3 支援。
NDK_TOOLCHAIN_VERSION=clang建構選項現在預設會選擇 Clang 3.3。注意:GCC 4.4.3 和 Clang 3.1 皆已淘汰,且會從下一個 NDK 版本中移除。
- 已更新 GNU 專案偵錯工具 (GDB),以便支援 Python 2.7.5。
- 已新增 MCLinker 以支援 Windows 主機。由於
ld.gold預設為可用,因此您必須在LOCAL_LDFLAGS或APP_LDFLAGS中新增-fuse-ld=mcld,才能啟用 MCLinker。 - 已新增可輸出 ELF 程式庫依附元件的
ndk-depends工具。詳情請見NDK-DEPENDS.html(問題 53486)。
- 已新增針對 Android 4.3 (API 級別 18) 的支援。詳情請參閱
- 重要錯誤修正:
-
- 已修正
android_native_app_glue中潛在的事件處理問題 (問題 41755)。 - 已修正 ARM/GCC-4.7 版本,好讓 NEON 負載與儲存指示 VST 和 VLD 充分對齊 (GCC 問題 57271)。
- 已修正字串常值上常數負值索引值發生的 GCC 4.4.3/4.6/4.7 內部編譯器錯誤 (ICE)。 (問題 54623)
- 已修正使用物件地址進行常量初始化時發生的 GCC 4.7 區隔錯誤。 (問題 56508)
- 已修正使用 Boost 1.52.0 時,
-O值發生的 GCC 4.6 ARM 區隔錯誤 (問題 42891)。 - 已修正
libc.so和libc.a,以便支援wait4()函式 (問題 19854)。 - 已更新 x86 libc.so 和 libc.a 檔案,納入
clone()函式。 - 已修正
linker.list檔案為空白或未使用的LOCAL_SHORT_COMMANDS錯誤。 - 已修正 Mac OS 上的 GCC MIPS 版本以使用 CFI 指令;如果沒有這些指令,
ld.mcld --eh-frame-hdr將經常失敗。 - 已修正
llvm/lib/VMCore/Value.cpp中的 Clang 3.2 X86/MIPS 內部編譯器錯誤 (變更 59021)。 - 已修正 GCC 4.7 64 位元 Windows 組合器當機的問題。(錯誤:
out of memory allocating 4294967280 bytes)。 - 已更新
ndk-gdb指令碼,因此--start或--launch動作現在會等待 GNU 偵錯伺服器,讓伺服器更穩定地達到在執行路徑初期設定的中斷點,例如 JNI 程式碼內的中斷點 (問題 41278)。注意:這項功能需要 jdb,並且會產生有關待處理中斷點的警告。指定
--nowait選項即可還原先前的行為。 - 已修正程式庫清單空白時發生的 GDB 當機問題。
- 已修正以下問題:使用通過
bx pc或blx pcThumb 指示的stepi指令時,GDB 發生當機 (問題 56962、問題 36149)。 - 已修正 MIPS
gdbserver,方便尋找DT_MIPS_RLD_MAP,而非DT_DEBUG(問題 56586)。 - 已修正 ndk-build 指令碼中的循環依附元件,例如:如果 A->B 且 B->B,那就從建構中捨棄 B (問題 56690)。
- 已修正
- 其他錯誤修正:
-
- 已修正
ndk-build指令碼,讓您能夠以指令列選項形式指定 Clang 版本 (例如NDK_TOOLCHAIN_VERSION=clang3.2)。過去,僅限以環境變數形式指定版本。 - 已針對 MIPS 版本目標,將使用 Clang 編譯器時的
_Unwind_Exceptiongabi++ 大小修正為 24。 (變更 54141) - 已修正
ndk-build指令碼,確保在使用ndk-build clean指令時,可以從包含預先建構的靜態程式庫的專案中實際移除已建構的程式庫。 (變更 54461、變更 54480) - 已將
NDK_ANALYZE=1選項修改為更精簡的文字。 - 已修正
gnu-libstdc++/Android.mk,以便針對使用回溯相容性的建構作業加入backward/路徑 (問題 53404)。 - 已修正
stlport new有時會傳回隨機值的問題。 - 已修正
ndk-gdb,以符合CPU_ABIS(而非APP_ABIS) 的順序 (問題 54033) - 已修正 MacOSX 上的 NDK 64 位元版本選擇錯誤編譯器路徑的問題 (問題 53769)。
- 已修正建構指令碼,用於偵測 64 位元 Windows Vista (問題 54485)。
- 已修正 x86
ntonl/swap32錯誤:invalid 'asm': operand number out of range(問題 54465、變更 57242)。 - 已修正
ld.gold,以便合併字串常值。 - 已修正
ld.gold,以便處理大型符號對齊作業。 - 已更新
ld.gold,以便啟用--sort-section=name選項。 - 已修正 GCC 4.4.3/4.6/4.7,以便隱藏靜態連結程式的
-export-dynamic選項。針對靜態連結程式,GCC 不再新增.interp區段。 - 已修正與
_Unwind_Control_Block中的typedef不一致有關的 GCC 4.4.3stlport編譯錯誤。 (問題 54426) - 已修正
awk指令碼,以便處理在 Windows 上建立的AndroidManifest.xml檔案,這些檔案的結尾可能包含\r字元,並會導致建構錯誤 (問題 42548)。 - 已修正
make-standalone-toolchain.sh以便探測prebuilts/目錄,進而偵測主機是 32 位元還是 64 位元。 - 已修正 Clang 3.2
-integrated-as選項。 - 已修正 Clang 3.2 ARM EHABI 精簡模型
pr1和pr2處理常式資料。 - 已新增 Clang
-mllvm -arm-enable-ehabi選項以修正以下 Clang 錯誤:clang: for the -arm-enable-ehabi option: may only occur zero or one times!
- 已修正應用程式資訊清單中沒有
uses-sdk元素時發生建構失敗的問題 (問題 57015)。
- 已修正
- 其他變更:
-
- 標頭修正
- 由於
errno.h中的__set_errno已淘汰,且libc.so不再匯出此項目,因此已修改標頭,使__set_errno成為內嵌函式。 - 已修改
elf.h,以便加入stdint.h。 (問題 55443) - 已修正
sys/un.h,使其獨立於其他標頭 (問題 53646)。 - 已修正所有
MotionEvent_getHistoricalAPI 系列,以便取得const AInputEvent* motion_event(問題 55873)。 - 已修正
malloc_usable_size,以便取得const void*(問題 55725)。 - 已修正 stdint.h,提升與 C99 的相容性 (變更 46821)。
- 已修改
wchar.h,以便重新定義WCHAR_MAX和WCHAR_MIN - 已修正指標相關
PRI和SCN巨集的<inttypes.h>宣告 (問題 57218)。 - 已變更
sys/cdefs.h標頭,讓__WCHAR_TYPE__在 API 9 以下級別為 32 位元,也就是wchat_t在所有 API 級別皆為 32 位元。如要還原先前的行為,請定義_WCHAR_IS_8BIT布林值變數 (問題 57267)。
- 由於
- 已在 NDK
docs/中新增更多格式,並已修正其他說明文件。 - 已新增在建構靜態程式庫時對精簡封存技術的支援 (問題 40303)。
- 已更新
make-standalone-toolchain.sh指令碼,使其在指定--stl=stlport選項時支援stlport程式庫以及gnustl程式庫。詳情請參閱STANDALONE-TOOLCHAIN.html。 - 已更新
make-standalone-toolchain.sh指令碼,讓--llvm-version=選項能夠建立clang和clang++以及$TOOLCHAIN_PREFIX-clang和$TOOLCHAIN_PREFIX-clang++指令碼,避免不小心使用主機的 clang 和 clang++ 定義。 - 已新增兩個標記,以便在上游 Clang 中重新啟用兩項最佳化功能 (但已在 NDK 中停用),進而與 GCC 編譯的程式碼更加相容:
- 已新增
-fcxx-missing-return-semantics標記,以便在 Clang 3.2 以上版本中重新啟用缺少的傳回語意。一般而言,所有路徑在終止時都必須提供值傳回函式的回傳敘述。如果情況不同,Clang 會在沒有提供回傳敘述的路徑中插入未定義的指令 (或進入偵錯模式)。如果您確定程式碼正確無誤,請使用這個標記,讓最佳化工具充分利用未定義的行為。如果不確定,請勿使用這個標記。呼叫端可能仍會收到不正確的值,但最佳化器不會利用這個值,並會導致程式碼更難以偵錯。 - 已新增
-fglobal-ctor-const-promotion標記,這樣可以重新啟用將具有靜態建構函式的全域變數提升為常數的功能。透過這個標記,LLVM 的全域變數最佳化流程會嘗試評估具有靜態建構函式的全域變數,並將其提升為全域常數。雖然這項最佳化作業正確無誤,但可能會導致與 GCC 編譯的程式碼之間出現一定程度的不相容。例如,程式碼可能會執行const_cast,將常數轉換成可變動的數並加以修改。在 GCC 中,變數可讀寫,程式碼則會意外執行。在 Clang 中,常數變數位於唯讀記憶體中,並可能導致應用程式當機。
- 已新增
- 已將
-mldc1-sdc1新增至 MIPS GCC 和 Clang 編譯器。根據預設,編譯器會正確對齊 8 位元組物件,並發出ldc1和sdc1指令來移動物件。如果您的應用程式使用自訂分配器,但又不像預設分配器一樣始終與新物件的 8 位元組邊界對齊,則應用程式可能會因為在未對齊的記憶體上執行ldc1和sdc1而發生當機。在這種情況下,請使用-mno-ldc1-sdc1標記以解決這個問題。 - 如果
APP_PLATFORM_LEVEL大於APP_MIN_PLATFORM_LEVEL,事件嚴重程度將從警告降級為資訊。APP_PLATFORM_LEVEL可能低於jni/Application.mk中的APP_PLATFORM,因為 NDK 只有部分級別的標頭。在這種情況下,實際級別就會下降。APP_MIN_PLATFORM_LEVEL是由應用程式資訊清單中的android:minSdkVersion所指定 (問題 39752)。 - 已將
android_getCpuIdArm()和android_setCpuArm()方法新增至cpu-features.c。透過這項新增功能,也能更輕鬆地擷取 ARM CPUID 資訊 (問題 53689)。 - 已修改
ndk-build,以便使用 GCC 4.7 的as/ld進行 Clang 編譯。注意事項:在 GCC 4.7 版中,
monotonic_clock和is_monotonic已分別重新命名為steady_clock和is_steady。 - 已在
ndk-build指令碼中新增下列新警告:- 已新增警告,在靜態程式庫模組使用
LOCAL_LDLIBS/LDFLAGS時發出。 - 已新增警告,在設定沒有可建構的模組時發出。
- 已新增在共用程式庫或可執行模組的
LOCAL_LDLIBS/LDFLAGS中使用非系統程式庫時發出的警告。
- 已新增警告,在靜態程式庫模組使用
- 已更新建構指令碼,如果
APP_MODULES未定義,且Android.mk中只列有靜態程式庫,這個指令碼便會強制建構所有程式庫 (問題 53502)。 - 已更新
ndk-build,以便支援LOCAL_SRC_FILES中的絕對路徑。 - 已移除
*-gdbtui執行檔,而該執行檔與已啟用-tui選項的*-gdb執行檔重複。 - 已更新建構指令碼,以便在 Edison Design Group (EDG) 編譯器的前端重新開啟
_STLP_HAS_INCLUDE_NEXT時發出警告 (問題 53646)。 - 已新增環境變數
NDK_LIBS_OUT,以允許覆寫預設$PROJECT/libs的libraries/gdbserver路徑。 詳情請參閱OVERVIEW.html。 - 已變更 ndk-build 指令碼預設值,在保護格式字串 (
-Wformat -Werror=format-security) 的同時編譯程式碼。可以透過設定LOCAL_DISABLE_FORMAT_STRING_CHECKS=true停用。 詳情請參閱ANDROID-MK.html - 已在
ndk-gdb-py中新增 STL 美化排版支援功能。詳情請參閱NDK-GDB.html。 - 已新增基於 googletest 架構的測試。
- 已針對工具鏈建構指令碼新增一則通知,如果目前的 shell 不是
bash,您就會收到警告。
- 標頭修正
Android NDK r8e (2013 年 3 月)
- 重要變更:
-
- 已新增 64 位元主機工具鏈集 (套件名稱字尾是
*-x86_64.*)。詳情請參閱CHANGES.HTML和NDK-BUILD.html。 - 已新增 Clang 3.2 編譯器。GCC 4.6 仍是預設選編譯器。如要進一步瞭解如何使用 Clang 編譯器,請參閱
CHANGES.HTML。 - 已針對 Linux/MacOSX 主機新增靜態程式碼分析工具。如要進一步瞭解如何使用分析工具,請見
CHANGES.HTML。 - 已針對 Linux/MacOSX 主機新增 MCLinker 做為實驗性功能。
ld.gold連結器在可以使用時即為預設連結器,因此您必須明確啟用這個連結器。詳情請參閱CHANGES.HTML。 - 已更新 ndk-build,使用拓撲排定模組依附元件的順序,這表示建構作業會自動排序
LOCAL_STATIC_LIBRARIES、LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_SHARED_LIBRARIES中指定的程式庫。詳情請見CHANGES.HTML(問題 39378)。
- 已新增 64 位元主機工具鏈集 (套件名稱字尾是
- 重要錯誤修正:
-
- 已修正建構指令碼,在
-O2中建構所有工具鏈。先前版本的工具鏈未正確建構,且未最佳化。 - 已修正針對 64 位元 MacOSX 無條件建構 Clang/llvm 的建構指令碼。
- 已修正 GCC 4.6/4.7 內部編譯器錯誤:
gen_thumb_movhi_clobber at config/arm/arm.md:5832。 (問題 52732) - 已修正 GCC/ARM 4.6/4.7 無法使用 64 位元 atomic 內建函式連結程式碼的建構問題。 (問題 41297)
- 已修正 GCC 4.7 連接器 DIV 用法不符錯誤 (Sourceware 問題)。
- 已修正 GCC 4.7 內部編譯器錯誤
build_data_member_initialization, at cp/semantics.c:5790。 - 已修正 GCC 4.7 內部編譯器錯誤
redirect_eh_edge_1, at tree-eh.c:2214(問題 52909)。 - 已修正 GCC 4.7 分段錯誤。 (GCC 問題)
- 已修正
<chrono>時鐘解析度,並啟用steady_clock(問題 39680)。 - 已修正工具鏈,以便針對 GCC 4.7 libstdc++ 啟用
_GLIBCXX_HAS_GTHREADS(問題 41770、問題 41859)。 - 已修正因缺少
posix_memalign而導致 X86 MXX/SSE 程式碼連結失敗的問題。 (變更 51872) - 已修正
i386.c中distance_non_agu_define_in_bb()函式的 GCC4.7/X86 區隔錯誤。 (變更 50383) - 已修正 GCC4.7/X86,以便還原先前的
cmov行為。 (GCC 問題) - 已修正 libstdc++/GCC4.7 中
setlocale()的 NULL 傳回值處理方式 (問題 46718)。 - 已修正
ld.gold執行階段未定義對__exidx_start和__exidx_start_end參照的問題 (變更 52134) - 已修正使用 Eigen 程式庫時發生的 Clang 3.1 內部編譯器錯誤 (問題 41246)。
- 已修正在 C++11 模式下包含
<chrono>的 Clang 3.1 內部編譯器錯誤 (問題 39600)。 - 已修正以下問題:針對統一初始化
rvalue的方法呼叫產生物件程式碼時,發生 Clang 3.1 內部編譯器錯誤 (問題 41387)。 - 已修正 Clang 3.1/X86 堆疊重新對齊。 (變更 52154)
- 已修正在 Android 4.1.2 版上偵錯時發生的 GNU Debugger (GDB) SIGILL 問題 (問題 40941)。
- 已修正符號含有較長的間接檔案路徑時,GDB 就無法設定
source:line中斷點的問題 (問題 42448)。 - 已修正 MIPS PIE 執行檔的 GDB
read_program_header(變更 49592)。 - 已修正
uncaught_exception()中的STLport區隔錯誤 (變更 50236)。 - 已修正處理例外狀況 (原因是未對齊存取
DW_EH_PE_udata2、DW_EH_PE_udata4和DW_EH_PE_udata8) 時發生的STLport總線錯誤。 - 已修正
nothrow new[]運算子的 Gabi++ 無限遞迴問題 (問題 52833)。 - 已修正 Gabi++ 對例外狀況處理常式指標的錯誤偏移問題 (變更 53446)
- 已移除 Gabi++ 對例外狀況物件的冗餘釋放 (變更 53447)
- 已修正建構指令碼,在
- 其他錯誤修正:
-
- 已修正 NDK 標頭:
- 已修正
STLport,以便在發生記憶體錯誤後取消作業,而非無聲退出。 - 已修正系統和 Gabi++ 標頭,以透過 API 級別 8 及以下級別進行編譯。
- 已修正
cpufeatures,避免剖析/proc/self/auxv(問題 43055)。 - 已修正
ld.gold,使其不依賴主機 libstdc++ 以及 Windows 平台,也不依賴libgcc_sjlj_1.dll程式庫。 - 已修正在
.vsave中觸發不一致的註冊清單,且造成編譯器故障的 Clang 3.1 問題。 (變更 49930) - 已修正 Clang 3.1,以便能夠編譯 libgabi++,並通過針對 MIPS 建構目標的
test-stlport測試 (變更 51961)。 - 已修正 Clang 3.1,以便只針對 C++ 預設啟用例外狀況,而不針對 C 啟用。
- 已修正 Clang 3.1 中的多項問題,確保通過大部分 GNU 例外狀況測試。
- 已修正獨立 NDK 編譯器中的
clang和clang++指令碼,方便偵測-cc1,並在找到這個程式碼後不指定-target。 - 已修正
ndk-build,以便觀察Application.mk中設定的NDK_APP_OUT。 - 已修正 X86
libc.so和lib.a,這兩個程式碼之前缺少已在setjmp.h中宣告的sigsetjmp和siglongjmp函式 (問題 19851) - 已發布 GCC 4.4.3/4.6/4.7 libstdc++ 修補程式,以便在 C++ 11 中與 Clang 搭配使用。 (Clang 問題)
- 已修正傳遞給
HOST_AWK的引數中的 cygwin 路徑。 - 已修正從專案的 JNI 目錄執行時,視窗中發出的
ndk-build指令碼警告 (問題 40192)。 - 已修正以下問題:當 makefile 的
LOCAL_PATH定義在結尾有空白字元時,無法建構ndk-build指令碼 (問題 42841)。
- 其他變更:
-
- 已在 GCC/MIPS 工具鏈中啟用執行緒支援。
- 已更新 GCC 例外狀況處理輔助程式
__cxa_begin_cleanup和__cxa_type_match,使其在 GNU libstdc++ 中具有「預設」瀏覽權限,而非之前的「隱式」瀏覽權限。詳情請參閱CHANGES.HTML。 - 已更新建構指令碼,現可以隱式瀏覽權限建構 Gabi++ 和 STLport 靜態程式庫,但例外狀況處理輔助程式除外。
- 已更新 build,以便在 Thumb 模式下為 ARM 建構
STLport。 - 已在 Gabi++ 中新增對
std::set_new_handler的支援。(問題 52805) - 已在 GNU libstdc++ 中啟用
FUTEX系統呼叫。 - 已更新
ndk-build,使其不再將預先建構的靜態程式庫複製到專案的obj/local/<abi>/目錄。 (問題 40302) - 已從 ARM
toolchains/*/setup.mk指令碼中移除__ARM_ARCH_5*__(問題 21132)。 - 已在 Thumb 模式下針對 ARM 建構其他 GNU Libstdc++ 程式庫。
- 已針對 32 位元 FPU 啟用 MIPS 浮點
madd/msub/nmadd/nmsub/recip/rsqrt指令。 - 已在 GCC 4.6 和 4.7 中啟用 graphite 迴圈最佳化器,以實現進一步最佳化:
-fgraphite、-fgraphite-identity、-floop-block、-floop-flatten、-floop-interchange、-floop-strip-mine、-floop-parallelize-all和-ftree-loop-linear。 (資訊) - 已在 Linux 和 Max OS X 32 位元主機上為 Clang 3.1 啟用
polly,藉此分析及最佳化記憶體存取行為 (資訊)。 - 已在 Linux 上的 GCC 4.7、4.6、Clang 3.2 和 Clang 3.1 中啟用
-flto(透過 LLVMgold.so 實現 Clang LTO)。ld.gold無法使用,因此不支援 MIPS 編譯器目標。 - 已在 GCC 4.6/4.7 中為
ld.gold啟用--plugin和--plugin-opt。 - 已在 GCC 4.7 中為
ld.gold啟用--text-reorder。 - 已為
_GLIBCXX_USE_C99_MATH設定 GNU libstdc++,以便取消定義生物標頭中的isinf指令碼。詳情請參閱CHANGES.html。 - 已將
APP_LDFLAGS新增至建構指令碼。詳情請參閱ANDROID-MK.html。 - 已更新建構指令碼,以便允許
NDK_LOG=0停用NDK_LOG。 - 已更新建構指令碼,以便允許
NDK_HOST_32BIT=0停用主機開發人員環境 32 位元工具鏈。 - 已將預設 GCC/X86 標記
-march=和-mtune=從pentiumpro和generic變更為i686和atom。 - 已加強工具鏈建構指令碼:
- 已修正
build-gcc.sh中mingw建構類型的競爭狀況,這個類型會導致平行處理大量建構程序失敗。 - 已更新
build-gabi++.sh和build-stlport.sh,這些現在可以從 NDK 套件執行 (問題 52835)。 - 已修正
MSys公用程式集合中的run-tests.sh。 - 已改善 64 位元主機工具鏈和 Canadian Cross 建構支援。
- 已將
build-mingw64-toolchain.sh指令碼更新為較新版本。 - 已新增建構
libgnustl_static.a和stlport_static.a的選項,且沒有隱藏瀏覽權限。
- 已修正
Android NDK r8d (2012 年 12 月)
- 重要變更:
-
- 已將 GNU Compiler Collection (GCC) 4.7 編譯器新增至 NDK。由於 GCC 4.6 編譯器仍是預設編譯器,因此您必須按照下列指示明確啟用新版本:
- 針對
ndk-build,請匯出NDK_TOOLCHAIN_VERSION=4.7變數,「或」將變數新增至Application.mk。 - 針對獨立版本,請將
--toolchain=選項新增至make-standalone-toolchain.sh,例如:--toolchain=arm-linux-androideabi-4.7
注意:這項功能仍在實驗階段。請試用並回報問題。
- 針對
- 已透過 gabi++ 新增
stlport例外狀況支援。請注意,新的 gabi++ 依附於dlopen和相關程式碼,這表示:- 您無法再使用
-static選項建構「靜態」執行檔,或使用APP_STL := stlport_static加入libstlport_static.a,但仍可搭配獨立工具鏈使用-static選項。使用include $(BUILD_EXECUTABLE)編譯「動態」執行檔會照常運作,因為編譯器會自動新增-ldl選項。 - 如果您的專案使用
-nostdlib以及 {-Wl,--no-undefined} 建立連結,您必須手動加入-ldl選項。
CPLUSPLUS-SUPPORT.html。注意:這項功能仍在實驗階段,更適合與 GCC 4.6/4.7 編譯器 (而非 GCC 4.4.3 或 Clang 3.1) 搭配使用。請試用並回報問題。
- 您無法再使用
- 已針對 x86 新增
-mstack-protector-guard=選項,這樣除可選擇與舊版 Android C 程式庫 (bionic) 相容的「全域」預設路徑,也可選擇適用於-fstack-protector、-fstack-protector-all和-fstack-protector-strong且使用 GCC 4.6 以上版本編譯器的新「tls」路徑 (%gs:20)。注意:
-mstack-protector-guard設定本身不會啟用任何-fstack-protector*選項。 - 已將
android_setCpu()函式新增至sources/android/cpufeatures/cpu-features.c,以便在 Android 4.1 及以上版本中無法透過/proc進行自動偵測時使用。 (Chromium 問題 164154)
- 已將 GNU Compiler Collection (GCC) 4.7 編譯器新增至 NDK。由於 GCC 4.6 編譯器仍是預設編譯器,因此您必須按照下列指示明確啟用新版本:
- 重要錯誤修正:
-
- 已修正使用
ndk-build指令碼時不需要重新建構物件檔案的問題 (問題 39810)。 - 已修正 Mac OS X 10.6.x 適用的 NDK 8c 版本的連結器故障,這個故障會產生下列錯誤:
這個問題是由於在 Mac OS X 10.7 上進行建構所引起,而這會產生與 Mac OS 10.6.x 和 NDK 不相容的二進位檔。dyld: lazy symbol binding failed: Symbol not found: _memmem Referenced from: ...../arm-linux-androideabi/bin/ld Expected in: /usr/lib/libSystem.B.dylib
- 已從 Clang++ 獨立建構指令碼中移除
-x c++選項 (問題 39089)。 - 已修正在 Cygwin 中使用
NDK_TOOLCHAIN_VERSION=clang3.1選項的問題 (問題 39585)。 - 已修正
make-standalone-toolchain.sh指令碼,以允許使用 Cygwin 或 MinGW 環境產生獨立工具鏈。產生的工具鏈可用於 Cygwin、MingGW 或 CMD.exe 環境 (問題 39915、問題 39585)。 - 已在適用於 ARM 和 X86 的 android-14 版本中新增缺少的
SL_IID_ANDROIDBUFFERQUEUESOURCE選項 (問題 40625)。 - 已修正針對
ANDROID_CPU_X86_FEATURE_MOVBE功能的 x86 CPU 偵測作業 (問題 39317)。 - 已修正標準範本程式庫 (STL) 無法使用不含
.cpp副檔名的 C++ 來源的問題。 - 已修正在 reload1.c:1061 位置發生的 GCC 4.6 ARM 內部編譯器錯誤 (問題 20862)。
- 已修正在 emit-rtl.c:1954 位置發生的 GCC 4.4.3 ARM 內部編譯器錯誤。 (問題 22336)
- 已修正在 postreload.c:396 位置發生的 GCC 4.4.3 ARM 內部編譯器錯誤 (問題 22345)。
- 已修正 GCC 4.6/4.7 略過 lambda 函式的問題。 (問題 35933)
- 已修正使用
- 其他錯誤修正:
-
- NDK 標頭檔案修正:
- 已將
__WINT_TYPE__和wint_t修正為相同類型。 - 已更正
android/bitmap.h中的錯字 (問題 15134)。 - 已更正
errno.h中的錯字。 - 新增檢查功能,用於確認
sys/cdefs.h中是否存在__STDC_VERSION__(問題 14627)。 - 已重新整理
byteswap.h和dirent.h中的標頭。 - 已修正
limits.h,加入可提供PAGE_SIZE設定的page.h(問題 39983)。 - 已將
glGetAttribLocation()和glGetUniformLocation()的傳回類型從int修正為GLint。 - 已修正適用於 x86 建構作業的
__BYTE_ORDER常數 (問題 39824)。
- 已將
- 已修正
ndk-build指令碼,以便建構 ARM 時不會以-O2覆寫-Os。 - 已修正建構指令碼,以允許覆寫
HOST_AWK、HOST_SED和HOST_MAKE設定。 - 已修正在
fsck_msdos建構系統上連結由 Intel C/C++ 編譯器 (ICC) 建構的物件時發生的ld.gold問題。 - 已修正 Clang 中的 ARM EHABI 支援,以符合規範。
- 已修正 GNU Debugger (GDB),以縮短在
solib事件期間遍歷目標連結對應所花費的時間 (問題 38402)。 - 已修正連結共用程式庫時缺少的
libgcc.a檔案。
- NDK 標頭檔案修正:
- 其他變更:
-
- 已將 ARM 的 64 位元內建 atomic 函式向後移植至 GCC 4.6。
- 已新增音訊輸出延遲說明文件,以及其他說明文件和修正。
- 已修正使用 Clang 的偵錯版本,因此非空白函式現可針對沒有回傳敘述的路徑發出
SIGILL信號。 - 已將
make-standalone-toolchain.sh更新為接受後置字元-clang3.1,這等同於在 GCC 4.6 工具鏈中新增--llvm-version=3.1。 - 已將 GCC 和 Clang 錯誤報告網址更新為:https://source.android.com/source/report-bugs.html
- 已向
llvm-objdump新增 ARM ELF 支援。 - 已針對 Clang 建構系統,抑制將 c 輸入處理為 c++ 警告。
- 已更新版本,以便僅建構 32 位元版本的
libiberty.a並將其置於lib32/中。
Android NDK r8c (2012 年 11 月)
- 重要變更:
-
- 已將 Clang 3.1 編譯器新增至 NDK。GNU Compiler Collection (GCC) 4.6 仍是預設編譯器,因此您必須明確啟用 Clang 編譯器選項,如下所示:
- 針對
ndk-build,請匯出NDK_TOOLCHAIN_VERSION=clang3.1,「或」將這項環境變數設定新增至Application.mk。 - 針對獨立版本,請將
--llvm-version=3.1新增至make-standalone-toolchain.sh並將 makefile 中的CC和CXX替換為<tool-path>/bin/clang和<tool-path>/bin/clang++。詳情請參閱STANDALONE-TOOLCHAIN.html。
注意:這項功能仍在實驗階段。請試用並回報問題。
- 針對
- 已新增 Windows 工具鏈的 Gold 連接器
ld.gold。所有主機上的 ARM 和 X86 也會預設使用 Gold 連接器。如要覆寫以適應ld.bfd連結器,請將LOCAL_LDFLAGS += -fuse-ld=bfd新增至Android.mk,或將-fuse-ld=bfd傳送至執行連結的 g++/clang++ 指令列。 - 已新增
ndk-build[.cmd]和ndk-gdb指令碼的 NDK 路徑空間的檢查功能,以免發生難以診斷的建構錯誤。 - 已對 API 級別處理功能進行以下變更:
- 已修改建構邏輯,以便在
APP_PLATFORM、project.properties或default.properties中指定android-10版至android-13版專案連結到android-9,而非android-14。 - 已更新建構系統,讓使用 android-16 (Jelly Bean) 或以上版本的執行檔透過
-fPIE選項進行編譯,進而產生地址無關執行檔 (PIE)。 新的APP_PIE選項可讓您控制這個行為。詳情請參閱APPLICATION-MK.html。注意:14 以上的所有 API 級別仍都會與
platforms/android-14連結,且未新增任何platforms/android-N。 - 已修改
ndk-build,以便在調整後的 API 級別大於專案AndroidManifest.xml中的android:minSdkVersion時發出警告。
- 已修改建構邏輯,以便在
- 已更新
cpu-features輔助程式庫,以加入更多 ARM 特定功能。 詳情請參閱sources/android/cpufeatures/cpu-features.h。 - 已將 X86 平台上的 long Double 長度修改為 8 個位元組。這個資料類型的大小與雙精度相同,但仍視為不同的類型。
- 已更新
APP_ABI=armeabi-v7a的建構系統:- 已修改這個建構類型,以便將
-march=armv7-a參數傳送給連接器。這項變更可確保正確連結 v7 特定程式庫和crt*.o。 - 已將
-mfpu=vfpv3-d16新增至ndk-build,而非先前版本中使用的-mfpu=vfp選項。
- 已修改這個建構類型,以便將
- 已將 Clang 3.1 編譯器新增至 NDK。GNU Compiler Collection (GCC) 4.6 仍是預設編譯器,因此您必須明確啟用 Clang 編譯器選項,如下所示:
- 重要錯誤修正:
-
- 已修正以下問題:透過 Root 權限執行
make-standalone-toolchain.sh時,導致部分使用者無法存取獨立工具鏈 (問題 35279)。- NDK 版本套件中的所有檔案和執行檔都設為向所有使用者提供讀取和執行權限。
libstdc++.a的擁有權/所屬群組現會在複製時保留。
- 已從 Windows 預先建構的
echo.exe中移除冗餘\r。冗餘\r造成gdb.setup在 GNU Debugger (GDB) 中失敗,原因是會錯誤地加入路徑 (問題 36054)。 - 已修正 Windows 平行建構作業,這類建構作業有時會因
host-mkdir實作項目中的時間問題而失敗 (問題 25875)。 - 已修正 GCC 4.4.3 GNU
libstdc++,以便預設不合併typeinfo名稱。詳情請見toolchain repo gcc/gcc-4.4.3/libstdc++-v3/libsupc++/typeinfo(問題 22165)。 - 已修正 GCC 4.6
cp/mangle.c::write_unscoped_name中有關null內容的問題,因為 GCC 可能會在內容為null並在TREE_CODE中解除參照時發生當機。 - 已修正 ARM NEON 特定浮動類型定義時 GCC 4.4.3 發生當機的問題。 (問題 34613)
- 已修正
STLport內部_IteWrapper::operator*()實作問題,這個情況下會傳回含有已解除參照值的過時堆疊位置,並導致執行階段異常終止 (問題 38630)。 - ARM 特定修正:
- 已修正 ARM GCC 4.4.3/4.6
g++,現在不會發出「GCC 4.4 已變更針對 <va_list> 的破壞處理」警告。現在無需再透過使用-Wno-psabi切換鈕這種解決方法來避免發出這則警告。 - 在
LOCAL_SRC_FILES中指定.arm或.neon後置字串的專案也會使用APP_STL,這個問題現已修正。使用APP_STL時,ndk-build指令碼會先搜尋LOCAL_SRC_FILES中的 C++ 檔案,然後再新增要編譯的 STLheader/lib路徑。已修改ndk-build,現在會在搜尋前篩選.arm和.neon後置字串,否則LOCAL_SRC_FILES中的項目 (例如myfile.cpp.arm.neon) 不會編譯為 C++ 程式碼。 - 已修正
binutils-2.21/ld.bfd,使其得以從沒有tag_FP_arch的舊二進位檔中連結物件;之前這類連結會在 GNU Binutils 中產生「宣告失敗」錯誤訊息 (問題 35209)。 - 原本當
binutils-2.19/ld透過更新的binutils-2.21連結預先建構的物件時,會發出「EABI 物件屬性 44 不明」警告,此警告現已移除。 - 已透過修改
make-standalone-toolchain.sh填入子目錄armv7-a/thumb中的headers/libs,修正同時使用-mthumb和-march=armv7-a發生的 GNUstdc++編譯問題 (問題 35616)。 - 已修正「unresolvable R_ARM_THM_CALL relocation」錯誤 (問題 35342)。
- 已修正
reload1.c:3633位置發生的內部編譯器錯誤,原因是從char進行符號擴充時,ARM 後端預期的運算元類型不正確。 (GCC 問題 50099) - 已修正偏移量為負數時發生的內部編譯器錯誤 (GCC 問題)。
- 已修正 ARM GCC 4.4.3/4.6
- 已修正 X86 的
-fstack-protector,這也是ndk-buildx86 ABI 目標的預設設定。 - MIPS 特定修正:
- 已透過在編譯 MIPS
libstlport_*時將_STLP_LITTLE_ENDIAN設為 1,修正STLport位元組順序。 - 已修正編譯 LLVM 時發生的 GCC
__builtin_unreachable問題。 (GCC 問題 54369) - 針對占用 100% CPU 的
cc1編譯程序,向後移植了相關修正 (GCC 問題 50380)。
- 已透過在編譯 MIPS
- GNU Debugger 特定修正:
- 已在建構的 gdb-7.x 中停用 Python 支援,否則 gdb-7.x 設定函式可能會擷取主機上任何可用的 Python 版本,並透過硬性依附於特定 Python 版本的方式建構
gdb(問題 36120)。 - 已修正
APP_ABI包含all且未符合任何已知架構時的ndk-gdb問題 (問題 35392)。 - 已修正 Windows 路徑名稱支援,方法為保留
:字元,前提是該字元看起來像 Windows 路徑的一部分,而且此路徑的開頭為磁碟機字母代號 (GDB 問題 12843)。 - 已修正在
gdbserver中針對 ARM 新增硬體中斷點支援的問題 (GDB 問題)。 - 已新增在連結器一致時僅讀取目前
solibs的修正功能。 這項變更可以加快solib事件處理速度 (問題 37677)。 - 已新增反覆嘗試尋找
solib中斷點的修正功能。GDB 會在每次呼叫svr4_current_sos()時重試enable_break(),直到成功為止。 (變更 43563) - 已修正
gdb不會在dlopen-ed程式庫中設定的中斷點位置停止的問題 (問題 34856)。 - 已修正動態連結器中的
SIGILL,如今在系統上呼叫dlopen()時 (系統中/system/bin/linker的符號已剝離,rtld_db_dlactivity()也已實作為Thumb),不會因為未保留sym_addr的LSB而出現問題 (問題 37147)。
- 已在建構的 gdb-7.x 中停用 Python 支援,否則 gdb-7.x 設定函式可能會擷取主機上任何可用的 Python 版本,並透過硬性依附於特定 Python 版本的方式建構
- 已修正以下問題:透過 Root 權限執行
- 其他錯誤修正:
-
- 已修正 NDK 標頭:
- 已修正誤從原始核心中移除的
arch-mips/include/asm/*程式碼 (變更 43335)。 - 已將
linux/sysctl.h和linux/icmp.h中的結構體成員資料__unused替換為__linux_unused,以免與sys/cdefs.h中的#define __unused發生衝突。 - 已修正
fenv.h中封裝在__BEGIN_DECLS和__END_DECLS內的 C 函式。 - 已移除
malloc.h中未實作的函式。 - 已針對 ANSI 編譯器修正
uint64_t的stdint.h定義 (問題 1952)。 - 已修正
<arch>/include/machine/*中的預先處理器巨集。 - 將 MIPS 的
link.h替換成支援所有平台的新版本。 - 已移除
linux-unistd.h - 已將 GLibc 專用的巨集
LONG_LONG_MIN、LONG_LONG_MAX和ULONG_LONG_MAX從<pthread.h>移至<limits.h>。
- 已修正誤從原始核心中移除的
- 已修正
ndk-stack-parser中的緩衝區溢位。 - 已修正
_STLP_USE_EXCEPTIONS,以便在未定義時略過所有宣告與__Named_exception用法。只有在允許STLport使用例外狀況時,系統才會編譯及使用__Named_exception設定。 - 已修正僅適用 Linux 的 NDK 套件的建構,不需要同時建構 Windows 程式碼。請使用以下設定執行這類建構作業:
./build/tools/make-release.sh --force --systems=linux-x86
- 已修正
libc.so,因此不會匯出atexit()和__do_handler。 這些符號是由 C 程式庫的系統版本針對 ARM 建構系統匯出,以支援舊版原生程式庫。NDK 產生的值不應直接參照這些符號。 每個共用程式庫或執行檔都應嵌入自己的符號版本 (由crtbegin_*.o提供)。如果您的專案使用
-nostdlib -Wl,--no-undefined選項建立連結,您就必須提供自己的__dso_handle,因為這種情況下不會連結crtbegin_so.o。__dso_handle的內容並無關聯,如以下程式碼範例所示:extern "C" { extern void *__dso_handle __attribute__((__visibility__ ("hidden"))); void *__dso_handle; }
- 已修正在
objdump中用於plt項目的 ARM 符號解碼器,以便產生更易解讀的function@plt。 - 已從 X86 平台
libc.so程式庫移除 GCC 4.6libgcc.a中引進的下列符號:__aeabi_idiv0、__aeabi_ldiv0、__aeabi_unwind_cpp_pr1和__aeabi_unwind_cpp_pr2。 - 已移除 MIPS
crt*_so.S中未使用的.ctors、.dtors和.eh_frame。 - 已更新
ndk-gdb,使其只使用ndk-buildDUMP_XXXX輸出中的最後一行。這項變更可確保Application.mk或Android.mk以$(info ...)語法輸出內容時,對應內容不會插入到DUMP_XXXX的結果中。 (更多資訊)
- 已修正 NDK 標頭:
- 其他變更:
-
- 已從
platforms/android-[3,4,5,8]中移除arch-x86和arch-mips標頭。這些標頭並不完整,因為 X86 和 MIPS ABI 僅在 API 9 或以上版本中受支援。 - 已簡化獨立套件中的 c++ include 路徑,如下所示 (問題 35279)。
<path>/arm-linux-androideabi/include/c++/4.6.x-google to: <path>/include/c++/4.6/
- 已修正
ndk-build,以便預設辨識更多 C++ 副檔名:.cc .cp .cxx .cpp .CPP .c++ .C。您仍可使用LOCAL_CPP_EXTENSION覆寫這些副檔名設定。 - 已修正
samples/san-angeles中導致重新啟動時出現黑色畫面或凍結頁框的問題。 - 已替換 NDK 範例中淘汰的 API (問題 20017)。
hello-gl2從 android-5 到 android-7native-activity從 android-9 到 android-10native-audio從 android-9 到 android-10native-plasma從 android-9 到 android-10
- 已採用
.note.android.ident部分 (於crtbegin_static/dynamic.o所定義) 更簡單的配置,為 Android 執行檔新增品牌宣傳資訊,以便偵錯工具做出相應處理。結構成員與值的定義如下:static const struct { int32_t namesz; /* = 8, sizeof ("Android") */ int32_t descsz; /* = 1 * sizeof(int32_t) */ int32_t type; /* = 1, ABI_NOTETYPE */ char name[sizeof "Android"]; /* = "Android" */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }
第
.note.ABI-tag部分先前的品牌宣傳選項已不適用。 - 已新增指令碼
run-tests-all.sh,現可透過不同條件呼叫run-tests.sh和standalone/run.sh。即使不使用--abi選項,run-tests.sh指令碼仍可執行,且已經過增強,可為所有支援的 ABI 編譯大部分測試,並在所有連接裝置上執行。
- 已從
Android NDK r8b (2012 年 7 月)
這個版本的主要功能為新的 GNU Compiler Collection (GCC) 4.6 工具鏈和 GNU Debugger (GDB) 7.3.x (已新增對 Android 4.1 (API 級別 16) 系統映像檔的偵錯支援)。
- 重要錯誤修正:
-
- 已修正在 MacOS 和 Windows Cygwin 環境中使用靜態程式庫時的
LOCAL_SHORT_COMMANDS問題。產生清單檔案的速度較快,並且不會重新產生這個檔案,以避免重複重新建構專案。 - 已修正
ndk-gdb中的幾個問題:- 已更新工具,以便更一致地將
-e、-d和-s標記傳送給 adb。 - 已更新工具,以便接受包含空格的裝置序號。
- 已更新擷取
/system/bin/link資訊的工具,因此主機上的gdb可以在__dl_rtld_db_dlactivity中設定中斷點,並瞭解連接器活動 (例如,在呼叫dlopen()時重新掃描solib符號)。
- 已更新工具,以便更一致地將
- 已修正 Windows 上的
ndk-build clean,之前無法移除./libs/*/lib*.so。 - 已修正
ndk-build.cmd,以便在make失敗時傳回非零ERRORLEVEL。 - 已修正
libc.so,解決未正確匯出__exidx_start和__exidx_end符號的問題。 - 已修正針對 ARM 和 MIPS 展開越過
__libc_init的堆疊時發生的SEGV問題。
- 已修正在 MacOS 和 Windows Cygwin 環境中使用靜態程式庫時的
- 重要變更:
-
- 已新增 GCC 4.6 工具鏈 (具備
gold的binutils2.21 和 GDB 7.3.x),以與原始 GCC 4.4.3 工具鏈 (binutils2.19 和 GDB 6.6) 並存。- GCC 4.6 現已成為預設工具鏈。您可以在
Application.mk中設定NDK_TOOLCHAIN_VERSION=4.4.3,藉此選取原始檔案。 - 對
gold連結器的支援僅適用於 Linux 和 Mac OS 主機上的 ARM 和 x86 架構。這項支援功能預設為停用。如要啟用,請在Android.mk中新增LOCAL_LDLIBS += -fuse-ld=gold。 - 使用
-fPIE編譯的程式需要新的GDB才能進行偵錯,包括 Android 4.1 (API 級別 16) 系統映像檔中的二進位檔。 binutils2.21ld工具包含從 2.22 版向後移植的修正:- 已停用
sincos()最佳化功能,以因應與舊版平台的相容性。
- GCC 4.6 現已成為預設工具鏈。您可以在
- 已更新建構選項,以便預設啟用從不執行 (NX) 位元和
relro/bind_now保護措施:- 已將
--noexecstack新增至組合器,並將-z noexecstack新增至連接器,藉由在堆疊和堆積中啟用 NX 位元來提供 NX 保護措施,以防範緩衝區溢位攻擊。 - 將
-z relro和-z now新增至連結器,以加強內部資料區段的安全性,預防受到記憶體損毀而導致的安全漏洞。(更多資訊:1、2) - 您可以透過下列選項停用這些功能:
- 設定組合器的
--execstack選項和連接器的-z execstack,即可停用 NX 保護措施。 - 設定連接器的
-z norelro和-z lazy選項,即可停用內部資料的強化作業。 - 您可以透過下列選項,在 NDK
jni/Android.mk中停用這些保護措施:LOCAL_DISABLE_NO_EXECUTE=true # disable "--noexecstack" and "-z noexecstack" DISABLE_RELRO=true # disable "-z relro" and "-z now"
詳情請參閱
docs/ANDROID-MK.html。 - 設定組合器的
- 已將
- 已透過
.note.ABI-tag區塊 (位於crtbegin_static/dynamic.o中) 為 Android 執行檔新增品牌宣傳資訊,讓偵錯工具做出相應處理。結構成員與值的定義如下:static const struct { int32_t namesz; /* = 4, sizeof ("GNU") */ int32_t descsz; /* = 6 * sizeof(int32_t) */ int32_t type; /* = 1 */ char name[sizeof "GNU"]; /* = "GNU" */ int32_t os; /* = 0 */ int32_t major; /* = 2 */ int32_t minor; /* = 6 */ int32_t teeny; /* = 15 */ int32_t os_variant; /* = 1 */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }
- 已新增 GCC 4.6 工具鏈 (具備
- 其他錯誤修正:
-
- 已修正
R_MIPS_TLS_LDM再定位遭截斷以符合mips-linux-gnu的問題 (更多資訊)。 - 已修正使用
--gc-sections時造成的ld工具分段錯誤 (更多資訊)。 - 已修正 MIPS
GOT_PAGE計數問題 (更多資訊)。 - 已修正
mips_elf_count_got_symbols的追蹤警告符號連結。 - 已修正
mips_elf_allocate_lazy_stub的追蹤警告符號連結。 - 已將 MIPS
.dynamic移至資料區隔,以使其可寫入。 - 已將符號的硬式編碼值取代為 MIPS 的區隔大小。
- 已從 MIPS 工具鏈的預設設定中移除
-mno-shared選項。Android 工具鏈的預設設定是-fPIC,或為-fpic(如果受支援)。如果您沒有明確指定-mshared、-fpic、-fPIC、-fpie或-fPIE,MIPS 編譯器就會新增-mno-shared以關閉 PIC。已修正編譯器,在這種情況下不會新增-mno-shared。 - 已修正範例
hello-jni和two-libs中錯誤的套件名稱,以使該範例下的tests專案能夠編譯。
- 已修正
- 其他變更:
-
- 已變更二進位檔的位置:
- 已將
gdbserver從toolchain/<arch-os-ver>/prebuilt/gdbserver移至prebuilt/android-<arch>/gdbserver/gdbserver。 - 已將 x86 工具鏈前置字串從
i686-android-linux-重新命名為i686-linux-android-。 - 已在使用 GCC 4.6 進行編譯時,將
sources/cxx-stl/gnu-libstdc++/include和lib移至sources/cxx-stl/gnu-libstdc++/4.6,或已在使用 GCC 4.4.3 進行編譯時,將其移至sources/cxx-stl/gnu-libstdc++/4.4.3。 - 已將
libbfd.a和libintl.a從lib/移至lib32/。
- 已將
- 在重新建構和測試 NDK 工具鏈中新增和改善各種指令碼:
- 已新增
build-mingw64-toolchain.sh,以產生新的 Linux 託管工具鏈,用於產生 Win32 和 Win64 執行檔。 - 已透過使用
clone指令,且只針對建構 NDK 工具鏈二進位檔所需的目錄使用checkout,加快download-toolchain-sources.sh的速度。 - 已新增
build-host-gcc.sh和build-host-gdb.sh指令碼。 - 已新增
tests/check-release.sh,以檢查指定 NDK 安裝目錄的內容,或是現有的 NDK 套件。 - 已重新編寫
tests/standalone/run.sh獨立測試。
- 已新增
- 已從所有平台和架構中移除
if_dl.h標頭。這個標頭所描述的AF_LINK和sockaddr_dl元素是 BSD 專用的 (亦即不存在於 Linux)。
- 已變更二進位檔的位置:
Android NDK r8 (2012 年 5 月)
這個版本的 NDK 支援 MIPS ABI,還修正了其他問題。
- 新功能:
-
- 已新增針對 MIPS ABI 的支援,以允許您產生可以在相容的 MIPS 型 Android 裝置上執行的機器程式碼。MIPS 的主要功能包括 MIPS 專用的工具鏈、系統標頭、程式庫和偵錯支援。如要進一步瞭解 MIPS 支援,請參閱 NDK 套件中的
docs/CPU-MIPS.html。根據預設,系統會針對 ARM 型裝置產生程式碼。您可以在
Application.mk檔案的APP_ABI定義中加入mips,以針對 MIPS 平台進行建構。舉例來說,下面這行程式碼會指示ndk-build針對三個不同的 ABI 建構程式碼:APP_ABI := armeabi armeabi-v7a mips
除非您依賴架構專屬組合源程式碼 (例如 ARM 組合程式碼),否則不必處理
Android.mk檔案即可建構 MIPS 機器程式碼。 - 您可以在呼叫
make-standalone-toolchain.sh時,使用--arch=mips選項建構獨立的 MIPS 工具鏈。詳情請參閱docs/STANDALONE-TOOLCHAIN.html。
注意:為確保只在使用者裝置能執行您的應用程式時向使用者提供應用程式,Google Play 會根據應用程式中包含的指令集資訊篩選應用程式,而您本人無需執行任何操作即可啟用篩選。此外,Android 系統本身也會在安裝時檢查您的應用程式,並且僅在此應用程式提供針對裝置 CPU 架構編譯的程式庫時,才允許繼續安裝。
- 已新增針對 MIPS ABI 的支援,以允許您產生可以在相容的 MIPS 型 Android 裝置上執行的機器程式碼。MIPS 的主要功能包括 MIPS 專用的工具鏈、系統標頭、程式庫和偵錯支援。如要進一步瞭解 MIPS 支援,請參閱 NDK 套件中的
- 重要錯誤修正:
-
- 已修正 GAbi++ 實作中的錯字,導致基礎類別物件
b的dynamic_cast<D>(b)結果與衍生類別D的結果誤以與基礎類別相反的方向進行調整 (問題 28721)。 - 已修正
make-standalone-toolchain.sh無法複製libsupc++.*的問題。
- 已修正 GAbi++ 實作中的錯字,導致基礎類別物件
- 其他錯誤修正:
-
- 已修正
ndk-build.cmd,確保即使使用者重新定義SHELL環境變數,ndk-build.cmd也可正確運作;這個變數可在 Windows 環境中安裝各種開發工具時變更。
- 已修正
Android NDK r7c (2012 年 4 月)
這個 NDK 版本包含針對 Tegra2 型裝置進行的重要修正,以及一些額外修正及改善:
- 重要錯誤修正:
-
- 已修正 GNU STL armeabi-v7a 二進位檔,以避免非 NEON 裝置不會當機。NDK r7b 提供的檔案並經正確設定,因此在 Tegra2 型裝置和其他裝置上嘗試使用特定浮點函式 (例如:
cosf、sinf、expf) 時發生當機。
- 已修正 GNU STL armeabi-v7a 二進位檔,以避免非 NEON 裝置不會當機。NDK r7b 提供的檔案並經正確設定,因此在 Tegra2 型裝置和其他裝置上嘗試使用特定浮點函式 (例如:
- 重要變更:
-
- 已透過
NDK_OUT環境變數新增對自訂輸出目錄的支援。定義後,這個變數就會儲存所有產生的中間檔案,而非$PROJECT_PATH/obj。ndk-gdb也能辨識這個變數。 - 現支援建構內含數百或數千個源檔案的模組,只需在
Android.mk中將LOCAL_SHORT_COMMANDS定義為true。這項變更將強制 NDK 建構系統把大部分連接器或封存選項加入清單檔案,做為解決指令列長度限制的方法。 詳情請參閱
docs/ANDROID-MK.html。
- 已透過
- 其他錯誤修正:
-
- 已修正
cpufeatures輔助程式庫中的android_getCpuCount()實作。在系統動態啟用核心的某些裝置上,先前的實作項目會在首次呼叫函式時回報「有效」核心總數,而非「實際存在」的核心總數。
- 已修正
Android NDK r7b (2012 年 2 月)
這個 NDK 版本包含針對原生 Windows 版本和 Cygwin 的多項修正,以及許多其他改善:
- 重要錯誤修正:
-
- 已更新
sys/atomics.h,避免某些採用 ARM 型架構的裝置發生正確性問題。使用這個版本的 NDK 重新建構未經修改的源程式碼,應該便可完全消除這個問題。 詳情請參閱docs/ANDROID-ATOMICS.html。 - 已還原為
binutils2.19 版,以修正 NDK r7 中發生的偵錯問題 (已改用binutils2.20.1)。 - 已修正 32 位元 Linux 上的
ndk-build。封裝錯誤會將 64 位元版本的awk執行檔置於 NDK r7 中的prebuilt/linux-x86/bin下。 - 已修正原生 Windows 版本 (
ndk-build.cmd)。其他建構模式則不受影響。修正包括:- 已解決嘗試從專案路徑以外的目錄 (例如,當中的任何子目錄) 呼叫
ndk-build.cmd時發生的無限循環/堆疊溢位錯誤。 - 已修正自動產生的依附元件檔案遭到忽略的問題。也就是說,更新標頭並不會對包含該標頭的來源程式碼觸發重新編譯作業。
- 之前系統無法正確處理檔案或路徑中的特殊字元 (空格和引號除外),此問題現已修正。
- 已解決嘗試從專案路徑以外的目錄 (例如,當中的任何子目錄) 呼叫
- 已修正獨立工具,確保使用
-lstdc++時可產生適當的二進位檔 (即與 GNUlibstdc++C++ 執行階段連結)。如要連結到共用程式庫版本,請使用-lgnustl_shared;如為靜態版本,則應使用-lstdc++。如要進一步瞭解這項修正,請參閱
docs/STANDALONE-TOOLCHAIN.html。 - 已修正 Cygwin 上的
gnustl_shared。該連結器之前會指出找不到libsupc++.a(即使檔案位於正確位置)。 - 已修正不透過
APP_STL使用任何特定 C++ 執行階段時發生的 Cygwin C++ 連結問題。
- 已更新
- 其他變更:
-
- 當應用程式使用 GNU
libstdc++執行階段時,編譯器將不再強制啟用例外狀況和 RTTI。這項變更會讓程式碼變小。如果需要這些功能,則必須執行下列其中一項操作:
- 在您的模組或
Application.mk中明確啟用例外狀況和/或 RTTI。(建議) - 在
Application.mk中,將APP_GNUSTL_FORCE_CPP_FEATURES定義為'exceptions'、'rtti'或兩者。詳情請參閱docs/APPLICATION-MK.html。
- 在您的模組或
- 如果應用程式含有獨立程序執行的專用服務,
ndk-gdb現在可以正常運作。這可以對主要應用程式程序偵錯,而非對ps所列的第一個程序 (通常是服務程序) 偵錯。 - 已修正一個罕見錯誤:NDK r7 無法遵循
LOCAL_ARM_MODE值,而且一律會將特定來源檔案 (但並非全部) 編譯為 32 位元指示。 STLport:重新整理來源,以符合 Android 平台版本。這次更新可以修正一些不嚴重的錯誤:- 已修正不完整類型的例項化作業
- 已修正不嚴重的「==」與「=」錯字
- 在
string::assign中使用了memmove,而非memcpy - 已改善對
IsNANorINF、IsINF、IsNegNAN等程式碼的處理方式。
如需完整詳細資料,請參閱修訂版本記錄。
STLport:已從程式庫中移除 5 個不必要的靜態初始化器。- armeabi-v7a 的 GNU libstdc++ 程式庫錯誤地對 armeabi 程式庫進行編譯。這項變更不會影響正確性,不過使用正確的 ABI 應可稍微提高效能。
cpu-features輔助程式庫已更新,可回報三個選用 x86 CPU 功能 (SSSE3、MOVBE和POPCNT)。詳情請參閱docs/CPU-FEATURES.html。docs/NDK-BUILD.html已更新為指定NDK_APPLICATION_MK,而非NDK_APP_APPLICATION_MK,以便選取自訂Application.mk檔案。- Cygwin:叫用時,
ndk-build不會在目前的目錄中建立空白的「NUL」檔案。 - Cygwin:已新增更完善的自動依附元件偵測功能。在之前的版本中,這項偵測功能在下列情況下無法正常運作:
- Cygwin 磁碟機的前置字串不是
/cygdrive。 - 使用驅動較少的安裝時,例如,Cygwin 會將
/home轉換為\\server\subdir而非C:\Some\Dir。
- Cygwin 磁碟機的前置字串不是
- Cygwin:
ndk-build不會嘗試將$NDK/prebuilt/windows/bin內建的原生 Windows 工具與特定版本的 Cygwin 和/或 GNU Make 搭配使用。
- 當應用程式使用 GNU
Android NDK r7 (2011 年 11 月)
這個 NDK 版本包含針對 Android 4.0 平台支援的新功能,以及許多其他新功能和改善:
- 新功能
-
- 已新增 Android 4.0 (API 級別 14) 專用的官方 NDK API,為平台新增下列原生功能:
- 已新增符合 Khronos Group OpenMAX AL 1.0.1 標準的原生多媒體 API。新的
<OMXAL/OpenMAXAL.h>和<OMXAL/OpenMAXAL_Android.h>標頭可讓目標 API 級別 14 的應用程式透過使用新的 Android 專用緩衝區佇列介面,直接從原生程式碼執行多媒體輸出。詳情請參閱docs/openmaxal/index.html和 http://www.khronos.org/openmax/。 - 已更新符合 Khronos Group OpenSL ES 1.0.1 標準的原生音訊 API。使用 API 級別 14 時,可將經過壓縮的音訊 (例如 MP3、AAC、Vorbis) 解碼為 PCM。詳情請參閱
docs/opensles/index.html和 http://www.khronos.org/opensles/。
- 已新增符合 Khronos Group OpenMAX AL 1.0.1 標準的原生多媒體 API。新的
- 新增 CCache 支援。如要加快大型重新建構的速度,請將
NDK_CCACHE環境變數定義為ccache(或ccache二進位檔的路徑)。宣告時,NDK 建構系統會在編譯任何來源檔案時自動使用 CCache。例如:export NDK_CCACHE=ccache
注意:CCache 並未包含在 NDK 版本中,因此您必須先安裝此項目才能使用。如要進一步瞭解 CCache,請參閱 http://ccache.samba.org。
- 現支援將
APP_ABI設為all,以指出您要為指定 NDK 版本支援的所有 ABI 建構 NDK 模組。這表示,在這個版本中,Application.mk中的下列兩行是等效的:APP_ABI := all APP_ABI := armeabi armeabi-v7a x86
如果您是透過指令列呼叫
ndk-build,也能定義APP_ABI,這樣就能快速檢查專案是否針對所有支援的 ABI 進行建構,而無需變更專案的Application.mk file。例如:ndk-build APP_ABI=all
- 已在
Android.mk中新增LOCAL_CPP_FEATURES變數,讓您可以宣告模組使用的 C++ 功能 (RTTI 或例外狀況)。換句話說,如果您預先建構的模組依賴於這些功能,就能夠確保最終連結可以正常運作。詳情請參閱docs/ANDROID-MK.html和docs/CPLUSPLUS-SUPPORT.html。 - 已縮短在建構指令中使用的源檔案和物件檔案路徑。從專案路徑叫用
$NDK/ndk-build時,傳送到建構命令的源檔案路徑、對象檔案路徑和二進位檔案路徑現已大幅縮短,因為這些路徑以相對於當前目錄的方式進行傳送。這對建構具有大量來源檔案的專案來說十分有用,可避免超過主機作業系統所支援的指令列長度上限。如果從專案樹狀結構的子目錄叫用ndk-build,或定義NDK_PROJECT_PATH指向特定目錄,則行為維持不變。
- 已新增 Android 4.0 (API 級別 14) 專用的官方 NDK API,為平台新增下列原生功能:
- 實驗功能
- 您現在「不必」使用 Cygwin,就能從專案路徑上的指令列中呼叫
ndk-build.cmd指令碼,在 Windows 上建構 NDK 來源檔案。指令碼使用的引數與原始ndk-build指令碼完全相同。Windows NDK 套件隨附專屬的預先建構二進位檔,可用於建構 GNU Make、Awk 以及版本所需的其他工具。您不需要安裝任何其他項目,就能取得正常運作的建構系統。重要事項:
ndk-gdb無法在 Windows 中運作,因此您仍須使用 Cygwin 進行偵錯。這項功能仍在實驗階段,歡迎您隨意試用,並在公開錯誤資料庫或公開論壇上回報問題。NDK 隨附的所有範例和單元測試都能透過這項功能成功編譯。
- 修正重大錯誤
-
- 現在,如果
Application.mk中未定義APP_MODULES,匯入的共用程式庫將預設安裝至目標安裝位置 (libs/<abi>)。舉例來說,如果頂層模組foo匯入了bar模組,則libfoo.so和libbar.so都會複製到安裝位置。過去,除非在APP_MODULES中一併列出bar,否則系統只會複製libfoo.so。如果明確定義APP_MODULES,行為會維持不變。 ndk-gdb現可正確處理 MAIN 意圖篩選器中具有多個類別的活動。- 靜態程式庫匯入作業現已可正確轉換。舉例來說,如果頂層模組
foo匯入靜態程式庫bar,而後者匯入靜態程式庫zoo,則libfoo.so會同時連結至libbar.a和libzoo.a。
- 現在,如果
- 其他變更
-
docs/NATIVE-ACTIVITY.HTML:修正錯字。原生活動的最低 API 級別應為 9,而非 8。docs/STABLE-APIS.html:已新增說明文件,並從 API 級別 9 開始,將 EGL 列為受支援的穩定 API。download-toolchain-sources.sh:已更新來自 android.googlesource.com 的工具鏈來源,這是 Android 開放原始碼計畫伺服器的新位置。- 已新增名為
gabi++的 C++ 支援執行階段。詳情請參閱更新後的docs/CPLUSPLUS-SUPPORT.html。 - 已新增名為
gnustl_shared的 C++ 支援執行階段,與 GNU libstdc++ v3 的共用程式庫版本 (GPLv3 授權) 相對應。詳情請參閱docs/CPLUSPLUS-SUPPORT.html - 已在 STLport C++ 執行階段中新增針對 RTTI 的支援 (不支援例外狀況)。
- 已在
LOCAL_CPP_EXTENSION中新增針對多個副檔名的支援。舉例來說,如要將foo.cpp和bar.cxx編譯為 C++ 來源,請宣告以下內容:LOCAL_CPP_EXTENSION := .cpp .cxx
- 已從 NDK 提供的連結時共用系統程式庫中移除許多不需要的匯出符號。這可以確保使用獨立工具鏈產生的程式碼不會不小心依賴不穩定的 ABI 符號 (例如,每當用於建構平台的工具鏈變更時,都會隨之改變的任何 libgcc.a 符號)
- 重新整理 EGL 和 OpenGLES Khronos 標頭,以支援更多副檔名。請注意,這麼做「不會」變更對應程式庫的 NDK ABI,因為每個副檔名都必須在用戶端應用程式執行階段接受探測。
可用的副檔名取決於您的實際裝置和 GPU 驅動程式,而非執行裝置的平台版本。標頭變更只會新增常數和類型,這樣在使用
eglGetProcAddress()或glGetProcAddress()檢測副檔名時,能夠更輕鬆地使用這些副檔名。以下清單說明最新支援的副檔名:- GLES 1.x
-
GL_OES_vertex_array_objectGL_OES_EGL_image_externalGL_APPLE_texture_2D_limited_npotGL_EXT_blend_minmaxGL_EXT_discard_framebufferGL_EXT_multi_draw_arraysGL_EXT_read_format_bgraGL_EXT_texture_filter_anisotropicGL_EXT_texture_format_BGRA8888GL_EXT_texture_lod_biasGL_IMG_read_formatGL_IMG_texture_compression_pvrtcGL_IMG_texture_env_enhanced_fixed_functionGL_IMG_user_clip_planeGL_IMG_multisampled_render_to_textureGL_NV_fenceGL_QCOM_driver_controlGL_QCOM_extended_getGL_QCOM_extended_get2GL_QCOM_perfmon_global_modeGL_QCOM_writeonly_renderingGL_QCOM_tiled_rendering
- GLES 2.0
-
GL_OES_element_index_uintGL_OES_get_program_binaryGL_OES_mapbufferGL_OES_packed_depth_stencilGL_OES_texture_3DGL_OES_texture_floatGL_OES_texture_float_linearGL_OES_texture_half_float_linearGL_OES_texture_npotGL_OES_vertex_array_objectGL_OES_EGL_image_externalGL_AMD_program_binary_Z400GL_EXT_blend_minmaxGL_EXT_discard_framebufferGL_EXT_multi_draw_arraysGL_EXT_read_format_bgraGL_EXT_texture_format_BGRA8888GL_EXT_texture_compression_dxt1GL_IMG_program_binaryGL_IMG_read_formatGL_IMG_shader_binaryGL_IMG_texture_compression_pvrtcGL_IMG_multisampled_render_to_textureGL_NV_coverage_sampleGL_NV_depth_nonlinearGL_QCOM_extended_getGL_QCOM_extended_get2GL_QCOM_writeonly_renderingGL_QCOM_tiled_rendering
- EGL
-
EGL_ANDROID_recordableEGL_NV_system_time
Android NDK r6b (2011 年 8 月)
相較於 r6,這個版本的 NDK 不包含任何新功能。r6b 版本解決了 r6 版本中存在的下列問題:
- 修正重大錯誤
-
- 已修正使用
APP_ABI="armeabi x86"進行多架構建構時的建構問題。 - 已修正 NDK 發布套件中預先建構 STLport 二進位檔的位置。導致這些檔案置於錯誤位置的原因,是封裝指令碼中的錯誤。
- 已修正在共用程式庫中搭配使用 x86standalone 工具鏈與
atexit()的情形。 - 已修正
make-standalone-toolchain.sh --arch=x86。這個程式碼之前無法將合適的 GNU libstdc++ 二進位檔複製到正確位置。 - 已修正獨立工具鏈連接器在缺少
__dso_handle符號的定義和大小 (僅限 ARM) 時發出的警告。 - 已修正 x86 版本
$(SYSROOT)/usr/include的加入順序。 詳情請參閱錯誤。 - 已修正將
ptrdiff_t和size_t與 x86 獨立工具鏈搭配使用時,兩者在 x86 特定系統中的定義。
- 已修正使用
Android NDK r6 (2011 年 7 月)
這個版本的 NDK 包含對 x86 ABI 的支援,以及其他小幅變更。
如要進一步瞭解這個版本的變更,請參閱 NDK 套件包含的 CHANGES.HTML 文件。
- 一般注意事項:
-
- 新增對 x86 ABI 的支援,以便產生可以在相容 x86 型 Android 裝置上執行的機器程式碼。x86 的主要功能包括 x86 專用的工具鏈、系統標頭、程式庫和偵錯支援。如需 x86 支援的所有詳細資料,請參閱 NDK 套件中的
docs/CPU-X86.html。系統預設針對 ARM 型裝置產生程式碼,但您可以在
Application.mk檔案的APP_ABI定義中加入 x86,以面向 x86 平台進行建構。舉例來說,下面這行程式碼會指示ndk-build針對三個不同的 ABI 建構程式碼:APP_ABI := armeabi armeabi-v7a x86
除非您依賴 ARM 型組合源程式碼,否則不必處理
Android.mk檔案即可建構 x86 機器碼。 - 您可以在呼叫
make-standalone-toolchain.sh時,使用--toolchain=x86-4.4.3選項建構獨立的 x86 工具鏈。詳情請參閱docs/STANDALONE-TOOLCHAIN.html。 - 新的
ndk-stack工具可讓您轉換由原生程式碼產生的logcat中的堆疊追蹤。這項工具會將操作說明地址轉換為可讀取的格式,其中包含與各個堆疊框架對應的函式、來源檔案和行數等資訊。 如需更多資訊和使用範例,請參閱docs/NDK-STACK.html。
- 新增對 x86 ABI 的支援,以便產生可以在相容 x86 型 Android 裝置上執行的機器程式碼。x86 的主要功能包括 x86 專用的工具鏈、系統標頭、程式庫和偵錯支援。如需 x86 支援的所有詳細資料,請參閱 NDK 套件中的
- 其他變更:
arm-eabi-4.4.0自 NDK r5 起已淘汰,並已從 NDK 發布版本中移除。
Android NDK r5c (2011 年 6 月)
相較於 r5b,這個版本的 NDK 不包含任何新功能。r5c 版本解決了 r5b 版本中存在的下列問題:
- 重要錯誤修正:
-
ndk-build:已修正在嘗試執行平行偵錯專案時出現的罕見錯誤。- 已修正導致
LOCAL_WHOLE_STATIC_LIBRARIES無法與新工具鏈正常搭配使用的錯字,並在docs/ANDROID-MK.html中新增了有關這個錯誤的說明文件。 - 已修正在 API 級別 8 (Android 2.2) 之前的平台版本時執行時,連結到
gnustl_static程式碼發生崩潰的錯誤。 ndk-gdb:已修正對 Android 3.0 或以上版本裝置進行偵錯時造成分段的錯誤。<android/input.h>:已修正 API 第 9 級 (Android 2.3) 中加入的兩個錯誤函式。雖然這麼做會中斷來源 API,但系統的二進位檔介面則維持不變。錯誤的函式缺少history_index參數,而正確的定義如下:float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index, size_t history_index); float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index, size_t history_index);
- 已更新 API 級別 9 (Android 2.3) 的 C 程式庫 ARM 二進位檔,可在連結時正確公開在這個 API 級別加入的新函式 (例如
pthread_rwlock_init)。
- 小幅改善和修正:
-
- 物件檔案現在會始終按照其在
LOCAL_SRC_FILES中的顯示順序進行連結。由於先前是按源副檔名對檔案進行分組,因此並不會按這個順序進行連結。 - 當
import-module失敗時,系統會輸出搜尋到的目錄清單。這有助於確認建構系統使用的NDK_MODULE_PATH定義是否正確。 import-module成功時,現在會在記錄中顯示模組所在的目錄 (使用NDK_LOG=1即可查看)。- 提高可偵錯應用程式的建構速度 (當專案中加入大量目錄時)。
ndk-gdb:更有效地偵測adb shell錯誤,並改善錯誤訊息。<pthread.h>:已針對 API 級別 9 (Android 2.3) 及以上版本修正PTHREAD_RWLOCK_INITIALIZER定義。- 已修正模組可自行匯入並導致 GNU Make 產生無限迴圈的問題。
- 已修正當
LOCAL_ARM_NEON設為 True (build/core/build-binary.mk中的類型) 時,導致建構失敗的錯誤。 - 已修正導致無法編譯
.s組合檔案 (.S檔案正常) 的錯誤。
- 物件檔案現在會始終按照其在
Android NDK r5b (2011 年 1 月)
相較於 r5,新版 NDK 不包含任何新功能。r5b 版本解決了 r5 版本中存在的下列問題:
- r5 二進位檔需要 glibc 2.11,但 r5b 二進位檔是透過面向 glibc 2.7 或更高版本的專屬工具鏈產生。Linux 工具鏈二進位檔現可在 Ubuntu 8.04 或以上版本執行。
- 已修正 rm-linux-androideabi-4.4.3 工具鏈中的編譯器錯誤。 先前的二進位檔在處理已簽署的字元時,會產生無效的 thumb 指令序列。
- 已新增 APP_STL 的「gnustl_static」值遺失文件,讓您連結至靜態程式庫版本的 GNU libstdc++。 the
- 已修正下列
ndk-build問題:- 在 Windows 發生編譯錯誤時產生不一致的依附元件檔案的錯誤。這個錯誤導致在原始碼中修正錯誤後,無法正確執行建構作業。
- Cygwin 特定錯誤,其中針對 Android NDK 安裝或是專案路徑使用短路徑,導致產生無效依附元件檔案。這個錯誤會造成無法逐步進行增量建構。
- 導致 cpufeatures 程式庫無法與新 NDK 工具鏈搭配使用的錯字。
- 透過避免針對每個源檔案或物件檔案從 GNU Make 中調用
cygpath -m(來源樹狀結構過大時會引發問題),可以加快 Cygwin 建構速度。如果這個方法不可行,請在環境中定義NDK_USE_CYGPATH=1,以便再次使用cygpath -m。 - 現在安裝 Cygwin 時,如果遇到包含空格的無效安裝路徑,便會通知使用者。先前,無效的路徑會輸出錯誤,以指出 GNU Make 版本不正確,即使安裝了正確版本亦然。
- 以往當內含多個以半形冒號分隔的目錄時,
NDK_MODULE_PATH環境變數無法正確運作,現在這個問題已經修正。 prebuilt-common.sh指令碼內含修正程式的 64 位元產生的機器程式碼 (而非主機標記),讓 32 位元工具鏈可以在 Snow Leopard 上正常進行重新建構。工具鏈重建指令碼現在也支援使用 32 位元主機工具鏈。- 已將缺少
INET_ADDRSTRLEN的宣告新增至<netinet/in.h>。 - 已將缺少的
IN6_IS_ADDR_MC_NODELOCAL和IN6_IS_ADDR_MC_GLOBAL宣告新增至<netinet/in6.h>。 <asm/byteorder.h>中的「asm」已替換為「__asm__」,以便使用-std=c99進行編譯。
Android NDK r5 (2010 年 12 月)
NDK 版本包含許多新的 API,其中大部分是為支援開發遊戲,以及大量使用原生程式碼的其他類似應用程式而引入。開發人員可透過 API 直接存取事件、音訊、圖像和視窗管理、資產及儲存空間。開發人員也可以在新的 NativeActivity 類別的協助下,以原生程式碼實作 Android 應用程式生命週期。如要進一步瞭解這個版本的變更,請參閱下載的 NDK 套件隨附的 CHANGES.HTML 文件。
- 一般注意事項:
-
- 已新增對原生活動的支援,可讓您以原生程式碼實作 Android 應用程式生命週期。
- 針對下列項目新增原生支援:
- 輸入子系統 (例如鍵盤和觸控螢幕)
- 存取感應器資料 (加速計、指南針、陀螺儀等)。
- 事件 API,用以等待處理輸入和感應器事件等項目。
- 視窗和顯示子系統
- 以 OpenSL ES 標準為基礎的音訊 API,可支援播放和錄製功能,並控管平台的音效
- 可存取
.apk檔案封裝的資產。
- 加入全新的工具鏈 (以 GCC 4.4.3 為基礎),不僅能產生更優質的程式碼,現在也能做為獨立的跨平台程式碼編譯使用,適合想藉助
./configure && make建構應用程式的人員使用。詳情請參閱 docs/STANDALONE-TOOLCHAIN.html。系統仍會提供 GCC 4.4.0 的二進位檔,但 4.2.1 二進位檔已移除。 - 已針對預先建構的靜態與共用程式庫 (docs/PREBUILTS.html) 和模組匯出及匯入作業新增支援功能,大幅簡化共用及重複使用第三方模組的程序 (原因說明請見 docs/IMPORT-MODULE.html)。
- 提供預設 C++ STL 實作 (以 STLport 為基礎) 做為輔助模組。這可做為靜態或共用程式庫使用 (如需瞭解詳情和用法範例,請參閱 source/android/stlport/README)。如果選擇根據這些程式庫 (而非預設 C++ STL 實作) 進行編譯,還會提供 STLport (靜態或共用) 和 GNU libstdc++ (僅限靜態) 的預先建構二進位檔。 預設 STL 實作不支援 C++ 例外狀況和 RTTI。詳情請參閱 docs/CPLUSPLUS-SUPPORT.HTML。
- 改善
cpufeatures輔助程式庫,協助改善 CPU 類型的回報功能 (部分裝置先前回報的類型是 ARMv7 CPU,而實際則是 ARMv6)。我們建議開發人員利用這個程式庫重建應用程式,再上傳到 Google Play,以便從這些改善中獲得好處。 - 新增 EGL 程式庫,協助您建立及管理 OpenGL ES 材質和服務。
- 新增範例應用程式
native-plasma和native-activity,以示範如何編寫原生活動。 - 加入許多錯誤修正和其他小改善。如需詳細的變更清單,請參閱 docs/CHANGES.html。
Android NDK r4b (2010 年 6 月)
- NDK r4b 注意事項:
-
修正 NDK 建構系統和偵錯指令碼中的數個問題。如果您使用的是 NDK r4,建議下載 NDK r4b 版本。如要進一步瞭解這個版本的變更,請參閱已下載 NDK 套件隨附的 CHANGES.TXT 文件。
- 一般注意事項:
-
- 透過新的
ndk-build建構指令提供簡化的建構系統。 - 透過新的
ndk-gdb指令,支援在正式版裝置上對產生的機器碼進行簡易原生偵錯。 - 針對以 ARM 為基礎的 CPU 架構
armeabi-v7a,新增 Android 專用 ABI。新 ABI 可以擴充現有的armeabiABI,以便加入以下 CPU 指令集擴充功能:- Thumb-2 操作說明
- VFP 硬體 FPU 指令 (VFPv3-D16)
- 針對 ARM Advanced SIMD (NEON) GCC 內建函式和 VFPv3-D32 的選用支援。 提供支援的裝置包括 Motorola 的 Verizon Nexus、Google Nexus One 等等。
- 新增
cpufeatures靜態程式庫 (含原始碼),讓應用程式在執行階段偵測主機裝置的 CPU 功能。具體來說,應用程式可以檢查 ARMv7-A 支援、VFPv3-D32 和 NEON 支援,然後視需要提供獨立的程式碼路徑。 - 新增範例應用程式
hello-neon,說明如何使用cpufeatures程式庫檢查 CPU 功能,然後在 CPU 支援時,使用 NEON 內建函式提供最佳化的程式碼路徑。 - 您可以針對 NDK 支援的任一或兩種指令集產生機器程式碼。舉例來說,您可以同時針對 ARMv5 和 ARMv7-A 架構進行建構,並將所有內容儲存到應用程式的最終
.apk中。 - 為確保只在使用者裝置能夠執行您的應用程式時向其提供應用程式,Google Play 會根據應用程式中包含的指令集資訊篩選應用程式,而您本人無需執行任何操作即可啟用篩選。此外,Android 系統本身也會在安裝時檢查您的應用程式,並且僅在此應用程式提供針對裝置 CPU 架構編譯的程式庫時,才允許繼續安裝。
- 新增針對 Android 2.2 的支援,包括可從原生程式碼存取
Bitmap物件像素緩衝區的新穩定 API。
- 透過新的
Android NDK r3 (2010 年 3 月)
- 一般注意事項:
-
- 新增 OpenGL ES 2.0 原生程式庫支援。
- 新增範例應用程式 (
hello-gl2),演示如何使用 OpenGL ES 2.0 頂點和 fragment 著色器。 - 使用 GCC 4.4.0 重新整理了這個版本的工具鏈二進位檔,其產生的程式碼應該比先前的版本 (4.2.1) 更精簡且更高效。NDK 還會提供 4.2.1 二進位檔,您可以視需要選用這些二進位檔建構機器程式碼。
Android NDK r2 (2009 年 9 月)
最初發布為「Android 1.6 NDK,第 1 版」。
- 一般注意事項:
-
- 新增 OpenGL ES 1.1 原生程式庫支援。
- 新增範例應用程式 (
san-angeles),以便透過原生 OpenGL ES API 算繪 3D 圖形,同時透過GLSurfaceView物件管理活動生命週期。
Android NDK r1 (2009 年 6 月)
最初發布為「Android 1.5 NDK,第 1 版」。
- 一般注意事項:
-
- 加入針對 ARMv5TE 指令的編譯器支援 (GCC),包括 Thumb-1 指令。
- 加入針對穩定原生 API 系統、說明文件和範例應用程式的系統標頭。