zom*_*ega 5 documentation android libc bionic
对于 glibc,您可以在此处找到在线文档。
我正在寻找 Android 的 libc 实现的等效文档(标头位于 sysroot/usr/include 下)。
有这些的文档吗?
(例如 sysroot/usr/include/sys/vfs.h 下的调用 statfs())。
至少可以说,Google\xe2\x80\x99s 文档很少。您可以在这里和这里找到它。如果您通常熟悉 C 运行时库,那么 xe2\x80\x99 有很多有用的信息,但没有完整的逐个函数文档集。Google 似乎假设您不会\xe2\x80\x99 第一次在 Android 上学习 C/C++ 编程。
\nOpenBSD 手册页可在此处获取。使用页面顶部的表格选择不同的功能。
\n可用函数的最终来源是头文件。由于您可以将 NDK 安装在文件系统中的任何位置,因此 I\xe2\x80\x99 将描述相对于 NDK 目录的标头位置:
\n在 Windows 上,您\xe2\x80\x99 将在以下位置找到其中的大部分:
\n<NDK-directory>\\sysroot\\usr\\include\n
Run Code Online (Sandbox Code Playgroud)\n然而,一些与编译器密切相关的头文件位于:
\n<NDK-directory>\\toolchains\\llvm\\prebuilt\\windows-x86_64\\lib64\\clang\\<clang-version>\\include\n
Run Code Online (Sandbox Code Playgroud)\n在 Linux 上,这些目录是:
\n<NDK-directory>/sysroot/usr/include\n<NDK-directory>/lib64/clang/<clang-version>/include\n
Run Code Online (Sandbox Code Playgroud)\n当 Android 项目成形时,Google对 C 运行时库有一些具体要求:
\n小的。早期 Android 设备的 RAM 比当前设备少得多。HTC Dream 是第一款发售的 Android 设备,拥有 192MB 内存,而现在 1GB 是最低内存。除了代码很小之外,该库也不需要大量的工作内存。
\n快速地。Dream 的运行频率为 528MHz,而当前低端设备的运行频率为 1GHz 或更高。尺寸和速度要求意味着简单性是非常可取的。
\nBSD 许可。Google 非常希望避免应用程序开发人员必须使用 GPL 许可的库。在本世纪的第一个十年,开源在商业上的接受程度要低得多,许多作为潜在应用程序供应商的公司与 GPL 或其他 Copyleft 许可证无关。在早期的Android原生代码工作中,静态链接相当常见,如果静态链接到GPL\xe2\x80\x99ed代码,则需要开源自己的代码。BSD 许可证更加宽松:只要您承认 BSD 许可的代码存在,您就可以使用 BSD 许可的代码做几乎所有您喜欢的事情。
\nGlibc 在速度相当快的 PC 上发展而来,其 RAM 和处理器速度远高于早期的 Android 设备,因此它没有同样的小而简单的压力。个人电脑还可以在内存和磁盘之间“交换”数据和程序。Android 从来不支持这一点:物理 RAM 就是全部同时运行的程序可以使用的所有内存。
\nGlibc也是一个非常完整的C 运行时库,结合了其他 C 运行时的大部分功能。它还与非常广泛的硬件和操作系统兼容。这两件事往往会让事情变得更大。它使用 LGPL,而不是完整的 GPL,但了解其区别需要您了解静态链接和动态链接之间的区别。谷歌不想尝试对高管进行相关教育。
\nBionic 只支持 ARM32、ARM64、x86、x86-64、MIPS 和 MIPS64,所有这些都是小端字节序。它唯一支持的操作系统内核是Linux。多线程总是在运行,并且总是有一个MMU。这些东西肯定简化了 Bionic 的代码。
\nAndroid 4.0 的 Bionic 概述可在此处找到。
\nBionic 并不支持所有 POSIX,尽管它相当接近。它包含许多 BSD 扩展和相当多的 glibc 扩展,这些扩展不会过度增加内存使用。有些事情被故意排除,以牺牲标准一致性为代价。例如,出于安全原因printf
不支持%n
格式化程序(一个非常明智的决定),并且没有 Unix 密码数据库功能,因为 Android 没有\xe2\x80\ x99t数据库。
该库在 Android 的生命周期中获得了更多功能。现代版本 NDK 中的 C 头文件包含条件编译,可让您选择 Android 版本作为您支持的最旧版本。只有该版本中存在的函数才可在您的编译中使用。从个人经验来看,将 C/C++ 代码移植到 Android 5.0 \xe2\x80\x9cLollipop\xe2\x80\x9d 比早期版本要容易得多。许多经典的 Unix 功能就在那时出现了。
\n其中相当多的内容来自各种 BSD Unix。需要进行更改才能在 Linux(而不是 BSD)内核上运行。OpenBSD 似乎是最大的贡献者,但数学库主要来自 FreeBSD,并带有来自 SoC 制造商的优化汇编程序例程。pthreads 库和动态链接器是从头开始编写的。没有单独的 libpthread,因为它和传统 Unix libc 的许多其他扩展已合并到 Bionic\xe2\x80\x99s libc 中。
\nBionic 是一个C运行时库,但 C++ 代码经常调用它。与 Bionic 不同,C++ 运行时库不是 Android 操作系统的一部分。历史上,有多种不同的 C++ 运行时可用,但现在 LLVM 项目中的 libc++ 已成为标准。您必须将libc++_shared.so
APK 包含在您的应用程序中,因为它不是由操作系统提供的。这会浪费一些内存和存储空间,但按照现代应用程序的标准来看,浪费的并不多。