NDK 修訂版本記錄

本頁提供了 NDK 的異動資訊 (包括所有目前已發布的穩定版),方便您查詢相關變更。如要下載最新的 NDK 穩定版或目前可用的 Beta 版,請參閱「NDK 下載」頁面。

如需更完整的資訊,請參閱 android-ndk-announce Google 網路論壇,並訂閱接收發布公告。

Android NDK r27 LTS(2024 年 7 月)

變更記錄
下載內容
  • 請按一下這裡以下載此版本。
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 不再支援 KitKat (API 19 和 20)。
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 包含 Android 13 API。
  • 已根據 LLVM 14 開發,將 LLVM 更新至 clang-r450784d。
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 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 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 已淘汰,並將從即將推出的 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。目前有兩個已知問題:
    • 問題 1258std::filesystem::perm_options::nofollow 可能不適用於舊裝置。
    • 問題 1260:如果在舊裝置上傳送不存在的路徑,std::filesystem::canonical 將無法正確執行。
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 不再支援 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 除外)
    一般而言,這項變更只會影響建構系統維護人員,或使用非最新版建構系統的使用者。ndk-build 和 CMake 工具鏈使用者以及 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 目前是最為可靠的方式。
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • LLD 現已開放測試。 Android 開放原始碼計畫目前正在將預設的連接器改為 LLD,隨後 NDK 也將改用 LLD (具體時間未定)。如要測試應用程式中的 LLD,請傳送 -fuse-ld=lld (連結時)。
  • 自 2019 年 8 月起,上傳到 Play 商店的 APK 一律必須具備 64 位元的版本。請立即開始移植您的程式,以免屆時出現意外問題。詳情請參閱這篇網誌文章
  • 已新增 Android Q API。
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 開發人員應開始使用 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:
    $ $NDK/toolchains/llvm/prebuilt//bin/armv7a-linux-androideabi26-clang++ src.cpp
               
    對於 r19,工具鍊也會安裝在舊路徑上以提供建構 就有機會適應新的版面配置舊路徑將在 r20 中移除,make_standalone_toolchain.py 指令碼將不會 已移除這個指令碼目前非必要,但會發出含有上述資訊的警示,因此仍會保留以維持現有工作流程。 如果您使用的是 ndk-build、CMake 或獨立工具鏈,您的工作流程將不會有任何變更。這項變更對第三方建構系統的維護人員來說非常實用,他們現在應可刪除部分特定 Android 程式碼。詳情請參閱 版本 系統維護人員指南。
  • 已移除 ndk-depends。我們認為 ReLinker 可以更有效地解決舊版 Android 裝置上的原生程式庫載入問題。
  • 問題 862:重新導向 Clang 的 GCC 包裝函式指令碼已經移除,原因是功能不足,無法做為替換方案使用。
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 已移除 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 位元的版本。請立即開始移植您的程式,以免屆時出現意外問題。詳情請參閱這篇網誌文章
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 已停止支援 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 位元的版本。請立即開始移植您的程式,以免屆時出現意外問題。詳情請參閱這篇網誌文章
變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 已移除淘汰的標頭。 統一標頭現簡稱為「標頭」。如需遷移提示,請參閱統一標頭遷移附註
  • 已停止支援 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 總覽

如要進一步瞭解這個版本的新功能和變更內容,請參閱變更記錄

變更記錄
下載內容
  • 請按一下這裡以下載此版本。
公告事項
  • 預設啟用統一標頭。如要瞭解如何使用這些標頭,請參閱統一標頭
  • 注意:已淘汰的標頭將從即將推出的版本中移除。如果您遇到與這些標頭有關的任何問題,請提交錯誤

    如需遷移提示,請參閱統一標頭遷移附註

  • 已停止支援 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 平台保持同步,並可確保時時保持最新狀態和準確性。僅針對標頭的錯誤修正現在會影響所有 API 級別。加入統一標頭修正了早期 NDK 版本中的不一致問題,例如:
    • M 和 N 中的標頭實際上是 L 的標頭。
    • 標頭中的函式宣告與其平台層級不符;標頭宣告的函式不存在,或無法宣告可用的函式。
    • 一些舊 API 級別缺少部分常數或包含不正確的常數,但這些常數皆會出現在新 API 中。

    根據預設,系統不會啟用這些新的統一標頭。如要瞭解如何啟用及使用這些標頭,請參閱統一標頭

  • GCC 淘汰:這個版本已停止對 GCC 的有效支援。雖然 GCC 目前不會從 NDK 中移除,但不會再收到向後移植內容。gnustl 的某些部分仍與 Clang 不相容,因此除非 libc++ 穩定到可以成為預設 STL,否則不會完全移除 GCC。

如要進一步瞭解這個版本的新功能和變更內容,請參閱變更記錄

下載內容
  • 這裡封存了此版本的下載內容。
公告事項
  • 已停止支援 GCC。雖然 GCC 目前不會從 NDK 中移除,但不會再收到向後移植內容。gnustl 的某些部分仍與 Clang 不相容,因此只有在 libc++ 穩定到可以成為預設 STL 時,才能移除 GCC。達到上述條件後,可能會移除 GCC。
  • 已新增 simpleperf,這是適用於 Android 的一種 CPU 分析器。
r13b
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 工具鏈檔案。
已知問題
  • 以下並未列出所有待處理的錯誤。
  • 使用 libc++ 和 GCC 的獨立工具鏈無法正常運作。這可能是 GCC 中的一項錯誤。詳情請參閱修訂訊息
  • 即使有 android-24,但仍未公開適用於 Marshmallow 和 N 的 Bionic 標頭和程式庫。這些平台仍然是 Lollipop 標頭和程式庫 (並非 r11 中的迴歸)。
  • RenderScript 工具不存在 (並非 r11 中的迴歸):問題 7
下載內容
  • 這裡封存了此版本的下載內容。
公告事項
  • ndk-build 指令在 r13 中預設使用 Clang。我們將在後續版本中移除 GCC。
  • make-standalone-toolchain.sh 指令碼將從 r13 中移除。請確認 make_standalone_toolchain.py 符合您的需求。
  • GitHub 回報問題。
r12b
  • 我們修正了 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 或更高級別的裝置新增 libcamera2 API。詳情請參閱相機特性
