本页面提供了 NDK 所有发布的稳定版本的更改信息。要下载最新稳定版本的 NDK 或任何当前可用的 Beta 版本,请参阅 NDK 下载页面。
请参阅 android-ndk-announce Google Group 以获取更完整的信息,并订阅以接收版本发布通知。
Android NDK r27 LTS (2024 年 7 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
Android NDK r26 LTS (2023 年 9 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
- 公告
-
- KitKat(API 级别 19 和 20)不再受支持。
Android NDK r25 LTS (2022 年 7 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
- 公告
-
- 包含 Android 13 API。
- 将 LLVM 更新到 clang-r450784d,基于 LLVM 14 开发。
Android NDK r24 (2022 年 3 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
- 公告
-
- GNU Assembler (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,因此绝大多数应用除了性能提升外不会注意到此变化。
- RenderScript 构建支持已移除。RenderScript 在 Android 12 中已弃用。如果您尚未将应用从 RenderScript 迁移出来,可以使用 NDK r23 LTS。
- GNU Assembler (GAS) 已移除。如果您之前使用
Android NDK r23 LTS (2021 年 8 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
- 公告
-
- GNU binutils(不包括 GNU Assembler (GAS))已移除。GAS 将在下一版本中移除。如果您使用
-fno-integrated-as进行构建,如果有什么阻止您移除该标志,请提交 bug。 - 对 GDB 的支持已终止。GDB 将从下一版本中移除。请改用 LLDB。请注意,
ndk-gdb默认使用 LLDB。 - NDK r23 是支持非 Neon 的最后一个版本。从 NDK r24 开始,sysroot 中的 armeabi-v7a 库将使用 Neon 构建。极少数非常老的设备不支持 Neon,因此绝大多数应用除了性能提升外不会注意到此变化。
- 下一个 NDK 版本将不支持 Jelly Bean(API 级别 16、17 和 18)。NDK r24 支持的最低操作系统版本将为 KitKat(API 级别 19)。
- GNU binutils(不包括 GNU Assembler (GAS))已移除。GAS 将在下一版本中移除。如果您使用
Android NDK r22b (2021 年 3 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
- 公告
-
- GNU binutils 已弃用,并将从即将发布的 NDK 版本中移除。请注意,GNU Assembler(
as)是其中的一部分。如果您使用-fno-integrated-as进行构建,如果有什么阻止您移除该标志,请提交 bug。如果您直接使用as,请改用clang。 - LLD 现在是默认链接器。ndk-build 和我们的 CMake 工具链文件也已迁移到使用 llvm-ar 和 llvm-strip。
- ndk-gdb 现在使用 lldb 作为调试器。gdb 已弃用,并将在未来版本中移除。要回退到 gdb,请使用 --no-lldb 选项。但请提交 bug 说明您无法使用 lldb 的原因。
-
现在包含
std::filesystem支持。有两个已知问题:
- GNU binutils 已弃用,并将从即将发布的 NDK 版本中移除。请注意,GNU Assembler(
Android NDK r21e LTS (2021 年 1 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
- 公告
-
-
不再支持 32 位 Windows。这不会影响绝大多数用户。如果您仍需要从 32 位版本的 Windows 构建 NDK 应用,请继续使用 NDK r20。
有关 Android Developer 工具中此更改的更多信息,请参阅关于该主题的博文。
-
LLD 现在可供测试。AOSP 已切换到默认使用 LLD,NDK 将紧随其后(时间表未知)。通过在链接时传递
-fuse-ld=lld来在您的应用中测试 LLD。请注意,问题 843 将影响使用 LLD 与 binutils strip 和 objcopy 而非 llvm-strip 和 llvm-objcopy 的构建。 - 旧版工具链安装路径将在未来版本中移除。这些路径自 NDK r19 以来已弃用,并占用 NDK 中相当大的空间。即将移除的路径有:
- platforms
- sources/cxx-stl
- sysroot
- toolchains(toolchains/llvm 除外)
make_standalone_toolchain.py用户也不受影响(尽管该脚本自 r19 以来已不再必要)。有关从旧版工具链布局迁移的更多信息,请参阅您正在使用的 NDK 版本的构建系统维护者指南。 - 自 2019 年 8 月起,Play 商店要求在上传 APK 时提供 64 位支持。立即开始移植,以避免届时出现意外。有关更多信息,请参阅这篇博文。
- 现在可以从我们的 wiki 和网站下载已签名和公证的 macOS 应用捆绑包。请注意,由于只有捆绑包可以使用 RPATHs 并通过公证,传统的 macOS 版 NDK 软件包无法公证。SDK 将继续使用传统软件包,因为应用捆绑包需要更改布局,这会使其与 Android Studio 不兼容。通过 SDK Manager 下载 NDK 时不会被隔离,因此目前 Gatekeeper 允许使用。目前,SDK Manager 是获取 macOS 版 NDK 最可靠的方式。
-
Android NDK r20b (2019 年 6 月)
更新日志Android NDK r19c (2019 年 1 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
- 公告
-
- 开发者应开始使用 LLD 测试其应用。AOSP 已切换到默认使用 LLD,NDK 将在下一版本中默认使用它。一旦 LLD 经过一个发布周期并且没有重大未解决问题,BFD 和 Gold 将被移除(预计 r21)。通过在链接时传递
-fuse-ld=lld来在您的应用中测试 LLD。注意:lld 目前不支持 Windows 上的压缩符号。问题 888。Clang 也无法在 Windows 上生成压缩符号,但这在使用从 Darwin 或 Linux 构建的工件时可能会成为问题。 - 自 2019 年 8 月起,Play 商店要求在上传 APK 时提供 64 位支持。立即开始移植,以避免届时出现意外。有关更多信息,请参阅这篇博文。
-
问题 780:独立工具链现在已不再必要。Clang、binutils、sysroot 和其他工具链组件现在都安装到
$NDK/toolchains/llvm/prebuilt/<host-tag>,并且 Clang 会自动找到它们。无需为 API 级别 26 ARM 创建独立工具链,而是直接从 NDK 调用编译器。 在 r19 中,工具链也安装到旧路径,以便构建系统有机会适应新布局。旧路径将在 r20 中移除。$ $NDK/toolchains/llvm/prebuilt/
/bin/armv7a-linux-androideabi26-clang++ src.cpp make_standalone_toolchain.py脚本不会被移除。它现在是不必要的,并将发出包含上述信息的警告,但该脚本将保留以保留现有工作流程。如果您使用 ndk-build、CMake 或独立工具链,您的工作流程应该不会有变化。此更改对于第三方构建系统的维护者来说意义重大,他们现在应该能够删除一些 Android 特定的代码。有关更多信息,请参阅构建系统维护者指南。 - ndk-depends 已移除。我们认为 ReLinker 是解决旧版 Android 上原生库加载问题的更好方案。
- 问题 862:将重定向到 Clang 的 GCC 包装脚本已移除,因为它们的功能不足以直接替代。
- 开发者应开始使用 LLD 测试其应用。AOSP 已切换到默认使用 LLD,NDK 将在下一版本中默认使用它。一旦 LLD 经过一个发布周期并且没有重大未解决问题,BFD 和 Gold 将被移除(预计 r21)。通过在链接时传递
Android NDK r18b (2018 年 9 月)
更新日志Android NDK r17c (2018 年 6 月)
更新日志- 下载
-
- 本版本的下载内容可从此处获取。
- 公告
-
- 不再支持 GCC。它将在 NDK r18 中移除。
- libc++ 现在是 CMake 和独立工具链的默认 STL。如果您手动选择了不同的 STL,我们强烈建议您迁移到
libc++。请注意,ndk-build 仍默认不使用 STL。有关更多详细信息,请参阅这篇博文。 - gnustl 和 stlport 已弃用,并将在 NDK r18 中移除。
- 对 ARMv5 (armeabi)、MIPS 和 MIPS64 的支持已移除。尝试构建这些 ABI 将导致错误。
- 对 ICS(android-14 和 android-15)的支持将从 r18 中移除。
- 自 2019 年 8 月起,Play 商店要求在上传 APK 时提供 64 位支持。立即开始移植,以避免届时出现意外。有关更多信息,请参阅这篇博文。
Android NDK r16b (2017 年 12 月)
更新日志- 下载
- 本版本的下载内容可从此处获取。
- 公告
-
- 已移除弃用的头文件。统一头文件现在就简称为“头文件”。有关迁移提示,请参阅统一头文件迁移说明。
- 不再支持 GCC。它尚未从 NDK 中移除,但不再接收向后移植。在 libc++ 变得足够稳定以成为默认设置之前,无法移除它,因为 gnustl 的某些部分仍与 Clang 不兼容。它将在 r18 中与其他 STL 一起移除。
libc++已退出 Beta 版,现在是 NDK 中首选的 STL。从 r17 开始,libc++是 CMake 和独立工具链的默认 STL。如果您手动选择了不同的 STL,我们强烈建议您迁移到libc++。有关更多详细信息,请参阅这篇博文。- 对 ARM5 (armeabi)、MIPS 和 MIPS64 的支持已弃用。它们不再默认使用 ndk-build 构建,但如果明确命名,仍然可以构建,并将包含在“all”、“all32”和“all64”中。对这些架构的支持已在 r17 中移除。如果您定位这些 ABI 中的任何一个,CMake 和 ndk-build 都会发出警告。
- API
-
添加了适用于Android 8.1 的原生 API。要详细了解这些 API,请参阅原生 API 概览。
有关此版本中新增内容和更改的更多信息,请参阅此更新日志。
Android NDK r15c (2017 年 7 月)
更新日志- 下载
- 本版本的下载内容可从此处获取。
- 公告
-
- 默认启用统一头文件。要了解如何使用这些头文件,请参阅统一头文件。
- GCC 已不再受支持。它尚未从 NDK 中移除,但已不再接收向后移植。由于 gnustl 的某些部分仍然与 Clang 不兼容,在 libc++ 足够稳定并成为默认库之前,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 架构上运行的汇编代码构建。要了解详情,请参阅构建汇编代码。
注意:弃用的头文件将在即将发布的版本中移除。如果您在使用这些头文件时遇到任何问题,请提交 bug。
有关迁移提示,请参阅统一头文件迁移说明。
- API
-
为Android 8.0 添加了原生 API。要详细了解这些 API,请参阅原生 API 概览。
要详细了解此版本中的新增和更改内容,请参阅此更新日志。
Android NDK r14b (2017 年 3 月)
更新日志- 下载
- 此版本的下载文件可在此处获取。
- 公告
-
- 统一头文件:此版本引入了与 Android 平台同步并保持始终最新和准确的平台头文件。仅头文件的错误修复现在会影响所有 API 级别。统一头文件的引入修复了早期 NDK 版本中的不一致,例如:
- M 和 N 中的头文件实际上是 L 的头文件。
- 头文件中的函数声明与其平台级别不正确匹配;头文件声明了不存在的函数或未能声明可用的函数。
- 旧版 API 级别中的几个常量缺失或不正确,而这些常量存在于较新的 API 级别中。
这些新的统一头文件默认情况下未启用。要了解如何启用和使用这些头文件,请参阅统一头文件。
- GCC 弃用:此版本终止了对 GCC 的主动支持。GCC 尚未从 NDK 中移除,但将不再接收向后移植。由于 gnustl 的某些部分仍然与 Clang 不兼容,在 libc++ 变得足够稳定并成为默认库之前,GCC 不会完全移除。
- 统一头文件:此版本引入了与 Android 平台同步并保持始终最新和准确的平台头文件。仅头文件的错误修复现在会影响所有 API 级别。统一头文件的引入修复了早期 NDK 版本中的不一致,例如:
要详细了解此版本中的新增和更改内容,请参阅此更新日志。
Android NDK r13b (2016 年 10 月)
- 下载
- 此版本的下载文件已归档,可在此处获取。
- 公告
-
- GCC 已不再受支持。它尚未从 NDK 中移除,但已不再接收向后移植。由于 gnustl 的某些部分仍然与 Clang 不兼容,在 libc++ 变得足够稳定并成为默认库之前,它无法移除。在那之后,它很可能会被移除。
- 添加了 simpleperf,一个用于 Android 的 CPU 分析器。
- r13b
-
-
针对缺失
__cxa_bad_cast的其他修复。
-
针对缺失
- NDK
-
NDK_TOOLCHAIN_VERSION现在默认为 Clang。- libc++ 已更新至 r263688。
- 我们已重置为(几乎)干净的上游版本。这应该会消除一些错误,但在我们将 libandroid_support 推荐为默认库之前,我们仍然需要进行清理。
-
make-standalone-toolchain.sh现在只是一个 Python 版本工具的包装器。存在一些行为差异。详情请参阅提交消息。 - 已移除一些不受支持的 ABI 的库 (mips64r2、mips32r6、mips32r2 和 x32)。可能仍然存在一些遗漏。
- crtbegin_static.o 的问题已解决,该问题曾导致在为 ARM android-21+ 构建静态可执行文件时链接阶段缺少 atexit:问题 132
- 在 build/cmake/android.toolchain.cmake 中添加了 CMake 工具链文件。
- 已知问题
Android NDK r12b (2016 年 6 月)
- 下载
- 此版本的下载文件已归档,可在此处获取。
- 公告
ndk-build命令在 r13 中将默认使用 Clang。我们将在后续版本中移除 GCC。make-standalone-toolchain.sh脚本将在 r13 中移除。请确保make_standalone_toolchain.py适合您的需求。- 请向 GitHub 报告问题。
- 我们已修复
ndk-gdb.py。(问题 118) - 我们已更新
NdkCameraMetadataTags.h,使其不再包含无效的 enum 值。 - ndk-build 中一个导致使用 libc++ 的静态库出现错误警告的 bug 已修复。有关此更改的详细信息,请参阅此处的注释。
- OpenSLES 头文件已针对 android-24 更新。
- NDK
- 我们移除了对 armeabi-v7a-hard ABI 的支持。详情请参阅此说明。
- 移除了 pre-GB 平台级别的所有 sysroots。我们在 r11 中放弃了对其支持,但疏忽了实际移除它们。
- 在 ARM32 上使用 c++_shared 时的异常处理现在大部分都能正常工作。unwinder 现在将链接到每个链接的对象中,而不是链接到 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 (非 thumb) STL 库。
- 为 android-24 添加了 Vulkan 支持。
- 为 android-24 添加了 Choreographer API。
- 为支持
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED或更高功能级别的设备添加了libcamera2API。要了解详情,请参阅相机特性。 - Clang
- Clang 已更新至 3.8svn (r256229, build 2812033)。
- 32 位 Windows 包中的
clang.exe和clang++.exe可执行文件实际上是 64 位。32 位可执行文件名为clang_32.exe。
- 32 位 Windows 包中的
- GCC
- 与 ChromeOS GCC @ google/gcc-4_9 r227810 同步。
- 从 ToT 向后移植了 coverage sanitizer 补丁 (r231296)。
- 修复了 libatomic 以不使用
ifuncs。(问题 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 ASAN 仍然无法工作。更多信息请参阅此更改列表上的讨论。
- 在 Android 2.3 (API 级别 9) 或 Android 4.0 (API 级别 14) 的 ARM 上,使用
c++_shared时的异常展开仍然无法工作。 - 尽管存在 android-24,但 Android 6.0 (API 级别 23) 和 Android 7.0 (API 级别 24) 的 Bionic 头文件和库尚未公开。这些平台仍然使用 Android 5.0 (API 级别 21) 的头文件和库(不是 r11 的回归)。
- RenderScript 工具不存在(不是 r11 的回归)。(问题 7)
- 此更新日志并非旨在提供所有未解决错误的全面列表。
__thread 这次应该真的能工作了。Android NDK r12 (2016 年 6 月)
- 下载
- 此版本的下载文件已归档,可在此处获取。
- 公告
ndk-build命令在即将发布的版本中将默认使用 Clang。GCC 将在后续版本中移除。make-standalone-toolchain.sh脚本将在即将发布的版本中移除。如果您使用此脚本,请尽快计划迁移到make_standalone_toolchain.py。- NDK
- 移除了对 armeabi-v7a-hard ABI 的支持。请参阅文档中的说明。
- 移除了 Android 2.3 (API 级别 9) 之前平台级别的所有 sysroots。我们在 NDK r11 中放弃了对其支持,但疏忽了实际移除它们。
- 更新了在 ARM32 上使用 c++_shared 时的异常处理,使其大部分都能正常工作(请参阅已知问题)。unwinder 现在链接到每个链接的对象中,而不是链接到 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 问题 14,NDK 问题 16)。
- 移除了不可达的 ARM (非 thumb) STL 库。
- 为 android-24 添加了 Vulkan 支持。
- 为 android-24 添加了 Choreographer API。
- 为支持
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED功能级别或更高版本的设备添加了 libcamera2 API。有关更多信息,请参阅CameraCharacteristics参考。 - Clang
- Clang 已更新至 3.8svn (r256229, build 2812033)。32 位 Windows 包中的
clang.exe和clang++.exe可执行文件实际上是 64 位。32 位可执行文件名为clang_32.exe。 - 修复了
__thread,使其这次真的能工作。 - GCC
- 编译器与 ChromeOS GCC @ google/gcc-4_9 r227810 同步。
- 从 ToT 向后移植了 coverage sanitizer 补丁 (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 Address Sanitizer (ASAN) 目前无法工作。有关更多信息,请参阅问题 186276。
- 在 Android 2.3 (API 级别 9) 或 Android 4.0 (API 级别 14) 的 ARM 上,使用
c++_shared时的异常展开无法工作。 - 尽管存在 android-24,但 Android 6.0 (API 级别 23) 及更高版本的 Bionic 头文件和库尚未公开。这些平台仍然使用 Android 5.0 (API 级别 21) 的头文件和库,这与 NDK r11 一致。
- RenderScript 工具不存在,这与 NDK r11 一致。(NDK 问题 7)
- 在
NdkCameraMetadataTags.h头文件中,相机元数据标签 enum 值ACAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP意外列出,并将在下个版本中移除。请改用ACAMERA_STATISTICS_LENS_SHADING_MAP值。
Android NDK r11c (2016 年 3 月)
Android NDK r11b (2016 年 3 月)
- NDK
- Clang
-
- 勘误表
- 与我们在 r11 发布说明中报告的相反,
__thread无法工作。这是因为我们提供的 Clang 版本缺少模拟 TLS 支持的错误修复。
Android NDK r11 (2016 年 3 月)
- Clang
-
- 重要公告
- 新增
- Clang 现在支持模拟 TLS。
- 编译器现在通过使用 pthread 线程特定数据模拟 ELF TLS 来支持
__thread。 - C++11
thread_local在某些情况下有效,但不适用于具有非平凡析构函数的数据,因为这些情况需要 libc 的支持。此限制在 Android 6.0 (API 级别 23) 或更新版本上运行时不适用。 - 当从共享库访问 TLS 变量时,模拟 TLS 在 Aarch64 上尚无法工作。
- 编译器现在通过使用 pthread 线程特定数据模拟 ELF TLS 来支持
- Clang 现在支持模拟 TLS。
- GCC
-
- 重要公告
- NDK 中的 GCC 现已弃用,转而推荐使用 Clang。
- NDK 不会升级到 5.x,也不接受非关键的向后移植。
- 4.9 版本中误编译和内部编译器错误的维护将逐案处理。
- 移除
- 移除了 GCC 4.8。所有目标现在都使用 GCC 4.9。
- 其他变更
- google/gcc-4_9 同步到 r224707。此前已与 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来恢复旧行为。
- 您可以通过传递指定
- 更改了构建系统,以对平台头文件使用
-isystem。- bionic 引起的警告不再中断应用构建。
- 修复了二进制文件通过 gabi++ 抛出异常时发生的 segfault。(问题 179410)
- 将 libc++ 的内联命名空间更改为
std::__ndk1,以防止与平台 libc++ 发生 ODR 问题。 - 所有 libc++ 库现在都使用 libc++abi 构建。
- 将默认
APP_PLATFORM提升至 Gingerbread。- 预计未来版本将放弃对 Froyo 及更早版本的支持。
- 将 ARM 独立工具链的默认设置更改为 arm7。
- 更新了 64 位版本的 gabi++
_Unwind_Exception结构。 - 为 cpufeatures 添加了以下功能
- 检测 SSE4.1 和 SSE4.2。
- 检测 x86_64 上的 cpu 特性。
- 将 libc++abi 更新至上游版本 r231075。
- 更新了
byteswap.h、endian.h、sys/procfs.h、sys/ucontext.h、sys/user.h和uchar.h,均来自 ToT Bionic。 - 在所有 API 级别上同步了
sys/cdefs.h。 - 修复了 arm 的
fegetenv 和 fesetenv。 - 修复了 mips64 和 x86_64 的
crtend_*的末尾指针大小/对齐问题。
- 重要公告
- Binutils
-
- 新增
- 添加了一个新选项:
--pic-veneer。
- 添加了一个新选项:
- 移除
- 32 位 Windows 包不再包含 ld.gold。您可以从 64 位 Windows 包中获取 ld.gold。
- 变更
- 统一了 Android 和 ChromiumOS 之间的 binutils 源。有关此更改的更多信息,请参阅此处的注释。
- 提高了 aarch64 上 Gold 的可靠性。在链接时使用
-fuse-ld=gold可以使用 gold 而不是 bfd。默认设置可能会在下一个版本中切换。 - 改进了 Gold ARM 后端链接大型二进制文件的时间(可调试 Chrome 浏览器链接时间缩短高达 50%)。
- 新增
- GDB
-
- 移除
- 移除了 ndk-gdb,转而使用 ndk-gdb.py。
- 变更
- 更新了 gdb 至版本 7.10。
- 提高了性能。
- 改进了错误消息。
- 修复了相对项目路径。
- 停止 Ctrl-C 终止后台的 gdbserver。
- 改进了 Windows 支持。
- 移除
Android NDK r10e (2015 年 5 月)
- 下载
- 此版本的下载文件已归档,可在此处获取。
- 重要变更
-
- 将 Cortex-A53 Erratum 843419 的解决方法集成到了
aarch64-linux-android-4.9链接器中。有关此解决方法的更多信息,请参阅cortex-a53 勘误 843419 的解决方法。 - 添加了 Clang 3.6;
NDK_TOOLCHAIN_VERSION=clang现在默认选择该版本的 Clang。 - 移除了 Clang 3.4。
- 移除了 GCC 4.6。
- 为所有架构在
ld.gold中实现了多线程支持。现在可以链接支持或不支持多线程的版本;默认是不支持多线程的版本。- 要使用多线程编译,请使用
--threads选项。 - 要不使用多线程编译,请使用
--no-threads选项。
- 要使用多线程编译,请使用
- 将所有架构的 GDB/gdbserver 升级到 7.7。
- 移除了 32 位 Darwin 的 NDK 包。
- 将 Cortex-A53 Erratum 843419 的解决方法集成到了
- 重要错误修复
-
- 修复了当 OpenMP 循环位于主线程外部时发生的崩溃。
- 修复了 GCC 4.9 的一个内部编译器错误 (ICE),该错误发生在用户声明了
#pragma GCC optimize ("O0"),但在命令行上指定了不同的优化级别时。pragma具有优先权。 - 修复了一个曾经导致以下错误消息并导致崩溃的错误
in add_stores, at var-tracking.c:6000
- 实现了针对 Clang 3.5 问题的一个解决方法,该问题是 LLVM 自动向量化生成了
llvm.cttz.v2i64(),这是一个在 ARM 指令集中没有对应指令的指令。
- 其他错误修复
-
- 进行了以下头文件和库修复
- 修复了
media/NdkMediaDrm.h中的PROPERTY_*。 - 修复了
mips64的sys/ucontext.h。 - 移除了 Clang 版本对
__builtin_isnan和__builtin_isinf的检查。 - 添加了
android-21/arch-mips/usr/include/asm/reg.h和android-21/arch-mips64/usr/include/asm/reg.h。 - 修复了 GCC 4.9 为 x86 生成的一个虚假数组越界警告,并重新启用了 GCC 4.9 为 ARM 生成的数组越界警告。此前已无条件禁用了 ARM 的警告。
- 修复了 Clang 3.5 为
mips和mips64创建可写.gcc_except_table部分的问题,从而与 GCC 行为一致。此更改使您可以避免以下链接器警告.../ld: warning: creating a DT_TEXTREL in a shared object
- 向后移植了
compiler-rt问题的一个修复,这些问题导致 Clang 编译mips64时发生崩溃。有关更多信息,请参阅 LLVM 问题 20098。 - 修复了 Clang 3.5 在非 ASCII 注释上发生的崩溃。(问题 81440)
- 修复了
stlport collate::compare以返回-1和1。此前,它返回的是任意有符号数字。 - 修复了 64 位 ABI 的
ndk-gdb。(问题 118300) - 修复了 RenderScript 的 HelloComputeNDK 示例在 Android 4.4 (Android API 级别 19) 上发生的崩溃。有关更多信息,请参阅此页面。
- 修复了 GCC 的
libc++ __wrap_iter。有关更多信息,请参阅 LLVM 问题 22355。 - 修复了 ABI
x86_64的.asm支持。 - 实现了 GCC 4.8
stlport问题的一个解决方法。(问题 127773) - 从 Windows 项目路径中移除了尾随目录分隔符
\\。(问题 160584) - 修复了当从
gradle执行ndk-build.cmd命令编译单个.c文件时发生的no rule to make target错误。(问题 66937) - 添加了以下主机工具链中缺失的
libatomic.a和libgomp.a库aarch64-linux-android-4.9mips64el-linux-android-4.9mipsel-linux-android-4.9x86_64-4.9
- 其他变更
-
- 为
aarch64添加了ld.gold。默认链接器仍然是ld.bfd。要显式启用ld.gold,请将-fuse-ld=gold添加到LOCAL_LDFLAGS或APP_LDFLAGS变量中。 - 使用
binutils-2.25构建了 MIPS 和 MIPS64 工具链,这提供了改进的 R6 支持。 - 将
-fstandalone-debug(完整调试信息)设为 Clang 的默认选项。 - 对于 GCC 4.9、Clang 3.5 和 Clang 3.6 的 ARM、AArch64、X86 和 X86_64 工具链,用
-fstack-protector-strong替换了-fstack-protector。 - 为
ndk-gdb添加了--package命令行开关,允许构建系统覆盖包名。(问题 56189) - 弃用了 MIPS 的
-mno-ldc1-stc1。此选项可能与新的-fpxx和-mno-odd-spreg选项或 FPXX ABI 不兼容。 - 将 MIPS MSA 和 R6 检测功能添加到了
cpu-features。
- 为
Android NDK r10d (2014 年 12 月)
- 重要变更
-
- 将 GCC 4.8 设为所有 32 位 ABI 的默认设置。弃用了 GCC 4.6,并将在下个版本中移除。要恢复之前的行为,可以在 ndk-build 中添加
NDK_TOOLCHAIN_VERSION=4.6,或在命令行执行make-standalone-toolchain.sh时添加--toolchain=arm-linux-androideabi-4.6。GCC 4.9 仍然是 64 位 ABI 的默认设置。 - 停止所有 x86[_64] 工具链默认添加
-mstackrealign。NDK 工具链假定 16 字节堆栈对齐。默认使用的工具和选项强制执行此规则。编写汇编代码的用户必须确保保持堆栈对齐,并确保其他编译器也遵守此规则。(GCC 错误 38496) - 为 ARM 和 x86 ABI 添加了 Clang 3.5 对 Address Sanitizer 功能的支持。有关此更改的更多信息,请参阅 Address Sanitizer 项目。
- 从 API 级别 21 开始引入了构建时使用
-fPIE -pie的要求。在 API 级别 16 及更高版本中,ndk-build 在构建时使用PIE。此更改有多种影响,已在开发者预览版问题 888 中讨论。这些影响不适用于共享库。
- 将 GCC 4.8 设为所有 32 位 ABI 的默认设置。弃用了 GCC 4.6,并将在下个版本中移除。要恢复之前的行为,可以在 ndk-build 中添加
- 重要错误修复
-
- 在 aarch64-linux-android-4.9 链接器中,进行了更多与 A53 勘误 #835769 相关的修复。作为此工作的一部分,当指定
-mfix-cortex-a53-835769(默认启用)时,GCC 会传递一个新选项--fix-cortex-a53-835769。更多信息请参阅此binutils 消息和此binutils 消息。 - 记录了对 libc++
sscanf/vsscanf挂起问题的修复,该问题发生在 API 级别 21 中。修复本身已在 r10c 中实现。(问题 77988) - 修复了在使用 GCC 4.9 并指定
-Os时发生的 AutoFDO (-fauto-profile) 崩溃。(问题 77571)
- 在 aarch64-linux-android-4.9 链接器中,进行了更多与 A53 勘误 #835769 相关的修复。作为此工作的一部分,当指定
- 其他错误修复
-
- 进行了以下头文件和库修复
- 为 API 级别 16 添加了
posix_memalign。此外,在stdlib.h中为 API 级别 16 至 19 添加了原型。(问题 77861) - 修复了
stdatomic.h,使其仅针对 C++11 包含<atomic>。 - 修改了以下头文件以供独立使用:API 级别 21 的
sys/user.h,以及gl2ext.h、dlext.h、fts.h、sgidefs.h。 - 修改了
sys/user.h,将mxcsr_mask重命名为mxcr_mask,并更改了u_ar0的数据类型 从 - 将
sysconf()返回值类型从int更改为long。 - 修复了 ndk-build 对
LOCAL_ARM_MODE的thumb处理:在 r10d 中,ndk-build 默认添加LOCAL_LDFLAGS+=-mthumb,除非满足以下条件之一 - 您已将
LOCAL_ARM_MODE设置为arm。 - 您正在进行调试构建(使用
APP_OPTIM=debug和AndroidManifest.xml包含android:debuggable="true"等设置),其中 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)
unsigned long更改为 struct user_regs_struct*。
Android NDK r10c (2014 年 10 月)
- 重要变更
-
- 对下载结构进行了以下更改
- 每个包现在都包含其各自平台的 32 位和 64 位头文件、库和工具。
- 包含调试信息的 STL 库不再需要单独下载。
- 将之前称为
Android-L的所有内容更改为正式发布名称:android-21。 - 通过重新基于 GCC 仓库的
google分支,更新了 GCC 4.9。与上游版本的 GCC 4.9 的主要区别包括 -O2选项现在开启向量化,不带循环剥离,但带有更激进的循环展开。- 对 FDO 和 LIPO 的增强
- 为所有主机添加了 Clang 3.5 支持:
NDK_TOOLCHAIN_VERSION=clang现在选择 Clang 3.5。请注意 - ARM 和 x86 默认使用集成汇编器。如果这导致问题,请使用
-fno-integrated-as作为解决方法。 - Clang 3.5 会对未使用的标志(例如 GCC 支持的
-finline-functions选项)发出更多警告。 - 通过指定
art-on选项,可以在使用 ART 作为其虚拟机的 Android 5.0 设备上调试时进入 ART 调试模式。有关更多信息,请参阅 NDK 目录中的prebuilt/common/gdb/common.setup。 - 移除了对 Clang 3.3 的支持。
- 弃用了 GCC 4.6,并可能在未来版本中移除。
- 更新了 mclinker 到 2.8,并添加了相同代码折叠("ICF")支持。使用
--icf选项指定 ICF。 - 扩展了 x86 和 x86_64 中的
arm_neon.h支持,覆盖了约 93% 的 NEON 内置函数。有关 NEON 支持的更多信息- 导航到 NDK 程序员指南 (
docs/Programmers_Guide/html/),并参阅 Architectures and CPUs > Neon。 - 查看
samples/中更新后的hello-neon示例。 - 请参阅 Intel 关于将 ARM NEON 移植到 Intel SSE 的指南。
- 导航到 NDK 程序员指南 (
- 记录了
headers/libs/android-21中对_FORTIFY_SOURCE的支持,该支持在 r10 中出现(当时android-21仍称为Android-L),但没有文档说明。
有关更详细信息,请参阅下面的重要错误修复。
从使用 GCC 的项目迁移时,可以使用
-Wno-invalid-command-line-argument和-Wno-unused-command-line-argument忽略未使用的标志,直到您决定如何长期处理它们。 - 重要错误修复
-
- 修复了 GCC4.9/aarch64 的内部编译器错误,该错误导致以下错误消息(问题 77564)
- 修复了 GCC4.9/arm 生成的错误代码。(问题 77567)
- 修复了涉及内联汇编的 GCC4.9/mips 的内部编译器错误。(问题 77568)
- 修复了 GCC4.9/arm 为
x = (cond) ? y : x生成的错误代码。(问题 77569) - 修复了 GCC4.9/aarch64 和 Clang3.5/aarch64,使其默认解决 Cortex-A53 勘误 (835769)。可以通过指定
-mno-fix-cortex-a53-835769来禁用解决方法。
internal compiler error: in simplify_const_unary_operation, at simplify-rtx.c:1539
- 其他错误修复
-
- 对
android-21进行了以下头文件和库修复- 添加了更多电视键码:
android/keycodes.h - 为
android/sensor.h添加了更多常量和六个新传感器函数:ASensorManager_getDefaultSensorEx、ASensor_getFifoMaxEventCount、ASensor_getFifoReservedEventCount、ASensor_getStringType、ASensor_getReportingMode和ASensor_isWakeUpSensor。 - 修复了
stdatomic.h,以改进与 GCC 4.6 的兼容性,并支持<atomic>头文件。 - 为所有 API 级别添加了
sys/ucontext.h和sys/user.h。signal.h头文件现在包含<sys/ucontext.h>。您可以移除任何现有的struct ucontext定义。 - 为 API 级别 17、18 和 19 添加了
posix_memalign。 - 为所有架构添加了以下函数:
android_set_abort_message、posix_fadvise、posix_fadvise64、pthread_gettid_np。 - 为
native-media/AndroidManifest.xml示例添加了所需的权限。(问题 106640) - 为 API 级别 21 添加了
clock_nanosleep和clock_settime。(问题 77372) - 从所有架构中移除了以下符号:
get_malloc_leak_info、free_malloc_leak_info、__srget、__swbuf、__srefill、__swsetup、__sdidinit、__sflags、__sfp、__sinit、__smakebuf、__sflush、__sread、__swrite、__sseek、__sclose、_fwalk、__sglue、__get_thread、__wait4、__futex_wake、__open、__get_tls、__getdents64和dlmalloc。 - 从 64 位架构中移除了以下函数:
basename_r、dirname_r、__isthreaded、_flush_cache(mips64)。 - 从 32 位架构中移除了以下函数:
__signalfd4。 - 在以下函数中将第三个参数的类型从
size_t更改为int:strtoll_l、strtoull_l、wcstoll_l和wcstoull_l。 - 将以下函数恢复到 64 位架构:
arc4random、arc4random_buf和arc4random_uniform。 - 将
cxa_*以及new和delete运算符移回libstdc++.so。此更改恢复了 r9d 的行为;r10 的先前版本包含占位符文件。
- 添加了更多电视键码:
- 恢复了 GCC 4.8 和 4.9 对 mips 的 MXU 支持。此支持在 r10 和 r10b 中缺失,因为这些版本的 GCC 是使用 binutils-2.24 编译的,而 binutils-2.24 不支持 MXU。现在支持了。
- 修复了
make-standalone-toolchain.sh中的--toolchain=,使其现在正确支持使用指定 Clang 版本的后缀。 - 修复了 libc++/armeabi
strtod()函数。 - 修复了
docs/中的 NDK 文档。
- 对
- 其他变更
-
- 增强了
cpu-features以检测 ARMv8 对以下指令集的支持:AES、CRC32、SHA2、SHA1 和 64 位 PMULL/PMULL2。(问题 106360) - 修改了 ndk-build 以使用
*-gcc-ar,它在 GCC 4.8、GCC 4.9 和 Clang 中可用。Clang 指定使用它,而不是*-ar。此设置改进了 LTO 支持。 - 从 GCC 编译器中移除了
include-fixed/linux/a.out.h和include-fixed/linux/compiler.h头文件。(问题 73728) - 修复了与 Mac OS X 上 GCC 4.8 的
-flto相关的问题。错误消息显示 - 修复了
build-binary.mk.中的一个拼写错误。(问题 76992)
.../ld: error: .../libexec/gcc/arm-linux-androideabi/4.9/liblto_plugin.so Symbol not found: _environ
- 增强了
- 重要已知问题
-
- 在 GCC4.9 中指定 -Os (
-fauto-profile) 可能导致崩溃。(问题 77571)
- 在 GCC4.9 中指定 -Os (
Android NDK r10b (2014 年 9 月)
- 重要注意事项
-
- 由于可下载包的大小限制为 512MB,以下 32 位项目不在 32 位 NDK 下载包中。相反,它们位于 64 位下载包中
- Android-L 头文件
- GCC 4.9
- 目前,NDK 提供的 RenderScript 支持仅限于 Android 4.4 (API 级别 19) 的 32 位 RenderScript。您不能使用 RenderScript(32 位或 64 位)和 Android 版本的任何其他组合构建 HelloComputeNDK(唯一的 RenderScript 示例)。
- 要编译 native-codec,您必须使用 64 位 NDK 包,所有 Android-L 头文件都位于其中。
- 重要错误修复
- 其他错误修复
-
- 从所有版本 GCC 的
include-fixed/目录中移除了stdio.h。(问题 73728。) - 从 Windows 包的
platforms/android-L/arch-*/usr/include/linux/netfilter*/目录中移除了重复的头文件。(问题 73704。) - 修复了一个导致 Clang 无法构建 HelloComputeNDK 的问题。
- 修复了 atexit。(问题 66595。)
- 对
docs/和sources/third_party/googletest/README.NDK中的文档进行了各种修复。(问题 74069。) - 对 Android-L 头文件进行了以下修复
- 为
ctype.h和wchar.h添加了以下函数:dn_expand()、grantpt()、inet_nsap_addr()、inet_nsap_ntoa()、insque()、nsdispatch()、posix_openpt()、__pthread_cleanup_pop()、__pthread_cleanup_push()、remque()、setfsgid()、setfsuid()、splice()、tee()、twalk()(问题 73719),以及 42 个*_l()函数。 - 将
cmsg_nxthdr重命名为__cmsg_nxthdr。 - 移除了
__libc_malloc_dispatch。 - 将
ptrace()原型更改为long ptrace(int, ...);。 - 移除了
sha1.h。 - 扩展了
android/dlext.h中的android_dlextinfo。 - 为
stdlib.h、time.h、wchar.h和complex.h中接收或返回 float 或 double 类型值的函数添加了__NDK_FPABI__注释。
- 从所有版本 GCC 的
- 其他变更
-
- 更新了
mipsel-linux-android-4.9和mips64el-linux-android-4.9,实现了新的 multilib 目录布局,并提供了对 gdb-7.7 的支持 - 增强了
cpu-features以检测更多 arm64 特性。(更改列表 100339。)
- 更新了
Android NDK r10 (2014 年 7 月)
- 重要变更
-
- 新增 3 个新的 ABI,全部为 64 位:arm64-v8a、x86_64、mips64。 请注意
- GCC 4.9 是 64 位 ABI 的默认编译器。Clang 当前版本为 3.4。
NDK_TOOLCHAIN_VERSION=clang可能不适用于 arm64-v8a 和 mips64。 - Android-L 是第一个支持 64 位的级别。请注意,此 API 级别是临时的,仅用于 L-preview。正式的 API 级别号将在 L-release 时取代它。
- 此版本现在包含
APP_ABI的all32和all64设置。APP_ABI=all32等同于APP_ABI=armeabi,armeabi-v7a,x86,mips。APP_ABI=all64等同于APP_ABI=arm64-v8a,x86_64,mips64。APP_ABI=all选择所有 ABI。
- Android-L 中的新 GNU libstdc++ 包含所有
<tr1/cmath>。在定义自己的数学函数之前,请检查_GLIBCXX_USE_C99_MATH_TR1以查看是否已存在具有该名称的函数,以避免链接器产生“multiple definition”错误。 - cpu-features 库已更新,支持 ARMv8 内核。现有的 cpu-features 库可能无法检测 ARMv8 平台上 NEON 的存在。请使用新版本重新编译您的代码。
- 添加了新的
platforms/android-L/API 目录。它包含 - 更新的 Bionic 头文件,它们自 Android API 级别 3 (Cupcake) 到 19 (KitKat) 未曾更改。此针对 L 级别的新版本将与 AOSP 同步。
- 新的媒体 API 和 native-codec 示例。
- 更新的
Android.h头文件,用于 SLES/OpenSLES,可在 AudioPlayer 中启用单精度浮点音频格式的支持。 - GLES 3.1 和 AEP 扩展到
libGLESv3.so. - GLES2 和 GLES3 头文件更新至最新的官方 Khronos 版本。
- 为 32-/64 位 ABI 添加了 GCC 4.9 编译器。如前所述,GCC 4.9 是 64 位 ABI 的默认(唯一)编译器。对于 32 位 ABI,您必须显式启用 GCC 4.9,因为 GCC 4.6 仍然是默认设置。
- 对于 ndk-build,通过向
Application.mk添加NDK_TOOLCHAIN_VERSION=4.9,或从命令行导出为环境变量,启用 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(ARM 和 MIPS 的默认设置)中的 GDB 版本仍然是 GDB-7.3.x,您必须设置
NDK_TOOLCHAIN_VERSION=4.8或4.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++ 支持”部分。请注意
- 除了 locale 之外的所有测试现在都可以通过 Clang 3.4 和 GCC 4.8。有关更多信息,请参阅文档的“C++ 支持”部分。
- X86 和 MIPS libc++ 的 libc++ 库仍然使用 gabi++。
- GCC 4.7 及更高版本现在可以使用
。 - 如果使用
<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 原子库调用导致 ABI armeabi 的某些 libc++ 测试崩溃的问题。
- 修复了 Clang 3.4 在读取预编译头文件时发生的崩溃。(问题 66657)。
- 修复了 Clang 3.3/3.4
-O3的断言 - 修复了以下 Clang 3.3/3.4 崩溃
llvm-3.2/llvm/include/llvm/MDBuilder.h:64: llvm::MDNode* llvm::MDBuilder::createBranchWeights(llvm::ArrayRef(问题 57381)。): Assertion Weights.size() >= 2 && "Need at least two branch weights!" Assertion failed: (!Fn && "cast failed but able to resolve overload expression!!"), function CheckCXXCStyleCast, file Volumes/data/ndk-toolchain/src/llvm-3.3/llvm/tools/clang/lib/Sema/SemaCast.cpp, line 2018。(问题 66950)。 - 修复了 libc++,使其现在可以编译
- 其他错误修复
-
- 头文件修复
- 修复了 32 位
ssize_t,使其为int而不是long int。 - 修复了
WCHAR_MIN和WCHAR_MAX,使其根据它们运行的架构采用适当的符号 - X86/MIPS:有符号。
- ARM:无符号。
- 要强制 X86/MIPS 默认为无符号,请使用
-D__WCHAR_UNSIGNED__。 - 要强制
wchar_t为 16 位,请使用-fshort-wchar。 - 从 32 位
libc.so中移除了不存在的符号,并为 Android API 级别 12 及更高版本添加了pread64、pwrite64、ftruncate64。(问题 69319)。更多信息请参阅 AOSP 更改列表 94137 的提交消息。 - 修复了 GCC 关于
putchar重定义的警告。警告消息为 - 修复了
make-standalone-toolchain.sh --stl=libc++,使其 - 修复了 GCC/Windows,仅在外部程序中生成进程必要时引用参数。此更改降低了超出 32K 长度限制的可能性。
- 修复了导致无法调整
APP_PLATFORM环境变量的问题。 - 修复了 crazy_linker 中
IsSystemLibrary()的实现,使其使用strrchr()而不是strchr()来查找库路径的真实基本名称。 - 修复了 native-audio 无法在调试模式下构建的问题。
- 修复了 gdb 无法打印极值浮点数的问题。(问题 69203)。
- 修复了 Clang 3.4 无法使用
-Wl,-shared进行编译的问题(与-shared不同,后者没有编译问题)。问题在于 Clang 在 Android 目标上,如果没有-shared或-static存在,会添加-pie。这种不正确的行为导致链接器抱怨-shared和-pie不能共存。
include/stdio.h:236:5: warning: conflicts with previous declaration here [-Wattributes] int putchar(int);(更改列表 91185)。 - 其他变更
-
- 将
arm_neon.h添加到 x86 工具链中,使其现在模拟约 47% 的 Neon 功能。目前不支持 64 位类型。有关更多信息,请参阅 x86 文档中关于 ARM Neon 内置函数支持的部分。 - 将 ARM/GOT_PREL 优化(存在于从 GCC google 分支构建的 GCC 4.6 中)移植到了 ARM GCC 4.8/4.9。此优化有时在访问全局变量时可以减少指令计数。例如,请参阅
$NDK/tests/build/b14811006-GOT_PREL-optimization/中的 build.sh 脚本。 - 为 STL gabi++、stlport 和 libc++ 添加了 ARM 版本。它们现在都支持 ARM 和 Thumb 模式。
- 现在可以使用
--toolchain=x86_64-linux-android-4.9调用 make-standalone-toolchain.sh 脚本,这等同于--toolchain=x86_64-4.9。
- 将
Android NDK r9d (2014 年 3 月)
- 重要变更
-
- 添加了对 Clang 3.4 编译器的支持。
NDK_TOOLCHAIN_VERSION=clang选项现在选择 Clang 3.4。GCC 4.6 仍然是默认编译器。 - 添加了
APP_ABI=armeabi-v7a-hard,以及额外的 multilib 选项-mfloat-abi=hard。这些选项用于 ARM GCC 4.6/4.8 和 Clang 3.3/3.4(后者使用 4.8 的汇编器、链接器和库)。使用这些选项时,请注意以下更改 - 执行
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-v7a和armeabi-v7a-hard作为 make 目标(即在 APP_ABI= 行上)。这样做会导致其中一个被忽略。请注意,APP_ABI=all仍然等同于armeabi armeabi-v7a x86 mips。 make-standalone-toolchain.sh脚本会将额外的库复制到/hard目录中。将上述CFLAGS和LFLAGS添加到您的 makefile 中,以使 GCC 或 Clang 能够链接/hard中的库。- 添加了 yasm 汇编器,以及 x86 目标的
LOCAL_ASMFLAGS和EXPORT_ASMFLAGS标志。ndk-build脚本使用prebuilts/*/bin/yasm*构建具有.asm扩展名的LOCAL_SRC_FILES。 - 更新了 MClinker 到 2.6.0,它增加了
-gc-sections支持。 - 添加了实验性 libc++ 支持(上游 r201101)。按照以下步骤使用此新功能
- 在
Application.mk中添加APP_STL := c++_static或APP_STL := c++_shared。您可以通过LIBCXX_FORCE_REBUILD := true从源代码重新构建。 - 执行
make-standalone-toolchain.sh --stl=libc++创建包含 libc++ 头文件/库的独立工具链。
CPLUSPLUS-SUPPORT.html。(问题 36496) - 在
- 添加了对 Clang 3.4 编译器的支持。
- 重要错误修复
-
- 修复了 GCC 4.6/4.8 ARM EABI 的意外异常处理器中的未捕获抛出。(GCC 问题 59392)
- 修复了 GCC 4.8,使其现在正确解决了带有依赖性非类型模板参数的模板的部分特化。(GCC 问题 59052)
- 为预构建的 python 添加了更多模块(问题 59902)
- Mac OS X:
zlib、bz2、_curses、_curses_panel、_hashlib、_ssl - Linux:
zlib、nis、crypt、_curses和_curses_panel
- Mac OS X:
- 修复了 x86 和 MIPS gdbserver
event_getmsg_helper。 - 修复了 RenderScript NDK 工具链中的许多问题,包括在旧设备上的兼容性和 C++ 反射问题。
- 其他错误修复
-
- 头文件修复
- 修复了 Android API 级别 13 及更高版本在
android/asset_manager.h中缺失#include <sys/types.h>的问题。(问题 64988) - 修复了 Android API 级别 14 及更高版本在
android/rect_manager.h中缺失#include的问题。 - 在
jni.h中为JNI_OnLoad和JNI_OnUnload添加了JNICALL。注意JNICALL被定义为__NDK_FPABI__。有关更多信息,请参阅sys/cdefs.h。 - 更新了以下头文件,以便在包含时无需手动包含其依赖项(问题 64679)
- 为所有架构添加了
sys/cachectl.h。MIPS 开发者现在可以包含此头文件,而无需编写#ifdef __mips__。 - 通过为采用或返回 float 或 double 值的函数添加
__NDK_FPABI__,修复了platforms/android-18/include/android/input.h。 - 修复了 MIPS 的
struct stat,它在 Android API level 12 及更高版本中被错误地设置为其 64 位对应项。此错误设置是 r9c 版本中引入的回归。 - 为 Android API level 9 及更低版本定义了
__PTHREAD_MUTEX_INIT_VALUE、__PTHREAD_RECURSIVE_MUTEX_INIT_VALUE和__PTHREAD_ERRORCHECK_MUTEX_INIT_VALUE。 - 为 x86 的
libm.so添加了scalbln、scalblnf和scalblnl,适用于 API 18 及更高版本。 - 修复了
sources/android/support/include/iconv.h中的一个拼写错误。(问题 63806)
android/tts.h EGL/eglext.h fts.h GLES/glext.h GLES2/gl2ext.h OMXAL/OpenMAXSL_Android.h SLES/OpenSLES_Android.h sys/prctl.h sys/utime.h
- 修复了 Android API 级别 13 及更高版本在
- 修复了 gabi++ 的
std::unexpected()以调用std::terminate(),从而使用户定义的std::terminate()处理程序有机会运行。 - 修复了 gabi++ 以捕获
std::nullptr。 - 修复了 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 shell 不理解 cygwin 创建的符号链接。
- 头文件修复
- 其他变更
-
- 为之前仅用于
cmd.exeshell 的所有*cmd脚本应用了执行权限,以防开发者希望在 cygwin 中使用ndk-build.cmd而非推荐的ndk-build脚本。 - 如果指定的目录不存在,则通过移动而不是复制来提高了
make-standalone-toolchain.sh脚本的速度。
- 为之前仅用于
Android NDK r9c *(2013 年 12 月)*
此版本仅包含错误修复。
- 重要错误修复
-
- 修复了 GCC 4.8 ARM 的一个问题,其中堆栈指针恢复得过早。此问题导致帧指针无法可靠地访问堆栈帧中的变量。(GCC 问题 58854)
- 修复了 GCC 4.8 libstdc++ 的一个问题,其中
std::nth_element中的一个错误导致生成的代码会产生随机的段错误(segfault)。(问题 62910) - 修复了使用
-fuse-ld=mcld时 cc1/cc1plus 中的 GCC 4.8 内部编译器错误(ICE),从而不再发生以下错误:cc1: internal compiler error: in common_handle_option, at opts.c:1774
- 修复了
-mhard-float对__builtin数学函数的支持。有关使用 STL 修复-mhard-float的持续信息,请关注问题 61784。
- 其他错误修复
-
- 头文件修复
- 在
poll.h中将poll的原型更改为poll(struct pollfd *, nfds_t, int);。 - 为 Android API levels 12 和 19 将
utimensat添加到libc.so。这些库现在包含在 Android API levels 12 到 19 的所有版本中。 - 为 Android API level 19,将
futimens引入到libc.so中。 - 为 Android API level 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_HR和CLOCK_MONOTONIC_HR。
- 在
- 在 Teapot、MoreTeapots 示例和
source/android/ndk_helper中:- 更改了它们,以便现在为 armeabi-v7a 使用硬浮点 ABI。
- 更新了它们,以便在 Android API level 19 及更高版本上使用沉浸模式。
- 修复了
/system/lib/libdvm.so中Check_ReleaseStringUTFChars的一个问题,该问题导致 x86 设备崩溃。
- 修复了在 cygwin 中当 NDK 包通过符号链接引用时发生的
ndk-build失败。 - 修复了当
LOCAL_SRC_FILES包含绝对路径时,在 Windowscmd.exe中发生的ndk-build.cmd失败。(问题 69992) - 修复了
ndk-stack脚本,即使无法解析帧(因为找不到例程、文件名或行号)也能继续执行。在任何这些情况下,它都打印??。 - 修复了 windows-x64_64 目标的
ndk-stack堆栈,使其不再错误地将帧行与stack:部分中不包含pc、eip或ip的行匹配。例如:I/DEBUG ( 1151): #00 5f09db68 401f01c4 /system/lib/libc.so
- 修复了 gabi++,以便它:
- 不使用 malloc() 分配 C++ 线程局部对象。
- 在 userdebug/eng Android 平台构建中,如果
libc.debug.malloc非零,则避免 gabi++ 中的死锁。
- 头文件修复
- 其他变更
-
- 添加了
LOCAL_EXPORT_LDFLAGS。 - 引入了
NDK_PROJECT_PATH=null设置,用于选项明确传递给ndk-build的集成构建系统。使用此设置,ndk-build不会尝试查找NDK_PROJECT_PATH。此设置还阻止变量从 NDK_PROJECT_PATH 推导默认设置。因此,现在必须明确指定以下变量(如果存在默认值,则也指定):NDK_OUT, NDK_LIBS_OUT, APP_BUILD_SCRIPT, NDK_DEBUG(可选,默认为 0),以及Application.mk中包含的其他APP_*。 APP_ABI现在可以在逗号分隔列表中枚举。例如:APP_ABI := "armeabi,armeabi-v7a"
- 提供了使用
-g选项在可选的独立包android-ndk-r9c-cxx-stl-libs-with-debugging-info.zip中重建包含调试信息的所有 STL 的能力。此选项有助于ndk-stack脚本提供更好的 STL 堆栈转储。此更改不应影响最终剥离文件的代码/大小。 - 增强了
hello-jni示例,以便在编译时报告APP_ABI。 - 使用确定性模式(选项
-D)下的ar工具来构建静态库。(问题 60705)
- 添加了
Android NDK r9b *(2013 年 10 月)*
- 重要变更
-
- 更新了适用于所有 Android API level(最高 18)的
include/android/*h和math.h,包括添加了 level 13、15、16 和 17。有关添加的 API 的信息,请参阅更改 68012 和 68014 的提交消息。(问题 47150、58528 和 38423) - 添加了对 Android API level 19 的支持,包括 Renderscript 绑定。
- 在现有的 armeabi-v7a ABI 中添加了对
-mhard-float的支持。有关更多信息以及 Clang 的当前限制,请参阅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 Language Independent Options。GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
- 添加了两个新示例来演示 OpenGL ES 3.0 功能:Teapot 和 MoreTeapots。这些示例在运行 Android 4.1(API level 16)及更高版本的设备上运行。
- 弃用了 GCC 4.7 和 Clang 3.2 支持,这些支持将在下一版本中移除。
- 更新了适用于所有 Android API level(最高 18)的
- 重要错误修复
-
- 修复了 ARM GCC 4.6
thumb2无法生成 16 位相对跳转表的问题。(GCC 问题) - 修复了
g++.dg/cpp0x/lambda/lambda-defarg3.C上的 GCC 4.8 内部编译器错误(ICE)。(更改 62770,GCC 问题) - 修复了 Windows 32 位
*-gdb.exe可执行文件无法启动的问题。(问题 58975) - 修复了构建 bullet 库时的 GCC 4.8 内部编译器错误(ICE)。错误消息如下:
(问题 58916,GCC 问题)internal compiler error: verify_flow_info failed
- 修改了 GDB/ARM 构建,以跳过前导码中用于展开的
ARM.exidx数据,并添加了一个命令(set arm exidx-unwinding)来控制基于 exidx 的堆栈展开。(问题 55826) - 修复了 Clang 3.3 MIPS 编译器中 HI 和 LO 寄存器被错误重用的问题。
- 修复了
dbx_reg_number中 MIPS 4.7 内部编译器错误(ICE)的问题。错误消息如下: (GCC 补丁)external/icu4c/i18n/decimfmt.cpp:1322:1: internal compiler error: in dbx_reg_number, at dwarf2out.c:10185
- 修复了 ARM GCC 4.6
- 其他错误修复
-
- 头文件修复
- 根据规范修复了 ARM 的
WCHAR_MIN和WCHAR_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中移除了不存在的函数imaxabs和imaxdiv。 - 修复了
pthread_exit()返回值和pthread_self()的问题。(问题 60686) - 添加了缺失的
mkdtemp()函数,该函数已存在于bionic头文件stdlib.h中。
- 根据规范修复了 ARM 的
- 修复了在 Android API level 11 上使用 Clang 构建
samples/gles3jni的问题。 - 修复了 MCLinker,以允许多次出现以下选项:
-gc-sections和--eh-frame-hdr。 - 修复了 MCLinker,以接受
--no-warn-mismatch选项。 - 修改了
cpu-features选项,不再假定所有 VFPv4 设备都支持 IDIV。现在,此选项仅将 IDIV 添加到白名单设备,包括 Nexus 4。(问题 57637) - 修复了
android_native_app_glue.c在事件预派发操作中错误记录错误的问题。 - 修复了 gabi++ 上的所有 terminate 和 unexpected_handler 操作,使其线程安全。
- 修复了 Clang
-integrated-as选项的几个问题,使其能够通过ssax-instructions和fenv的测试。 - 修复了 GCC 4.6/4.7/4.8 编译器,即使对于静态可执行文件也传递链接器选项
--eh-frame-hdr。有关更多信息,请参阅 GCC 补丁。 - 修复了
CPU-ARCH-ABIS.html中多余的撇号。有关更多信息,请参阅NDK-DEPENDS.html。(问题 60142) - 修复了 Windows 上 ndk-build 输出中多余的引号。(问题 60649)
- 修复了 Clang 3.3 以编译 ARM 的内置原子操作,例如
__atomic_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.5MB 对比ld.bfd的 3.5MB 和ld.gold的 7.5MB),从而使速度提高了大约 20%。 - 添加了
LOCAL_CONLYFLAGS和APP_CONLYFLAGS,用于指定仅适用于 C 而不适用于 C++ 的选项。现有的LOCAL_CFLAGS和APP_CFLAGS也用于 C++ 编译(以避免重复指定大多数选项),因此像-std=gnu99这样的选项在 g++ 构建中可能会出现警告,在 clang++ 构建中可能会出现错误。 - 添加了
gabi++数组辅助函数。 - 修改了 GCC 构建,以便所有
libgcc.a文件都使用-funwind-tables构建,从而允许堆栈在之前被阻止的点(例如__aeabi_idiv0)之后展开。 - 在 MIPS GCC4.6/4.7/4.8 中添加了 Ingenic MXU 支持,并带有新的
-mmxu选项。 - 扩展了 MIPS GCC4.6/4.7/4.8 的
-mldc1-sdc1,以同时控制 ldxc1/sdxc1。 - 添加了 crazy linker。有关更多信息,请参阅
sources/android/crazy_linker/README.TXT。 - 修复了
bitmap-plasma以绘制到全屏,而不是 200x200 像素的区域。 - 通过创建指向相同文件的符号链接,将 Linux 和 Darwin 工具链的大小减少了 25%。
- 为所有 GCC 构建启用了 OpenMP。要使用此功能,请将以下标志添加到您的构建设置中:
Android NDK r9 *(2013 年 7 月)*
- 重要变更
-
- 添加了对 Android 4.3(API level 18)的支持。有关更多信息,请参阅
STABLE-APIS.html以及samples/gles3jni/README中的新代码示例。 - 添加了 OpenGL ES 3.0 的头文件和库,OpenGL ES 3.0 由 Android 4.3(API level 18)及更高版本支持。
- 将 GNU Compiler Collection (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启用。如果您使用编译时断言(例如sources/cxx-stl/stlport/stlport/stl/config/features.h的第 311 行),请务必添加__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_LDFLAGS或APP_LDFLAGS中添加-fuse-ld=mcld来启用 MCLinker。 - 添加了
ndk-depends工具,用于打印 ELF 库依赖项。有关更多信息,请参阅NDK-DEPENDS.html。(问题 53486)
- 添加了对 Android 4.3(API level 18)的支持。有关更多信息,请参阅
- 重要错误修复
-
- 修复了
android_native_app_glue中潜在的事件处理问题。(问题 41755) - 修复了 ARM/GCC-4.7 构建,为 NEON 加载和存储指令 VST 和 VLD 生成足够的对齐方式。(GCC 问题 57271)
- 修复了 GCC 4.4.3/4.6/4.7 在字符串文字上使用常量负索引值时的内部编译器错误(ICE)。(问题 54623)
- 修复了 GCC 4.7 使用对象地址进行常量初始化时的段错误(segmentation fault)。(问题 56508)
- 修复了在使用 Boost 1.52.0 时,GCC 4.6 ARM 在
-O值上的段错误(segmentation fault)。(问题 42891) - 修复了
libc.so和libc.a以支持wait4()函数。(问题 19854) - 更新了 x86 的 libc.so 和 libc.a 文件,以包含
clone()函数。 - 修复了
LOCAL_SHORT_COMMANDS中的 bug,其中linker.list文件为空或未使用。 - 修复了 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 Debug Server,从而可以更可靠地命中毒开始阶段(例如 JNI 代码中的断点)设置的断点。(问题 41278)注意: 此功能需要 jdb,并会产生有关待定断点的警告。指定
--nowait选项可恢复之前的行为。 - 修复了 GDB 在库列表为空时崩溃的问题。
- 修复了在使用
stepi命令跳过bx pc或blx pcThumb 指令时 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)。之前,只能将版本指定为环境变量。 - 修复了使用 Clang 编译器时,gabi++ 在 MIPS 构建目标上
_Unwind_Exception的大小为 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段。 - 修复了 GCC 4.4.3
stlport的编译错误,该错误涉及_Unwind_Control_Block的typedef不一致。(问题 54426) - 修复了
awk脚本,以处理在 Windows 上创建的AndroidManifest.xml文件,这些文件可能包含尾随的\r字符并导致构建错误。(问题 42548) - 修复了
make-standalone-toolchain.sh,以探测prebuilts/目录来检测主机是 32 位还是 64 位。 - 修复了 Clang 3.2 的
-integrated-as选项。 - 修复了 Clang 3.2 ARM EHABI 紧凑模型的
pr1和pr2处理程序数据。 - 添加了 Clang
-mllvm -arm-enable-ehabi选项,以修复以下 Clang 错误:clang: for the -arm-enable-ehabi option: may only occur zero or one times!
- 修复了应用程序清单中没有
uses-sdk元素时构建失败的问题。(问题 57015)
- 修复了
- 其他变更
-
- 头文件修复
- 修改了头文件,使
__set_errno成为内联函数,因为errno.h中的__set_errno已弃用,并且libc.so不再导出它。 - 修改了
elf.h以包含stdint.h。(问题 55443) - 修复了
sys/un.h,使其可以独立于其他头文件包含。(问题 53646) - 修复了所有的
MotionEvent_getHistoricalAPI 家族,使其接受const AInputEvent* motion_event参数。(问题 55873) - 修复了
malloc_usable_size,使其接受const void*参数。(问题 55725) - 修复了 stdint.h,使其与 C99 更兼容。(更改 46821)
- 修改了
wchar.h,使其不再重新定义WCHAR_MAX和WCHAR_MIN - 修复了
<inttypes.h>中与指针相关的PRI和SCN宏的声明。(问题 57218) - 更改了
sys/cdefs.h头文件,以便对于小于 9 的 API level,__WCHAR_TYPE__是 32 位,这意味着对于所有 API level,wchat_t都是 32 位。要恢复以前的行为,请定义_WCHAR_IS_8BIT布尔变量。(问题 57267)
- 修改了头文件,使
- 在 NDK
docs/中添加了更多格式,并进行了杂项文档修复。 - 添加了构建静态库时的 thin archive 技术支持。(问题 40303)
- 更新了脚本
make-standalone-toolchain.sh,以便在指定--stl=stlport选项时,除了gnustl之外还支持stlport库。有关更多信息,请参阅STANDALONE-TOOLCHAIN.html。 - 更新了
make-standalone-toolchain.sh脚本,以便--llvm-version=选项除了创建clang和clang++之外,还创建$TOOLCHAIN_PREFIX-clang和$TOOLCHAIN_PREFIX-clang++脚本,以避免意外使用主机的 clang 和 clang++ 定义。 - 添加了两个标志,以重新启用上游 Clang 中的两项优化,这些优化在 NDK 中被禁用,以更好地与 GCC 编译的代码兼容:
- 添加了
-fcxx-missing-return-semantics标志,以在 Clang 3.2+ 中重新启用*缺失返回语义*。通常,所有路径对于返回值函数都应以 return 语句终止。如果不是这种情况,clang 会在没有 return 语句的路径上插入未定义的指令(或在调试模式下插入陷阱)。如果您确定代码是正确的,请使用此标志以允许优化器利用未定义的行为。如果您不确定,请不要使用此标志。调用者仍然可能会收到随机的错误值,但优化器不会利用它,并且会让您的代码更难调试。 - 添加了
-fglobal-ctor-const-promotion标志,以重新启用将带有静态构造函数的全局变量提升为常量。使用此标志,LLVM 的全局变量优化通道会尝试评估带有静态构造函数的全局变量,并将它们提升为全局常量。虽然此优化是正确的,但它可能与 GCC 编译的代码产生一些不兼容性。例如,代码可能会执行const_cast将常量转换为可变类型并修改它。在 GCC 中,变量位于读写区域,并且代码会意外运行。在 Clang 中,const 变量位于只读内存中,这可能会导致您的应用程序崩溃。
- 添加了
- 将
-mldc1-sdc1添加到 MIPS GCC 和 Clang 编译器。默认情况下,编译器会正确对齐 8 字节对象,并发出ldc1和sdc1指令来移动它们。如果您的应用程序使用自定义分配器,并且它并不总是以与默认分配器相同的方式与新对象的 8 字节边界对齐,则您的应用程序可能会因为对未对齐内存执行ldc1和sdc1操作而崩溃。在这种情况下,使用-mno-ldc1-sdc1标志来解决此问题。 - 如果
APP_PLATFORM_LEVEL大于APP_MIN_PLATFORM_LEVEL,则将事件严重性从警告降级为信息。jni/Application.mk中的APP_PLATFORM_LEVEL可能低于APP_PLATFORM,因为 NDK 没有所有级别的头文件。在这种情况下,实际级别会向下偏移。APP_MIN_PLATFORM_LEVEL由应用程序清单中的android:minSdkVersion指定。(问题 39752) - 在
cpu-features.c中添加了android_getCpuIdArm()和android_setCpuArm()方法。此添加使得检索 ARM CPUID 信息更容易。(问题 53689) - 修改了
ndk-build,以便在 Clang 编译时使用 GCC 4.7 的as/ld。注意: 在 GCC 4.7 中,
monotonic_clock和is_monotonic已分别重命名为steady_clock和is_steady。 - 向
ndk-build脚本添加了以下新警告:- 如果在静态库模块中使用
LOCAL_LDLIBS/LDFLAGS,则添加警告。 - 如果配置没有要构建的模块,则添加警告。
- 如果在共享库或可执行模块的
LOCAL_LDLIBS/LDFLAGS中使用了非系统库,则添加警告。
- 如果在静态库模块中使用
- 更新了构建脚本,以便如果未定义
APP_MODULES且Android.mk中只列出了静态库,则脚本会强制构建所有这些库。(问题 53502) - 更新了
ndk-build,以支持LOCAL_SRC_FILES中的绝对路径。 - 移除了
*-gdbtui可执行文件,它们是启用了-tui选项的*-gdb可执行文件的副本。 - 更新了构建脚本,以便在 Edison Design Group (EDG) 编译器前端重新启用
_STLP_HAS_INCLUDE_NEXT时警告您。(问题 53646) - 添加了环境变量
NDK_LIBS_OUT,允许覆盖libraries/gdbserver的路径,其默认路径为$PROJECT/libs。有关更多信息,请参阅OVERVIEW.html。 - 更改了 ndk-build 脚本的默认设置,以使用格式字符串保护编译代码:
-Wformat -Werror=format-security。您可以设置LOCAL_DISABLE_FORMAT_STRING_CHECKS=true来禁用它。有关更多信息,请参阅ANDROID-MK.html。 - 在
ndk-gdb-py中添加了 STL 美化打印支持。有关更多信息,请参阅NDK-GDB.html。 - 添加了基于 googletest 框架的测试。
- 工具链构建脚本中添加了通知,用于在你当前 shell 不是
bash时发出警告。
- 头文件修复
Android NDK r8e (2013 年 3 月)
- 重要变更
-
- 添加了 64 位主机工具链集(包名后缀
*-x86_64.*)。更多信息请参阅CHANGES.HTML和NDK-BUILD.html。 - 添加了 Clang 3.2 编译器。GCC 4.6 仍是默认设置。有关使用 Clang 编译器的信息,请参阅
CHANGES.HTML。 - 添加了适用于 Linux/MacOSX 主机的静态代码分析器。有关使用分析器的信息,请参阅
CHANGES.HTML。 - 添加了适用于 Linux/MacOSX 主机的 MCLinker 作为实验性功能。
ld.gold连接器是可用情况下的默认设置,因此你必须显式启用它。更多信息请参阅CHANGES.HTML。 - 更新了
ndk-build,以对模块依赖项使用拓扑排序,这意味着构建会自动整理LOCAL_STATIC_LIBRARIES、LOCAL_WHOLE_STATIC_LIBRARIES和LOCAL_SHARED_LIBRARIES中指定的库的顺序。更多信息请参阅CHANGES.HTML。(问题 39378)
- 添加了 64 位主机工具链集(包名后缀
- 重要错误修复
-
- 修复了构建脚本,以在
-O2模式下构建所有工具链。之前版本中的工具链未正确构建,未进行优化。 - 修复了构建脚本,该脚本会无条件地为 MacOSX 构建 64 位 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) - 修复了 X86 MXX/SSE 代码由于缺少
posix_memalign而链接失败的问题。(变更 51872) - 修复了 GCC4.7/X86 在
i386.c中的函数distance_non_agu_define_in_bb()内的段错误。(变更 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) - 修复了
STLport在uncaught_exception()中的段错误。(变更 50236) - 修复了
STLport在异常处理中由于对DW_EH_PE_udata2、DW_EH_PE_udata4和DW_EH_PE_udata8的非对齐访问导致的总线错误。 - 修复了 Gabi++ 使用
nothrow new[]运算符时的无限递归问题。(问题 52833) - 修复了 Gabi++ 异常处理程序指针的错误偏移问题。(变更 53446)
- 移除了 Gabi++ 对异常对象的冗余释放(变更 53447)
- 修复了构建脚本,以在
- 其他错误修复
-
- 修复了 NDK 头文件
- 修复了
STLport在内存不足错误后中止,而不是静默退出。 - 修复了系统和 Gabi++ 头文件,使其能够在使用 API 级别 8 及更低版本时编译。
- 修复了
cpufeatures,使其不解析/proc/self/auxv。(问题 43055) - 修复了
ld.gold,使其不依赖于主机 libstdc++,并在 Windows 平台上不依赖于libgcc_sjlj_1.dll库。 - 修复了 Clang 3.1,它会在
.vsave中发出不一致的寄存器列表并导致汇编程序失败。(变更 49930) - 修复了 Clang 3.1,使其能够编译 libgabi++ 并通过针对 MIPS 构建目标的
test-stlport测试。(变更 51961) - 修复了 Clang 3.1,使其仅在 C++ 中默认启用异常,而不是在 C 中。
- 修复了 Clang 3.1 中的几个问题,使其通过大多数 GNU 异常测试。
- 修复了独立 NDK 编译器中的脚本
clang和clang++,使其能够检测-cc1并在找到时不再指定-target。 - 修复了
ndk-build,使其能够遵守Application.mk中设置的NDK_APP_OUT。 - 修复了 X86
libc.so和lib.a缺少已在setjmp.h中声明的sigsetjmp和siglongjmp函数的问题。(问题 19851) - 修补了 GCC 4.4.3/4.6/4.7 libstdc++,使其在 C++ 11 中与 Clang 配合使用。(Clang 问题)
- 修复了传递给
HOST_AWK的参数中的 cygwin 路径问题。 - 修复了在 Windows 中从项目 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 静态库现在构建时具有隐藏可见性,但异常处理助手除外。
- 更新了构建,以便针对 ARM 在 Thumb 模式下构建
STLport。 - 在 Gabi++ 中添加了对
std::set_new_handler的支持。(问题 52805) - 在 GNU libstdc++ 中启用了
FUTEX系统调用。 - 更新了
ndk-build,使其不再将预构建静态库复制到项目的obj/local/<abi>/目录。(问题 40302) - 从 ARM
toolchains/*/setup.mk脚本中移除了__ARM_ARCH_5*__。(问题 21132) - 为 ARM 构建了额外的 GNU libstdc++ thumb 模式库。
- 针对带有 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)。MIPS 编译器目标不受支持,因为ld.gold不可用。 - 在 GCC 4.6/4.7 中为
ld.gold启用了--plugin和--plugin-opt。 - 在 GCC 4.7 中为
ld.gold启用了--text-reorder。 - 使用
_GLIBCXX_USE_C99_MATH配置了 GNU libstdc++,它会取消定义 bionic 头文件中的isinf脚本。更多信息请参阅CHANGES.html。 - 在构建脚本中添加了
APP_LDFLAGS。更多信息请参阅ANDROID-MK.html。 - 更新了构建脚本,允许使用
NDK_LOG=0来禁用NDK_LOG。 - 更新了构建脚本,允许使用
NDK_HOST_32BIT=0来禁用主机开发者环境的 32 位工具链。 - 将默认的 GCC/X86 标志
-march=和-mtune=从pentiumpro和generic更改为i686和atom。 - 增强了工具链构建脚本
- 修复了
build-gcc.sh中针对mingw构建类型的竞争条件,该条件曾阻碍大量并行构建处理。 - 更新了
build-gabi++.sh和build-stlport.sh,使其现在可以从 NDK 包中运行。(问题 52835) - 修复了
MSys工具集中的run-tests.sh。 - 改进了 64 位主机工具链和 Canadian Cross 构建支持。
- 将
build-mingw64-toolchain.sh脚本更新到更新的版本。 - 添加了在不隐藏可见性的情况下构建
libgnustl_static.a和stlport_static.a的选项。
- 修复了
Android NDK r8d (2012 年 12 月)
- 重要变更
-
- 在 NDK 中添加了 GNU Compiler Collection (GCC) 4.7 编译器。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=选项,用于在使用 GCC 4.6 及更高版本的编译器时,在与旧版 Android C 库 (bionic) 兼容的全局默认路径和用于-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)
- 在 NDK 中添加了 GNU Compiler Collection (GCC) 4.7 编译器。GCC 4.6 编译器仍是默认设置,因此你必须按如下方式显式启用新版本
- 重要错误修复
-
- 修复了使用
ndk-build脚本时对象文件不必要的重建问题。(问题 39810) - 修复了 NDK 8c 版本在 Mac OS X 10.6.x 上导致以下错误消息的连接器故障
此问题是由于在 Mac OS X 10.7 上构建导致的,在该版本上构建的二进制文件与 Mac OS 10.6.x 和 NDK 不兼容。dyld: lazy symbol binding failed: Symbol not found: _memmem Referenced from: ...../arm-linux-androideabi/bin/ld Expected in: /usr/lib/libSystem.B.dylib
- 从 Clang++ 独立构建脚本中移除了
-x c++选项。(问题 39089) - 修复了在 Cygwin 中使用
NDK_TOOLCHAIN_VERSION=clang3.1选项的问题。(问题 39585) - 修复了
make-standalone-toolchain.sh脚本,允许使用 Cygwin 或 MinGW 环境生成独立工具链。生成的工具链可在 Cygwin、MingGW 或 CMD.exe 环境中使用。(问题 39915、问题 39585) - 在 ARM 和 X86 的 android-14 构建中添加了缺失的
SL_IID_ANDROIDBUFFERQUEUESOURCE选项。(问题 40625) - 修复了
ANDROID_CPU_X86_FEATURE_MOVBE功能的 x86 CPU 检测问题。(问题 39317) - 修复了阻止标准模板库 (STL) 使用没有
.cpp文件扩展名的 C++ 源文件的问题。 - 修复了 GCC 4.6 ARM 内部编译器错误:at reload1.c:1061。(问题 20862)
- 修复了 GCC 4.4.3 ARM 内部编译器错误:at emit-rtl.c:1954。(问题 22336)
- 修复了 GCC 4.4.3 ARM 内部编译器错误:at postreload.c:396。(问题 22345)
- 修复了 GCC 4.6/4.7 跳过 lambda 函数的问题。(问题 35933)
- 修复了使用
- 其他错误修复
-
- NDK 头文件修复
- 修复了
__WINT_TYPE__和wint_t,使其为同一类型。 - 更正了
android/bitmap.h中的拼写错误。(问题 15134) - 更正了
errno.h中的拼写错误。 - 在
sys/cdefs.h中添加了对__STDC_VERSION__是否存在的检查。(问题 14627) - 重组了
byteswap.h和dirent.h中的头文件。 - 修复了
limits.h,使其包含提供PAGE_SIZE设置的page.h。(问题 39983) - 将
glGetAttribLocation()和glGetUniformLocation()的返回类型从int更改为GLint。 - 修复了 x86 构建的
__BYTE_ORDER常量。(问题 39824)
- 修复了
- 修复了
ndk-build脚本,使其不对 ARM 构建使用-O2覆盖-Os。 - 修复了构建脚本,允许覆盖
HOST_AWK、HOST_SED和HOST_MAKE设置。 - 修复了
ld.gold在fsck_msdos构建时链接 Intel C/C++ 编译器 (ICC) 构建的对象的问题。 - 修复了 Clang 中的 ARM EHABI 支持,使其符合规范。
- 修复了 GNU Debugger (GDB),以缩短在
solib事件期间遍历目标链接映射所花费的时间。(问题 38402) - 修复了链接共享库时缺少
libgcc.a文件的问题。
- NDK 头文件修复
- 其他变更
-
- 将 ARM 的 64 位内置原子函数回移植到 GCC 4.6。
- 添加了有关音频输出延迟的文档,以及其他文档和修复。
- 修复了 Clang 的调试构建,现在非 void 函数对于没有返回语句的路径会触发
SIGILL信号。 - 更新了
make-standalone-toolchain.sh,使其接受后缀-clang3.1,这等同于向 GCC 4.6 工具链添加--llvm-version=3.1。 - 更新了 GCC 和 Clang 错误报告网址:https://aosp.org.cn/source/report-bug s.html
- 添加了对
llvm-objdump中的 ARM ELF 支持。 - 针对 Clang 构建抑制了将 C 输入视为 C++ 的警告。
- 更新了构建,使其仅构建 32 位版本的
libiberty.a并将其放入lib32/。
Android NDK r8c (2012 年 11 月)
- 重要变更
-
- 此版本的 NDK 包含 Clang 3.1 编译器。GNU Compiler Collection (GCC) 4.6 仍是默认设置,因此你必须按如下方式显式启用 Clang 编译器选项
- 对于
ndk-build,请导出NDK_TOOLCHAIN_VERSION=clang3.1,或将此环境变量设置添加到Application.mk。 - 对于独立构建,请将
--llvm-version=3.1添加到make-standalone-toolchain.sh,并将 makefile 中的CC和CXX替换为<tool-path>/bin/clang和<tool-path>/bin/clang++。详细信息请参阅STANDALONE-TOOLCHAIN.html。
注意:此功能为实验性功能。请试用并报告任何问题。
- 对于
- 为 Windows 工具链添加了 Gold 连接器
ld.gold。Gold 连接器也是所有主机上 ARM 和 X86 的默认连接器。你可以在Android.mk中添加LOCAL_LDFLAGS += -fuse-ld=bfd,或在进行链接的 g++/clang++ 命令行中传递-fuse-ld=bfd来覆盖它,以使用ld.bfd连接器。 - 在
ndk-build[.cmd]和ndk-gdb脚本中添加了对 NDK 路径中是否存在空格的检查,以防止难以诊断的构建错误。 - 对 API 级别处理进行了以下更改
- 修改了构建逻辑,以便在
APP_PLATFORM、project.properties或default.properties中指定android-10到android-13的项目链接到android-9,而不是android-14。 - 更新了构建,以便使用 android-16 (Jelly Bean) 或更高版本的可执行文件使用
-fPIE选项(位置无关可执行文件,PIE)进行编译。新的APP_PIE选项允许你控制此行为。详细信息请参阅APPLICATION-MK.html。注意:所有高于 14 的 API 级别仍链接到
platforms/android-14,并且没有添加新的platforms/android-N。 - 修改了
ndk-build,以便在调整后的 API 级别高于项目AndroidManifest.xml中的android:minSdkVersion时提供警告。
- 修改了构建逻辑,以便在
- 更新了
cpu-features助手库,以包含更多 ARM 特有的功能。详细信息请参阅sources/android/cpufeatures/cpu-features.h。 - 将 X86 平台上的 long double 修改为 8 字节。此数据类型的大小现在与 double 相同,但仍被视为不同类型。
- 更新了
APP_ABI=armeabi-v7a的构建- 修改了此构建类型,以便向连接器传递
-march=armv7-a参数。此更改确保 v7 特有库和crt*.o正确链接。 - 在
ndk-build中添加了-mfpu=vfpv3-d16,取代了之前版本中使用的-mfpu=vfp选项。
- 修改了此构建类型,以便向连接器传递
- 此版本的 NDK 包含 Clang 3.1 编译器。GNU Compiler Collection (GCC) 4.6 仍是默认设置,因此你必须按如下方式显式启用 Clang 编译器选项
- 重要错误修复
-
- 修复了使用 root 权限运行
make-standalone-toolchain.sh导致某些用户无法访问独立工具链的问题。(问题 35279)- NDK 发布包中的所有文件和可执行文件均设置为对所有用户具有读取和执行权限。
- 现在复制
libstdc++.a时会保留其所有者/组。
- 移除了 Windows 预构建
echo.exe中冗余的\r。冗余的\r导致 GNU Debugger (GDB) 中的gdb.setup失败,因为它错误地成为了路径的一部分。(问题 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上下文问题,在该问题中,当上下文为null并在TREE_CODE中被解引用时,GCC 可能会崩溃。 - 修复了 GCC 4.4.3 在 ARM NEON 特定浮点类型定义时崩溃的问题。(问题 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脚本会在向编译添加 STL 头文件/库路径之前在LOCAL_SRC_FILES中搜索 C++ 文件。修改了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 警告。 - 修复了 GNU
stdc++在同时使用-mthumb和-march=armv7-a编译时的问题,方法是修改make-standalone-toolchain.sh,使其在子目录armv7-a/thumb中填充头文件/库。(问题 35616) - 修复了不可解析的 R_ARM_THM_CALL 重定位错误。(问题 35342)
- 修复了内部编译器错误:at
reload1.c:3633,该问题是由于 ARM 后端在从char进行有符号扩展时期望错误的 operand 类型造成的。(GCC 问题 50099) - 修复了带有负移位量的内部编译器错误。(GCC 问题)
- 修复了 ARM GCC 4.4.3/4.6
- 修复了 X86 的
-fstack-protector,它也是ndk-buildx86 ABI 目标的默认设置。 - MIPS 特定修复
- 通过将
_STLP_LITTLE_ENDIAN设置为 1 来修复STLport字节序,该设置在编译 MIPSlibstlport_*时生效。 - 修复了编译 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) - 修复了在调用
dlopen()时动态链接器中的SIGILL问题,在/system/bin/linker的符号已被 stripping,并且rtld_db_dlactivity()以Thumb实现的系统上,由于未保留sym_addr的LSB导致了此问题。(问题 37147)
- 在构建时禁用了 gdb-7.x 中的 Python 支持,否则 gdb-7.x 配置函数可能会选择主机上可用的任何 Python 版本,并使用对特定 Python 版本的硬编码依赖项来构建
- 修复了使用 root 权限运行
- 其他错误修复
-
- 修复了 NDK 头文件
- 修复了
arch-mips/include/asm/*代码,该代码曾被错误地从原始内核中移除。(变更 43335) - 在
linux/sysctl.h和linux/icmp.h中将结构体成员数据__unused替换为__linux_unused,以避免与sys/cdefs.h中的#define __unused冲突。 - 修复了
fenv.h中包含的 C 函数使用__BEGIN_DECLS和__END_DECLS的问题。 - 移除了
malloc.h中未实现的函数。 - 修复了
stdint.h中为 ANSI 编译器定义的uint64_t。(问题 1952) - 修复了
<arch>/include/machine/*中的预处理器宏。 - 将 MIPS 的
link.h替换为支持所有平台的新版本。 - 移除了
linux-unistd.h - 将 GLibc 特定宏
LONG_LONG_MIN、LONG_LONG_MAX和ULONG_LONG_MAX从<pthread.h>移至<limits.h>。
- 修复了
- 修复了
ndk-stack-parser中的缓冲区溢出问题。 - 修复了未定义
_STLP_USE_EXCEPTIONS时,它会忽略所有__Named_exception的声明和使用。仅当允许STLport使用异常时,才会编译和使用__Named_exception设置。 - 修复了仅构建 Linux NDK 包而不同时构建 Windows 代码的问题。使用以下设置执行此类构建
./build/tools/make-release.sh --force --systems=linux-x86
- 修复了
libc.so,使其不再导出atexit()和__do_handler。这些符号由系统版本的 C 库为 ARM 构建导出,以支持旧版原生库。NDK 生成的代码不应直接引用它们。相反,每个共享库或可执行文件应嵌入其自己的版本,由crtbegin_*.o提供。如果你的项目使用
-nostdlib -Wl,--no-undefined选项进行链接,则必须提供自己的__dso_handle,因为在这种情况下不会链接crtbegin_so.o。__dso_handle的内容不重要,如下面的示例代码所示extern "C" { extern void *__dso_handle __attribute__((__visibility__ ("hidden"))); void *__dso_handle; }
- 修复了
objdump中用于plt条目的 ARM 符号解码器,以生成更易读的形式function@plt。 - 移除了 X86 平台
libc.so库中 GCC 4.6libgcc.a中引入的以下符号:__aeabi_idiv0、__aeabi_ldiv0、__aeabi_unwind_cpp_pr1和__aeabi_unwind_cpp_pr2。 - 移除了 MIPS
crt*_so.S中未使用的.ctors、.dtors和.eh_frame。 - 更新了
ndk-gdb,使其仅获取ndk-buildDUMP_XXXX输出的最后一行。此更改确保如果Application.mk或Android.mk使用$(info ...)语法打印内容,该内容不会注入到DUMP_XXXX的结果中。(更多信息)
- 修复了 NDK 头文件
- 其他变更
-
- 移除了
platforms/android-[3,4,5,8]中的arch-x86和arch-mips头文件。这些头文件不完整,因为 X86 和 MIPS ABI 仅在 API 9 或更高版本上受支持。 - 简化了独立软件包中的 c++ 包含路径,如下所示。(问题 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
- 将
- 添加了新的 Android 可执行文件品牌标识,在
.note.android.ident部分(在crtbegin_static/dynamic.o中定义)采用了更简单的方案,以便调试工具能够相应地操作。结构成员和值定义如下static const struct { int32_t namesz; /* = 8, sizeof ("Android") */ int32_t descsz; /* = 1 * sizeof(int32_t) */ int32_t type; /* = 1, ABI_NOTETYPE */ char name[sizeof "Android"]; /* = "Android" */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }
之前在
.note.ABI-tag部分中的品牌标识选项已弃用。 - 添加了新脚本
run-tests-all.sh,该脚本在各种条件下调用run-tests.sh和standalone/run.sh。脚本run-tests.sh在没有--abi选项的情况下运行,并得到增强以编译大多数测试,使其适用于所有受支持的 ABI 并在所有连接的设备上运行
- 移除了
Android NDK r8b (2012 年 7 月)
此版本的主要功能是新的 GNU Compiler Collection (GCC) 4.6 工具链和 GNU Debugger (GDB) 7.3.x,它们增加了对 Android 4.1 (API Level 16) 系统映像的调试支持。
- 重要错误修复
-
- 修复了 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符号。 - 修复了在 unwinding ARM 和 MIPS 的堆栈超过
__libc_init时出现的SEGV问题。
- 修复了 Mac OS、Windows Cygwin 环境中静态库的
- 重要变更
-
- 添加了 GCC 4.6 工具链(
binutils2.21 包含gold和 GDB 7.3.x),与原始 GCC 4.4.3 工具链(binutils2.19 和 GDB 6.6)共存。- GCC 4.6 现在是默认工具链。你可以在
Application.mk中设置NDK_TOOLCHAIN_VERSION=4.4.3来选择原始工具链。 - 仅 Linux 和 Mac OS 主机上的 ARM 和 x86 架构支持
gold连接器。此支持默认禁用。在Android.mk中添加LOCAL_LDLIBS += -fuse-ld=gold即可启用。 - 使用
-fPIE编译的程序需要新的GDB进行调试,包括 Android 4.1 (API Level 16) 系统映像中的二进制文件。 binutils2.21ld工具包含从版本 2.22 回移植的修复程序- 禁用了
sincos()优化,以兼容旧平台。
- GCC 4.6 现在是默认工具链。你可以在
- 更新了构建选项,默认启用 Never eXecute (NX) 位和
relro/bind_now保护- 添加了
--noexecstack到汇编器和-z noexecstack到连接器,通过在堆栈和堆上启用 NX 位提供 NX 保护,抵御缓冲区溢出攻击。 - 添加了
-z relro和-z now到连接器,用于在链接后增强内部数据部分,防止内存损坏导致的安全漏洞。(更多信息:1,2) - 可以使用以下选项禁用这些功能
- 通过为汇编器设置
--execstack选项和为连接器设置-z execstack来禁用 NX 保护。 - 通过为连接器设置
-z norelro和-z lazy选项来禁用内部数据部分的增强。 - 通过在 NDK
jni/Android.mk中设置以下选项来禁用这些保护LOCAL_DISABLE_NO_EXECUTE=true # disable "--noexecstack" and "-z noexecstack" DISABLE_RELRO=true # disable "-z relro" and "-z now"
更多详细信息请参阅
docs/ANDROID-MK.html。 - 通过为汇编器设置
- 添加了
- 在
.note.ABI-tag部分(在crtbegin_static/dynamic.o中)为 Android 可执行文件添加了品牌标识,以便调试工具能够相应地操作。结构成员和值定义如下static const struct { int32_t namesz; /* = 4, sizeof ("GNU") */ int32_t descsz; /* = 6 * sizeof(int32_t) */ int32_t type; /* = 1 */ char name[sizeof "GNU"]; /* = "GNU" */ int32_t os; /* = 0 */ int32_t major; /* = 2 */ int32_t minor; /* = 6 */ int32_t teeny; /* = 15 */ int32_t os_variant; /* = 1 */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }
- 添加了 GCC 4.6 工具链(
- 其他错误修复
-
- 修复了
mips-linux-gnu重定位截断以适应R_MIPS_TLS_LDM的问题。(更多信息) - 修复了使用
--gc-sections时ld工具段错误的问题。(更多信息) - 修复了 MIPS
GOT_PAGE计数问题。(更多信息) - 修复了
mips_elf_count_got_symbols的警告符号链接问题。 - 修复了
mips_elf_allocate_lazy_stub的警告符号链接问题。 - 将 MIPS
.dynamic移至数据段,以便可写。 - 将符号的硬编码值替换为正确的 MIPS 段大小。
- 从 MIPS 工具链的默认设置中移除了
-mno-shared选项。Android 工具链的默认设置为-fPIC(或如果支持,为-fpic)。如果你没有显式指定-mshared、-fpic、-fPIC、-fpie或-fPIE,MIPS 编译器会添加-mno-shared,这会关闭 PIC。修复了编译器在此情况下不添加-mno-shared的问题。 - 修复了示例
hello-jni和two-libs中错误的包名,以便其下的tests项目能够编译。
- 修复了
- 其他更改
-
- 更改了二进制文件的位置
- 将
gdbserver从toolchain/<arch-os-ver>/prebuilt/gdbserver移至prebuilt/android-<arch>/gdbserver/gdbserver。 - 将 x86 工具链前缀从
i686-android-linux-重命名为i686-linux-android-。 - 将
sources/cxx-stl/gnu-libstdc++/include和lib移至sources/cxx-stl/gnu-libstdc++/4.6(使用 GCC 4.6 编译时)或sources/cxx-stl/gnu-libstdc++/4.4.3(使用 GCC 4.4.3 编译时)。 - 将
libbfd.a和libintl.a从lib/移至lib32/。
- 将
- 添加并改进了重建和测试 NDK 工具链中的各种脚本
- 添加了
build-mingw64-toolchain.sh,用于生成新的 Linux 主机工具链,该工具链生成 Win32 和 Win64 可执行文件。 - 通过使用
clone命令并仅对构建 NDK 工具链二进制文件所需的目录使用checkout,提高了download-toolchain-sources.sh的速度。 - 添加了
build-host-gcc.sh和build-host-gdb.sh脚本。 - 添加了
tests/check-release.sh,用于检查给定 NDK 安装目录或现有 NDK 包的内容。 - 重写了
tests/standalone/run.sh独立测试。
- 添加了
- 从所有平台和架构中移除了
if_dl.h头文件。它描述的AF_LINK和sockaddr_dl元素特定于 BSD(即它们在 Linux 中不存在)。
- 更改了二进制文件的位置
Android NDK r8 (2012 年 5 月)
此版本的 NDK 包含对 MIPS ABI 的支持以及一些额外的修复。
- 新功能
-
- 添加了对 MIPS ABI 的支持,允许你生成可在兼容的基于 MIPS 的 Android 设备上运行的机器代码。MIPS 的主要功能包括 MIPS 特定工具链、系统头文件、库和调试支持。有关 MIPS 支持的更多详细信息,请参阅 NDK 包中的
docs/CPU-MIPS.html。默认情况下,为基于 ARM 的设备生成代码。你可以在
Application.mk文件中的APP_ABI定义中添加mips,以便为 MIPS 平台构建。例如,以下行指示ndk-build为三种不同的 ABI 构建代码APP_ABI := armeabi armeabi-v7a mips
除非你依赖于特定于架构的汇编源文件(例如 ARM 汇编代码),否则通常无需修改
Android.mk文件即可构建 MIPS 机器代码。 - 调用
make-standalone-toolchain.sh时,可以使用--arch=mips选项构建独立 MIPS 工具链。更多详细信息请参阅docs/STANDALONE-TOOLCHAIN.html。
注意:为确保你的应用仅在设备能够运行它们的情况下对用户可用,Google Play 会根据应用中包含的指令集信息过滤应用 - 你无需采取任何操作即可启用过滤。此外,Android 系统本身也会在安装时检查你的应用,并仅在应用提供了针对设备 CPU 架构编译的库时才允许继续安装。
- 添加了对 MIPS ABI 的支持,允许你生成可在兼容的基于 MIPS 的 Android 设备上运行的机器代码。MIPS 的主要功能包括 MIPS 特定工具链、系统头文件、库和调试支持。有关 MIPS 支持的更多详细信息,请参阅 NDK 包中的
- 重要错误修复
-
- 修复了 GAbi++ 实现中的一个拼写错误,在该错误中,将基类对象
b的dynamic_cast<D>(b)结果转换为派生类D时,调整方向与基类方向相反。(问题 28721) - 修复了
make-standalone-toolchain.sh无法复制libsupc++.*的问题。
- 修复了 GAbi++ 实现中的一个拼写错误,在该错误中,将基类对象
- 其他错误修复
-
- 修复了
ndk-build.cmd,以确保即使用户重新定义了SHELL环境变量,ndk-build.cmd也能正确运行,在 Windows 环境中安装各种开发工具时,该变量可能会更改。
- 修复了
Android NDK r7c (2012 年 4 月)
此版本的 NDK 包含针对 Tegra2 设备的重要修复以及一些额外的修复和改进
- 重要错误修复
-
- 修复了 GNU STL armeabi-v7a 二进制文件,使其不在非 NEON 设备上崩溃。NDK r7b 提供的文件配置不正确,导致在 Tegra2 设备和其他设备上使用某些浮点函数(例如
cosf、sinf、expf)时崩溃。
- 修复了 GNU STL armeabi-v7a 二进制文件,使其不在非 NEON 设备上崩溃。NDK r7b 提供的文件配置不正确,导致在 Tegra2 设备和其他设备上使用某些浮点函数(例如
- 重要变更
-
- 通过
NDK_OUT环境变量添加了对自定义输出目录的支持。定义此变量时,将使用它来存储所有中间生成的文件,而不是$PROJECT_PATH/obj。此变量也由ndk-gdb识别。 - 通过在
Android.mk中将LOCAL_SHORT_COMMANDS定义为true,添加了对构建具有数百甚至数千个源文件的模块的支持。此更改强制 NDK 构建系统将大多数连接器或归档器选项放入列表文件中,作为命令行长度限制的变通方法。详细信息请参阅
docs/ANDROID-MK.html。
- 通过
- 其他错误修复
-
- 修复了
cpufeatures助手库中的android_getCpuCount()实现。在某些设备上,系统会动态启用核心,先前的实现会在第一次调用该函数时报告活跃核心的总数,而不是物理可用核心的总数。
- 修复了
Android NDK r7b (2012 年 2 月)
此版本的 NDK 包含针对原生 Windows 构建、Cygwin 以及许多其他改进的修复
- 重要错误修复
-
- 更新了
sys/atomics.h,以避免在某些多核基于 ARM 的设备上出现正确性问题。使用此版本的 NDK 重新构建未修改的源文件,此问题应可完全消除。更多详细信息,请阅读docs/ANDROID-ATOMICS.html。 - 恢复到
binutils2.19,以修复 NDK r7 中出现的调试问题(该版本切换到binutils2.20.1)。 - 修复了 32 位 Linux 上的
ndk-build。打包错误将 64 位版本的awk可执行文件放在了 NDK r7 的prebuilt/linux-x86/bin下。 - 修复了原生 Windows 构建 (
ndk-build.cmd)。其他构建模式不受影响。修复包括- 移除了尝试从不是项目路径顶部的目录(例如,项目路径的任何子目录)调用
ndk-build.cmd时发生的无限循环/堆栈溢出 bug。 - 修复了忽略自动生成的依赖文件的问题。这意味着更新头文件不会触发包含该头文件的源文件的重新编译。
- 修复了无法正确处理文件或路径中除空格和引号以外的特殊字符的问题。
- 移除了尝试从不是项目路径顶部的目录(例如,项目路径的任何子目录)调用
- 修复了独立工具链,使其在使用
-lstdc++(即链接到 GNUlibstdc++C++ 运行时)时生成正确的二进制文件。如果要链接到共享库版本,应使用-lgnustl_shared;如果使用静态版本,则使用-lstdc++。有关此修复的更多详细信息,请参阅
docs/STANDALONE-TOOLCHAIN.html。 - 修复了 Cygwin 上的
gnustl_shared。连接器抱怨找不到libsupc++.a,尽管该文件位于正确位置。 - 修复了在不通过任何特定 C++ 运行时使用
APP_STL的 Cygwin C++ 链接问题。
- 更新了
- 其他变更
-
- 当你的应用使用 GNU
libstdc++运行时时,编译器将不再强制启用异常和 RTTI。此更改可减小代码大小。如果你需要这些功能,必须执行以下任一操作
- 在你的模块或
Application.mk中显式启用异常和/或 RTTI。(推荐) - 在
Application.mk中将APP_GNUSTL_FORCE_CPP_FEATURES定义为'exceptions'、'rtti'或两者。详细信息请参阅docs/APPLICATION-MK.html。
- 在你的模块或
ndk-gdb现在在应用在独立进程中运行私有服务时能正常工作。它调试主应用进程,而不是ps列出的第一个进程,后者通常是服务进程。- 修复了一个罕见的 bug,在该 bug 中 NDK r7 会忽略
LOCAL_ARM_MODE值并总是将某些源文件(但不是所有)编译为 32 位指令。 STLport:刷新源文件以匹配 Android 平台版本。此更新修复了一些小 bug- 修复了不完整类型的实例化
- 修复了一个小的“==”与“=”拼写错误
- 在
string::assign中使用了memmove而不是memcpy - 更好地处理了
IsNANorINF、IsINF、IsNegNAN等
有关完整详细信息,请参阅提交日志。
STLport:从库中移除了 5 个不必要的静态初始化程序。- armeabi-v7a 的 GNU libstdc++ 库被错误地编译为 armeabi。此更改对正确性没有影响,但使用正确的 ABI 应能提供稍好的性能。
- 更新了
cpu-features助手库,以报告三个可选的 x86 CPU 功能 (SSSE3、MOVBE和POPCNT)。详细信息请参阅docs/CPU-FEATURES.html。 - 更新了
docs/NDK-BUILD.html,提及NDK_APPLICATION_MK而不是NDK_APP_APPLICATION_MK以选择自定义Application.mk文件。 - Cygwin:
ndk-build在调用时不再在当前目录中创建空的“NUL”文件。 - Cygwin:添加了更好的自动依赖检测。在之前版本中,它在以下情况下无法正常工作
- 当 Cygwin 驱动器前缀不是
/cygdrive时。 - 在使用无驱动器挂载时,例如,当 Cygwin 将
/home翻译为\\server\subdir而不是C:\Some\Dir时。
- 当 Cygwin 驱动器前缀不是
- Cygwin:
ndk-build不会尝试在某些版本的 Cygwin 和/或 GNU Make 中使用$NDK/prebuilt/windows/bin下的原生 Windows 工具。
- 当你的应用使用 GNU
Android NDK r7 (2011 年 11 月)
此版本的 NDK 包含支持 Android 4.0 平台的新功能以及许多其他添加和改进
- 新功能
-
- 添加了 Android 4.0 (API level 14) 的官方 NDK API,该版本向平台添加了以下原生功能
- 添加了基于 Khronos Group OpenMAX AL 1.0.1 标准的原生多媒体 API。新的
<OMXAL/OpenMAXAL.h>和<OMXAL/OpenMAXAL_Android.h>头文件允许针对 API level 14 的应用通过使用新的 Android 特有缓冲区队列接口直接从原生代码执行多媒体输出。更多详细信息,请参阅docs/openmaxal/index.html和 http://www.khronos.org/openmax/。 - 更新了基于 Khronos Group OpenSL ES 1.0.1 标准的原生音频 API。使用 API Level 14,你现在可以将压缩音频(例如 MP3、AAC、Vorbis)解码为 PCM。更多详细信息,请参阅
docs/opensles/index.html和 http://www.khronos.org/opensles/。
- 添加了基于 Khronos Group OpenMAX AL 1.0.1 标准的原生多媒体 API。新的
- 添加了 CCache 支持。为了加快大型重建的速度,请将
NDK_CCACHE环境变量定义为ccache(或你的ccache二进制文件的路径)。声明后,NDK 构建系统在编译任何源文件时会自动使用 CCache。例如export NDK_CCACHE=ccache
注意:NDK 发布包不包含 CCache,因此在使用之前必须安装它。有关 CCache 的更多信息,请参阅 http://ccache.samba.org。
- 添加了支持将
APP_ABI设置为all,表示你要为给定 NDK 版本支持的所有 ABI 构建 NDK 模块。这意味着在你的Application.mk中,以下两行中的任意一行与此版本等效APP_ABI := all APP_ABI := armeabi armeabi-v7a x86
如果你在命令行调用
ndk-build时定义APP_ABI,此功能也有效,这是检查项目是否为所有受支持的 ABI 构建而无需更改项目Application.mk file的快捷方法。例如ndk-build APP_ABI=all
- 在
Android.mk中添加了LOCAL_CPP_FEATURES变量,允许你声明模块使用哪些 C++ 功能(RTTI 或异常)。这确保了如果你有依赖于这些功能的预构建模块,最终链接能够正常工作。更多详细信息请参阅docs/ANDROID-MK.html和docs/CPLUSPLUS-SUPPORT.html。 - 缩短了构建命令中使用的源文件和对象文件的路径。从项目路径调用
$NDK/ndk-build时,传递给构建命令的源文件、对象文件和二进制文件的路径现在显著缩短,因为它们是相对于当前目录传递的。这在构建具有大量源文件的项目时非常有用,可以避免主机操作系统支持的最大命令行长度限制。如果你从项目树的子目录调用ndk-build,或者如果定义NDK_PROJECT_PATH指向特定目录,则行为不变。
- 添加了 Android 4.0 (API level 14) 的官方 NDK API,该版本向平台添加了以下原生功能
- 实验性功能
- 你现在可以通过从项目路径的命令行调用
ndk-build.cmd脚本,在 Windows 上构建 NDK 源文件,无需 Cygwin。该脚本接受与原始ndk-build脚本完全相同的参数。Windows NDK 包附带自己的预构建 GNU Make、Awk 和构建所需的其他工具的二进制文件。你应该无需安装其他任何东西即可获得一个工作的构建系统。重要:
ndk-gdb在 Windows 上无法工作,因此你仍然需要 Cygwin 进行调试。此功能仍处于实验阶段,请随意尝试并向公共 bug 数据库或公共论坛报告问题。NDK 附带的所有示例和单元测试都能成功使用此功能编译。
- 重要错误修复
-
- 如果你的
Application.mk中未定义APP_MODULES,导入的共享库现在默认安装到目标安装位置 (libs/<abi>)。例如,如果顶层模块foo导入模块bar,则libfoo.so和libbar.so都会复制到安装位置。以前,除非你在APP_MODULES中也列出了bar,否则只会复制libfoo.so。如果显式定义APP_MODULES,则行为不变。 ndk-gdb现在对于 MAIN 意图过滤器中有多个类别的 activity 能够正常工作。- 静态库导入现在可以正确传递。例如,如果顶层模块
foo导入静态库bar,而bar导入静态库zoo,则libfoo.so现在将链接到libbar.a和libzoo.a。
- 如果你的
- 其他变更
-
docs/NATIVE-ACTIVITY.HTML:修复了拼写错误。对于原生 activity,最低 API 级别应为 9,而不是 8。docs/STABLE-APIS.html:添加了缺失的文档,将 EGL 列为从 API 级别 9 开始支持的稳定 API。download-toolchain-sources.sh:更新为从 android.googlesource.com 下载工具链源文件,这是 AOSP 服务器的新位置。- 添加了一个新的 C++ 支持运行时库,名为
gabi++。有关它的更多详细信息,请参阅更新后的docs/CPLUSPLUS-SUPPORT.html。 - 添加了一个新的 C++ 支持运行时库,名为
gnustl_shared,它对应于 GNU libstdc++ v3 的共享库版本(GPLv3 许可证)。更多信息请参阅docs/CPLUSPLUS-SUPPORT.html - 在 STLport C++ 运行时库中添加了对 RTTI 的支持(不支持异常)。
- 在
LOCAL_CPP_EXTENSION中添加了对多个文件扩展名的支持。例如,要将foo.cpp和bar.cxx都编译为 C++ 源文件,请声明如下LOCAL_CPP_EXTENSION := .cpp .cxx
- 从 NDK 提供的链接时共享系统库中移除了许多不需要导出的符号。这确保了使用独立工具链生成的代码不会意外依赖于不稳定的 ABI 符号(例如,每次用于构建平台的工具链更改时都会更改的任何 libgcc.a 符号)
- 刷新了 EGL 和 OpenGLES Khronos 头文件以支持更多扩展。请注意,这不会更改相应库的 NDK ABI,因为每个扩展必须在运行时由客户端应用探测。
可用的扩展取决于你的实际设备和 GPU 驱动程序,而不是设备运行的平台版本。头文件更改只是添加了新的常量和类型,以便在使用
eglGetProcAddress()或glGetProcAddress()探测扩展后更容易使用它们。以下列表描述了新支持的扩展- GLES 1.x
-
GL_OES_vertex_array_objectGL_OES_EGL_image_externalGL_APPLE_texture_2D_limited_npotGL_EXT_blend_minmaxGL_EXT_discard_framebufferGL_EXT_multi_draw_arraysGL_EXT_read_format_bgraGL_EXT_texture_filter_anisotropicGL_EXT_texture_format_BGRA8888GL_EXT_texture_lod_biasGL_IMG_read_formatGL_IMG_texture_compression_pvrtcGL_IMG_texture_env_enhanced_fixed_functionGL_IMG_user_clip_planeGL_IMG_multisampled_render_to_textureGL_NV_fenceGL_QCOM_driver_controlGL_QCOM_extended_getGL_QCOM_extended_get2GL_QCOM_perfmon_global_modeGL_QCOM_writeonly_renderingGL_QCOM_tiled_rendering
- GLES 2.0
-
GL_OES_element_index_uintGL_OES_get_program_binaryGL_OES_mapbufferGL_OES_packed_depth_stencilGL_OES_texture_3DGL_OES_texture_floatGL_OES_texture_float_linearGL_OES_texture_half_float_linearGL_OES_texture_npotGL_OES_vertex_array_objectGL_OES_EGL_image_externalGL_AMD_program_binary_Z400GL_EXT_blend_minmaxGL_EXT_discard_framebufferGL_EXT_multi_draw_arraysGL_EXT_read_format_bgraGL_EXT_texture_format_BGRA8888GL_EXT_texture_compression_dxt1GL_IMG_program_binaryGL_IMG_read_formatGL_IMG_shader_binaryGL_IMG_texture_compression_pvrtcGL_IMG_multisampled_render_to_textureGL_NV_coverage_sampleGL_NV_depth_nonlinearGL_QCOM_extended_getGL_QCOM_extended_get2GL_QCOM_writeonly_renderingGL_QCOM_tiled_rendering
- EGL
-
EGL_ANDROID_recordableEGL_NV_system_time
Android NDK r6b (2011 年 8 月)
此版本的 NDK 与 r6 相比没有新增功能。r6b 版本解决了 r6 版本中的以下问题
- 重要错误修复
-
- 修复了在使用
APP_ABI="armeabi x86"进行多架构构建时的问题。 - 修复了 NDK 发布包中预构建 STLport 二进制文件的位置。打包脚本中的一个 bug 将它们放错了位置。
- 修复了使用 x86 独立工具链时共享库中的
atexit()使用问题。 - 修复了
make-standalone-toolchain.sh --arch=x86。它曾无法将正确的 GNU libstdc++ 二进制文件复制到正确位置。 - 修复了独立工具链连接器关于缺少
__dso_handle符号定义和大小的警告(仅限 ARM)。 - 修复了 x86 构建中
$(SYSROOT)/usr/include的包含顺序。更多信息请参阅bug。 - 修复了在 x86 特定系统上与 x86 独立工具链一起使用时
ptrdiff_t和size_t的定义问题。
- 修复了在使用
Android NDK r6 (2011 年 7 月)
此版本的 NDK 包含对 x86 ABI 的支持以及其他一些小的更改。有关此版本中更改的详细信息,请阅读 NDK 包中包含的 CHANGES.HTML 文档。
- 一般说明
-
- 增加了对 x86 ABI 的支持,允许你生成可在兼容的基于 x86 的 Android 设备上运行的机器代码。x86 的主要功能包括 x86 特定工具链、系统头文件、库和调试支持。有关 x86 支持的所有详细信息,请参阅 NDK 包中的
docs/CPU-X86.html。默认情况下,为基于 ARM 的设备生成代码,但你可以在
Application.mk文件中的APP_ABI定义中添加 x86,以便为 x86 平台构建。例如,以下行指示ndk-build为三种不同的 ABI 构建代码APP_ABI := armeabi armeabi-v7a x86
除非你依赖于基于 ARM 的汇编源文件,否则通常无需修改
Android.mk文件即可构建 x86 机器代码。 - 调用
make-standalone-toolchain.sh时,可以使用--toolchain=x86-4.4.3选项构建独立 x86 工具链。更多详细信息请参阅docs/STANDALONE-TOOLCHAIN.html。 - 新的
ndk-stack工具允许你翻译由原生代码生成的logcat中的堆栈跟踪。该工具将指令地址翻译成可读格式,其中包含每个堆栈帧对应的函数、源文件和行号等信息。有关更多信息和使用示例,请参阅docs/NDK-STACK.html。
- 增加了对 x86 ABI 的支持,允许你生成可在兼容的基于 x86 的 Android 设备上运行的机器代码。x86 的主要功能包括 x86 特定工具链、系统头文件、库和调试支持。有关 x86 支持的所有详细信息,请参阅 NDK 包中的
- 其他变更
arm-eabi-4.4.0已从 NDK 发行版中移除,该版本自 NDK r5 起已被弃用。
Android NDK r5c (2011 年 6 月)
此版本的 NDK 与 r5b 相比没有新增功能。r5c 版本解决了 r5b 版本中的以下问题
- 重要错误修复
-
ndk-build:修复了在尝试对可调试项目进行并行构建时出现的罕见 bug。- 修复了导致
LOCAL_WHOLE_STATIC_LIBRARIES无法在新工具链中正常工作的拼写错误,并在docs/ANDROID-MK.html中添加了相关文档。 - 修复了链接到
gnustl_static的代码在早于 API 级别 8 (Android 2.2) 的平台版本上运行时崩溃的 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文件正常)。
- 对象文件现在总是按照它们在
Android NDK r5b (2011 年 1 月)
此版本的 NDK 与 r5 相比没有新增功能。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 上出现编译错误时,一个会导致依赖文件不一致的 Bug。修复源代码中的错误后,这会阻止正常的构建。
- 一个 Cygwin 特有的 Bug,在使用极短的 Android NDK 安装路径或项目路径时会导致生成无效的依赖文件。这使得增量构建无法进行。
- 一个导致
cpufeatures库无法在新 NDK 工具链下正常工作的错别字。 - 通过避免 GNU Make 对每个源文件或目标文件调用
cygpath -m,提高了 Cygwin 中的构建速度,之前这会在大型源文件树中导致问题。如果此操作无法正常工作,请在您的环境中定义NDK_USE_CYGPATH=1以再次使用cygpath -m。 - Cygwin 安装现在会通知用户包含空格的无效安装路径。此前,无效路径会输出一个抱怨 GNU Make 版本不正确的错误,即使安装的是正确的版本。
- 修复了一个错别字,该错别字导致
NDK_MODULE_PATH环境变量在包含多个由冒号分隔的目录时无法正常工作。 - 为了检查编译器是否生成了 64 位机器码,而不是依赖于主机标签,
prebuilt-common.sh脚本包含了一些修复,这使得 32 位工具链可以在 Snow Leopard 上正常重新构建。工具链重新构建脚本现在也支持使用 32 位主机工具链。 - 在
<netinet/in.h>中添加了INET_ADDRSTRLEN的缺失声明。 - 在
<netinet/in6.h>中添加了IN6_IS_ADDR_MC_NODELOCAL和IN6_IS_ADDR_MC_GLOBAL的缺失声明。 - 在
<asm/byteorder.h>中,将 'asm' 替换为 '__asm__' 以允许使用-std=c99进行编译。
Android NDK r5 (2010 年 12 月)
此版本的 NDK 包含了许多新的 API,其中大部分是为了支持大量使用原生代码的游戏和类似应用的开发而引入的。通过使用这些 API,开发者可以直接通过原生方式访问事件、音频、图形和窗口管理、资产和存储。开发者还可以借助新的 NativeActivity 类,在原生代码中实现 Android 应用生命周期。有关此版本中更改的详细信息,请阅读下载的 NDK 软件包中包含的 CHANGES.HTML 文档。
- 一般说明
-
- 添加了对原生 Activity 的支持,这允许您在原生代码中实现 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 解释了原因)。
- 提供基于 STLport 的默认 C++ STL 实现作为辅助模块。它可以作为静态库或共享库使用 (详细信息和使用示例请参阅 sources/android/stlport/README)。如果您选择针对这些库而不是默认 C++ STL 实现进行编译,则还提供 STLport (静态或共享) 和 GNU libstdc++ (仅静态) 的预构建二进制文件。默认 STL 实现不支持 C++ 异常和 RTTI。更多信息请参阅 docs/CPLUSPLUS-SUPPORT.HTML。
- 包含对
cpufeatures辅助库的改进,该改进提高了 CPU 类型的报告准确性(之前某些设备在实际为 ARMv6 时报告为 ARMv7 CPU)。我们建议使用此库的开发者重新构建其应用,然后上传到 Google Play 以受益于这些改进。 - 添加了一个 EGL 库,允许您创建和管理 OpenGL ES 纹理和服务。
- 添加了新的示例应用
native-plasma和native-activity,以演示如何编写原生 Activity。 - 包含许多错误修复和其他小改进;更详细的更改列表请参阅 docs/CHANGES.html。
Android NDK r4b (2010 年 6 月)
- NDK r4b 注释
-
包含对 NDK 构建和调试脚本中几个问题的修复 - 如果您正在使用 NDK r4,我们建议您下载 NDK r4b 版本。有关此版本中更改的详细信息,请阅读下载的 NDK 软件包中包含的 CHANGES.TXT 文档。
- 一般说明
-
- 通过新的
ndk-build构建命令提供简化的构建系统。 - 通过新的
ndk-gdb命令,添加了对在生产设备上对生成的机器码进行便捷原生调试的支持。 - 为基于 ARM 的 CPU 架构添加了新的 Android 特有 ABI,
armeabi-v7a。新的 ABI 扩展了现有的armeabiABI,以包含这些 CPU 指令集扩展:- Thumb-2 指令
- VFP 硬件 FPU 指令 (VFPv3-D16)
- 对 ARM Advanced SIMD (NEON) GCC intrinsic 和 VFPv3-D32 的可选支持。受 Verizon Droid by Motorola、Google Nexus One 等设备支持。
- 添加了新的
cpufeatures静态库(包含源文件),该库允许您的应用在运行时检测主机设备的 CPU 功能。具体来说,应用可以检查 ARMv7-A 支持以及 VFPv3-D32 和 NEON 支持,然后根据需要提供不同的代码路径。 - 添加了一个示例应用
hello-neon,该应用演示了如何使用cpufeatures库检查 CPU 功能,然后在 CPU 支持的情况下,使用 NEON intrinsic 提供优化的代码路径。 - 允许您为 NDK 支持的任一或两个指令集生成机器码。例如,您可以同时为 ARMv5 和 ARMv7-A 架构进行构建,并将所有内容存储到应用的最终
.apk中。 - 为确保您的应用仅在用户的设备能够运行时才对用户可用,Google Play 现在会根据应用中包含的指令集信息过滤应用 - 您无需执行任何操作即可启用过滤。此外,Android 系统本身也会在安装时检查您的应用,并且只有在应用提供了为设备 CPU 架构编译的库时,才会允许安装继续。
- 添加了对 Android 2.2 的支持,包括用于从原生代码访问
Bitmap对象像素缓冲区的新的稳定 API。
- 通过新的
Android NDK r3 (2010 年 3 月)
- 一般说明
-
- 添加了 OpenGL ES 2.0 原生库支持。
- 添加了一个示例应用
hello-gl2,该应用演示了如何使用 OpenGL ES 2.0 顶点和片段着色器。 - 此版本的工具链二进制文件已更新为 GCC 4.4.0,它应该比之前的版本 (4.2.1) 生成稍微更紧凑和高效的机器码。NDK 仍然提供 4.2.1 的二进制文件,您可以选择使用它们来构建机器码。
Android NDK r2 (2009 年 9 月)
最初发布时名为“Android 1.6 NDK, Release 1”。
- 一般说明
-
- 添加了 OpenGL ES 1.1 原生库支持。
- 添加了一个示例应用
san-angeles,该应用通过原生 OpenGL ES API 渲染 3D 图形,同时使用GLSurfaceView对象管理 Activity 生命周期。
Android NDK r1 (2009 年 6 月)
最初发布时名为“Android 1.5 NDK, Release 1”。
- 一般说明
-
- 包含对 ARMv5TE 指令(包括 Thumb-1 指令)的编译器支持 (GCC)。
- 包含稳定原生 API 的系统头文件、文档和示例应用。