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 进行构建,则需要移除该标志。如需了解如何使汇编与 LLVM 兼容,请参阅 Clang 迁移说明
  • GDB 已被移除。请改用 LLDB。请注意,ndk-gdb 默认使用 LLDB,而 Android Studio 只支持 LLDB。
  • Jelly Bean(API 16、17 和 18)不再受支持。NDK 支持的最低操作系统是 KitKat(API 级别 19)。
  • 非 Neon 设备不再受支持。极少数非常旧的设备不支持 Neon。因此,除了性能得到提升之外,大多数应用都不会注意设备是否支持 Neon。
  • 移除了 RenderScript 构建支持。Android 12 中废弃了 RenderScript。如果您尚未完成将您的应用迁离 RenderScript 的操作,可以使用 NDK r23 LTS。
变更记录
下载
  • 请从此处下载此版本。
通告
  • 移除了 GNU binutils(不包括 GNU 汇编器 [GAS])。GAS 将在下一版本中移除。使用 -fno-integrated-as 进行构建时,如果无法移除该标志,请提交 bug 报告。
  • 对 GDB 的支持已结束。GDB 将从下一个版本中移除。请改用 LLDB。请注意,ndk-gdb 默认使用 LLDB。
  • NDK r23 是支持非 Neon 设备的最后一个版本。从 NDK r24 开始,sysroot 中的 armeabi-v7a 库将使用 Neon 构建。极少数非常旧的设备不支持 Neon。因此,除了性能得到提升之外,大多数应用都不会注意设备是否支持 Neon。
  • 下一 NDK 版本将不支持 Jelly Bean(API 16、17 和 18)。NDK r24 支持的最低操作系统是 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 传递不存在的路径时,canonical 会成功,但这是错误情况。
变更记录
下载
  • 请从此处下载此版本。
通告
  • 不再支持 32 位 Windows。这不会影响绝大多数用户。如果您仍需要从 32 位版本的 Windows 构建 NDK 应用,请继续使用 NDK r20。

    如需详细了解 Android 开发者工具中的这一变更,请参阅有关该主题的博文

  • LLD 现已可供测试。AOSP 已改为默认使用 LLD,NDK 也将紧随其后进行改换(时间未定)。如需在您的应用中测试 LLD,请在建立链接时传递 -fuse-ld=lld。请注意,问题 843 会影响结合 LLD 使用 binutils strip 和 objcopy 的 build,而不会影响使用 llvm-strip 和 llvm-objcopy 的 build。
  • 旧版工具链安装路径将在未来版本中移除。自 NDK r19 起,这些路径就已过时,且在 NDK 中占用了相当大的空间。要移除的路径为:
    • platforms
    • sources/cxx-stl
    • sysroot
    • toolchains(toolchains/llvm 除外)
    一般情况下,此变更只会影响构建系统维护者或使用非最新版构建系统的人员,而不会影响 ndk-build 和 CMake 工具链用户以及 make_standalone_toolchain.py 用户(尽管从 r19 开始就不需要该脚本)。如需了解如何从旧版工具链布局中迁出,请参阅您所使用的 NDK 版本的构建系统维护人员指南
  • 从 2019 年 8 月开始,在您上传 APK 时,Play 商店会要求支持 64 位。请立即开始移植,以免到时出现意外。如需了解详情,请参阅此博文
  • 现在,您可以从我们的 Wiki 和网站下载已签名并公证的 macOS App Bundle。请注意,由于只有 App Bundle 可以使用 RPATH 和通过公证,因此适用于 macOS 的传统 NDK 软件包无法获得公证。SDK 将继续使用传统软件包,原因在于 App Bundle 需要更改布局,这会使其与 Android Studio 不兼容。通过 SDK 管理器下载此类 NDK 时,NDK 不会被隔离,因此目前 Gatekeeper 允许使用该 NDK。目前,对于适用于 macOS 的 NDK,通过 SDK 管理器获取是最可靠的方式。
变更记录
下载
  • 请从此处下载此版本。
通告
  • LLD 现已可供测试。AOSP 正在改为默认使用 LLD,NDK 也将紧随其后进行改换(时间未定)。请在建立链接时传递 -fuse-ld=lld,以在您的应用中测试 LLD。
  • 从 2019 年 8 月开始,在您上传 APK 时,Play 商店会要求支持 64 位。请立即开始移植,以免到时出现意外。如需了解详情,请参阅此博文
  • 添加了 Android Q API。
变更记录
下载
  • 请从此处下载此版本。
通告
  • 开发者应开始对其应用进行 LLD 方面的测试。AOSP 已改为默认使用 LLD,并且在下一版本中,NDK 也将默认使用 LLD。如果 LLD 经历了一个版本周期(预计为 r21)而没有出现未解决的重大问题,则 BFD 和 Gold 将被移除。请在建立链接时传递 -fuse-ld=lld,以在您的应用中测试 LLD。注意:lld 目前在 Windows 上不支持压缩符号。问题 888。Clang 也无法在 Windows 上生成压缩符号,在使用通过 Darwin 或 Linux 构建的工件时,这可能会成为一个问题。
  • 从 2019 年 8 月开始,在您上传 APK 时,Play 商店会要求支持 64 位。请立即开始移植,以免到时出现意外。如需了解详情,请参阅此博文
  • 问题 780:现在不需要独立工具链。Clang、binutils、sysroot 以及其他工具链组件现已全部安装到 $NDK/toolchains/llvm/prebuilt/<host-tag>,并且 Clang 会自动寻找它们。请直接从 NDK 调用编译器,而不是为 API 26 ARM 创建独立的工具链:
    $ $NDK/toolchains/llvm/prebuilt//bin/armv7a-linux-androideabi26-clang++ src.cpp
               
    对于 r19,该工具链也安装到了旧路径,以便构建系统有机会适应新的布局。旧路径会在 r20 中移除,而 make_standalone_toolchain.py 脚本不会移除。现已不需要此脚本,并且它会发出包含上述信息的警告,但此脚本会保留下来以维持现有工作流。如果您使用的是 ndk-build、CMake 或独立工具链,那么您的工作流应该不会出现任何变化。这项变更对于第三方构建系统的维护者来说非常有用,他们现在应该能够删除一些 Android 专用代码。如需了解详情,请参阅构建系统维护者指南。
  • 移除了 ndk-depends。若要解决旧版 Android 上的原生库加载问题,我们认为 ReLinker 是一个更好的解决方案。
  • 问题 862:移除了重定向到 Clang 的 GCC 封装容器脚本,因为它们在功能方面有所不足,无法用作替代方案。
变更记录
下载
  • 请从此处下载此版本。