Clang
  • Clang 已更新為 3.8svn (r256229,版本 2812033)。
    • 32 位元 Windows 套件中的 clang.execlang++.exe 執行檔實際上是 64 位元。32 位元執行檔的名稱為 clang_32.exe
  • __thread 現應可實際運作。
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)。
  • 這份變更記錄並未完整列出所有待處理的錯誤。
下載內容
  • 這裡封存了此版本的下載內容。
公告事項
  • 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 問題 14NDK 問題 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.execlang++.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 值。
變更內容
  • 已對 ndk-gdb.py 指令碼套用其他修正。
  • 已將選用的套件名稱引數新增至 ndk-gdb 指令 --attach 選項 (問題 13)。
  • 已修正 32 位元 Windows 平台的無效工具鏈路徑 (問題 45)。
  • 已修正 ndk-which 指令的相對路徑 (問題 29)。
  • 已修正針對 libgcc 編譯器使用 cygpath 的方式 (Android 問題 195486)。
NDK
  • 重要公告
    • 我們已將錯誤追蹤工具移至 GitHub
  • 變更
    • 已修正 ndk-gdb.py,這在 r11 中已完全迴歸
    • 已修正 Mac 版 ndk-gdb
    • 已新增指令列工具的更多頂層捷徑:
      • ndk-depends
      • ndk-gdb
      • ndk-stack
      • ndk-which。這個指令在先前的版本中完全不存在。
    • 已修正 libc++ 的獨立工具鏈 (之前一直缺少 __cxxabi_config.h)。
    • 已修正「make-standalone-toolchain.sh」中「--toolchain」的說明文件。
Clang
  • Errata
    • 與我們在 r11 版本資訊中回報的內容相反,__thread 無法運作。這是因為我們傳輸的 Clang 版本缺少針對模擬傳輸層安全標準 (TLS) 支援的錯誤修正。
Clang
  • 重要公告
    • 我們強烈建議您改用 Clang。
      • 如果 Clang 發生問題,對於 NDK 中有關 Clang 的問題,請在這裡回報錯誤。對於更一般的 Clang 問題,請按照這個頁面中的操作說明回報錯誤。
    • Clang 已更新為 3.8svn (r243773,版本 2481030)。
      • 這個版本幾乎是純上游的 Clang。
      • Windows 64 位元可下載 NDK 套件中包含 32 位元版本的 Clang。
  • 新增
    • Clang 現已支援模擬傳輸層安全標準 (TLS)。
      • 編譯器現在使用 pthread 執行緒專屬資料模擬 ELF TLS,以支援 __thread
      • C++11 thread_local 在某些情況下適用,但不適用於含有重要解構函式的資料,因為這類情況下需要 libc 提供支援。在 Android 6.0 (API 級別 23) 或更新版本上執行時,這項限制不適用。
      • 從共用程式庫存取 TLS 變數時,模擬 TLS 目前仍無法與 Aarch64 搭配使用。
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。
  • 移除
    • 已停止支援 _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 和更舊版本。
  • 已針對 64 位元更新 gabi++ _Unwind_Exception 結構。
  • 已在 cpufeatures 中新增下列功能:
    • 偵測 SSE4.1 和 SSE4.2。
    • 偵測 x86_64 上的 CPU 功能。
  • 已將 libc++abi 更新為上游 r231075
  • 已從 ToT Bionic 更新 byteswap.hendian.hsys/procfs.hsys/ucontext.hsys/user.huchar.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 支援。
YASM
  • 變更
    • 將 YASM 更新至 1.3.0 版。
已知問題
  • x86 ASAN 目前無法正常運作。詳情請參閱這個頁面的討論內容。
  • 組合 Clang、x86、stlport_static 和 -O0 以上最佳化等級將會導致 dynamic_cast 測試失敗。詳情請參閱這裡的註解。
  • 在 ARM32 上使用 c++_shared 時,例外狀況處理經常會失敗。根本原因是,libc++abi 用於 ARM32 的 LLVM 展開程式與 libgcc 不相容。這個行為並非是來自 r10e 的迴歸。
下載內容
  • 這裡封存了此版本的下載內容。
重要變更:
  • 已將 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 套件。
重要錯誤修正:
  • 已修正因主執行緒外 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_*
    • 已修正 mips64sys/ucontext.h
    • 已捨棄針對 __builtin_isnan__builtin_isinf 的 Clang 版本檢查。
    • 已新增 android-21/arch-mips/usr/include/asm/reg.handroid-21/arch-mips64/usr/include/asm/reg.h
  • 已修正 GCC 4.9 針對 x86 產生的陣列邊界錯誤警告,並已重新啟用 GCC 4.9 針對 ARM 產生的陣列邊界警告。針對 ARM 的警告先前已無條件停用。
  • 已修正 mipsmips64 的 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,傳回 -11。這個程式碼先前會傳回任意帶符號數。
  • 已修正 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.alibgomp.a 程式庫:
    • aarch64-linux-android-4.9
    • mips64el-linux-android-4.9
    • mipsel-linux-android-4.9
    • x86_64-4.9
其他變更:
  • 已為 aarch64 新增 ld.gold。預設連結器仍為 ld.bfd。 如要顯式啟用 ld.gold,請將 -fuse-ld=gold 加入 LOCAL_LDFLAGSAPP_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
重要變更:
  • 已將 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 中的討論資訊。 這些影響並不適用於共用程式庫。
重要錯誤修正:
  • 針對 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)
其他錯誤修正:
  • 修正以下標頭和程式庫:
    • 已將 posix_memalign 新增至 API 級別 16。此外,已將 stdlib.h 中的原型新增至 API 級別 16 到 19 (問題 77861)。
    • 已修正 stdatomic.h,使其只針對 C++11 加入 <atomic>
    • 已修改以下標頭以供獨立使用:sys/user.h 以及針對 API 級別 21 的 gl2ext.hdlext.hfts.hsgidefs.h
    • 已修改 sys/user.h,將 mxcsr_mask 重新命名為 mxcr_mask,以及將 u_ar0 的資料類型
    • unsigned long 變更為 struct user_regs_struct*。
    • 已將 sysconf() 傳回值類型從 int 變更為 long
  • 已修正 ndk-build 對 LOCAL_ARM_MODEthumb 處理方式:在 r10d 中,除非符合下列任一條件,否則 ndk-build 會預設新增 LOCAL_LDFLAGS+=-mthumb
    • 您已將 LOCAL_ARM_MODE 設定為等於 arm
    • 您正在 (透過包含 android:debuggable="true"APP_OPTIM=debugAndroidManifest.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)
