Android libc 文档在哪里?

Where is the Android libc documentation?

对于 glibc,您可以找到在线文档 here

我正在寻找 Android 的 libc 实现的等效文档(headers 位于 sysroot/usr/include 下)。

这些有文档吗?

(例如在sysroot/usr/include/sys/vfs.h下调用statfs())。

仿生文档在哪里?

Google 的文档至少可以说是稀疏的。你可以找到它here and here。如果您通常熟悉 C run-time 库,那么这里有很多有用的信息,但是没有完整的 function-by-function 文档集。 Google 似乎假设您不会在 Android 上第一次学习 C/C++ 编程。

OpenBSD 手册页可用 here。使用页面顶部的表格 select 不同的功能。

可用函数的权威来源是 header 文件。由于您可以在文件系统中的任何位置安装 NDK,因此我将描述相对于 NDK 目录的 header 位置:

在 Windows 上,您会发现其中大部分位于:

<NDK-directory>\sysroot\usr\include

但是,一些与编译器密切相关的header在:

<NDK-directory>\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\<clang-version>\include

在 Linux 上,这些目录是:

<NDK-directory>/sysroot/usr/include
<NDK-directory>/lib64/clang/<clang-version>/include

为什么 Android 使用 Bionic 而不是 glibc?

当 Android 项目初具规模时,Google 有一些 specific requirements 的 C run-time 库:

  • 小。早期 Android 设备的 RAM 比当前设备少得多。 HTC Dream 是第一款发售的 Android 设备,它有 192MB,而现在 1GB 是最小值。除了代码小之外,该库不需要大量的工作内存。

  • 快。 Dream 运行 频率为 528MHz,而当前 low-end 设备的频率为 1GHz 或更高。大小和速度要求意味着简单性是非常可取的。

  • BSD-licensed。 Google 非常希望避免应用程序开发人员不得不使用 GPL-licensed 库。在本世纪的头十年,开源在商业中的接受度要低得多,许多潜在的应用程序供应商公司与 GPL 或其他 copyleft 许可证无关。在早期 Android 本机代码工作中,静态 linking 非常普遍,如果您静态 link 到 GPL 代码,则需要 open-source 自己的代码。 BSD 许可证更为宽松:只要您承认它存在,您就可以使用 BSD-licensed 代码做几乎所有您喜欢的事情。

Glibc 在相当快的 PC 上发展而来,它的 RAM 和处理器速度比早期的 Android 设备快得多,因此它没有同样的小而简单的压力。 PC 还可以使用内存和磁盘之间的数据和程序“交换”。 Android从来不支持:物理RAM是全部所有程序可以同时使用的内存运行

Glibc 也是一个非常完整 C run-time 库,结合了所有其他 C run-time 的大部分功能。它还与非常广泛的 运行ge 硬件和操作系统兼容。这两件事往往会使它变得更大。它使用 LGPL,而不是完整的 GPL,但要了解其中的区别,您需要了解静态和动态 linking 之间的区别。 Google 不想尝试就此对高管进行教育。

Bionic 仅支持 ARM32、ARM64、x86、x86-64、MIPS 和 MIPS64,所有这些little-endian。它曾经支持的唯一操作系统内核是 Linux。 Multi-threading总是在运行,并且总是有一个 MMU。这些东西绝对简化了Bionic的代码。

可以找到 Android 4.0 的 Bionic 概述 here

与标准的差异

Bionic 不支持所有 POSIX,尽管它相当接近。它包含许多 BSD 扩展,以及相当多的不会过度增加内存使用的 glibc 扩展。有些东西被故意排除在外,以牺牲标准一致性为代价。例如,printf 出于安全原因不支持 %n 格式化程序(一个非常合理的决定),并且没有 Unix 密码数据库功能,因为 Android 不支持 那种数据库。

仿生进化

库在 Android 的生命周期中获得了更多的功能。现代版本的 NDK 中的 C headers 包含条件编译,让您可以选择 Android 的版本作为您支持的最旧版本。只有该版本中存在的函数才能在您的编译中使用。根据个人经验,将 C/C++ 代码移植到 Android 5.0 “Lollipop” 比早期版本要容易得多。那时出现了很多经典的 Unix 功能。

Bionic 中的代码来自哪里?

其中相当一部分来自各种 BSD Unix。需要在 Linux 而不是 BSD 内核上对 运行 进行更改。 OpenBSD 似乎是最大的贡献者,但数学库主要来自 FreeBSD,具有来自 SoC 制造商的优化汇编程序。 pthreads 库和动态 linker 是从头开始编写的。没有单独的 libpthread,因为它和许多其他扩展传统的 Unix libc 已被合并到 Bionic 的 libc 中。

C++

Bionic 是一个 C run-time 库,但 C++ 代码经常调用它。与 Bionic 不同,C++ run-time 库不是 Android 操作系统的一部分。从历史上看,有几种不同的 C++ 运行 时代可用,但现在 LLVM 项目的 libc++ 是标准。您必须在您的应用程序 APK 中包含 libc++_shared.so,因为它不是由操作系统提供的。这会浪费一些内存和存储空间,但以现代应用程序的标准来看并不算多。