通告
  • 移除了 GCC。
  • LLD 现已可供测试。AOSP 正在改为默认使用 LLD,NDK 也将紧随其后进行改换(时间未定)。请在建立链接时传递 -fuse-ld=lld,以在您的应用中测试 LLD。
  • 移除了 gnustl、gabi++ 和 stlport。
  • 取消了对 ICS(android-14 和 android-15)的支持。使用可执行文件的应用无需再同时提供 PIE 和非 PIE 可执行文件。
  • 从 2019 年 8 月开始,在您上传 APK 时,Play 商店会要求支持 64 位。请立即开始移植,以免到时出现意外。如需了解详情,请参阅此博文
变更记录
下载
  • 请从此处下载此版本。
通告
  • GCC 不再受支持,且将在 NDK r18 中移除。
  • 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 月开始,在您上传 APK 时,Play 商店会要求支持 64 位。请立即开始移植,以免到时出现意外。如需了解详情,请参阅此博文
变更记录
下载
  • 请从此处下载此版本。
通告
  • 移除了弃用的头文件。统一头文件现已简化为“头文件”。如需迁移提示,请参阅统一头文件迁移说明
  • GCC 不再受支持,虽然尚未从 NDK 中移除,但其已不再接收向后移植项。只有在 libc++ 足够稳定,可以成为默认 STL 之后,才能移除 GCC,因为 gnustl 的某些部分仍与 Clang 不兼容。当从 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 概览

如需详细了解此版本的新变化以及变更内容,请查看此变更记录

变更记录
下载
  • 请从此处下载此版本。
通告
  • 默认情况下会启用统一头文件。要了解如何使用这些头文件,请参阅统一头文件
  • 注意:已废弃的头文件会在即将发布的版本中移除。如果您遇到任何与这些头文件相关的问题,请提交 bug 报告

    如需迁移提示,请参阅统一头文件迁移说明

  • GCC 不再受支持,虽然尚未从 NDK 中移除,但其已不再接收向后移植项。只有在 libc++ 足够稳定,可以成为默认 STL 之后,才能移除 GCC,因为 gnustl 的某些部分仍与 Clang 不兼容。
  • 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 的有效支持。虽然尚未从 NDK 中移除 GCC,但其已不再接收向后移植项。由于 gnustl 的某些部分仍与 Clang 不兼容,因此只有在 libc++ 足够稳定,可以成为默认 STL 之后,才会完全移除 GCC。

如需详细了解此版本的新变化以及变更内容,请查看此变更记录

下载
  • 请从此处下载此归档版本。
通告
  • GCC 不再受支持,虽然尚未从 NDK 中移除,但其已不再接收向后移植项。只有在 libc++ 足够稳定,可以成为默认 STL 之后,才能移除 GCC,因为 gnustl 的某些部分仍与 Clang 不兼容。在此时间点之后,可能会将其移除。
  • 添加了 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+ 构建静态可执行文件期间,导致关联时缺少 atexit 的 crtbegin_static.o 问题:问题 132
  • 在 build/cmake/android.toolchain.cmake 中添加了 CMake 工具链文件。
已知问题
  • 此处并未详尽列出所有未解决的错误。
  • 使用 libc++ 和 GCC 的独立工具链不起作用。这似乎是 GCC 中的 bug。如需了解详情,请参阅提交消息
  • 尽管存在 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 中的一个 bug,它会导致针对使用 libc++ 的静态库发出错误警报。如需详细了解此变更,请参阅此处的注释。
  • 针对 android-24 更新了 OpenSLES 头文件。