重要變更:
  • 針對下載結構進行了下列變更:
    • 每個套件現在皆包含適用於其各自平台的 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 選項) 發出更多警告。
    • 從使用 GCC 的專案進行遷移時,您可以使用 -Wno-invalid-command-line-argument-Wno-unused-command-line-argument 忽略未使用的標記,直到能夠決定這些標記的後續用途再進行處理。

  • 在使用 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
  • 已記錄針對 headers/libs/android-21_FORTIFY_SOURCE 的支援,r10 中 (這時 android-21 仍稱為 Android-L) 已存在這個程式碼,但沒有任何相關說明文件。
重要錯誤修正:
其他錯誤修正:
  • 已針對 android-21 進行下列標頭和程式庫修正:
    • 已新增更多電視按鍵碼:android/keycodes.h
    • 已向 android/sensor.h 新增更多常數和六個新的感應器函式:ASensorManager_getDefaultSensorExASensor_getFifoMaxEventCountASensor_getFifoReservedEventCountASensor_getStringTypeASensor_getReportingMode 以及 ASensor_isWakeUpSensor
    • 已修正 stdatomic.h,藉此提升與 GCC 4.6 的相容性,並支援 <atomic> 標頭。
    • 已將 sys/ucontext.hsys/user.h 新增至所有 API 級別。signal.h 標頭現在包含 <sys/ucontext.h>。您可以移除 struct ucontext 現有的任何定義。
    • 已將 posix_memalign 新增至 API 級別 17、18 和 19。
    • 已將下列函式新增至所有架構:android_set_abort_messageposix_fadviseposix_fadvise64pthread_gettid_np
    • 已將必要權限新增至 native-media/AndroidManifest.xml 範例 (問題 106640)。
    • 已將 clock_nanosleepclock_settime 新增至 API 級別 21。(問題 77372)
    • 已從所有架構中移除下列符號:get_malloc_leak_infofree_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_rdirname_r__isthreaded_flush_cache (mips64)。
    • 將下列函式從 32 位元架構中移除:__signalfd4
    • 已將下列函式中的第三個引數類型從 size_t 變更為 intstrtoll_lstrtoull_lwcstoll_lwcstoull_l
    • 已將下列函式還原至 64 位元架構:arc4randomarc4random_bufarc4random_uniform
    • 已將 cxa_* 以及 newdelete 運算子移回 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.hinclude-fixed/linux/compiler.h 標頭。 (問題 73728)
  • 已修正在 Mac OS X 上使用 GCC 4.8 時發生的 -flto 相關問題。錯誤訊息如下:
  • .../ld: error: .../libexec/gcc/arm-linux-androideabi/4.9/liblto_plugin.so
    Symbol not found: _environ
    
  • 已修正 build-binary.mk. 中的錯字 (問題 76992)
重要已知問題:
  • 在 GCC4.9 中指定 -Os (-fauto-profile) 可能會導致當機。 (問題 77571)
重要事項:
  • 由於可下載套件設有 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 4.8/4.9 中的 gdb 7.6。(問題 7411274371。)
  • 已修正 x86 的 GCC 4.8/4.9,這樣就會預設停止啟用 -msse4.2-mpopcnt (問題 73843。)
其他錯誤修正:
  • 已從所有版本的 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 標頭進行下列修正:
    1. 已將下列函式新增至 ctype.hwchar.hdn_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() 函式。
    2. cmsg_nxthdr」已重新命名為「__cmsg_nxthdr」。
    3. 已移除__libc_malloc_dispatch
    4. 已將 ptrace() 原型變更為 long ptrace(int, ...);
    5. 已移除sha1.h
    6. 已延長 android/dlext.h 中的 android_dlextinfo
    7. 已針對 stdlib.htime.hwchar.hcomplex.h 中接收或傳回浮點型或雙精度類型值的函式,為 __NDK_FPABI__ 加上註解。
其他變更:
  • 已更新 mipsel-linux-android-4.9mips64el-linux-android-4.9,實作新的 multilib 目錄版面配置,並支援 gdb-7.7
  • 已增強 cpu-features 功能,以便偵測更多 arm64 功能。(變更清單 100339。)
重要變更:
  • 已新增 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_ABIall32all64 設定。
      • 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.84.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 宣告:
  • llvm-3.2/llvm/include/llvm/MDBuilder.h:64: llvm::MDNode* llvm::MDBuilder::createBranchWeights(llvm::ArrayRef): Assertion Weights.size() >= 2 && "Need at least two branch weights!" (問題 57381)。
  • 已修正下列 Clang 3.3/3.4 當機問題:
  • 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)。
其他錯誤修正:
  • 已修正標頭:
    • 已將 32 位元 ssize_t 修正為 int,而不是 long int
    • 已修正 WCHAR_MINWCHAR_MAX,以便依據執行這些程式碼的架構使用適當符號:
      • X86/MIPS:有符號。
      • ARM:無符號。
      • 如要強制 X86/MIPS 預設為無符號,請使用 -D__WCHAR_UNSIGNED__
      • 如要強制 wchar_t 為 16 位元,請使用 -fshort-wchar
    • 已從 32 位元 libc.so 中移除不存在的符號,並已新增適用於 Android API 級別 12 以上級別的 pread64pwrite64ftruncate64 (問題 69319)。詳情請參閱 Android 開放原始碼計畫變更清單 94137 中的相關修訂訊息。
  • 已修正有關重新定義 putchar 的 GCC 警告。警告訊息如下所示:
  • include/stdio.h:236:5: warning: conflicts with previous declaration here [-Wattributes] int putchar(int); (變更清單 91185)。
  • 已修正 make-standalone-toolchain.sh --stl=libc++,使其可以:
    • 複製 cxxabi.h (問題 68001)。
    • 在 NDK 安裝目錄以外的目錄中執行。(問題 6769068647)。
  • 已修正 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 無法同時存在。
