此页面提供有关所有已发布的 NDK 稳定版本中更改的信息。要下载最新稳定版本的 NDK 或任何当前可用的 Beta 版本,请参阅NDK 下载页面。
查看android-ndk-announce Google 网上论坛,了解更多完整信息,并订阅以接收版本发布公告。
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 更新为基于 LLVM 14 开发的 clang-r450784d。
Android NDK r24 (2022 年 3 月)
变更日志- 下载
-
- 此版本的下载地址为此处。
- 公告
-
- 已移除 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,因此大多数应用除了性能提升外不会注意到其他变化。
- 已移除 RenderScript 构建支持。RenderScript 已在 Android 12 中弃用。如果您尚未完成将应用从 RenderScript 迁移出去的工作,可以使用 NDK r23 LTS。
- 已移除 GNU 汇编程序 (GAS)。如果您使用的是
Android NDK r23 LTS (2021 年 8 月)
变更日志- 下载
-
- 此版本的下载地址为此处。
- 公告
-
- 已移除 GNU binutils(GNU 汇编程序 (GAS) 除外)。GAS 将在下个版本中移除。如果您使用的是
-fno-integrated-as
,如果任何因素阻止您移除此标志,请提交错误报告。 - 已停止对 GDB 的支持。GDB 将在下个版本中移除。请改用 LLDB。请注意,
ndk-gdb
默认使用 LLDB。 - NDK r23 是最后一个支持非 Neon 的版本。从 NDK r24 开始,sysroot 中的 armeabi-v7a 库将使用 Neon 构建。极少数非常旧的设备不支持 Neon,因此大多数应用除了性能提升外不会注意到其他变化。
- 在下个 NDK 版本中将不支持 Jelly Bean (API 16、17 和 18)。对于 r24,NDK 支持的最低操作系统将为 KitKat (API 级别 19)。
- 已移除 GNU binutils(GNU 汇编程序 (GAS) 除外)。GAS 将在下个版本中移除。如果您使用的是
Android NDK r22b (2021 年 3 月)
变更日志- 下载
-
- 此版本的下载地址为此处。
- 公告
-
- GNU binutils 已弃用,并将从即将发布的 NDK 版本中移除。请注意,GNU 汇编程序 (
as
) **是**其中一部分。如果您使用的是-fno-integrated-as
,如果任何因素阻止您移除此标志,请提交错误报告。如果您直接使用as
,请改用clang
。 - LLD 现在是默认链接器。ndk-build 和我们的 CMake 工具链文件也已迁移到使用 llvm-ar 和 llvm-strip。
- ndk-gdb 现在使用 lldb 作为调试器。gdb 已弃用,并将从将来的版本中移除。要回退到 gdb,请使用 --no-lldb 选项。但请提交错误报告,说明您为何无法使用 lldb。
-
std::filesystem
支持现已包含。有两个已知问题
- GNU binutils 已弃用,并将从即将发布的 NDK 版本中移除。请注意,GNU 汇编程序 (
Android NDK r21e LTS (2021 年 1 月)
变更日志- 下载
-
- 此版本的下载地址为此处。
- 公告
-
-
不再支持 32 位 Windows。这对绝大多数用户没有影响。如果您仍然需要从 32 位版本的 Windows 构建 NDK 应用,请继续使用 NDK r20。
有关 Android 开发者工具中此更改的更多信息,请参阅有关此主题的博文。
-
LLD 现已提供测试版。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 应用包。请注意,由于只有包可以使用 RPATH 并通过公证,因此传统的 macOS NDK 包**无法**公证。SDK 将继续使用传统包,因为应用包需要进行布局更改,这会使其与 Android Studio 不兼容。通过 SDK 管理器下载的 NDK 不会被隔离,因此目前允许 Gatekeeper 使用。**SDK 管理器目前是获取 macOS NDK 的最可靠方法。**
-
Android NDK r20b (2019 年 6 月)
变更日志Android NDK r19c (2019 年 1 月)
变更日志- 下载
-
- 此版本的下载链接在此。
- 公告
-
- 开发人员应开始使用LLD测试他们的应用。AOSP 已切换到默认使用 LLD,NDK 将在下一个版本中默认使用它。一旦 LLD 经历了一个没有重大未解决问题的发布周期(估计为 r21),BFD 和 Gold 将被移除。在链接时传递
-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 经历了一个没有重大未解决问题的发布周期(估计为 r21),BFD 和 Gold 将被移除。在链接时传递
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 将导致错误。
- 将从 r18 中移除对 ICS(android-14 和 android-15)的支持。
- 从 2019 年 8 月开始,Play 商店上传 APK 时将需要 64 位支持。请立即开始移植,以免到时候措手不及。更多信息,请参阅这篇博文。
Android NDK r16b (2017 年 12 月)
变更日志- 下载
- 此版本的下载链接在此。
- 公告
-
- 已移除弃用的头文件。统一的头文件现在简称为“头文件”。有关迁移技巧,请参阅统一的头文件迁移说明。
- 不再支持 GCC。它不会立即从 NDK 中移除,但不再接收反向移植。在 libc++ 足够稳定到成为默认值之前,它无法被移除,因为 gnustl 的某些部分仍然与 Clang 不兼容。它将在其他 STL 从 r18 中移除时被移除。
libc++
已脱离测试阶段,现在是 NDK 中首选的 STL。从 r17 开始,libc++
是 CMake 和独立工具链的默认 STL。如果您手动选择了不同的 STL,我们强烈建议您迁移到libc++
。更多详情,请参阅这篇博文。- 对 ARM5 (armeabi)、MIPS 和 MIPS64 的支持已弃用。它们将不再默认使用 ndk-build 构建,但如果明确命名,仍然可以构建,并且将包含在“all”、“all32”和“all64”中。r17 中已移除对这些的支持。如果您定位任何这些 ABI,CMake 和 ndk-build 都将发出警告。
- API
-
添加了针对Android 8.1的原生 API。要了解有关这些 API 的更多信息,请参阅原生 API 概述。
有关此版本新增功能和更改的更多信息,请参阅此变更日志。
Android NDK r15c (2017 年 7 月)
变更日志- 下载
- 此版本的下载链接在此。
- 公告
-
- 统一的头文件已默认启用。要了解如何使用这些头文件,请参阅统一的头文件。
- 不再支持 GCC。它尚未从 NDK 中移除,但不再接收反向移植。在 libc++ 足够稳定到成为默认值之前,它无法被移除,因为 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 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 中移除,但不再接收反向移植。在 libc++ 足够稳定到成为默认值之前,它无法被移除,因为 gnustl 的某些部分仍然与 Clang 不兼容。它可能会在那之后被移除。
- 添加了simpleperf,这是一个用于 Android 的 CPU 分析器。
- r13b
- 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 月)
- 下载
- 此版本的下载已存档 此处。
- 公告
- 在 r13 中,
ndk-build
命令默认使用 Clang。我们将在后续版本中移除 GCC。 - 将在 r13 中移除
make-standalone-toolchain.sh
脚本。请确保make_standalone_toolchain.py
满足您的需求。 - 将问题报告到 GitHub。
- 我们已修复
ndk-gdb.py
。(问题 118) - 我们已更新
NdkCameraMetadataTags.h
,使其不再包含无效的枚举值。 - 已修复 `ndk-build` 中的一个错误,该错误会导致使用 libc++ 的静态库出现虚假警告。有关此更改的更多信息,请参阅 此处 的注释。
- 已更新 android-24 的 OpenSLES 头文件。
- NDK
- 我们已移除对 armeabi-v7a-hard ABI 的支持。更多信息,请参阅此 说明。
- 已移除所有 GB 前平台级别的 sysroot。我们在 r11 中放弃了对它们的支援,但忽略了实际移除它们。
- 在 ARM32 上使用 c++_shared 时的异常处理现在大部分都能工作。解卷器现在将链接到每个已链接的对象,而不是链接到 libc++ 本身。有关此异常处理的更多信息,请参阅 已知问题。
- 已精简默认编译器标志。(问题 27)。
- 有关这些更改的完整信息,请参阅 此更改列表。
- 添加了独立工具链的 Python 实现:
build/tools/make_standalone_toolchain.py
。- Windows 用户不再需要 Cygwin 即可使用此功能。
- 我们将在 r13 中移除 bash 版本,因此请立即测试新版本。
-fno-limit-debug-info
已在 Clang 调试版本中默认启用。此更改应提高 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 库。
- 已将 Vulkan 支持添加到 android-24。
- 已将 Choreographer API 添加到 android-24。
- 为支持
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED
或更高版本的设备添加了libcamera2
API。更多信息,请参阅 相机特性。 - Clang
- Clang 已更新至 3.8svn (r256229,构建 2812033)。
- 32 位 Windows 软件包中的
clang.exe
和clang++.exe
可执行文件实际上是 64 位的。32 位可执行文件名为clang_32.exe
。
- 32 位 Windows 软件包中的
- GCC
- 与 ChromeOS GCC @ google/gcc-4_9 r227810 同步。
- 从 ToT (r231296) 反向移植了代码覆盖率分析程序补丁。
- 已修复 libatomic 不使用
ifuncs
。(问题 31) - Binutils
- 已消除“发现并修复了勘误 843419”信息消息。
- 引入了
--long-plt
选项,用于修复链接大型 arm32 二进制文件时发生的内部链接器错误。 - 已修复 AArch64 的错误运行时存根。这会导致针对非常大的 DSO 错误计算跳转地址。
- 引入了默认选项
--no-apply-dynamic
,用于解决早期 Android 版本中的动态链接器错误。 - NDK r11 KI 的
dynamic_cast
与 Clang 不兼容。我们已修复 x86、stlport_static
和优化问题。 - GDB
- 已更新至 GDB 7.11。更多信息,请参阅 GDB 新闻 页面。
- 一些针对
ndk-gdb.py
的错误修复。 - 已知问题
- x86 ASAN 仍然无法工作。更多信息,请参阅此 更改列表 中的讨论。
- 使用
c++_shared
的异常展开在 Android 2.3(API 级别 9)或 Android 4.0(API 级别 14)上的 ARM 上仍然无法工作。 - 尽管存在 android-24,但 Android 6.0(API 级别 23)和 Android 7.0(API 级别 24)的 Bionic 头文件和库尚未公开。这些平台仍然是 Android 5.0(API 级别 21)的头文件和库(与 r11 没有回归)。
- RenderScript 工具不存在(与 r11 没有回归)。(问题 7)
- 此变更日志并非旨在列出所有未解决的错误的完整列表。
__thread
这次应该可以正常工作了。Android NDK r12 (2016 年 6 月)
- 下载
- 此版本的下载已存档 此处。
- 公告
- 在即将发布的版本中,
ndk-build
命令将默认使用 Clang。GCC 将在后续版本中移除。 - 将在即将发布的版本中移除
make-standalone-toolchain.sh
脚本。如果您使用此脚本,请尽快计划迁移到make_standalone_toolchain.py
。 - NDK
- 已移除对 armeabi-v7a-hard ABI 的支持。请参阅 文档 中的说明。
- 已移除 Android 2.3(API 级别 9)之前的平台级别的所有 sysroot。我们在 NDK r11 中放弃了对它们的支援,但忽略了实际移除它们。
- 更新了在 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 问题 14,NDK 问题 16)。
- 已移除无法访问的 ARM(非 thumb)STL 库。
- 已将 Vulkan 支持添加到 android-24。
- 已将 Choreographer API 添加到 android-24。
- 为支持
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED
功能级别或更高版本的设备添加了 libcamera2 API。更多信息,请参阅CameraCharacteristics
参考。 - Clang
- Clang 已更新至 3.8svn (r256229,构建 2812033)。32 位 Windows 软件包中的
clang.exe
和clang++.exe
可执行文件实际上是 64 位的。32 位可执行文件名为clang_32.exe
。 - 已修复
__thread
,使其这次可以真正工作了。 - GCC
- 已将编译器与 ChromeOS GCC @ google/gcc-4_9 r227810 同步。
- 从 ToT (r231296) 反向移植了代码覆盖率分析程序补丁。
- 已修复
libatomic
不使用 ifuncs(NDK 问题 31)。 - Binutils
- 已消除“发现并修复了勘误 843419”信息消息。
- 引入了
--long-plt
选项,用于修复链接大型 arm32 二进制文件时发生的内部链接器错误。 - 已修复 AArch64 的错误运行时存根。此问题会导致针对非常大的动态共享对象 (DSO) 错误计算跳转地址。
- 引入了默认选项
--no-apply-dynamic
,用于解决早期 Android 版本中的动态链接器错误。 - 已修复 NDK r11 中的一个已知问题,在该问题中,
dynamic_cast
与 Clang、x86、stlport_static 和优化不兼容。 - GDB
- 已更新至 GDB 7.11 版本。有关此版本的更多信息,请参阅 GDB 新闻。
- 已修复
ndk-gdb.py
脚本中的多个错误。 - 已知问题
- x86 Address Sanitizer (ASAN) 当前无法工作。更多信息,请参阅 问题 186276。
- 使用
c++_shared
的异常展开在 Android 2.3(API 级别 9)或 Android 4.0(API 级别 14)上的 ARM 上无法工作。 - 尽管存在 android-24,但 Android 6.0(API 级别 23)和更高版本的 Bionic 头文件和库尚未公开。这些平台仍然具有 Android 5.0(API 级别 21)的头文件和库,这与 NDK r11 保持一致。
- RenderScript 工具不存在,这与 NDK r11 保持一致。(NDK 问题 7)
- 在
NdkCameraMetadataTags.h
头文件中,相机元数据标签枚举值ACAMERA_STATISTICS_LENS_SHADING_CORRECTION_MAP
被意外列出,将在下一个版本中移除。请改用ACAMERA_STATISTICS_LENS_SHADING_MAP
值。
Android NDK r11c (2016年3月)
- 变更
- 对
ndk-gdb.py
脚本应用了额外的修复。 - 向
ndk-gdb
命令的--attach
选项添加了一个可选的包名参数。(Issue 13) - 修复了32位Windows平台的无效工具链路径。(Issue 45)
- 修复了
ndk-which
命令的相对路径。(Issue 29) - 修复了libgcc编译器中cygpath的使用。(Android Issue 195486)
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++抛出异常时发生的段错误。(Issue 179410)
- 将libc++的内联命名空间更改为
std::__ndk1
,以防止与平台libc++的ODR问题。 - 所有libc++库现在都使用libc++abi构建。
- 将默认
APP_PLATFORM
提升到Gingerbread。- 预计在未来的版本中将放弃对Froyo和更旧版本的支持。
- 将ARM独立工具链的默认值更改为arm7。
- 更新了64位的gabi++
_Unwind_Exception
结构。 - 为cpufeatures添加了以下功能
- 检测SSE4.1和SSE4.2。
- 检测x86_64上的cpu特性。
- 将libc++abi更新到上游r231075。
- 从ToT Bionic更新了
byteswap.h
、endian.h
、sys/procfs.h
、sys/ucontext.h
、sys/user.h
和uchar.h
。 - 在所有API级别上同步了
sys/cdefs.h
。 - 修复了arm的
fegetenv和fesetenv
。 - 修复了mips64和x86_64的
crtend_*
的结束指针大小/对齐。
- 重要公告
- Binutils
-
- 新增功能
- 添加了一个新选项:
--pic-veneer
。
- 添加了一个新选项:
- 移除
- 32位Windows软件包不再包含ld.gold。您可以从64位Windows软件包中获取ld.gold。
- 变更
- 统一了Android和ChromiumOS之间的binutils源代码。有关此更改的更多信息,请参见此处的评论。
- 提高了aarch64的Gold的可靠性。在链接时使用
-fuse-ld=gold
来使用gold而不是bfd。默认值可能会在下个版本中切换。 - 改进了Gold ARM后端的大型二进制文件的链接时间(可调试的Chrome浏览器的链接时间最多减少50%)。
- 新增功能
- GDB
-
- 移除
- 移除了ndk-gdb,改用ndk-gdb.py。
- 变更
- 将gdb更新到7.10版本。
- 改进了性能。
- 改进了错误消息。
- 修复了相对项目路径。
- 阻止Ctrl-C终止后台运行的gdbserver。
- 改进了Windows支持。
- 移除
Android NDK r10e (2015年5月)
- 下载
- 此版本的下载已存档在此处。
- 重要更改
-
- 将Cortex-A53 Erratum 843419的解决方法集成到
aarch64-linux-android-4.9
链接器中。有关此解决方法的更多信息,请参见Cortex-A53 erratum 843419的解决方法。 - 添加了Clang 3.6;
NDK_TOOLCHAIN_VERSION=clang
现在默认选择该版本的Clang。 - 移除了Clang 3.4。
- 移除了GCC 4.6。
- 在所有架构中实现了
ld.gold
中的多线程支持。它现在可以支持或不支持多线程进行链接;默认是不支持。- 要使用多线程进行编译,请使用
--threads
选项。 - 要不用多线程进行编译,请使用
--no-threads
选项。
- 要使用多线程进行编译,请使用
- 将所有架构的GDB/gdbserver升级到7.7。
- 移除了32位Darwin的NDK软件包。
- 将Cortex-A53 Erratum 843419的解决方法集成到
- 重要的错误修复
-
- 修复了在主线程之外存在OpenMP循环时发生的崩溃。
- 修复了当用户声明
#pragma GCC optimize ("O0")
,但在命令行中指定了不同的优化级别时发生的GCC 4.9内部编译器错误(ICE)。pragma
优先。 - 修复了以前会产生带有以下错误消息的崩溃的错误
in add_stores, at var-tracking.c:6000
- 实现了一种解决Clang 3.5问题的办法,其中LLVM自动矢量化会生成
llvm.cttz.v2i64()
,这是一个在ARM指令集中没有对应指令的指令。
- 其他错误修复
-
- 进行了以下头文件和库修复
- 修复了
media/NdkMediaDrm.h
中的PROPERTY_*
。 - 修复了
mips64
的sys/ucontext.h
。 - 放弃了
__builtin_isnan
和__builtin_isinf
的Clang版本检查。 - 添加了
android-21/arch-mips/usr/include/asm/reg.h
和android-21/arch-mips64/usr/include/asm/reg.h
。 - 修复了GCC 4.9为x86生成的虚假数组边界警告,并重新启用了GCC 4.9为ARM生成的数组边界警告。以前,ARM的警告已被无条件禁用。
- 修复了Clang 3.5的
mips
和mips64
以创建可写的.gcc_except_table
节,从而与GCC行为匹配。此更改允许您避免以下链接器警告.../ld: warning: creating a DT_TEXTREL in a shared object
- 反向移植了针对
compiler-rt
问题的修复程序,这些问题在Clang为mips64
编译时会导致崩溃。有关更多信息,请参见LLVM Issue 20098。 - 修复了在非ASCII注释上发生的Clang 3.5崩溃。(Issue 81440)
- 修复了
stlport collate::compare
以返回-1
和1
。以前,它返回任意带符号的数字。 - 修复了64位ABI的
ndk-gdb
。(Issue 118300) - 修复了RenderScript的HelloComputeNDK示例在Android 4.4(Android API级别19)上产生的崩溃。有关更多信息,请参见此页面。
- 修复了GCC的
libc++ __wrap_iter
。有关更多信息,请参见LLVM Issue 22355。 - 修复了ABI
x86_64
的.asm
支持。 - 实现了一种解决GCC 4.8
stlport
问题的办法。(Issue 127773) - 从Windows中的项目路径中移除了尾随目录分隔符
\\
。(Issue 160584) - 修复了通过
gradle
执行ndk-build.cmd
命令编译单个.c
文件时出现的no rule to make target
错误。(问题 66937) - 添加了以下主机工具链中缺少的
libatomic.a
和libgomp.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_LDFLAGS
或APP_LDFLAGS
变量。 - 使用
binutils-2.25
构建 MIPS 和 MIPS64 工具链,该工具链提供了改进的 R6 支持。 - 使
-fstandalone-debug
(完整调试信息)成为 Clang 的默认选项。 - 对于 GCC 4.9、Clang 3.5 和 Clang 3.6 的 ARM、AArch64、X86 和 X86_64 工具链,将
-fstack-protector
替换为-fstack-protector-strong
。 - 向
ndk-gdb
添加了--package
命令行开关,以允许构建系统覆盖包名称。(问题 56189) - 已弃用 MIPS 的
-mno-ldc1-stc1
。此选项可能无法与新的-fpxx
和-mno-odd-spreg
选项或 FPXX ABI 一起使用。 - 向
cpu-features
添加了 MIPS MSA 和 R6 检测。
- 为
Android NDK r10d (2014年12月)
- 重要更改
-
- 将 GCC 4.8 设置为所有 32 位 ABI 的默认值。已弃用 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 的默认值。 - 停止所有 x86[_64] 工具链默认添加
-mstackrealign
。NDK 工具链假设 16 字节的堆栈对齐。默认使用的工具和选项强制执行此规则。编写汇编代码的用户必须确保保留堆栈对齐,并确保其他编译器也符合此规则。(GCC 错误 38496) - 将地址消毒功能添加到 Clang 3.5 对 ARM 和 x86 ABI 的支持。有关此更改的更多信息,请参阅 地址消毒器 项目。
- 从 API 级别 21 开始,引入了构建时使用
-fPIE -pie
的要求。在 API 级别 16 和更高版本中,ndk-build 在构建时使用PIE
。此更改有一些影响,在 开发者预览版问题 888 中进行了讨论。这些影响不适用于共享库。
- 将 GCC 4.8 设置为所有 32 位 ABI 的默认值。已弃用 GCC 4.6,并将在下个版本中将其移除。要恢复之前的行为,请将
- 重要的错误修复
-
- 对 A53 勘误 #835769 中的 aarch64-linux-android-4.9 链接器进行了更多修复。作为此操作的一部分,当指定
-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)
- 对 A53 勘误 #835769 中的 aarch64-linux-android-4.9 链接器进行了更多修复。作为此操作的一部分,当指定
- 其他错误修复
-
- 进行了以下头文件和库修复
- 将
posix_memalign
添加到 API 级别 16。此外,还在 API 级别 16 到 19 中的stdlib.h
中添加了一个原型。(问题 77861) - 修复了
stdatomic.h
,以便它仅针对 C++11 包含<atomic>
。 - 修改了以下标头以供独立使用:
sys/user.h
,以及 API 级别 21 的gl2ext.h
、dlext.h
、fts.h
、sgidefs.h
。 - 修改了
sys/user.h
以将mxcsr_mask
重命名为mxcr_mask
,并更改u_ar0
的数据类型 从 - 将
sysconf()
的返回值类型从int
更改为long
。 - 修复了 ndk-build 对
LOCAL_ARM_MODE
的thumb
的处理:在 r10d 中,ndk-build 默认添加LOCAL_LDFLAGS+=-mthumb
,除非以下条件之一适用 - 您已将
LOCAL_ARM_MODE
设置为arm
。 - 您正在进行调试构建(使用
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 作为虚拟机的 Android 5.0 设备上进行调试时,通过指定
art-on
选项,可以进入 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/
),并查看体系结构和 CPU > Neon。 - 检查
samples/
中更新的hello-neon
示例。 - 请参阅英特尔的 从 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
进行了以下标头和库修复- 添加了更多 TV 键码:
android/keycodes.h
- 在
android/sensor.h
中添加了更多常量和六个新的传感器函数:ASensorManager_getDefaultSensorEx
、ASensor_getFifoMaxEventCount
、ASensor_getFifoReservedEventCount
、ASensor_getStringType
、ASensor_getReportingMode
和ASensor_isWakeUpSensor
。 - 修复了
stdatomic.h
,以提高与GCC 4.6的兼容性,并提供对<atomic>
头的支持。 - 将
sys/ucontext.h
和sys/user.h
添加到所有API级别。现在signal.h
头文件包含<sys/ucontext.h>
。您可以删除任何现有的struct ucontext
定义。 - 将
posix_memalign
添加到API级别17、18和19。 - 向所有架构添加了以下函数:
android_set_abort_message
、posix_fadvise
、posix_fadvise64
、pthread_gettid_np
。 - 将必需的权限添加到
native-media/AndroidManifest.xml
示例。(问题106640) - 将
clock_nanosleep
和clock_settime
添加到API级别21。(问题77372) - 从所有架构中删除了以下符号:
get_malloc_leak_info
、free_malloc_leak_info
、__srget
、__swbuf
、__srefill
、__swsetup
、__sdidinit
、__sflags
、__sfp
、__sinit
、__smakebuf
、__sflush
、__sread
、__swrite
、__sseek
、__sclose
、_fwalk
、__sglue
、__get_thread
、__wait4
、__futex_wake
、__open
、__get_tls
、__getdents64
和dlmalloc
。 - 从64位架构中删除了以下函数:
basename_r
、dirname_r
、__isthreaded
、_flush_cache
(mips64)。 - 从32位架构中删除了以下函数:
__signalfd4
。 - 将以下函数的第三个参数类型从
size_t
更改为int
:strtoll_l
、strtoull_l
、wcstoll_l
和wcstoull_l
。 - 将以下函数恢复到64位架构:
arc4random
、arc4random_buf
和arc4random_uniform
。 - 将
cxa_*
以及new
和delete
运算符移回libstdc++.so
。此更改恢复了r9d行为;先前版本的r10包含占位符文件。
- 添加了更多 TV 键码:
- 为mips的GCC 4.8和4.9恢复了MXU支持。由于这些版本的GCC是用不支持MXU的binutils-2.24编译的,因此r10和r10b中缺少此支持。现在它支持了。
- 修复了
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) - 修复了与GCC 4.8在Mac OS X上使用
-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
中接收或返回浮点型或双精度型值的函数添加了__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预览版。实际的API级别编号将在L发布版中替换它。
- 此版本现在包含
all32
和all64
设置,用于APP_ABI
。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示例。
- 更新的
Android.h
头文件(用于SLES/OpenSLES),可在AudioPlayer中支持单精度浮点音频格式。 - GLES 3.1和AEP扩展到
libGLESv3.so
。 - GLES2和GLES3头文件已更新到最新的官方Khronos版本。
- 将GCC 4.9编译器添加到32位/64位ABI。如前所述,GCC 4.9是64位ABI的默认(唯一)编译器。对于32位ABI,必须显式启用GCC 4.9,因为GCC 4.6仍然是默认值。
- 对于ndk-build,通过将
NDK_TOOLCHAIN_VERSION=4.9
添加到Application.mk
或从命令行将其导出为环境变量来启用32位GCC 4.9构建。 - 对于独立工具链,请在
make-standalone-toolchain.sh
脚本中使用--toolchain=
选项。例如:--toolchain=arm-linux-androideabi-4.9
。 - 在GCC 4.8/4.9和x86*中,GDB已升级到7.6版本。由于GCC 4.6(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++支持”部分。请注意:
- 除了区域设置之外,所有测试现在都通过了Clang 3.4和GCC 4.8的测试。更多信息,请参阅文档中的“C++支持”部分。
- X86和MIPS libc++的libc++库仍然使用gabi++。
- GCC 4.7及更高版本现在可以使用<atomic>。
- 如果使用
<list>
,则必须添加-fno-strict-aliasing
,因为__list_imp::_end
违反了TBAA规则。(问题61571)。 - 从GCC 4.6开始,LIBCXX_FORCE_REBUILD:=true不再重建libc++。重建它需要使用不同的编译器。请注意,Clang 3.3未经测试。
- mclinker现在是2.7版本,并支持aarch64 Linux。
- 添加了对
LOCAL_PCH
指定的头的预编译头支持。(问题25412)。
- 重要的错误修复
-
- 修复了libc++,使其现在可以编译
std::feof
等。(问题66668)。 - 修复了Clang 3.3/3.4原子库调用,该调用导致libc++测试中某些ABI armeabi崩溃。
- 修复了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附带的提交消息。 - 修复了关于
putchar
重新定义的GCC警告。警告消息如下: - 修复了
make-standalone-toolchain.sh --stl=libc++
,使其 - 修复了GCC/Windows,使其仅在外部程序中生成进程时才在必要时引用参数。此更改降低了超过32K长度限制的可能性。
- 修复了一个问题,该问题使得无法调整
APP_PLATFORM
环境变量。 - 修复了crazy_linker中
IsSystemLibrary()
的实现,使其使用strrchr()
而不是strchr()
来查找库路径的真实基名。 - 修复了native-audio无法在调试模式下构建的问题。
- 修复了gdb无法打印极端浮点数的问题。(问题69203)。
- 修复了Clang 3.4无法使用
-Wl,-shared
编译的问题(与-shared
相反,后者没有编译问题)。问题在于,如果既不存在-shared
也不存在-static
,Clang会为Android目标添加-pie
。这种行为是不正确的,导致链接器抱怨-shared
和-pie
不能共存。
include/stdio.h:236:5: warning: conflicts with previous declaration here [-Wattributes] int putchar(int);
(变更列表91185)。 - 其他更改
-
- 将
arm_neon.h
添加到x86工具链中,使其现在可以模拟约47%的Neon。目前不支持64位类型。更多信息,请参阅x86文档中关于ARM Neon内在函数支持的部分。 - 将ARM/GOT_PREL优化(存在于从GCC google分支构建的GCC 4.6中)移植到ARM GCC 4.8/4.9。此优化有时会在访问全局变量时减少指令计数。例如,请参阅
$NDK/tests/build/b14811006-GOT_PREL-optimization/
中的build.sh脚本。 - 为STL gabi++、stlport和libc++添加了ARM版本。它们现在同时具有ARM和Thumb模式。
- 现在可以使用
--toolchain=x86_64-linux-android-4.9
调用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
,以及附加的多库选项-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__
。 - 修复了
platforms/android-18/include/android/input.h
,方法是向接收或返回浮点或双精度值的函数添加__NDK_FPABI__
。 - 修复了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
添加了scalbln
、scalblnf
和scalblnl
。 - 修复了
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
。 - 修复了
ndk-gdb-py.cmd
,方法是将SHELL
设置为环境变量,而不是将其传递给python.exe
(后者会忽略此设置)。(问题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
脚本的速度。
- 为之前仅供
Android NDK r9c *(2013年12月)*
这是一个仅包含错误修复的版本。
- 重要的错误修复
-
- 修复了GCC 4.8 ARM的一个问题,该问题会导致栈指针过早恢复。此问题阻止了帧指针可靠地访问栈帧中的变量。(GCC问题58854)
- 修复了GCC 4.8 libstdc++的一个问题,该问题中std::nth_element中的一个bug会导致生成产生随机段错误的代码。(问题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
的原型更改为poll(struct pollfd *, nfds_t, int);
,位于poll.h
中。 - 为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_HR
和CLOCK_MONOTONIC_HR
。
- 将
- 在示例Teapot、MoreTeapots和
source/android/ndk_helper
中- 将它们更改为现在对armeabi-v7a使用硬浮点abi。
- 更新它们以在Android API级别19及更高版本上使用沉浸式模式。
- 修复了
/system/lib/libdvm.so
中Check_ReleaseStringUTFChars
的一个问题,该问题会导致x86设备崩溃。
- 修复了当NDK包通过符号链接引用时在Cygwin中发生的
ndk-build
失败。 - 修复了当
LOCAL_SRC_FILES
包含绝对路径时在Windowscmd.exe
中发生的ndk-build.cmd
失败。(问题69992) - 修复了
ndk-stack
脚本,即使它由于无法找到例程、文件名或行号而无法解析帧,它也能继续执行。在任何这些情况下,它都会打印??
。 - 修复了windows-x64_64目标的
ndk-stack
堆栈,使其不再错误地将帧行与stack:
部分中不包含pc
、eip
或ip
的行匹配。例如I/DEBUG ( 1151): #00 5f09db68 401f01c4 /system/lib/libc.so
- 修复了gabi++,使其
- 不使用malloc()分配C++线程局部对象。
- 在libc.debug.malloc在userdebug/eng Android平台构建中非零的情况下,避免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"
- 提供了使用可选的、单独的包
android-ndk-r9c-cxx-stl-libs-with-debugging-info.zip
(使用-g
选项)重新构建所有带有调试信息的STL的能力。此选项有助于ndk-stack
脚本提供更好的跨STL的堆栈转储。此更改不应影响最终剥离文件的代码/大小。 - 增强了
hello-jni
示例,以便在编译时报告APP_ABI
。 - 使用确定性模式(选项
-D
)下的ar
工具来构建静态库。(问题60705)
- 添加了
Android NDK r9b *(2013年10月)*
- 重要更改
-
- 更新了所有Android API级别(直至18)的
include/android/*h
和math.h
,包括添加了级别13、15、16和17。有关添加的API的信息,请参阅更改的提交消息68012和68014。(问题47150、58528和38423) - 添加了对Android API级别19的支持,包括Renderscript绑定。
- 在现有的armeabi-v7a ABI中添加了对
-mhard-float
的支持。有关Clang的更多信息和当前限制,请参阅tests/device/hard-float/jni/Android.mk
。 - 从GNU编译器集合(GCC)4.8迁移到4.8.2,并添加了诊断颜色支持。要启用诊断颜色,请设置
-fdiagnostics-color=auto
、-fdiagnostics-color=always
或导出GCC_COLORS
,如下所示 有关更多信息,请参阅GCC语言无关选项。GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
- 添加了两个新的示例来演示OpenGL ES 3.0功能:Teapot和MoreTeapots。这些示例可在安装了Android 4.1(API级别16)及更高版本的设备上运行。
- 已弃用GCC 4.7和Clang 3.2支持,这些支持将在下一个版本中删除。
- 更新了所有Android API级别(直至18)的
- 重要的错误修复
-
- 修复了ARM GCC 4.6
thumb2
无法生成16位相对跳转表的问题。(GCC问题) - 修复了
g++.dg/cpp0x/lambda/lambda-defarg3.C
上的GCC 4.8内部编译器错误(ICE)。(更改62770,GCC问题) - 修复了Windows 32位
*-gdb.exe
可执行文件无法启动的问题。(问题58975) - 修复了构建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
- 修复了使用Clang在Android API级别11上构建
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++
终止和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
。 - 修复了Clang 3.3与自定义
vfprintf
的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 级别 18)的支持。更多信息,请参见
STABLE-APIS.html
和samples/gles3jni/README
中的新的代码示例。 - 添加了 OpenGL ES 3.0 的头文件和库,Android 4.3(API 级别 18)及更高版本支持 OpenGL ES 3.0。
- 在 NDK 中添加了 GNU 编译器集合 (GCC) 4.8 编译器。由于 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 项目调试器 (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 级别 18)的支持。更多信息,请参见
- 重要的错误修复
-
- 修复了
android_native_app_glue
中潜在的事件处理问题。(问题 41755) - 修复了 ARM/GCC-4.7 构建以生成对 NEON 加载和存储指令 VST 和 VLD 的足够对齐。(GCC 问题 57271)
- 修复了 GCC 4.4.3/4.6/4.7 中针对字符串文字的常量负索引值的内部编译器错误 (ICE)。(问题 54623)
- 修复了 GCC 4.7 使用对象地址进行常量初始化时的段错误。(问题 56508)
- 修复了 GCC 4.6 ARM 使用 Boost 1.52.0 时,
-O
值的段错误。(问题 42891) - 修复了
libc.so
和libc.a
以支持wait4()
函数。(问题 19854) - 更新了 x86
libc.so
和libc.a
文件以包含clone()
函数。 - 修复了
LOCAL_SHORT_COMMANDS
漏洞,其中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 调试服务器,以便它可以更可靠地命中执行路径早期设置的断点(例如 JNI 代码中的断点)。(问题 41278)注意:此功能需要 jdb 并会生成有关挂起断点的警告。指定
--nowait
选项以恢复以前的行为。 - 修复了库列表为空时的 GDB 崩溃。
- 修复了使用
stepi
命令超过bx pc
或blx pc
Thumb 指令时的 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 编译器时,MIPS 构建目标的
_Unwind_Exception
的 gabi++ 大小为 24 的问题。(更改 54141) - 修复了
ndk-build
脚本,以确保在使用ndk-build clean
命令时,实际从包含预构建静态库的项目中删除已构建的库。(更改 54461,更改 54480) - 修改了
NDK_ANALYZE=1
选项,使其冗余信息更少。 - 修复了
gnu-libstdc++/Android.mk
,使其包含用于使用向后兼容性的构建的backward/
路径。(问题 53404) - 修复了
stlport new
有时返回随机值的问题。 - 修复了
ndk-gdb
以匹配CPU_ABIS
的顺序,而不是APP_ABIS
的顺序。(问题 54033) - 修复了 MacOSX 上 NDK 64 位构建选择编译器错误路径的问题。(问题 53769)
- 修复了构建脚本以检测 64 位 Windows Vista。(问题 54485)
- 修复了 x86
ntonl/swap32
错误:invalid 'asm': operand number out of range
。(问题 54465,更改 57242) - 修复了
ld.gold
以合并字符串文字。 - 修复了
ld.gold
以处理大型符号对齐。 - 更新了
ld.gold
以启用--sort-section=name
选项。 - 修复了 GCC 4.4.3/4.6/4.7 以抑制静态链接程序的
-export-dynamic
选项。GCC 不再为静态链接程序添加.interp
部分。 - 修复了 GCC 4.4.3
stlport
关于_Unwind_Control_Block
的不一致typedef
的编译错误。(问题 54426) - 修复了
awk
脚本以处理在 Windows 上创建的可能包含尾随\r
字符并导致构建错误的AndroidManifest.xml
文件。(问题 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_getHistorical
API 系列,使其采用const AInputEvent* motion_event
。(问题 55873) - 修复了
malloc_usable_size
以采用const void*
。(问题 55725) - 修复了
stdint.h
以使其与 C99 更兼容。(更改 46821) - 修改了
wchar.h
以不重新定义WCHAR_MAX
和WCHAR_MIN
。 - 修复了与指针相关的
PRI
和SCN
宏的<inttypes.h>
声明。(问题 57218) - 更改了
sys/cdefs.h
头文件,以便对于低于 9 的 API 级别,__WCHAR_TYPE__
为 32 位,这意味着对于所有 API 级别,wchat_t
为 32 位。要恢复之前的行为,请定义_WCHAR_IS_8BIT
布尔变量。(问题 57267)
- 修改了头文件,使
- 在 NDK
docs/
中添加了更多格式设置,并进行了其他文档修复。 - 在构建静态库时添加了对精简存档技术的支持。(问题 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+ 中的 *缺少返回值语义*。通常情况下,所有路径都应该以返回值语句结束,用于返回值的函数。如果不是这种情况,clang 会在没有返回值语句的路径中插入未定义指令(或调试模式下的陷阱)。如果您确定您的代码是正确的,请使用此标志以允许优化器利用未定义的行为。如果您不确定,请不要使用此标志。调用者仍然可能收到随机的错误值,但优化器不会利用它并使您的代码更难调试。 - 添加了
-fglobal-ctor-const-promotion
标志以重新启用将具有静态构造函数的全局变量提升为常量的功能。使用此标志,LLVM 的全局变量优化过程会尝试评估具有静态构造函数的全局变量并将其提升为全局常量。尽管此优化是正确的,但它可能会导致与由 GCC 编译的代码不兼容。例如,代码可能会执行const_cast
将常量转换为可变类型并修改它。在 GCC 中,变量是读写状态,代码意外运行。在 Clang 中,常量变量位于只读内存中,可能会导致应用程序崩溃。
- 添加了
- 在 MIPS GCC 和 Clang 编译器中添加了
-mldc1-sdc1
。默认情况下,编译器会正确对齐 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
以使用 GCC 4.7 的as/ld
进行 Clang 编译。注意:在 GCC 4.7 中,
monotonic_clock
和is_monotonic
分别已重命名为steady_clock
和is_steady
。 - 向
ndk-build
脚本添加了以下新的警告:- 如果在静态库模块中使用
LOCAL_LDLIBS/LDFLAGS
,则会添加警告。 - 如果配置没有要构建的模块,则会添加警告。
- 如果在共享库或可执行模块的
LOCAL_LDLIBS/LDFLAGS
中使用了非系统库,则会添加警告。
- 如果在静态库模块中使用
- 更新了构建脚本,以便如果未定义
APP_MODULES
并且仅在Android.mk
中列出了静态库,则脚本会强制构建所有这些库。(问题 53502) - 更新了
ndk-build
以支持LOCAL_SRC_FILES
中的绝对路径。 - 删除了
*-gdbtui
可执行文件,它们是启用了-tui
选项的*-gdb
可执行文件的副本。 - 更新了构建脚本,以便在 Edison Design Group (EDG) 编译器前端重新启用
_STLP_HAS_INCLUDE_NEXT
时向您发出警告。(问题 53646) - 添加了环境变量
NDK_LIBS_OUT
以允许覆盖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
构建所有工具链。以前版本中的工具链未进行优化就错误地构建了。 - 修复了在 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) - 修复了 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 调试器 (GDB) SIGILL 问题。(问题 40941)
- 修复了当符号包含长而间接的文件路径时,GDB 无法设置
source:line
断点的问题。(问题 42448) - 修复了 MIPS PIE 可执行文件的 GDB
read_program_header
。(更改 49592) - 修复了
STLport
在uncaught_exception()
中的段错误。(更改 50236) - 修复了由于
DW_EH_PE_udata2
、DW_EH_PE_udata4
和DW_EH_PE_udata8
的未对齐访问导致的异常处理中的STLport
总线错误。 - 修复了 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) - 修复了
ndk-build
脚本在 Makefile 的LOCAL_PATH
定义中存在尾随空格时无法构建的问题。(问题 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
(Clang LTO 通过 LLVMgold.so)。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 编译器集合 (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=
选项,用于在与旧版 Android C 库 (bionic) 兼容的 *全局* 默认路径和用于-fstack-protector
、-fstack-protector-all
和-fstack-protector-strong
的新 *tls* 路径 (%gs:20) 之间进行选择,使用 GCC 4.6 及更高版本的编译器。注意:
-mstack-protector-guard
设置本身不会启用任何-fstack-protector*
选项。 - 将
android_setCpu()
函数添加到sources/android/cpufeatures/cpu-features.c
,用于在 Android 4.1 及更高版本中无法通过/proc
进行自动检测时使用。(Chromium 问题 164154)
- 在 NDK 中添加了 GNU 编译器集合 (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.h
,后者提供PAGE_SIZE
设置。(问题 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 调试器 (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://source.android.com/source/report-bugs.html
- 为
llvm-objdump
添加了 ARM ELF 支持。 - 抑制了 Clang 构建中的“将 C 输入视为 C++”警告。
- 更新了构建过程,以便只构建 32 位版本的
libiberty.a
并将其放置在lib32/
目录下。
Android NDK r8c (2012 年 11 月)
- 重要更改
-
- 为 NDK 添加了 Clang 3.1 编译器。GNU 编译器集合 (GCC) 4.6 仍然是默认编译器,因此您必须显式启用 Clang 编译器选项,如下所示:
- 对于
ndk-build
,导出NDK_TOOLCHAIN_VERSION=clang3.1
或 将此环境变量设置添加到Application.mk
文件中。 - 对于独立构建,请向
make-standalone-toolchain.sh
添加--llvm-version=3.1
,并在您的 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 编译器集合 (GCC) 4.6 仍然是默认编译器,因此您必须显式启用 Clang 编译器选项,如下所示:
- 重要的错误修复
-
- 修复了使用 root 权限运行
make-standalone-toolchain.sh
会导致某些用户无法访问独立工具链的问题。(问题 35279)- NDK 发布包中的所有文件和可执行文件都设置为对所有人具有读和执行权限。
- 现在在复制时保留
libstdc++.a
的所有权/组。
- 从 Windows 预构建的
echo.exe
中删除了冗余的\r
。冗余的\r
导致 GNU 调试器 (GDB) 中的gdb.setup
失败,因为它错误地成为了路径的一部分。(问题 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_name
中的空上下文问题,在该问题中,当上下文为空并被TREE_CODE
解引用时,GCC 可能会崩溃。 - 修复了 ARM NEON 特定浮点类型定义中 GCC 4.4.3 的崩溃问题。(问题 34613)
- 修复了
STLport
内部_IteWrapper::operator*()
实现中的问题,该问题返回了保存已解引用值的过时的堆栈位置,并导致运行时崩溃。(问题 38630) - ARM 特定的修复
- 修复了 ARM GCC 4.4.3/4.6
g++
不再警告“的名称改编在 GCC 4.4 中已更改”的问题。不再需要使用 -Wno-psabi
开关来避免此警告的变通方法。 - 修复了
LOCAL_SRC_FILES
中包含.arm
或.neon
后缀的项目也使用APP_STL
的问题。使用APP_STL
时,ndk-build
脚本会在添加 STLheader/lib
路径到编译之前搜索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”警告。 - 通过修改
make-standalone-toolchain.sh
以填充子目录armv7-a/thumb
中的headers/libs
,修复了使用-mthumb
和-march=armv7-a
同时编译 GNUstdc++
的问题。(问题 35616) - 修复了“无法解析的 R_ARM_THM_CALL 重定位”错误。(问题 35342)
- 修复了
reload1.c:3633
处的内部编译器错误,该错误是由 ARM 后端在从char
符号扩展时期望错误的操作数类型引起的。(GCC 问题 50099) - 修复了负移位量导致的内部编译器错误。(GCC 问题)
- 修复了 ARM GCC 4.4.3/4.6
- 修复了 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)
- 通过在编译 MIPS
- GNU 调试器特定的修复
- 在构建时禁用了 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
的符号已被剥离且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
冲突。 - 修复了使用
__BEGIN_DECLS
和__END_DECLS
的封闭 C 函数的fenv.h
。 - 删除了
malloc.h
中未实现的函数。 - 修复了 ANSI 编译器的
stdint.h
中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
设置。 - 修复了在不构建Windows代码的情况下构建仅限Linux的NDK包的问题。使用以下设置执行此类构建
./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-build
DUMP_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编译器集合(GCC) 4.6工具链和GNU调试器(GDB) 7.3.x,它增加了对Android 4.1(API级别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
符号。 - 修复了在ARM和MIPS上解开
__libc_init
之后的堆栈时发生的SEGV
。
- 修复了Mac OS、Windows Cygwin环境中静态库的
- 重要更改
-
- 添加了GCC 4.6工具链(
binutils
2.21带gold
和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
来选择原始工具链。 - 仅在Linux和Mac OS主机上的ARM和x86架构上支持
gold
链接器。此支持默认情况下是禁用的。在Android.mk
中添加LOCAL_LDLIBS += -fuse-ld=gold
以启用它。 - 使用
-fPIE
编译的程序需要新的GDB
进行调试,包括Android 4.1(API级别16)系统映像中的二进制文件。 binutils
2.21ld
工具包含从2.22版本移植的修复程序。- 禁用了
sincos()
优化,以与旧平台兼容。
- GCC 4.6现在是默认工具链。您可以在
- 更新了构建选项,以默认情况下启用永不执行(NX)位和
relro
/bind_now
保护。- 向汇编器添加了
--noexecstack
,向链接器添加了-z noexecstack
,通过在堆栈和堆上启用NX位来提供针对缓冲区溢出攻击的NX保护。 - 向链接器添加了
-z relro
和-z now
,用于在链接后强化内部数据部分,以防止由内存损坏引起的安全性漏洞。(更多信息:1,2) - 可以使用以下选项禁用这些功能
- 通过为汇编器设置
--execstack
选项,为链接器设置-z execstack
选项来禁用NX保护。 - 通过为链接器设置
-z norelro
和-z lazy
选项来禁用内部数据的强化。 - 通过设置以下选项,在NDK
jni/Android.mk
中禁用这些保护LOCAL_DISABLE_NO_EXECUTE=true # disable "--noexecstack" and "-z noexecstack" DISABLE_RELRO=true # disable "-z relro" and "-z now"
有关更多详细信息,请参见
docs/ANDROID-MK.html
。 - 通过为汇编器设置
- 向汇编器添加了
- 使用
.note.ABI-tag
节(在crtbegin_static/dynamic.o
中)为Android可执行文件添加了品牌标识,以便调试工具可以相应地进行操作。结构成员和值定义如下static const struct { int32_t namesz; /* = 4, sizeof ("GNU") */ int32_t descsz; /* = 6 * sizeof(int32_t) */ int32_t type; /* = 1 */ char name[sizeof "GNU"]; /* = "GNU" */ int32_t os; /* = 0 */ int32_t major; /* = 2 */ int32_t minor; /* = 6 */ int32_t teeny; /* = 15 */ int32_t os_variant; /* = 1 */ int32_t android_api; /* = 3, 4, 5, 8, 9, 14 */ }
- 添加了GCC 4.6工具链(
- 其他错误修复
-
- 修复了
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-
。 - 使用GCC 4.6编译时,将
sources/cxx-stl/gnu-libstdc++/include
和lib
移动到sources/cxx-stl/gnu-libstdc++/4.6
;使用GCC 4.4.3编译时,移动到sources/cxx-stl/gnu-libstdc++/4.4.3
。 - 将
libbfd.a
和libintl.a
从lib/
移动到lib32/
。
- 将
- 添加并改进了重建和测试NDK工具链的各种脚本
- 添加了
build-mingw64-toolchain.sh
,以生成一个新的Linux主机工具链,该工具链生成Win32和Win64可执行文件。 - 通过使用
clone
命令,并且仅对构建NDK工具链二进制文件所需的目录使用checkout
,提高了download-toolchain-sources.sh
的速度。 - 添加了
build-host-gcc.sh
和build-host-gdb.sh
脚本。 - 添加了
tests/check-release.sh
用于检查给定 NDK 安装目录或现有 NDK 包的内容。 - 重写了
tests/standalone/run.sh
独立测试。
- 添加了
- 从所有平台和架构中删除了
if_dl.h
头文件。它描述的AF_LINK
和sockaddr_dl
元素是 BSD 特有的(即,它们在 Linux 中不存在)。
- 更改了二进制文件的位置
Android NDK r8 *(2012 年 5 月)*
此版本的 NDK 包含对 MIPS ABI 的支持以及一些其他修复。
- 新增功能
-
- 添加了对 MIPS ABI 的支持,允许您生成可在兼容的基于 MIPS 的 Android 设备上运行的机器代码。MIPS 的主要功能包括 MIPS 特定的工具链、系统头文件、库和调试支持。有关 MIPS 支持的更多详细信息,请参阅 NDK 包中的
docs/CPU-MIPS.html
。默认情况下,代码是为基于 ARM 的设备生成的。您可以将
mips
添加到Application.mk
文件中的APP_ABI
定义中,以构建用于 MIPS 平台的代码。例如,以下行指示ndk-build
为三个不同的 ABI 构建您的代码APP_ABI := armeabi armeabi-v7a mips
除非您依赖于特定于架构的汇编源代码(例如 ARM 汇编代码),否则您无需修改
Android.mk
文件即可构建 MIPS 机器代码。 - 您可以使用
--arch=mips
选项调用make-standalone-toolchain.sh
来构建独立的 MIPS 工具链。有关更多详细信息,请参阅docs/STANDALONE-TOOLCHAIN.html
。
注意:为确保您的应用程序仅在用户的设备能够运行它们时才对用户可用,Google Play 会根据您的应用程序中包含的指令集信息过滤应用程序——您无需执行任何操作即可启用此过滤功能。此外,Android 系统本身也会在安装时检查您的应用程序,并且只有当应用程序提供为设备的 CPU 架构编译的库时,才允许继续安装。
- 添加了对 MIPS ABI 的支持,允许您生成可在兼容的基于 MIPS 的 Android 设备上运行的机器代码。MIPS 的主要功能包括 MIPS 特定的工具链、系统头文件、库和调试支持。有关 MIPS 支持的更多详细信息,请参阅 NDK 包中的
- 重要的错误修复
-
- 修复了 GAbi++ 实现中的一个错别字,其中基类对象
b
到派生类D
的dynamic_cast<D>(b)
结果在与基类相反的方向上被错误地调整。(问题 28721) - 修复了
make-standalone-toolchain.sh
无法复制libsupc++.*
的问题。
- 修复了 GAbi++ 实现中的一个错别字,其中基类对象
- 其他错误修复
-
- 修复了
ndk-build.cmd
,以确保即使用户重新定义了SHELL
环境变量(在 Windows 环境中安装各种开发工具时可能会更改),ndk-build.cmd
也可以正常工作。
- 修复了
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
。 - 恢复为
binutils
2.19 以修复在 NDK r7(切换到binutils
2.20.1)中出现的调试问题。 - 修复了 32 位 Linux 上的
ndk-build
。打包错误将 64 位版本的awk
可执行文件放在了 NDK r7 的prebuilt/linux-x86/bin
下。 - 修复了原生 Windows 构建(
ndk-build.cmd
)。其他构建模式不受影响。修复包括:- 删除了在尝试从 *不是* 项目路径顶部(例如,在其任何子目录中)的目录调用
ndk-build.cmd
时发生的无限循环/堆栈溢出错误。 - 修复了自动生成的依赖文件被忽略的问题。这意味着更新头文件不会触发包含它的源代码的重新编译。
- 修复了文件或路径中除空格和引号之外的其他特殊字符未正确处理的问题。
- 删除了在尝试从 *不是* 项目路径顶部(例如,在其任何子目录中)的目录调用
- 修复了独立工具链在使用
-lstdc++
(即,链接到 GNUlibstdc++
C++ 运行时)时生成正确二进制文件的问题。如果您想链接到共享库版本,则应使用-lgnustl_shared
;对于静态版本,则使用-lstdc++
。有关此修复程序的更多详细信息,请参阅
docs/STANDALONE-TOOLCHAIN.html
。 - 修复了 Cygwin 上的
gnustl_shared
。链接器抱怨找不到libsupc++.a
,即使该文件位于正确的位置。 - 修复了在不通过
APP_STL
使用任何特定 C++ 运行时的情况下的 Cygwin C++ 链接。
- 更新了
- 其他更改
-
- 当您的应用程序使用 GNU
libstdc++
运行时时,编译器将不再强制启用异常和 RTTI。此更改将导致代码更小。如果您需要这些功能,则必须执行以下操作之一:
- 在您的模块或
Application.mk
中显式启用异常和/或 RTTI。(推荐) - 在您的
Application.mk
中将APP_GNUSTL_FORCE_CPP_FEATURES
定义为'exceptions'
、'rtti'
或两者。有关更多详细信息,请参阅docs/APPLICATION-MK.html
。
- 在您的模块或
ndk-gdb
现在可以在您的应用程序在独立进程中运行私有服务时正常工作。它调试主应用程序进程,而不是ps
列出的第一个进程(通常是服务进程)。- 修复了一个罕见的错误,即 NDK r7 无法遵守
LOCAL_ARM_MODE
值,并且总是将某些源文件(但不是全部)编译为 32 位指令。 STLport
:刷新源代码以匹配 Android 平台版本。此更新修复了一些小错误。- 修复了不完整类型的实例化。
- 修复了“==”与“=”的小错别字。
- 在
string::assign
中使用memmove
代替memcpy
。 - 添加了对
IsNANorINF
、IsINF
、IsNegNAN
等的更好处理。
有关完整详细信息,请参阅提交日志。
STLport
:从库中删除了 5 个不必要的静态初始化程序。- 用于 armeabi-v7a 的 GNU libstdc++ 库被错误地编译为 armeabi。此更改对正确性没有影响,但使用正确的 ABI 应该可以提供稍好一些的性能。
cpu-features
辅助库已更新,可报告三个可选的 x86 CPU 功能(SSSE3
、MOVBE
和POPCNT
)。有关更多详细信息,请参阅docs/CPU-FEATURES.html
。docs/NDK-BUILD.html
已更新,提及NDK_APPLICATION_MK
而不是NDK_APP_APPLICATION_MK
来选择自定义Application.mk
文件。- Cygwin:
ndk-build
在调用时不再在当前目录中创建空“NUL”文件。 - Cygwin:添加了更好的自动依赖项检测。在之前的版本中,它在以下情况下无法正常工作:
- 当 Cygwin 驱动器前缀不是
/cygdrive
时。 - 当使用无驱动器挂载时,例如,当 Cygwin 将
/home
转换为\\server\subdir
而不是C:\Some\Dir
时。
- 当 Cygwin 驱动器前缀不是
- Cygwin:
ndk-build
不会尝试在某些版本的 Cygwin 和/或 GNU Make 中使用$NDK/prebuilt/windows/bin
下的原生 Windows 工具。
- 当您的应用程序使用 GNU
Android NDK r7 *(2011 年 11 月)*
此版本的 NDK 包含支持 Android 4.0 平台的新功能以及许多其他新增功能和改进。
- 新增功能
-
- 添加了 Android 4.0(API 级别 14)的官方 NDK API,它为平台添加了以下原生功能:
- 添加了基于 Khronos Group OpenMAX AL 1.0.1 标准的原生多媒体 API。
<OMXAL/OpenMAXAL.h>
和<OMXAL/OpenMAXAL_Android.h>
头文件允许目标 API 级别 14 的应用程序通过使用新的 Android 特定的缓冲区队列接口直接从原生代码执行多媒体输出。有关更多详细信息,请参阅docs/openmaxal/index.html
和 http://www.khronos.org/openmax/。 - 更新了基于 Khronos Group OpenSL ES 1.0.1 标准的原生音频 API。使用 API 级别 14,您现在可以将压缩音频(例如 MP3、AAC、Vorbis)解码为 PCM。有关更多详细信息,请参阅
docs/opensles/index.html
和 http://www.khronos.org/opensles/。
- 添加了基于 Khronos Group OpenMAX AL 1.0.1 标准的原生多媒体 API。
- 添加了 CCache 支持。为了加快大型重建速度,请将
NDK_CCACHE
环境变量定义为ccache
(或您ccache
二进制文件的路径)。声明后,NDK 构建系统会在编译任何源文件时自动使用 CCache。例如:export NDK_CCACHE=ccache
注意:CCache 不包含在 NDK 版本中,因此您必须在使用它之前安装它。有关 CCache 的更多信息,请参阅 http://ccache.samba.org。
- 新增了对将
APP_ABI
设置为all
的支持,表示您希望为给定NDK版本支持的所有ABI构建NDK模块。这意味着在您的Application.mk
文件中,以下两行中的任何一行在本版本中都是等效的APP_ABI := all APP_ABI := armeabi armeabi-v7a x86
如果您在命令行中调用
ndk-build
时定义了APP_ABI
,这也适用,这是一种快速检查您的项目是否为所有支持的ABI构建而无需更改项目Application.mk
文件的方法。例如:ndk-build APP_ABI=all
- 在
Android.mk
中添加了一个LOCAL_CPP_FEATURES
变量,允许您声明您的模块使用的C++特性(RTTI或异常)。如果您有依赖于这些特性的预构建模块,这可以确保最终链接正确工作。更多详情请参见docs/ANDROID-MK.html
和docs/CPLUSPLUS-SUPPORT.html
。 - 缩短了构建命令中使用的源文件和目标文件的路径。当从项目路径调用
$NDK/ndk-build
时,传递给构建命令的源文件、目标文件和二进制文件的路径现在显著缩短了,因为它们相对于当前目录传递。这在构建具有大量源文件的项目时非常有用,可以避免主机操作系统支持的最大命令行长度限制。如果您从项目树的子目录调用ndk-build
,或者如果您定义NDK_PROJECT_PATH
指向特定目录,则行为不变。
- 添加了 Android 4.0(API 级别 14)的官方 NDK API,它为平台添加了以下原生功能:
- 实验性特性
- 您现在可以在Windows上无需Cygwin即可构建NDK源文件,方法是从项目路径的命令行调用
ndk-build.cmd
脚本。该脚本与原始ndk-build
脚本采用完全相同的参数。Windows NDK包自带预构建的GNU Make、Awk和其他构建所需工具的二进制文件。您无需安装任何其他内容即可获得可工作的构建系统。重要:
ndk-gdb
在Windows上无法工作,因此您仍然需要Cygwin进行调试。此功能仍在实验阶段,因此您可以随意尝试并向公共错误数据库或公共论坛报告问题。NDK附带的所有示例和单元测试都可以使用此功能成功编译。
- 重要的错误修复
-
- 如果您的
Application.mk
中未定义APP_MODULES
,则导入的共享库现在默认安装到目标安装位置(libs/<abi>
)。例如,如果顶级模块foo
导入模块bar
,则libfoo.so
和libbar.so
都将复制到安装位置。以前,只有libfoo.so
被复制,除非您也在APP_MODULES
中列出了bar
。如果您显式定义APP_MODULES
,则行为不变。 ndk-gdb
现在可以正确处理在其MAIN intent过滤器中具有多个类别的活动。- 静态库导入现在是正确地可传递的。例如,如果顶级模块
foo
导入导入静态库zoo
的静态库bar
,则libfoo.so
现在将链接到libbar.a
和libzoo.a
。
- 如果您的
- 其他更改
-
docs/NATIVE-ACTIVITY.HTML
:修复了错字。原生活动的最低API级别应为9,而不是8。docs/STABLE-APIS.html
:添加了缺失的文档,列出了从API级别9开始支持的稳定API EGL。download-toolchain-sources.sh
:更新为从android.googlesource.com下载工具链源代码,这是AOSP服务器的新位置。- 添加了一个名为
gabi++
的新C++支持运行时。更新后的docs/CPLUSPLUS-SUPPORT.html
中提供了有关它的更多详细信息。 - 添加了一个名为
gnustl_shared
的新C++支持运行时,它对应于GNU libstdc++ v3的共享库版本(GPLv3许可证)。更多信息请参见docs/CPLUSPLUS-SUPPORT.html
- 在STLport C++运行时中添加了对RTTI的支持(不支持异常)。
- 在
LOCAL_CPP_EXTENSION
中添加了对多个文件扩展名的支持。例如,要将foo.cpp
和bar.cxx
都编译为C++源文件,请声明以下内容:LOCAL_CPP_EXTENSION := .cpp .cxx
- 从NDK提供的链接时共享系统库中删除了许多不需要的导出符号。这确保了使用独立工具链生成的代码不会意外地依赖于不稳定的ABI符号(例如,每次用于构建平台的工具链更改时都会更改的任何libgcc.a符号)。
- 刷新了EGL和OpenGLES Khronos头文件以支持更多扩展。请注意,这不会更改相应库的NDK ABI,因为每个扩展都必须由客户端应用程序在运行时探测。
可用的扩展取决于您的实际设备和GPU驱动程序,而不是设备运行的平台版本。头文件更改只是添加了新的常量和类型,以便在使用
eglGetProcAddress()
或glGetProcAddress()
探测到扩展后更容易使用它们。以下列表描述了新支持的扩展:- GLES 1.x
-
GL_OES_vertex_array_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
Android NDK r6b *(2011年8月)*
此版本的NDK与r6相比没有任何新功能。r6b版本解决了r6版本中的以下问题:
- 重要的错误修复
-
- 修复了使用
APP_ABI="armeabi x86"
进行多架构构建时的构建问题。 - 修复了NDK发行版包中预构建STLport二进制文件的位置。打包脚本中的错误将它们放在了错误的位置。
- 修复了使用x86独立工具链在共享库中使用
atexit()
的问题。 - 修复了
make-standalone-toolchain.sh --arch=x86
。它以前无法将正确的GNU libstdc++二进制文件复制到正确的位置。 - 修复了独立工具链链接器关于缺少
__dso_handle
符号的定义和大小的警告(仅限ARM)。 - 修复了x86构建的
$(SYSROOT)/usr/include
的包含顺序。更多信息请参见错误。 - 修复了在与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的设备生成的,但是您可以将x86添加到
Application.mk
文件中的APP_ABI
定义中以构建x86平台。例如,以下行指示ndk-build
为三个不同的ABI构建您的代码:APP_ABI := armeabi armeabi-v7a x86
除非您依赖于基于ARM的汇编源代码,否则您无需修改
Android.mk
文件即可构建x86机器代码。 - 您可以使用
--toolchain=x86-4.4.3
选项在调用make-standalone-toolchain.sh
时构建独立的x86工具链。更多详细信息请参见docs/STANDALONE-TOOLCHAIN.html
。 - 新的
ndk-stack
工具允许您转换由原生代码生成的logcat
中的堆栈跟踪。该工具将指令地址转换为可读的格式,其中包含与每个堆栈帧对应的函数、源文件和行号等信息。更多信息和使用方法示例,请参见docs/NDK-STACK.html
。
- 添加了对x86 ABI的支持,允许您生成在兼容的基于x86的Android设备上运行的机器代码。x86的主要功能包括特定于x86的工具链、系统头文件、库和调试支持。有关x86支持的所有详细信息,请参阅NDK包中的
- 其他更改
- 自NDK r5以来已被弃用的
arm-eabi-4.4.0
已从NDK发行版中删除。
Android NDK r5c *(2011年6月)*
此版本的NDK与r5b相比没有任何新功能。r5c版本解决了r5b版本中的以下问题:
- 重要的错误修复
-
ndk-build
:修复了在尝试对可调试项目进行并行构建时出现的罕见错误。- 修复了阻止
LOCAL_WHOLE_STATIC_LIBRARIES
与新工具链一起正常工作的错字,并在docs/ANDROID-MK.html
中添加了对此的文档。 - 修复了链接到
gnustl_static
的代码在API级别低于8(Android 2.2)的平台版本上运行时崩溃的错误。 ndk-gdb
:修复了在调试Android 3.0或更高版本设备时导致段错误的错误。<android/input.h>
:在API级别9(Android 2.3)中引入的两个函数不正确,现已修复。虽然这会破坏源API,但系统的二进制接口保持不变。不正确的函数缺少history_index
参数,正确的定义如下所示:float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index, size_t history_index); float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index, size_t history_index);
- 更新了API级别9(Android 2.3)的C库ARM二进制文件,以便在链接时正确公开在该API级别中添加的新函数(例如,
pthread_rwlock_init
)。
- 次要改进和修复
-
- 目标文件现在始终按其在
LOCAL_SRC_FILES
中出现的顺序链接。以前情况并非如此,因为文件是按源扩展名分组的。 - 当
import-module
失败时,它现在会打印已搜索的目录列表。这对于检查构建系统使用的NDK_MODULE_PATH
定义是否正确非常有用。 - 当
import-module
成功时,它现在会将找到模块的目录打印到日志中(使用NDK_LOG=1
可见)。 - 当项目中包含目录数量非常多时,提高了可调试应用程序的构建速度。
ndk-gdb
:更好地检测adb shell
故障并改进了错误消息。<pthread.h>
:修复了API级别9(Android 2.3)及更高版本的PTHREAD_RWLOCK_INITIALIZER
的定义。- 修复了模块可以导入自身,从而导致GNU Make中出现无限循环的问题。
- 修复了一个错误,该错误会导致在将
LOCAL_ARM_NEON
设置为 true 时构建失败(build/core/build-binary.mk
中的错别字)。 - 修复了一个错误,该错误阻止了
.s
汇编文件(.S
文件正常)的编译。
- 目标文件现在始终按其在
Android NDK r5b *(2011年1月)*
此版本的NDK与r5相比没有任何新功能。r5b版本解决了r5版本中的以下问题:
- r5二进制文件需要glibc 2.11,但r5b二进制文件是用一个特殊的工具链生成的,该工具链的目标是glibc 2.7或更高版本。Linux工具链二进制文件现在可以在Ubuntu 8.04或更高版本上运行。
- 修复了arm-linux-androideabi-4.4.3工具链中的编译器错误。之前的二进制文件在处理带符号字符时会生成无效的Thumb指令序列。
- 为APP_STL的“gnustl_static”值添加了缺失的文档,允许您链接到GNU libstdc++的静态库版本。 the
- 修复了以下
ndk-build
问题:- 一个错误,在Windows上发生编译错误时会创建不一致的依赖文件。这阻止了在源代码中修复错误后进行正确的构建。
- 一个Cygwin特有的错误,其中使用非常短的Android NDK安装路径或项目路径会导致生成无效的依赖文件。这使得增量构建成为不可能。
- 一个错别字,阻止了cpufeatures库与新的NDK工具链一起正常工作。
- 通过避免从GNU Make为每个源文件或目标文件调用
cygpath -m
,Cygwin中的构建速度更快,这在非常大的源代码树中会导致问题。如果这不能正常工作,请在您的环境中定义NDK_USE_CYGPATH=1
以再次使用cygpath -m
。 - Cygwin安装现在会通知用户包含空格的无效安装路径。以前,无效路径会输出一个错误,抱怨GNU Make的版本不正确,即使安装了正确的版本。
- 修复了一个错别字,该错别字阻止了
NDK_MODULE_PATH
环境变量在包含多个用冒号分隔的目录时正常工作。 prebuilt-common.sh
脚本包含了一些修复程序,用于检查编译器生成的64位机器代码,而不是依赖于主机标签,这允许在Snow Leopard上正确重建32位工具链。工具链重建脚本现在也支持使用32位主机工具链。- 为
INET_ADDRSTRLEN
添加了一个缺失的声明到<netinet/in.h>
。 - 为
IN6_IS_ADDR_MC_NODELOCAL
和IN6_IS_ADDR_MC_GLOBAL
添加了缺失的声明到<netinet/in6.h>
。 - 在
<asm/byteorder.h>
中用__asm__
替换了'asm'
,以允许使用-std=c99
进行编译。
Android NDK r5 *(2010年12月)*
此版本的NDK包含许多新的API,其中大部分API都是为了支持开发大量使用本地代码的游戏和类似应用程序而引入的。使用这些API,开发人员可以直接访问本地事件、音频、图形和窗口管理、资源和存储。开发人员还可以借助新的NativeActivity
类在本地代码中实现Android应用程序生命周期。有关此版本中更改的详细信息,请阅读下载的NDK包中包含的CHANGES.HTML
文档。
- 一般说明
-
- 添加了对原生活动的支持,允许您在原生代码中实现Android应用程序生命周期。
- 添加了对以下内容的原生支持:
- 输入子系统(例如键盘和触摸屏)
- 访问传感器数据(加速度计、指南针、陀螺仪等)。
- 事件循环API,用于等待输入和传感器事件等。
- 窗口和表面子系统
- 基于OpenSL ES标准的音频API,支持播放和录制,以及对平台音频效果的控制
- 访问打包在
.apk
文件中的资源。
- 包含一个新的工具链(基于GCC 4.4.3),它生成更好的代码,现在也可以用作独立的交叉编译器,供那些想要使用
./configure && make
构建其内容的人使用。有关详细信息,请参阅docs/STANDALONE-TOOLCHAIN.html。仍然提供GCC 4.4.0的二进制文件,但已删除4.2.1二进制文件。 - 添加了对预构建静态库和共享库的支持(docs/PREBUILTS.html)以及模块导出和导入,使第三方模块的共享和重用更容易(docs/IMPORT-MODULE.html解释了原因)。
- 提供了一个默认的C++ STL实现(基于STLport)作为辅助模块。它可以用作静态库或共享库(详细信息和使用示例位于sources/android/stlport/README中)。如果您选择针对这些库而不是默认的C++ STL实现进行编译,则还会提供STLport(静态或共享)和GNU libstdc++(仅静态)的预构建二进制文件。默认STL实现不支持C++异常和RTTI。有关更多信息,请参阅docs/CPLUSPLUS-SUPPORT.HTML。
- 改进了
cpufeatures
辅助库,改进了CPU类型的报告(某些设备以前报告的是ARMv7 CPU,而实际上是ARMv6)。我们建议使用此库的开发人员重建他们的应用程序,然后上传到Google Play,以从这些改进中获益。 - 添加了一个EGL库,允许您创建和管理OpenGL ES纹理和服务。
- 添加了新的示例应用程序
native-plasma
和native-activity
,以演示如何编写原生活动。 - 包含许多错误修复和其他小的改进;有关更详细的更改列表,请参阅docs/CHANGES.html。
Android NDK r4b *(2010年6月)*
- NDK r4b说明
-
包含对NDK构建和调试脚本中几个问题的修复——如果您使用的是NDK r4,我们建议下载NDK r4b构建。有关此版本中更改的详细信息,请阅读下载的NDK包中包含的CHANGES.TXT文档。
- 一般说明
-
- 通过新的
ndk-build
构建命令提供了一个简化的构建系统。 - 通过新的
ndk-gdb
命令添加了对在生产设备上轻松进行生成的机器代码的原生调试的支持。 - 为基于ARM的CPU架构添加了一个新的Android专用ABI,
armeabi-v7a
。新的ABI扩展了现有的armeabi
ABI,以包含以下CPU指令集扩展:- Thumb-2指令
- VFP硬件FPU指令(VFPv3-D16)
- 对ARM高级SIMD(NEON)GCC内在函数和VFPv3-D32的可选支持。受摩托罗拉Verizon Droid、谷歌Nexus One等设备支持。
- 添加了一个新的
cpufeatures
静态库(带源代码),允许您的应用程序在运行时检测主机设备的CPU功能。具体来说,应用程序可以检查ARMv7-A支持以及VFPv3-D32和NEON支持,然后根据需要提供单独的代码路径。 - 添加了一个示例应用程序
hello-neon
,它演示了如何使用cpufeatures
库来检查CPU功能,然后在CPU支持的情况下提供使用NEON内在函数的优化代码路径。 - 允许您为NDK支持的一个或两个指令集生成机器代码。例如,您可以同时为ARMv5和ARMv7-A架构构建,并将所有内容存储到应用程序的最终
.apk
中。 - 为了确保您的应用程序只有在其设备能够运行它们的情况下才对用户可用,Google Play现在会根据您的应用程序中包含的指令集信息过滤应用程序——您无需执行任何操作即可启用过滤。此外,Android系统本身也会在安装时检查您的应用程序,并且只有当应用程序提供为设备的CPU架构编译的库时,才允许安装继续。
- 添加了对Android 2.2的支持,包括一个新的稳定API,用于从原生代码访问
Bitmap
对象的像素缓冲区。
- 通过新的
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,发行版1”。
- 一般说明
-
- 添加了OpenGL ES 1.1原生库支持。
- 添加了一个示例应用程序
san-angeles
,它通过原生OpenGL ES API渲染3D图形,同时使用GLSurfaceView
对象管理活动生命周期。
Android NDK r1 *(2009年6月)*
最初发布为“Android 1.5 NDK,发行版1”。
- 一般说明
-
- 包括对ARMv5TE指令(包括Thumb-1指令)的编译器支持(GCC)。
- 包括稳定原生API的系统头文件、文档和示例应用程序。