NDK
  • 我们取消了对 armeabi-v7a-hard ABI 的支持。如需了解详情,请参阅此说明
  • 移除了 Gingerbread 之前的平台级别的所有 sysroot。我们在 r11 中就已不再为其提供支持,但并没有切实将其移除。
  • 在 ARM32 上使用 c++_shared 时进行的异常处理现在大多都能够正常完成。展开程序现在会链接到每个链接对象,而非链接到 libc++ 本身。如需详细了解此异常处理,请参阅已知问题
  • 删减了默认编译器标志。 (问题 27)。
    • 如需了解有关这些变更的完整信息,请参阅此变更列表
  • 添加了独立工具链的 Python 实现:build/tools/make_standalone_toolchain.py
    • Windows 用户不再需要 Cygwin 即可使用此功能。
    • 我们将在 r13 中移除 Bash 样式,因此请立即测试新类型。
  • 默认情况下,系统会为 Clang 调试版本启用 -fno-limit-debug-info。此变更应该可以改进 LLDB 的可调试性。
  • --build-id 现已默认处于启用状态。
    • 版本号现在会显示在原生代码崩溃报告中,以便您轻松地判断运行的是哪个代码版本。
  • NDK_USE_CYGPATH 应该不会再导致 libgcc 方面的问题。(Android 问题 195486
  • -Wl--warn-shared-textrel-Wl,--fatal-warnings 选项现已默认处于启用状态。如果您有共享的文本重定位,则您的应用无法在 Android 6.0(API 级别 23)或更高版本中加载。系统从未允许针对 64 位应用使用文本重定位。
  • 预编译头文件的效果应该会更好。(问题 14问题 16
  • 移除了无法访问的 ARM(非 Thumb)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 版本中存在的动态链接器 bug。
  • 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
  • 此变更记录并未详尽列出所有未解决的 bug。
下载
  • 请从此处下载此归档版本。
通告
  • 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 中就已不再为其提供支持,但没有切实将其移除。
  • 更新了在 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 作为默认选项。此选项会让标识符显示在原生代码崩溃报告中,以便您轻松地判断运行的是哪个代码版本。
  • 修复了 NDK_USE_CYGPATH 问题,使其不会再导致 libgcc 方面的问题(问题 195486)。
  • 启用了以下选项作为默认选项:-Wl,--warn-shared-textrel-Wl,--fatal-warnings。如果您有共享的文本重定位,则您的应用无法在 Android 6.0(API 级别 23)或更高版本中加载。请注意,系统从未允许针对 64 位应用使用此配置。
  • 修复了一些问题,以便让预编译头文件的效果更好(NDK 问题 14NDK 问题 16)。
  • 移除了无法访问的 ARM(非 Thumb)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 版本中存在的动态链接器 bug。
  • 修复了 NDK r11 的一个已知问题,即 dynamic_cast 无法与 Clang、x86、stlport_static 和优化策略配合使用。
GDB
  • 更新到了 GDB 7.11 版。如需详细了解此版本,请参阅 GDB 新闻
  • 修复了 ndk-gdb.py 脚本中的一些错误。
已知问题
  • x86 AddressSanitizer (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
  • 修复了将 cygpath 用于 libgcc 编译器的问题。(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 支持的 bug 修复。
Clang
  • 重要通告
    • 我们强烈建议改用 Clang。
      • 如果您遇到了 Clang 方面的问题,则对于 NDK 中特定于 Clang 的问题,请在此处提交 bug 报告。对于更常规的 Clang 问题,请按照此页面中的说明提交 bug 报告。
    • 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 开发者网站中提供。
  • 新增
    • android-23 添加了原生跟踪 API。
    • android-23 添加了原生多网络 API。
    • 从 API 级别 21 开始,启用了 libc、m 和 dl,以提供带版本编号的符号。
    • 向 API 级别 N 添加了 Vulkan 头文件和库。
  • 移除
    • 取消了对 _WCHAR_IS_8BIT 的支持。
    • 移除了 sed。
    • 移除了 mclinker。
    • 移除了 Perl。
    • 从所有版本的 NDK libc、m 和 dl 中移除了这些库的平台版本不支持的所有符号。
    • 部分取消了对 mips64r2 的支持。余下部分会在将来进行移除。
  • 其他变更
    • 将 ARM 独立工具链更改为默认使用 arm7。
      • 您可以恢复旧行为,只需将 -target 选项指定为 armv5te-linux-androideabi 即可。
    • 将构建系统更改为针对平台 include 文件使用 -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 的解决方法
  • 添加了 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 软件包。
重要的 bug 修复:
  • 修复了主线程外存在 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 指令集中没有对应的指令。
其他的 bug 修复:
  • 修复了以下头文件和库方面的问题:
    • 修复了 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
  • ndk-gdb 添加了 --package 命令行开关,以允许构建系统替换软件包名称。(问题 56189
  • 针对 MIPS 废弃了 -mno-ldc1-stc1。此选项可能无法与新的 -fpxx-mno-odd-spreg 选项配合使用,可能也无法与 FPXX ABI 配合使用。
  • cpu-features 添加了 MIPS MSA 和 R6 检测。
重要变更:
  • 已将 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 支持添加了 AddressSanitizer 功能。如需详细了解此变更,请参阅 AddressSanitizer 项目。
  • 从 API 级别 21 开始,引入了在构建时使用 -fPIE -pie 的要求。在 API 级别 16 及更高级别中,ndk-build 在编译时使用 PIE。此变更会产生诸多影响,我们在开发者预览问题 888中讨论了这些影响。这些影响不适用于共享库。
重要的 bug 修复:
  • 在 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
其他的 bug 修复:
  • 修复了以下头文件和库方面的问题:
    • 向 API 级别 16 添加了 posix_memalign。此外,还针对 API 级别 16 到 19,在 stdlib.h 中添加了原型。(问题 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
    • 您正在进行调试构建(使用 APP_OPTIM=debug 和包含 android:debuggable="true"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 发出的“需要可执行堆栈”警告。(问题 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 示例。
    • 查看从 ARM NEON 移植到 Intel SSE 的 Intel 指南。
  • 记录了在 headers/libs/android-21 中对 _FORTIFY_SOURCE 的支持,_FORTIFY_SOURCE 在 r10(当时 android-21 仍称为 Android-L)中就出现了,但未提供文档。
重要的 bug 修复:
其他的 bug 修复:
  • android-21 进行了以下头文件和库方面的修复:
    • 添加了更多 TV 键码:android/keycodes.h
    • android/sensor.h 添加了更多常量以及以下 6 个新的传感器函数:ASensorManager_getDefaultSensorExASensor_getFifoMaxEventCountASensor_getFifoReservedEventCountASensor_getStringTypeASensor_getReportingModeASensor_isWakeUpSensor
    • 修复了 stdatomic.h 以改进与 GCC 4.6 的兼容性,并提供对 <atomic> 头文件的支持。
    • 向所有 API 级别添加了 sys/ucontext.hsys/user.hsignal.h 头文件现在包含 <sys/ucontext.h>。您可以移除所有现有的 struct ucontext 定义。
    • 向 API 级别 17、18 和 19 添加了 posix_memalign
    • 向所有架构添加了以下函数:android_set_abort_messageposix_fadviseposix_fadvise64pthread_gettid_np
    • native-media/AndroidManifest.xml 示例添加了所需的权限。(问题 106640
    • 向 API 级别 21 添加了 clock_nanosleepclock_settime。(问题 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__getdents64dlmalloc
    • 从 64 位架构中移除了以下函数:basename_rdirname_r__isthreaded_flush_cache (mips64)。
    • 从 32 位架构中移除了以下函数:__signalfd4
    • 将以下函数中的第 3 个参数的类型从 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 会指定 *-gcc-ar,而不是 *-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
重要说明:
  • 由于可下载软件包有 512MB 的大小限制,因此下列 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 头文件。
重要的 bug 修复:
  • 修复了 GCC 4.8/4.9 中的 gdb 7.6。(问题 7411274371。)
  • 修复了 x86 的 GCC 4.8/4.9,因此它们不再默认启用 -msse4.2-mpopcnt。(问题 73843。)
其他的 bug 修复:
  • 从所有版本的 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.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() 函数。
    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,实现了新的多库目录布局,并提供对 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)旨在实现与 AOSP 同步。
    • 新的媒体 API 和 native-codec 示例。
    • 更新了 SLES/OpenSLES 的 Android.h 头文件,使 AudioPlayer 支持单精度浮点音频格式。
    • libGLESv3.so. 的 GLES 3.1 和 AEP 扩展。
    • 将 GLES2 和 GLES3 头文件更新到了最新官方 Khronos 版本。
  • 向 32/64 位 ABI 添加了 GCC 4.9 编译器。如前所述,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。
  • 添加了 -mssse3 编译选项以提供 SSSE3 支持,并已将其设为 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 no 不再重新编译 libc++。重新编译需使用其他编译器。请注意,Clang 3.3 未经测试。
  • mclinker 现为 2.7 版,并提供 aarch64 Linux 支持。
  • 针对 LOCAL_PCH 指定的头文件添加了预编译头文件支持。(问题 25412)。
重要的 bug 修复:
  • 修复了 libc++,因此现在可以编译 std::feof 等(问题 66668)。
  • 修复了在某些 ABI armeabi libc++ 测试中导致崩溃的 Clang 3.3/3.4 原子库调用。
  • 修复了 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)。
其他的 bug 修复:
  • 修复了头文件:
    • 将 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)。如需了解详情,请参阅 AOSP 变更列表 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 不能共存。
其他变更:
  • 向 x86 工具链添加了 arm_neon.h,使其现在可模拟约 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 脚本。
重要变更:
  • 添加了对 Clang 3.4 编译器的支持。NDK_TOOLCHAIN_VERSION=clang 选项现在会选择 Clang 3.4。GCC 4.6 仍为默认编译器。
  • 添加了 APP_ABI=armeabi-v7a-hard,并提供额外的多库选项 -mfloat-abi=hard。这些选项可以与 ARM GCC 4.6/4.8 和 Clang 3.3/3.4(其使用 4.8 版本的编译器、链接器和库)配合使用。使用这些选项时,请注意下列变更:
    • 执行 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。为了让 make 的行为符合预期,不得同时指定 armeabi-v7aarmeabi-v7a-hard 作为 make 目标(即,在 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
重要的 bug 修复:
  • 修复了 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++ 反射问题。

其他的 bug 修复:
  • 头文件修复:
    • 针对 Android API 级别 13 及更高级别修复了 android/asset_manager.h 中缺失 #include <sys/types.h> 的问题。(问题 64988
    • 针对 Android API 级别 14 及更高级别修复了 android/rect_manager.h 中缺失 #include 的问题。
    • jni.h 中的 JNI_OnLoadJNI_OnUnload 添加了 JNICALL。请注意,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__
    • 通过向接受或返回浮点值或双精度值的函数添加 __NDK_FPABI__,修复了 platforms/android-18/include/android/input.h
    • 修复了 MIPS struct stat,之前针对 Android API 级别 12 及更高级别将其错误地设为 64 位版的对应设置。这项错误设置是版本 r9c 中引入的回归。
    • 针对 Android API 级别 9 及更低级别定义了 __PTHREAD_MUTEX_INIT_VALUE__PTHREAD_RECURSIVE_MUTEX_INIT_VALUE__PTHREAD_ERRORCHECK_MUTEX_INIT_VALUE
    • 针对 API 18 及更高级别向 x86 libm.so 添加了 scalblnscalblnfscalblnl
    • 修复了 sources/android/support/include/iconv.h 中的拼写错误。(问题 63806
  • 将 gabi++ std::unexpected() 修复为调用 std::terminate(),以便为用户定义的 std::terminate() 处理程序提供运行机会。
  • 修复了 gabi++ 以捕获 std::nullptr
  • 修复了 Teapot 和 MoreTeapots 示例:
    • 通过将镜面反射变量更改为使用中等精度,解决了 Tegra 2 和 Tegra 3 芯片的问题。镜面反射强度值现在可以小于 1.0。
    • 更改了示例,现在按下音量按钮可恢复沉浸模式,并使 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 失效。屏幕旋转不会触发 onSystemUiVisibilityChange,因此不会恢复沉浸模式。
  • 修复了 ndk-build 脚本以添加 -rpath-link=$SYSROOT/usr/lib-rpath-link=$TARGET_OUT,从而使用 ld.bfd 链接可执行文件。(问题 64266
  • 从所有 STL build 中移除了 -Bsymbolic
  • 通过将 SHELL 设为环境变量(而非将其传递到忽略此设置的 python.exe)修复了 ndk-gdb-py.cmd。(问题 63054
  • 修复了 make-standalone-toolchain.sh 脚本,使 --stl=stlport 选项复制 gabi++ 头文件,而非对其进行符号链接;cmd.exe 和 MinGW shell 无法理解 cygwin 创建的符号链接。
其他变更:
  • 将执行权限应用到了之前仅供在 cmd.exe shell 中使用的所有 *cmd 脚本,以防开发者希望在 cygwin 中使用 ndk-build.cmd,而非推荐的 ndk-build 脚本。
  • 针对指定目标目录不存在的情况,通过移动而非复制,加快了 make-standalone-toolchain.sh 脚本的速度。

这是一个仅修复 bug 的版本。

重要的 bug 修复:
  • 修复了 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
其他的 bug 修复:
  • 头文件修复:
    • poll.h 中的 poll 原型更改为了 poll(struct pollfd *, nfds_t, int);
    • 针对 Android API 级别 12 和 19 向 libc.so 添加了 utimensat。现在 Android API 级别 12 到 19 的所有级别均包含这些库。
    • 针对 Android API 级别 19,在 libc.so 中引入了 futimens
    • 针对 Android API 级别 8 及更高级别向 time.h 添加了缺失的 clock_settime()clock_nanosleep()
    • 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
  • 在确定性模式(选项 -D)下使用了 ar 工具编译静态库。(问题 60705
重要变更:
  • 针对 Android API 级别 18 及以下的所有级别更新了 include/android/*hmath.h,包括添加级别 13、15、16 和 17。如需了解添加的 API,请参阅变更 6801268014 的提交消息。(问题 471505852838423
  • 添加了对 Android API 级别 19 的支持,包括 Renderscript 绑定。
  • 在现有的 armeabi-v7a ABI 中添加了对 -mhard-float 的支持。如需了解相关详情及当前限制,请参阅 tests/device/hard-float/jni/Android.mk
  • 从 GNU Compiler Collection (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 支持,并将在下一版本中将其移除。
重要的 bug 修复:
  • 修复了 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 build,以跳过序言代码中用于进行堆栈展开的 ARM.exidx 数据,并添加了一个命令 (set arm exidx-unwinding) 来控制基于 exidx 的堆栈展开。(问题 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 补丁
其他的 bug 修复:
  • 头文件修复
    • 根据规范将 ARM WCHAR_MINWCHAR_MAX 修复为了无符号(X86/MIPS 版本有符号)。定义 _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。现在,此选项仅向列入白名单的设备(包括 Nexus 4)添加 IDIV。(问题 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_fetch_add__atomic_fetch_sub__atomic_fetch_or
  • 修复了自定义 vfprintf 的 Clang 3.3 ICE。(Clang 问题
其他变更:
  • 对所有 GCC build 启用了 OpenMP。若要使用此功能,请在构建设置中添加下列标志:
    LOCAL_CFLAGS += -fopenmp
    LOCAL_LDFLAGS += -fopenmp
    
    如需查看代码示例,请参阅 tests/device/test-openmp
  • 大幅缩小了 ld.mcld 的大小(大小为 1.5MB,而 ld.bfd 为 3.5MB,ld.gold 为 7.5MB),使速度提升约 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)及更高版本支持。
  • 向 NDK 添加了 GNU Compiler Collection (GCC) 4.8 编译器。由于 GCC 4.6 仍为默认编译器,因此您必须明确启用此选项:
    • 对于 ndk-build 编译系统,请导出 NDK_TOOLCHAIN_VERSION=4.8,或将其添加到 Application.mk 中。
    • 对于独立 build,请在 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 Project Debugger (GDB) 更新为支持 Python 2.7.5。
  • 添加了 MCLinker 以支持 Windows 主机。由于 ld.gold 在可用时即成为默认设置,因此您必须在 LOCAL_LDFLAGSAPP_LDFLAGS 中添加 -fuse-ld=mcld 才能启用 MCLinker。
  • 添加了 ndk-depends 工具,可输出 ELF 库依赖项。如需了解详情,请参阅 NDK-DEPENDS.html。(问题 53486
重要的 bug 修复:
  • 修复了 android_native_app_glue 中潜在的事件处理问题。(问题 41755
  • 修复了 ARM/GCC-4.7 build,以便 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 build 以使用 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 会崩溃的问题。
  • 修复了使用 stepi 命令越过 bx pcblx pc Thumb 指令时 GDB 会崩溃的问题。(问题 56962问题 36149
  • 修复了 MIPS gdbserver 以查找 DT_MIPS_RLD_MAP,而非 DT_DEBUG。(问题 56586
  • 修复了 ndk-build 脚本中的循环依赖项,例如:如果 A->B 并且 B->B,则不构建 B。(问题 56690
其他的 bug 修复:
  • 修复了 ndk-build 脚本,让您能够以命令行选项的形式(例如 NDK_TOOLCHAIN_VERSION=clang3.2)指定 Clang 版本。之前,只能以环境变量形式指定版本。
  • 针对 MIPS 构建目标,将使用 Clang 编译器时的 _Unwind_Exception gabi++ 大小修复成了 24。(变更 54141
  • 修复了 ndk-build 脚本,以确保使用 ndk-build clean 命令时,从包含预构建静态库的项目中实际移除已构建的库。 (变更 54461变更 54480
  • 修改了 NDK_ANALYZE=1 选项,以使其更简洁。
  • 修复了 gnu-libstdc++/Android.mk,以针对向后兼容的 build 添加 backward/ 路径。(问题 53404
  • 修复了 stlport new 有时会返回随机值的问题。
  • 修复了 ndk-gdb,以便与 CPU_ABIS(而非 APP_ABIS)的顺序匹配。(问题 54033
  • 修复了 MacOSX 上的 NDK 64 位 build 选择错误编译器路径的问题。(问题 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_Blocktypedef 不一致相关的 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 头文件,以便对于级别 9 以下的 API 级别,__WCHAR_TYPE__ 为 32 位,这意味着对于所有 API 级别,wchat_t 均为 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= 选项除了创建 $TOOLCHAIN_PREFIX-clang$TOOLCHAIN_PREFIX-clang++ 脚本之外,还创建 clangclang++,从而避免意外使用主机的 clang 和 clang++ 定义。
  • 添加了两个标志,以重新启用两项存在于上游 Clang 中但在 NDK 中停用的优化,以便更好地兼容 GCC 所编译的代码:
    • 添加了 -fcxx-missing-return-semantics 标记,以重新启用 Clang 3.2+ 中缺失的返回语义。通常,所有路径在终止时都应提供针对值返回函数的返回语句。如果情况并非如此,则 Clang 会在没有返回语句的路径中插入一条未定义的指令(或进入调试模式)。如果您确定代码正确无误,请使用此标记以让优化器能够利用未定义的行为。如果您不确定,请勿使用此标记。调用方可能仍会收到不正确的随机值,但是优化器不会利用此值并导致代码更难以调试。
    • 添加了 -fglobal-ctor-const-promotion 标记,以重新启用将具有静态构造函数的全局变量提升为常量的行为。利用此标记,LLVM 的全局变量优化环节会尝试对具有静态构造函数的全局变量进行求值,并将其提升为全局常量。虽然此优化并无问题,但可能会导致与 GCC 所编译的代码之间出现一定程度的不兼容。例如,代码可能会执行 const_cast 以将常量转为可变的量,并进行修改。在 GCC 中,此变量可读可写,而代码会意外运行。在 Clang 中,常量变量位于只读内存中,并且可能会导致应用崩溃。
  • 向 MIPS GCC 和 Clang 编译器添加了 -mldc1-sdc1。默认情况下,编译器会正确对齐 8 字节对象,并发出 ldc1sdc1 指令来移动它们。如果应用使用自定义分配器,而此分配器并不像默认分配器一样始终对齐新对象的 8 字节边界,那么应用可能会因针对未对齐内存执行 ldc1sdc1 操作而崩溃。在这种情况下,请使用 -mno-ldc1-sdc1 标志解决问题。
  • APP_PLATFORM_LEVEL 大于 APP_MIN_PLATFORM_LEVEL 时,事件严重性会从警告降级为信息。由于 NDK 只有部分级别的头文件,因此 APP_PLATFORM_LEVEL 可能会小于 jni/Application.mk 中的 APP_PLATFORM。在这种情况下,实际级别会降低。APP_MIN_PLATFORM_LEVEL 由应用清单中的 android:minSdkVersion 指定。(问题 39752
  • cpu-features.c 添加了 android_getCpuIdArm()android_setCpuArm() 方法。添加之后有助于简化 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_MODULESAndroid.mk 中仅列出静态库时,脚本能够强制构建所有库。(问题 53502
  • 更新了 ndk-build,以支持 LOCAL_SRC_FILES 中的绝对路径。
  • 移除了 *-gdbtui 可执行文件,它们与 *-gdb 可执行文件重复,并且启用了 -tui 选项。
  • 更新了 build 脚本,以在 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 链接器在可用时即为默认链接器,因此您必须明确启用 MCLinker。如需了解详情,请参阅 CHANGES.HTML
  • 更新了 ndk-build,以对模块依赖项进行拓扑排序,这意味着 build 会自动对 LOCAL_STATIC_LIBRARIESLOCAL_WHOLE_STATIC_LIBRARIESLOCAL_SHARED_LIBRARIES 中指定的库进行排序。如需了解详情,请参阅 CHANGES.HTML。(问题 39378
重要的 bug 修复:
  • 修复了 build 脚本,以构建 -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 位原子内置函数链接代码的构建问题。(问题 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_udata2DW_EH_PE_udata4DW_EH_PE_udata8 进行非对齐访问而引起的异常处理中的 STLport 总线错误。
  • 修复了 nothrow new[] 运算符的 Gabi++ 无限递归问题。(问题 52833
  • 修复了 Gabi++ 对异常处理程序指针的错误偏移问题。(变更 53446
  • 移除了 Gabi++ 对异常对象的冗余释放(变更 53447
其他的 bug 修复:
  • 修复了 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、GCC 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
  • 对 GNU libstdc++ 配置了 _GLIBCXX_USE_C99_MATH,以取消定义 Bionic 头文件中的 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.sh 中针对 mingw build 类型的竞态条件;以前,此类型会导致无法处理大量的并行构建。
    • 更新了 build-gabi++.shbuild-stlport.sh,它们现在可以从 NDK 软件包中运行。(问题 52835
    • 修复了 MSys 实用程序集合中的 run-tests.sh
    • 改进了 64 位主机工具链和 Canadian Cross 构建支持。
    • build-mingw64-toolchain.sh 脚本更新为最近的版本。
    • 添加了在不具有隐式可见性的情况下构建 libgnustl_static.astlport_static.a 的选项。
重要变更:
  • 向 NDK 中添加了 GNU Compiler Collection (GCC) 4.7 编译器。GCC 4.6 编译器仍为默认编译器,因此您必须明确启用新版本,具体步骤如下所示:
    • 对于 ndk-build,请导出 NDK_TOOLCHAIN_VERSION=4.7 变量或将其添加到 Application.mk
    • 对于独立 build,请将 --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) 兼容的全局默认路径,或选择使用 GCC 4.6 及更高版本编译器且适用于 -fstack-protector-fstack-protector-all-fstack-protector-strong 的新 tls 路径 (%gs:20)。

    注意-mstack-protector-guard 设置本身不会启用任何 -fstack-protector* 选项。

  • sources/android/cpufeatures/cpu-features.c 添加了 android_setCpu() 函数,以便在 Android 4.1 及更高版本中无法通过 /proc 进行自动检测时使用。(Chromium 问题 164154
重要的 bug 修复:
  • 修复了使用 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 build 中添加了缺失的 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
其他的 bug 修复:
  • NDK 头文件修复:
    • __WINT_TYPE__wint_t 修复为了同一类型。
    • 更正了 android/bitmap.h 中的拼写错误。(问题 15134
    • 更正了 errno.h 中的拼写错误。
    • 添加了检查 sys/cdefs.h 中是否存在 __STDC_VERSION__ 的功能。(问题 14627
    • 重新组织了 byteswap.hdirent.h 中的头文件。
    • 修复了 limits.h 以包含 page.h,后者可提供 PAGE_SIZE 设置。(问题 39983
    • glGetAttribLocation()glGetUniformLocation() 的返回类型从 int 修复为了 GLint
    • 修复了 x86 build 的 __BYTE_ORDER 常量。 (问题 39824
  • 修复了 ndk-build 脚本,以便执行 ARM 构建时不以 -O2 覆盖 -Os
  • 修复了编译脚本,以允许覆盖 HOST_AWKHOST_SEDHOST_MAKE 设置。
  • 修复了链接 Intel C/C++ 编译器 (ICC) 所编译的对象的 fsck_msdos 编译系统上的 ld.gold 问题。
  • 修复了 Clang 中的 ARM EHABI 支持,以符合规范。
  • 修复了 GNU Debugger (GDB),以缩短在 solib 事件期间遍历目标链接映射所花费的时间。 (问题 38402
  • 修复了链接共享库时缺失 libgcc.a 文件的问题。
其他变更:
  • 已将 ARM 的 64 位内置原子函数向后移植至 GCC 4.6。
  • 添加了有关音频输出延迟的文档,以及其他文档和修复。
  • 修复了使用 Clang 的调试编译系统,现在非空函数会针对不含返回语句的路径发出 SIGILL 信号。
  • make-standalone-toolchain.sh 更新为了接受后缀 -clang3.1,这相当于将 --llvm-version=3.1 添加到 GCC 4.6 工具链。
  • 将 GCC 和 Clang bug 报告网址更新为:https://source.android.com/source/report-bugs.html
  • llvm-objdump 添加了 ARM ELF 支持。
  • 已针对 Clang 编译系统,抑制将 c 输入处理为 c++ 警告。
  • 更新了 build,以便仅构建 32 位版本的 libiberty.a 并将其放入 lib32/
重要变更:
  • 向 NDK 添加了 Clang 3.1 编译器。GNU Compiler Collection (GCC) 4.6 仍为默认编译器,因此您必须明确启用 Clang 编译器选项,具体步骤如下所示:
    • 对于 ndk-build,请导出 NDK_TOOLCHAIN_VERSION=clang3.1,或将此环境变量设置添加到 Application.mk 中。
    • 对于独立 build,请将 --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。Gold 链接器也是所有主机上 ARM 和 X86 的默认链接器。您可以向 Android.mk 添加 LOCAL_LDFLAGS += -fuse-ld=bfd,或将 -fuse-ld=bfd 传递至执行链接的 g++/clang++ 命令行,从而改用 ld.bfd 链接器。
  • 添加了检查 ndk-build[.cmd]ndk-gdb 脚本的 NDK 路径中是否包含空格的功能,以防止出现难以诊断的编译错误。
  • 对 API 级别处理进行了以下变更:
    • 修改了构建逻辑,以便在 APP_PLATFORMproject.propertiesdefault.properties 中指定 android-10android-13 的项目链接到 android-9,而非 android-14
    • 更新了相关 build,以便使用 android-16 (Jelly Bean) 或更高版本的可执行文件通过 -fPIE 选项进行编译,从而生成位置独立的可执行文件 (PIE)。借助新的 APP_PIE 选项,您可以控制此行为。如需了解详情,请参阅 APPLICATION-MK.html

      注意:所有高于 API 级别 14 的级别仍会链接到 platforms/android-14,并且未添加新的 platforms/android-N

    • 修改了 ndk-build,以便在调整后的 API 级别高于项目 AndroidManifest.xml 中的 android:minSdkVersion 时发出警告。
  • 更新了 cpu-features 辅助程序库,以包含更多特定于 ARM 的功能。如需了解详情,请参阅 sources/android/cpufeatures/cpu-features.h
  • 将 X86 平台上的长双精度修改为了 8 个字节。此数据类型的大小现在与双精度相同,但仍被视为不同的类型。
  • 更新了 APP_ABI=armeabi-v7a 的编译系统:
    • 修改了此编译类型,以便将 -march=armv7-a 参数传递给链接器。此更改可确保正确链接特定于 v7 的库和 crt*.o
    • ndk-build 添加了 -mfpu=vfpv3-d16,从而替代之前版本中使用的 -mfpu=vfp 选项。
重要的 bug 修复:
  • 修复了以 root 权限运行 make-standalone-toolchain.sh 会导致独立工具链不可供某些用户访问的问题。(问题 35279
    • NDK 发布软件包中的所有文件和可执行文件都设置为向所有用户提供读取和执行权限。
    • libstdc++.a 的所有权/所属组现在会在复制时保留。
  • 从 Windows 预构建 echo.exe 中移除了冗余 \r。冗余 \r 导致了 gdb.setup 在 GNU Debugger (GDB) 中失败,因为它会错误地成为路径的一部分。(问题 36054
  • 修复了有时会因 host-mkdir 实现中的计时问题而失败的 Windows 并行构建问题。 (问题 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_namenull 上下文的问题,即当上下文为 null 并在 TREE_CODE 中解除引用时,GCC 可能会崩溃。
  • 修复了处理特定于 ARM NEON 的浮点型定义时 GCC 4.4.3 崩溃的问题。(问题 34613
  • 修复了 STLport 内部 _IteWrapper::operator*() 实现问题,其中会返回存储已解除引用的值的旧堆栈位置,并导致运行时崩溃。(问题 38630
  • 特定于 ARM 的修复:
    • 修复了 ARM GCC 4.4.3/4.6 g++,现在不会发出“<va_list> 的破坏处理在 GCC 4.4 中已更改”警告。不再需要采用通过 -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,使其能够链接来自旧 binutils 的对象而无需 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
    • 修复了“无法解析 R_ARM_THM_CALL 重定位”错误。问题 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
    • 向后移植了针对 cc1 编译进程会耗用 100% CPU 的修复。(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,在 /system/bin/linker 中的符号已剥离,并已实现 rtld_db_dlactivity() 作为 Thumb 的系统上调用 dlopen() 时,现在不会因为未保留 sym_addrLSB 而引起问题。(问题 37147
其他的 bug 修复:
  • 修复了 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。脚本 run-tests.sh 可以在不使用 --abi 选项的情况下运行,并且已增强,可以针对所有受支持的 ABI 编译大部分测试,并在所有相连设备上运行。

此版本的主要功能是新增的 GNU Compiler Collection (GCC) 4.6 工具链以及 GNU Debugger (GDB) 7.3.x,后者添加了对 Android 4.1(API 级别 16)系统映像的调试支持。

重要的 bug 修复:
  • 修复了在 Mac OS 和 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. 通过设置下列选项,在 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 */
    }
其他的 bug 修复:
  • 修复了 mips-linux-gnu 重定位截断为适合 R_MIPS_TLS_LDM 的问题。(了解详情
  • 修复了使用 --gc-sectionsld 工具的分段错误。 (了解详情
  • 修复了 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 针对 3 个不同的 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 架构编译的库时,才允许继续安装。

重要的 bug 修复:
  • 修复了 GAbi++ 实现中的拼写错误,如果对基类对象 b 执行 dynamic_cast<D>(b) 以转换为派生类 D,则结果错误地朝向基类的反方向进行调整。(问题 28721
  • 修复了 make-standalone-toolchain.sh 无法复制 libsupc++.* 的问题。
其他的 bug 修复:
  • 修复了 ndk-build.cmd 以确保 ndk-build.cmd 正常运行,即使用户已重新定义 SHELL 环境变量也是如此(在 Windows 环境中安装各种开发工具都有可能改变此变量)。

此版本的 NDK 包含对基于 Tegra2 的设备的重要修复,以及其他几项修复和改进:

重要的 bug 修复:
  • 修复了 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

其他的 bug 修复:
  • 修复了 cpufeatures 辅助程序库中的 android_getCpuCount() 实现。在内核由系统动态启用的特定设备上,之前的实现会在第一次调用此函数时报告活跃内核总数,而非实际存在的内核总数。

此版本的 NDK 包含针对原生 Windows build 的修复、Cygwin 以及许多其他改进:

重要的 bug 修复:
  • 更新了 sys/atomics.h,以避免某些基于 ARM 的多核设备上的正确性问题。使用此版本的 NDK 重新编译未经修改的源代码即可完全消除此问题。如需了解详情,请参阅 docs/ANDROID-ATOMICS.html
  • 恢复为 binutils 2.19,以修复 NDK r7(改为 binutils 2.20.1)中出现的调试问题。
  • 修复了 32 位 Linux 上的 ndk-build。NDK r7 中的打包错误会将 64 位版本的 awk 可执行文件放在 prebuilt/linux-x86/bin 下。
  • 修复了原生 Windows 构建系统 (ndk-build.cmd)。其他构建模式不受影响。修复包括:
    • 移除了尝试从并非项目路径顶层的目录(例如,其中的任何子目录)中调用 ndk-build.cmd 时发生的无限循环/堆栈溢出 bug。
    • 修复了自动生成的依赖项文件被忽略的问题。这意味着,更新头文件并不会触发对包含该头文件的源文件进行重新编译。
    • 修复了无法正确处理文件或路径中所含特殊字符(空格和引号除外)的问题。
  • 修复了独立工具链,确保使用 -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 辅助程序库已更新为报告 3 项可选的 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 模块。这意味着,在此版本中,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 定义为指向特定目录时,此行为保持不变。
实验性功能
在 Windows 系统中,您现在可以在不借助 Cygwin 的情况下,通过在命令行从项目路径调用 ndk-build.cmd 脚本来编译 NDK 源文件。此脚本所采用的参数与原始 ndk-build 脚本完全相同。Windows NDK 软件包随附自己的预编译二进制文件,适用于 GNU Make、Awk 以及编译所需的其他工具。您无需安装任何其他软件,即可获得有效的编译系统。

重要提示ndk-gdb 无法在 Windows 上运行,因此您仍需使用 Cygwin 进行调试。

此功能仍处在实验阶段,因此您可随意试用,并在公共错误数据库公共论坛中报告问题。NDK 随附的所有示例和单元测试都可使用此功能成功完成编译。

重要的 bug 修复
  • 现在如果 Application.mk 中未定义 APP_MODULES,导入的共享库会默认安装至目标安装位置 (libs/<abi>)。例如,如果顶级模块 foo 导入模块 bar,则 libfoo.solibbar.so 都会复制至安装位置。之前,除非在 APP_MODULES 中同时列出 bar,否则只复制 libfoo.so。如果您显式定义 APP_MODULES,则行为保持不变。
  • ndk-gdb 现在能够正确处理其 MAIN Intent 过滤器中具有多个类别的 Activity。
  • 静态库导入现在会正确传递。例如,如果顶级模块 foo 导入静态库 bar,而后者导入静态库 zoo,则 libfoo.so 现在会同时链接到 libbar.alibzoo.a
其他变更
  • docs/NATIVE-ACTIVITY.HTML:修复了拼写错误。对于原生 Activity,最低 API 级别应为 9,而不是 8。
  • docs/STABLE-APIS.html:添加了缺失的文档,将 EGL 列为受支持的稳定 API(从 API 级别 9 开始)。
  • download-toolchain-sources.sh:进行了更新,以从 AOSP 服务器的新位置 android.googlesource.com 下载工具链源文件。
  • 添加了新的 C++ 支持运行时,其名称为 gabi++。如需了解详情,请参阅经过更新的 docs/CPLUSPLUS-SUPPORT.html
  • 添加了新的 C++ 支持运行时,其名称为 gnustl_shared,并与 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 版本中存在的以下问题:

重要的 bug 修复
  • 修复了使用 APP_ABI="armeabi x86" 进行多架构构建时的构建问题。
  • 修复了 NDK 发布软件包中预构建 STLport 二进制文件的位置。 打包脚本中的错误导致这些二进制文件被放在错误的位置。
  • 修复了共享库中 atexit() 与 x86standalone 工具链配合使用的问题。
  • 修复了 make-standalone-toolchain.sh --arch=x86。之前它无法将正确的 GNU libstdc++ 二进制文件复制至适当的位置。
  • 修复了有关缺失 __dso_handle 符号的定义和大小的独立工具链链接器警告(仅限 ARM)。
  • 修复了 x86 build 的 $(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 针对 3 个不同的 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
其他变更:
从 NDK r5 开始废弃的 arm-eabi-4.4.0 已从 NDK 发行版中移除。

相较于 r5b,此版本的 NDK 不包含任何新功能。r5c 版本解决了 r5 版本中的下列问题:

重要的 bug 修复:
  • ndk-build:修复了在尝试对可调试项目执行并行构建时发生的一个罕见 bug。
  • 修复了导致 LOCAL_WHOLE_STATIC_LIBRARIES 无法与新工具链正常配合使用的拼写错误,并在 docs/ANDROID-MK.html 中添加了有关此错误的文档。
  • 修复了在 API 级别 8 (Android 2.2) 之前的平台版本上运行时,链接到 gnustl_static 的代码发生崩溃的 bug。
  • ndk-gdb:修复了在调试搭载 Android 3.0 或更新版本的设备时导致分段错误的 bug。
  • <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 时,导致构建失败的 bug(build/core/build-binary.mk 中的拼写错误)。
  • 修复了导致无法编译 .s 汇编文件(.S 文件不受影响)的 bug。

相较于 r5,此版本的 NDK 不包含任何新功能。r5b 版本解决了 r5 版本中的下列问题:

  • r5 二进制文件需要 glibc 2.11,但是 r5b 二进制文件是使用面向 glibc 2.7 或更高版本的特殊工具链生成的。Linux 工具链二进制文件现在可在 Ubuntu 8.04 或更高版本上运行。
  • 修复 arm-linux-androideabi-4.4.3 工具链中的编译器 bug。在处理带符号字符时,之前的二进制文件会生成无效的 Thumb 指令序列。
  • 针对 APP_STL 的“gnustl_static”值添加了遗漏的文档,此值允许您链接到静态库版本的 GNU libstdc++。
  • 修复了以下 ndk-build 问题:
    • 在 Windows 上发生编译错误时创建不一致的依赖项文件的错误。此错误导致更正源代码中的错误后无法正确执行编译。
    • 特定于 Cygwin 的 bug:针对 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 位主机工具链。
  • <netinet/in.h> 中添加了缺失的 INET_ADDRSTRLEN 声明。
  • <netinet/in6.h> 中添加了缺失的 IN6_IS_ADDR_MC_NODELOCALIN6_IS_ADDR_MC_GLOBAL
  • <asm/byteorder.h> 中,“asm”已替换为“__asm__”,以便使用 -std=c99 进行编译。

此版本的 NDK 包含许多新的 API,其中的大部分都是为了支持开发游戏及大量使用原生代码的类似应用而引入的。开发者可以通过使用这些 API,对事件、音频、图形及窗口管理、资源和存储空间进行直接的原生访问。得益于新的 NativeActivity 类,开发者还可以在原生代码中实现 Android 应用生命周期:如需详细了解此版本中所含的变更,请参阅下载的 NDK 软件包中随附的 CHANGES.HTML 文档。

一般说明:
  • 添加了对原生 Activity 的支持,使您能够在原生代码中实现 Android 应用生命周期。
  • 添加了对下列各项的原生支持:
    • 输入子系统(例如,键盘和触摸屏)
    • 访问传感器数据(加速度计、指南针、陀螺仪等)
    • 事件循环 API,用于等待输入和传感器事件等
    • 窗口和 Surface 子系统
    • 基于 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)作为辅助程序模块。它可用作静态库或共享库(如需了解详情及用法示例,请访问 sources/android/stlport/README)。此外,还会提供 STLport(静态或共享)和 GNU libstdc++(仅限静态)的预编译二进制文件,前提是您选择根据这些库(而非默认的 C++ STL 实现)进行编译。C++ 异常和 RTTI 在默认的 STL 实现中不受支持。如需了解详情,请参阅 docs/CPLUSPLUS-SUPPORT.HTML。
  • cpufeatures 辅助程序库进行了改进,以改进 CPU 类型的报告(之前某些设备会报告 ARMv7 CPU,但设备实际上是 ARMv6)。我们建议使用这个库的开发者重新编译其应用,然后上传到 Google Play 以从改进中受益。
  • 添加了一个 EGL 库,使您能够创建和管理 OpenGL ES 纹理及服务。
  • 添加了新的示例应用 native-plasmanative-activity,以演示如何编写原生 Activity。
  • 包含了许多 bug 修复和其他次要改进;如需更详细的变更列表,请参阅 docs/CHANGES.html。
NDK r4b 说明:

包含了针对 NDK 编译系统和调试脚本中多个问题的修复;如果您使用的是 NDK r4,我们建议您下载 NDK r4b 编译系统。如需关于此版本中所作变更的详细信息,请参阅下载的 NDK 软件包中随附的 CHANGES.TXT 文档。

一般说明:
  • 通过新的 ndk-build 构建命令提供了简化的构建系统。
  • 通过新的 ndk-gdb 命令支持在正式版设备上对生成的机器代码进行简易原生调试。
  • 针对基于 ARM 的 CPU 架构,添加了 Android 专用的新 ABI armeabi-v7a。这一新 ABI 可以扩展现有的 armeabi ABI 以包含下列 CPU 扩展指令集:
    • Thumb-2 指令
    • VFP 硬件 FPU 指令 (VFPv3-D16)
    • 针对 ARM Advanced SIMD (NEON) GCC 内建函数和 VFPv3-D32 的可选支持。提供支持的设备包括 Motorola 的 Verizon Droid、Google Nexus One 等等。
  • 添加了新的 cpufeatures 静态库(包含源代码),使您的应用能够在运行时检测主机设备的 CPU 功能。具体而言,应用可以检查是否支持 ARMv7-A 以及是否支持 VFPv3-D32 和 NEON,然后根据需要提供单独的代码路径。
  • 添加了示例应用 hello-neon,此示例演示了如何使用 cpufeatures 库检查 CPU 功能,然后使用 NEON 内建函数提供优化的代码路径(如果受 CPU 支持)。
  • 允许您针对 NDK 所支持的任一或全部指令集生成机器代码。例如,您可以同时针对 ARMv5 和 ARMv7-A 架构进行编译,并将所有内容存储到应用的最终 .apk 中。
  • 为确保仅在用户设备能够运行您的应用时才向其提供应用,Google Play 现在会根据应用中包含的指令集信息过滤应用,而您自己无需执行任何操作即可启用过滤。此外,Android 系统本身也会在安装时检查您的应用,并且仅在此应用提供针对设备 CPU 架构进行编译的库时,才允许继续安装。
  • 添加了对 Android 2.2 的支持,其中包括一个新增的稳定 API,用于从原生代码中访问 Bitmap 对象的像素缓冲区。
一般说明:
  • 添加了 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 对象管理 Activity 生命周期。

最初以“Android 1.5 NDK,第 1 版”的形式发布。

一般说明:
  • 提供了针对 ARMv5TE 指令(包括 Thumb-1 指令)的编译器支持 (GCC)。
  • 提供了针对稳定的原生 API、文档和示例应用的系统头文件。