其他變更:
  • 已將 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
重要變更:
  • 已新增 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 指令碼時,請將 針對 armeabi-v7a 目標指定下列選項:
      TARGET_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1
      TARGET_LDFLAGS += -Wl,--no-warn-mismatch -lm_hard
      已建構的程式庫將複製到 libs/armeabi-v7a。想著 會正常運作,您無法同時指定 armeabi-v7aarmeabi-v7a-hard 做為目標 (即 APP_ABI= 行)。 這種做法會造成系統忽略其中一項。請注意,APP_ABI=all 仍等於 armeabi armeabi-v7a x86 mips
    • make-standalone-toolchain.sh 指令碼會複製 /hard 目錄中的其他程式庫。已將上述 CFLAGSLFLAGS 新增至 makefile,使 GCC 或 Clang 能夠連結到 /hard 中的程式庫。
  • 已新增 yasm 組合器,以及適用於 x86 目標的 LOCAL_ASMFLAGSEXPORT_ASMFLAGS 標記。ndk-build 指令碼會使用 prebuilts/*/bin/yasm* 建構具有 .asm 副檔名的 LOCAL_SRC_FILES
  • 已將 MClinker 更新為 2.6.0,而這個版本已新增 -gc-sections 支援。
  • 已新增實驗性 libc++ 支援功能 (上游 r201101)。如要使用這項新功能,請按照下列步驟操作:
    • Application.mk 中新增 APP_STL := c++_staticAPP_STL := c++_shared。 您可以透過 LIBCXX_FORCE_REBUILD := true 從來源進行重新建構
    • 執行 make-standalone-toolchain.sh --stl=libc++,使用 libc++ headers/lib 建立獨立工具鏈。
    詳情請參閱 CPLUSPLUS-SUPPORT.html。 (問題 36496)
重要錯誤修正:
  • 已修正 GCC 4.6/4.8 ARM EABI 非預期例外狀況處理常式擲回的未捕獲問題。(GCC 問題 59392)
  • 已修正 GCC 4.8,現在可以針對包含依附元件、非類型範本引數的範本正確解析局部特化。(GCC 問題 59052)
  • 已向先行建構的 Python 新增更多模組 (問題 59902):
    • Mac OS X:zlibbz2_curses_curses_panel_hashlib_ssl
    • Linux:zlibniscrypt_curses_curses_panel
  • 已修正 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_OnLoadJNI_OnUnload。請注意,JNICALL 定義為 __NDK_FPABI__。詳情請參閱 sys/cdefs.h
    • 已更新下列標頭,現在無須手動加入其依附元件即可加入這些標頭 (問題 64679):
    • 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
    • 已為所有架構新增 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 及以上級別將 scalblnscalblnfscalblnl 新增至 x86 libm.so
    • 已修正 sources/android/support/include/iconv.h 中的錯字。 (問題 63806)
  • 已修正呼叫 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 指令碼的速度。

這是一個僅修正錯誤的版本。

重要錯誤修正:
  • 已修正 GCC 4.8 ARM 中太早還原堆疊指標的問題。這個問題會阻止頁框指標穩定存取堆疊框架中的變數。(GCC 問題 58854)
  • 已修正有關 GCC 4.8 libstdc++ 的問題:std::nth_element 中的錯誤導致系統產生程式碼時發生隨機分段錯誤 (問題 62910)。
  • 已修正 cc1/cc1plus 中的 GCC 4.8 ICE, -fuse-ld=mcld,以確保不再發生下列錯誤:
    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_HRCLOCK_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 包含絕對路徑時,Windows cmd.exe 中發生 ndk-build.cmd 失敗 (問題 69992)。
  • 已修正 ndk-stack 指令碼,現在即使因為找不到日常安排、檔案名稱或行號而無法剖析頁框,這個指令碼亦可繼續執行。無論哪種情況都會輸出 ??
  • 已修正 windows-x64_64 目標的 ndk-stack 堆疊,使其不再錯將頁框行與 stack: 區段中不含 pceipip 的行進行比對。例如:
    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 API 級別 18 及以下所有級別更新 include/android/*hmath.h,包括新增 13、15、16 和 17 級別。 如要瞭解已新增的 API,請參閱變更 68012 和變更 68014 的修訂訊息 (問題 471505852838423)。
  • 已新增針對 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_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
    
    若需更多資訊,請參閲 GCC 與語言無關聯
  • 已新增兩個範例來示範 OpenGL ES 3.0 功能:Teapot 和 MoreTeapots。這些範例可以在搭載 Android 4.1 (API 級別 16) 及以上版本的裝置上執行。
  • 已淘汰 GCC 4.7 和 Clang 3.2 支援,並將在下一個版本中將其移除。
重要錯誤修正:
  • 已修正 ARM GCC 4.6 thumb2 無法產生 16 位元相對跳轉表格的問題。(GCC 問題)
  • 已修正 g++.dg/cpp0x/lambda/lambda-defarg3.C 上的 GCC 4.8 內部編譯器錯誤 (ICE)。 (變更 62770GCC 問題)
  • 已修正 Windows 32 位元 *-gdb.exe 執行檔無法啟動的問題 (問題 58975)。
  • 已修正建構項目符號資料庫時的 GCC 4.8 ICE 問題。錯誤訊息如下:
    internal compiler error: verify_flow_info failed
    (問題 58916GCC 問題)
  • 已修改 GDB/ARM 版本,以便針對前列程式碼的展開不使用 ARM.exidx 資料,並已新增指令 (set arm exidx-unwinding),以便控制 exxx 為基礎的堆疊展開 (問題 55826)。
  • 已修正不正確地重複使用 HI 和 LO 註冊的 Clang 3.3 MIPS 編譯器問題。
  • 已修正 dbx_reg_number 中的 MIPS 4.7 ICE 問題。錯誤訊息如下: 如下:
    external/icu4c/i18n/decimfmt.cpp:1322:1:
    internal compiler error: in dbx_reg_number, at dwarf2out.c:10185
    
    (GCC 修補程式)
其他錯誤修正:
  • 標頭修正
    • 已根據規範 (X86/MIPS 版本有符號),將 ARM WCHAR_MINWCHAR_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 標頭中移除不存在的 imaxabsimaxdiv 函式。
    • 已修正 pthread_exit() 傳回值和 pthread_self() 的問題 (問題 60686)。
    • 已新增缺少的 mkdtemp() 函式,這個函式已存在於 bionic 標頭 stdlib.h 中。
  • 已修正在 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-instructionsfenv 的測試。
  • 已修正 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_CONLYFLAGSAPP_CONLYFLAGS,用於指定僅適用於 C 而不適用於 C++ 的選項。現有的 LOCAL_CFLAGSAPP_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%。
重要變更:
  • 已新增針對 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_LDFLAGSAPP_LDFLAGS 中新增 -fuse-ld=mcld,才能啟用 MCLinker。
  • 已新增可輸出 ELF 程式庫依附元件的 ndk-depends 工具。詳情請見 NDK-DEPENDS.html (問題 53486)。
重要錯誤修正:
  • 已修正 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.solibc.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 pcblx pc Thumb 指示的 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_Exception gabi++ 大小修正為 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.3 stlport 編譯錯誤。 (問題 54426)
  • 已修正 awk 指令碼,以便處理在 Windows 上建立的 AndroidManifest.xml 檔案,這些檔案的結尾可能包含 \r 字元,並會導致建構錯誤 (問題 42548)。
  • 已修正 make-standalone-toolchain.sh 以便探測 prebuilts/ 目錄,進而偵測主機是 32 位元還是 64 位元。
  • 已修正 Clang 3.2 -integrated-as 選項。
  • 已修正 Clang 3.2 ARM EHABI 精簡模型 pr1pr2 處理常式資料。
  • 已新增 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_getHistorical API 系列,以便取得 const AInputEvent* motion_event (問題 55873)。
    • 已修正 malloc_usable_size,以便取得 const void* (問題 55725)。
    • 已修正 stdint.h,提升與 C99 的相容性 (變更 46821)。
    • 已修改 wchar.h,以便重新定義 WCHAR_MAXWCHAR_MIN
    • 已修正指標相關 PRISCN 巨集的 <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= 選項能夠建立 clangclang++ 以及 $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 位元組物件,並發出 ldc1sdc1 指令來移動物件。如果您的應用程式使用自訂分配器,但又不像預設分配器一樣始終與新物件的 8 位元組邊界對齊,則應用程式可能會因為在未對齊的記憶體上執行 ldc1sdc1 而發生當機。在這種情況下,請使用 -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_clockis_monotonic 已分別重新命名為 steady_clockis_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/libslibraries/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,您就會收到警告。
重要變更:
  • 已新增 64 位元主機工具鏈集 (套件名稱字尾是 *-x86_64.*)。詳情請參閱 CHANGES.HTMLNDK-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_LIBRARIESLOCAL_WHOLE_STATIC_LIBRARIESLOCAL_SHARED_LIBRARIES 中指定的程式庫。詳情請見 CHANGES.HTML (問題 39378)。
重要錯誤修正:
  • 已修正建構指令碼,在 -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.cdistance_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_udata2DW_EH_PE_udata4DW_EH_PE_udata8) 時發生的 STLport 總線錯誤。
  • 已修正 nothrow new[] 運算子的 Gabi++ 無限遞迴問題 (問題 52833)。
  • 已修正 Gabi++ 對例外狀況處理常式指標的錯誤偏移問題 (變更 53446)
  • 已移除 Gabi++ 對例外狀況物件的冗餘釋放 (變更 53447)
其他錯誤修正:
  • 已修正 NDK 標頭:
    • 已移除 size_tssize_tptrdiff_t 的冗餘定義。
    • 已修正 MIPS 和 ARM fenv.h 標頭。
    • 已修正 stddef.h,不會再重新定義已存在於工具鏈中的 offsetof
    • 已修正 elf.h,以便加入 Elf32_auxv_tElf64_auxv_t (問題 38441)。
    • 已修正 OpenSLES_AndroidConfiguration.h 標頭檔案中的 #ifdef C++ 定義 (問題 53163)。
  • 已修正 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 編譯器中的 clangclang++ 指令碼,方便偵測 -cc1,並在找到這個程式碼後不指定 -target
  • 已修正 ndk-build,以便觀察 Application.mk 中設定的 NDK_APP_OUT
  • 已修正 X86 libc.solib.a,這兩個程式碼之前缺少已在 setjmp.h 中宣告的 sigsetjmpsiglongjmp 函式 (問題 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=pentiumprogeneric 變更為 i686atom
  • 已加強工具鏈建構指令碼:
    • 已修正 build-gcc.shmingw 建構類型的競爭狀況,這個類型會導致平行處理大量建構程序失敗。
    • 已更新 build-gabi++.shbuild-stlport.sh,這些現在可以從 NDK 套件執行 (問題 52835)。
    • 已修正 MSys 公用程式集合中的 run-tests.sh
    • 已改善 64 位元主機工具鏈和 Canadian Cross 建構支援。
    • 已將 build-mingw64-toolchain.sh 指令碼更新為較新版本。
    • 已新增建構 libgnustl_static.astlport_static.a 的選項,且沒有隱藏瀏覽權限。
重要變更:
  • 已將 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)
重要錯誤修正:
  • 已修正使用 ndk-build 指令碼時不需要重新建構物件檔案的問題 (問題 39810)。
  • 已修正 Mac OS X 10.6.x 適用的 NDK 8c 版本的連結器故障,這個故障會產生 下列錯誤:
    dyld: lazy symbol binding failed: Symbol not found: _memmem
    Referenced from: ...../arm-linux-androideabi/bin/ld
    Expected in: /usr/lib/libSystem.B.dylib
    此問題是由於在 Mac OS X 10.7 上進行建構所引起,而這會產生了 與 Mac OS 10.6.x 和 NDK 不相容。
  • 已從 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.hdirent.h 中的標頭。
    • 已修正 limits.h,加入可提供 PAGE_SIZE 設定的 page.h (問題 39983)。
    • 已將 glGetAttribLocation()glGetUniformLocation() 的傳回類型從 int 修正為 GLint
    • 已修正適用於 x86 建構作業的 __BYTE_ORDER 常數 (問題 39824)。
  • 已修正 ndk-build 指令碼,以便建構 ARM 時不會以 -O2 覆寫 -Os
  • 已修正建構指令碼,以允許覆寫 HOST_AWKHOST_SEDHOST_MAKE 設定。
  • 已修正在 fsck_msdos 建構系統上連結由 Intel C/C++ 編譯器 (ICC) 建構的物件時發生的 ld.gold 問題。
  • 已修正 Clang 中的 ARM EHABI 支援,以符合規範。
  • 已修正 GNU Debugger (GDB),以縮短在 solib 事件期間遍歷目標連結對應所花費的時間 (問題 38402)。
  • 已修正連結共用程式庫時缺少的 libgcc.a 檔案。
其他變更:
  • 已將 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/ 中。
重要變更:
  • 已將 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 中的 CCCXX 替換為 <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_PLATFORMproject.propertiesdefault.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 選項。
重要錯誤修正:
  • 已修正以下問題:透過 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++ 檔案,然後再新增要編譯的 STL header/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 發生的 GNU stdc++ 編譯問題 (問題 35616)。
    • 已修正「unresolvable R_ARM_THM_CALL relocation」錯誤 (問題 35342)。
    • 已修正 reload1.c:3633 位置發生的內部編譯器錯誤,原因是從 char 進行符號擴充時,ARM 後端預期的運算元類型不正確。 (GCC 問題 50099)
    • 已修正偏移量為負數時發生的內部編譯器錯誤 (GCC 問題)。
  • 已修正 X86 的 -fstack-protector,這也是 ndk-build x86 ABI 目標的預設設定。
  • MIPS 特定修正:
    • 已透過在編譯 MIPS libstlport_* 時將 _STLP_LITTLE_ENDIAN 設為 1,修正 STLport 位元組順序。
    • 已修正編譯 LLVM 時發生的 GCC __builtin_unreachable 問題。 (GCC 問題 54369)
    • 針對占用 100% CPU 的 cc1 編譯程序,向後移植了相關修正 (GCC 問題 50380)。
  • 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_addrLSB 而出現問題 (問題 37147)。
其他錯誤修正:
  • 已修正 NDK 標頭:
    • 已修正誤從原始核心中移除的 arch-mips/include/asm/* 程式碼 (變更 43335)。
    • 已將 linux/sysctl.hlinux/icmp.h 中的結構體成員資料 __unused 替換為 __linux_unused,以免與 sys/cdefs.h 中的 #define __unused 發生衝突。
    • 已修正 fenv.h 中封裝在 __BEGIN_DECLS__END_DECLS 內的 C 函式。
    • 已移除 malloc.h 中未實作的函式。
    • 已針對 ANSI 編譯器修正 uint64_tstdint.h 定義 (問題 1952)。
    • 已修正 <arch>/include/machine/* 中的預先處理器巨集。
    • 將 MIPS 的 link.h 替換成支援所有平台的新版本。
    • 已移除 linux-unistd.h
    • 已將 GLibc 專用的巨集 LONG_LONG_MINLONG_LONG_MAXULONG_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.6 libgcc.a 中引進的下列符號:__aeabi_idiv0__aeabi_ldiv0__aeabi_unwind_cpp_pr1__aeabi_unwind_cpp_pr2
  • 已移除 MIPS crt*_so.S 中未使用的 .ctors.dtors.eh_frame
  • 已更新 ndk-gdb,使其只使用 ndk-build DUMP_XXXX 輸出中的最後一行。這項變更可確保 Application.mkAndroid.mk$(info ...) 語法輸出內容時,對應內容不會插入到 DUMP_XXXX 的結果中。 (更多資訊)
其他變更:
  • 已從 platforms/android-[3,4,5,8] 中移除 arch-x86arch-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-7
    • native-activity 從 android-9 到 android-10
    • native-audio 從 android-9 到 android-10
    • native-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.shstandalone/run.sh。即使不使用 --abi 選項,run-tests.sh 指令碼仍可執行,且已經過增強,可為所有支援的 ABI 編譯大部分測試,並在所有連接裝置上執行。

這個版本的主要功能為新的 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 問題。
重要變更:
  • 已新增 GCC 4.6 工具鏈 (具備 goldbinutils 2.21 和 GDB 7.3.x),以與原始 GCC 4.4.3 工具鏈 (binutils 2.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) 系統映像檔中的二進位檔。
    • binutils 2.21 ld 工具包含從 2.22 版向後移植的修正:
      • 已修正 ld --gc-sections,之前會錯誤保留針對外部資料庫的廢止參照 (更多資訊)。
      • 已修正 ARM strip 指令,以保留 GNU_RELRO 區段中原始的 p_alignp_flags (如果有效)。如果沒有這項修正,系統將無法對使用 -fPIE 建構的程式進行偵錯 (更多資訊)。
    • 已停用 sincos() 最佳化功能,以因應與舊版平台的相容性。
  • 已更新建構選項,以便預設啟用從不執行 (NX) 位元和 relro/bind_now 保護措施:
    • 已將 --noexecstack 新增至組合器,並將 -z noexecstack 新增至連接器,藉由在堆疊和堆積中啟用 NX 位元來提供 NX 保護措施,以防範緩衝區溢位攻擊。
    • -z relro-z now 新增至連結器,以加強內部資料區段的安全性,預防受到記憶體損毀而導致的安全漏洞。(更多資訊:12)
    • 您可以透過下列選項停用這些功能:
      1. 設定組合器的 --execstack 選項和連接器的 -z execstack,即可停用 NX 保護措施。
      2. 設定連接器的 -z norelro-z lazy 選項,即可停用內部資料的強化作業。
      3. 透過設定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 */
    }
其他錯誤修正:
  • 已修正 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-jnitwo-libs 中錯誤的套件名稱,以使該範例下的 tests 專案能夠編譯。
其他變更:
  • 已變更二進位檔的位置:
    • 已將 gdbservertoolchain/<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++/includelib 移至 sources/cxx-stl/gnu-libstdc++/4.6,或已在使用 GCC 4.4.3 進行編譯時,將其移至 sources/cxx-stl/gnu-libstdc++/4.4.3
    • 已將 libbfd.alibintl.alib/ 移至 lib32/
  • 在重新建構和測試 NDK 工具鏈中新增和改善各種指令碼:
    • 已新增 build-mingw64-toolchain.sh,以產生新的 Linux 託管工具鏈,用於產生 Win32 和 Win64 執行檔。
    • 已透過使用 clone 指令,且只針對建構 NDK 工具鏈二進位檔所需的目錄使用 checkout,加快 download-toolchain-sources.sh 的速度。
    • 已新增 build-host-gcc.shbuild-host-gdb.sh 指令碼。
    • 已新增 tests/check-release.sh,以檢查指定 NDK 安裝目錄的內容,或是現有的 NDK 套件。
    • 已重新編寫 tests/standalone/run.sh 獨立測試。
  • 已從所有平台和架構中移除 if_dl.h 標頭。這個標頭所描述的 AF_LINKsockaddr_dl 元素是 BSD 專用的 (亦即不存在於 Linux)。

這個版本的 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 架構編譯的程式庫時,才允許繼續安裝。

重要錯誤修正:
  • 已修正 GAbi++ 實作中的錯字,導致基礎類別物件 bdynamic_cast<D>(b) 結果與衍生類別 D 的結果誤以與基礎類別相反的方向進行調整 (問題 28721)。
  • 已修正 make-standalone-toolchain.sh 無法複製 libsupc++.* 的問題。
其他錯誤修正:
  • 已修正 ndk-build.cmd,確保即使使用者重新定義 SHELL 環境變數,ndk-build.cmd 也可正確運作;這個變數可在 Windows 環境中安裝各種開發工具時變更。

這個 NDK 版本包含針對 Tegra2 型裝置進行的重要修正,以及一些額外修正及改善:

重要錯誤修正:
  • 已修正 GNU STL armeabi-v7a 二進位檔,以避免非 NEON 裝置不會當機。NDK r7b 提供的檔案並經正確設定,因此在 Tegra2 型裝置和其他裝置上嘗試使用特定浮點函式 (例如:cosfsinfexpf) 時發生當機。
重要變更:
  • 已透過 NDK_OUT 環境變數新增對自訂輸出目錄的支援。定義後,這個變數就會儲存所有產生的中間檔案,而非 $PROJECT_PATH/objndk-gdb 也能辨識這個變數。
  • 現支援建構內含數百或數千個源檔案的模組,只需在 Android.mk 中將 LOCAL_SHORT_COMMANDS 定義為 true

    這項變更將強制 NDK 建構系統把大部分連接器或封存選項加入清單檔案,做為解決指令列長度限制的方法。 詳情請參閱 docs/ANDROID-MK.html

其他錯誤修正:
  • 已修正 cpufeatures 輔助程式庫中的 android_getCpuCount() 實作。在系統動態啟用核心的某些裝置上,先前的實作項目會在首次呼叫函式時回報「有效」核心總數,而非「實際存在」的核心總數

這個 NDK 版本包含針對原生 Windows 版本和 Cygwin 的多項修正,以及許多其他改善:

重要錯誤修正:
  • 已更新 sys/atomics.h,避免某些採用 ARM 型架構的裝置發生正確性問題。使用這個版本的 NDK 重新建構未經修改的源程式碼,應該便可完全消除這個問題。 詳情請參閱 docs/ANDROID-ATOMICS.html
  • 已還原為 binutils 2.19 版,以修正 NDK r7 中發生的偵錯問題 (已改用 binutils 2.20.1)。
  • 已修正 32 位元 Linux 上的 ndk-build。封裝錯誤會將 64 位元版本的 awk 執行檔置於 NDK r7 中的 prebuilt/linux-x86/bin 下。
  • 已修正原生 Windows 版本 (ndk-build.cmd)。其他建構模式則不受影響。修正包括:
    • 已解決嘗試從專案路徑以外的目錄 (例如,當中的任何子目錄) 呼叫 ndk-build.cmd 時發生的無限循環/堆疊溢位錯誤。
    • 已修正自動產生的依附元件檔案遭到忽略的問題。也就是說,更新標頭並不會對包含該標頭的來源程式碼觸發重新編譯作業。
    • 之前系統無法正確處理檔案或路徑中的特殊字元 (空格和引號除外),此問題現已修正。
  • 已修正獨立工具,確保使用 -lstdc++ 時可產生適當的二進位檔 (即與 GNU libstdc++ 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
    • 已改善對 IsNANorINFIsINFIsNegNAN 等程式碼的處理方式。

    如需完整詳細資料,請參閱修訂版本記錄。

  • STLport:已從程式庫中移除 5 個不必要的靜態初始化器。
  • armeabi-v7a 的 GNU libstdc++ 程式庫錯誤地對 armeabi 程式庫進行編譯。這項變更不會影響正確性,不過使用正確的 ABI 應可稍微提高效能。
  • cpu-features 輔助程式庫已更新,可回報三個選用 x86 CPU 功能 (SSSE3MOVBEPOPCNT)。詳情請參閱 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:ndk-build 不會嘗試將 $NDK/prebuilt/windows/bin 內建的原生 Windows 工具與特定版本的 Cygwin 和/或 GNU Make 搭配使用。

這個 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.htmlhttp://www.khronos.org/openmax/
    • 已更新符合 Khronos Group OpenSL ES 1.0.1 標準的原生音訊 API。使用 API 級別 14 時,可將經過壓縮的音訊 (例如 MP3、AAC、Vorbis) 解碼為 PCM。詳情請參閱 docs/opensles/index.htmlhttp://www.khronos.org/opensles/
  • 新增 CCache 支援。如要加快大型重新建構的速度,請將 NDK_CCACHE 環境變數定義為 ccache (或 ccache 二進位檔的路徑)。宣告時,NDK 建構系統會在編譯任何來源檔案時自動使用 CCache。例如:
    export NDK_CCACHE=ccache
    

    注意:CCache 並未包含在 NDK 版本中,因此您必須先安裝此項目才能使用。如要進一步瞭解 CCache,請參閱 http://ccache.samba.org

  • 現支援將 APP_ABI 設為 all,以指出您要為指定 NDK 版本支援的所有 ABI 建構 NDK 模組。也就是說,在 Ad Exchange 報表中 這個版本與 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.htmldocs/CPLUSPLUS-SUPPORT.html
  • 已縮短在建構指令中使用的源檔案和物件檔案路徑。從專案路徑叫用 $NDK/ndk-build 時,傳送到建構命令的源檔案路徑、對象檔案路徑和二進位檔案路徑現已大幅縮短,因為這些路徑以相對於當前目錄的方式進行傳送。這對建構具有大量來源檔案的專案來說十分有用,可避免超過主機作業系統所支援的指令列長度上限。如果從專案樹狀結構的子目錄叫用 ndk-build,或定義 NDK_PROJECT_PATH 指向特定目錄,則行為維持不變。
實驗功能
您現在「不必」使用 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.solibbar.so 都會複製到安裝位置。過去,除非在 APP_MODULES 中一併列出 bar,否則系統只會複製 libfoo.so。如果明確定義 APP_MODULES,行為會維持不變。
  • ndk-gdb 現可正確處理 MAIN 意圖篩選器中具有多個類別的活動。
  • 靜態程式庫匯入作業現已可正確轉換。舉例來說,如果頂層模組 foo 匯入靜態程式庫 bar,而後者匯入靜態程式庫 zoo,則 libfoo.so 會同時連結至 libbar.alibzoo.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.cppbar.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_object
    • GL_OES_EGL_image_external
    • GL_APPLE_texture_2D_limited_npot
    • GL_EXT_blend_minmax
    • GL_EXT_discard_framebuffer
    • GL_EXT_multi_draw_arrays
    • GL_EXT_read_format_bgra
    • GL_EXT_texture_filter_anisotropic
    • GL_EXT_texture_format_BGRA8888
    • GL_EXT_texture_lod_bias
    • GL_IMG_read_format
    • GL_IMG_texture_compression_pvrtc
    • GL_IMG_texture_env_enhanced_fixed_function
    • GL_IMG_user_clip_plane
    • GL_IMG_multisampled_render_to_texture
    • GL_NV_fence
    • GL_QCOM_driver_control
    • GL_QCOM_extended_get
    • GL_QCOM_extended_get2
    • GL_QCOM_perfmon_global_mode
    • GL_QCOM_writeonly_rendering
    • GL_QCOM_tiled_rendering
    GLES 2.0
    • GL_OES_element_index_uint
    • GL_OES_get_program_binary
    • GL_OES_mapbuffer
    • GL_OES_packed_depth_stencil
    • GL_OES_texture_3D
    • GL_OES_texture_float
    • GL_OES_texture_float_linear
    • GL_OES_texture_half_float_linear
    • GL_OES_texture_npot
    • GL_OES_vertex_array_object
    • GL_OES_EGL_image_external
    • GL_AMD_program_binary_Z400
    • GL_EXT_blend_minmax
    • GL_EXT_discard_framebuffer
    • GL_EXT_multi_draw_arrays
    • GL_EXT_read_format_bgra
    • GL_EXT_texture_format_BGRA8888
    • GL_EXT_texture_compression_dxt1
    • GL_IMG_program_binary
    • GL_IMG_read_format
    • GL_IMG_shader_binary
    • GL_IMG_texture_compression_pvrtc
    • GL_IMG_multisampled_render_to_texture
    • GL_NV_coverage_sample
    • GL_NV_depth_nonlinear
    • GL_QCOM_extended_get
    • GL_QCOM_extended_get2
    • GL_QCOM_writeonly_rendering
    • GL_QCOM_tiled_rendering
    EGL
    • EGL_ANDROID_recordable
    • EGL_NV_system_time

相較於 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_tsize_t 與 x86 獨立工具鏈搭配使用時,兩者在 x86 特定系統中的定義。

這個版本的 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
其他變更:
arm-eabi-4.4.0 自 NDK r5 起已淘汰,並已從 NDK 發布版本中移除。

相較於 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 檔案正常) 的錯誤。

相較於 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++。
  • 已修正下列 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_NODELOCALIN6_IS_ADDR_MC_GLOBAL 宣告新增至 <netinet/in6.h>
  • <asm/byteorder.h> 中的「asm」已替換為「__asm__」,以便使用 -std=c99 進行編譯。

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-plasmanative-activity,以示範如何編寫原生活動。
  • 加入許多錯誤修正和其他小改善。如需詳細的變更清單,請參閱 docs/CHANGES.html。
NDK r4b 注意事項:

修正 NDK 建構系統和偵錯指令碼中的數個問題。如果您使用的是 NDK r4,建議下載 NDK r4b 版本。如要進一步瞭解這個版本的變更,請參閱已下載 NDK 套件隨附的 CHANGES.TXT 文件。

一般注意事項:
  • 透過新的 ndk-build 建構指令提供簡化的建構系統。
  • 透過新的 ndk-gdb 指令,支援在正式版裝置上對產生的機器碼進行簡易原生偵錯。
  • 針對以 ARM 為基礎的 CPU 架構 armeabi-v7a,新增 Android 專用 ABI。新 ABI 可以擴充現有的 armeabi ABI,以便加入以下 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。
一般注意事項:
  • 新增 OpenGL ES 2.0 原生程式庫支援。
  • 新增範例應用程式 (hello-gl2),演示如何使用 OpenGL ES 2.0 頂點和 fragment 著色器。
  • 使用 GCC 4.4.0 重新整理了這個版本的工具鏈二進位檔,其產生的程式碼應該比先前的版本 (4.2.1) 更精簡且更高效。NDK 還會提供 4.2.1 二進位檔,您可以視需要選用這些二進位檔建構機器程式碼。

最初發布為「Android 1.6 NDK,第 1 版」。

一般注意事項:
  • 新增 OpenGL ES 1.1 原生程式庫支援。
  • 新增範例應用程式 (san-angeles),以便透過原生 OpenGL ES API 算繪 3D 圖形,同時透過 GLSurfaceView 物件管理活動生命週期。

最初發布為「Android 1.5 NDK,第 1 版」。

一般注意事項:
  • 加入針對 ARMv5TE 指令的編譯器支援 (GCC),包括 Thumb-1 指令。
  • 加入針對穩定原生 API 系統、說明文件和範例應用程式的系統標頭。