Android POSIX 兼容吗?

Posted

技术标签:

【中文标题】Android POSIX 兼容吗?【英文标题】:Is Android POSIX-compatible? 【发布时间】:2015-02-20 15:45:28 【问题描述】:

我知道它使用 Linux 内核,但我不确定这是否意味着它与 POSIX 兼容,因为 POSIX 标准更多地处理用户空间功能。那么,兼容吗?

例如,如果我在我的 C 程序中只使用 ANSI 和 POSIX 函数,它会在 android 上编译和运行而不需要任何代码更改吗?

【问题讨论】:

甚至 Linux 也不完全兼容 POSIX :) @ShmilTheCat 我认为它只是没有认证,因为它要花钱? IMO 不仅仅是成本问题,请参阅personal.opengroup.org/~ajosey/tr28-07-2003.txt C API 子集:***.com/questions/12111640/… 与 POSIX 系统的另一个区别是 /tmp 不保证可写或存在 【参考方案1】:

GNU libc(glibc)对于手机来说太大太复杂了,所以Android实现了自己的特殊版本的libc,即Bionic libc,它本身并不完全支持POSIX。 android Bionic libc 中最缺乏的功能之一是pthread_cancel(),所以如果你不使用它,你的代码可能会很好。

正如@code monkey 提到的,你可以看看仿生source code。您可以找到更多信息here。

【讨论】:

This 也是列出差异的好链接。您也可以查看github。 @codemonkey 我编辑了问题以包含源代码的链接,谢谢。 仿生 vs Glibc 报告:irati.eu/wp-content/uploads/2012/07/bionic_report.pdf【参考方案2】:

Android 不完全兼容 POSIX。首先我注意到的是默认的 c 库。您可能知道它被称为 glibc。但是Android有自己的c库——仿生。这里有一些注意事项。

Bionic 的 POSIX 和系统调用标头中的一些函数是存根 或 Android 特定行为的包装器,导致意外行为 在某些情况下。

Android 使用基于 linux 的内核,所以你可以说它是 POSIX 兼容的。但总的来说,Android 也不符合 POSIX 等 Unix 规范。 您也可以阅读类似的内容

Bionic 不包括 C++ 异常处理,也许像 Google 那样 不使用 C++ 异常和 Java 异常,一旦 Java虚拟机启动

Bionic 不包含标准模板库,并且开发人员 如果需要,必须手动包含它

有很棒的自定义构建 NDK - CrystaX NDK

CrystaX NDK 的主要特点:

宽字符。 Google 的 NDK 在 C 中不正确支持宽字符 或 C++。使用 CrystaX NDK,您可以获得完全符合标准的宽 字符支持。您可以轻松移植使用广泛的现有代码 字符/字符串/流或编写新代码。

最新的工具链 CrystaX NDK 包括最新的 GCC 和 Clang 编译器以及稳定版本。这允许 开发人员使用新的语言能力(例如新的 C++ 11 特征)。所有编译器都是用高级和低级构建的 优化,可以生成最有效的代码 目标硬件。

C++11 支持因为 CrystaX NDK 包含最新版本 GCC 和 Clang,它支持许多新的 C++ 11 特性 GCC 中的 C++0x/C++11 支持以及 Clang 中的 C++98 和 C++11 支持。在 此外,CrystaX NDK 提供了完整的 C++ 11 类 std::thread、std::mutex、std::chrono 等。这些类不是 由于缺乏功能,在 Google NDK 中可用 Android 仿生库。我们已经调查了这个问题并修复了它, 所以在 CrystaX NDK 中,您可以直接使用它们而无需考虑 ifdefs。

Objective-C 支持 Google NDK 支持的唯一语言是 C 和 C++。 CrystaX NDK 除了 C 之外还增加了对 Objective-C 的支持 和 C++。目前只支持核心语言;从事于 类似 Cocoa 的库正在开发中。开始使用 Objective-C 您的项目,只需添加扩展名为 .m 的源文件 (Objective-C) 或 .mm (Objective-C++) 并在 Android.mk 中的 LOCAL_SRC_FILES。

待续...如果您在这里没有看到一些很棒的功能,请不要 犹豫与我们联系并索取。您也可以使用我们的问题/错误 跟踪器报告错误或功能请求。而且当然, 欢迎投稿!

您可以在Official CrystaX NDK site找到更多信息

【讨论】:

【参考方案3】:

我知道这个答案有点过时,但它会补充上面的答案。

是的,Android 不兼容 POSIX,主要是因为它的 libc(仿生)限制。但是,使用CrystaX NDK 您可能不会觉得这种差异如此之大 - 只是因为使用 CrystaX NDK 开发 Android 变得更加兼容 POSIX。我们在 CrystaX NDK 的核心 libcrystax.so 中自行实现了许多 libc 部分(Bionic 中有错误或不存在),并且在不改变典型开发流程的情况下完成了这些部分。我们将进一步改进它,因为 libcrystax 还不支持 full POSIX 集,但截至目前,它支持许多东西,例如宽字符和字符串,完全支持语言环境(locale-特定的输入和输出),完整的数学库,包括复杂的和类型通用的函数,标准 C++ 库的完整工作后端(两种实现,供您选择 - GNU libstdc++ 或 LLVM libc++)以及大量其他修复和改进。

只是为了展示 CrystaX NDK 如何让 Android 的原生开发变得更容易 - 我们已将 Boost 1.57.0 包含在 CrystaX NDK 10.1.0 中,我们是根据它的源代码构建的,没有进行任何修改 - 只是因为在 CrystaX NDK Boost 中保持不变与 Google 的 NDK 相比,更多符合 POSIX 标准。

【讨论】:

【参考方案4】:

树文档中的官方仿生引用

https://android.googlesource.com/platform/bionic/+/37ad9597839c70a7ec79578e5072df9c189fc830/docs/status.md

在 bionic/ 中运行 ./libc/tools/check-symbols-glibc.py 以获取由 glibc 但不是由 bionic 实现的 POSIX 函数的当前列表。目前(2017-10):

aio_cancel
aio_error
aio_fsync
aio_read
aio_return
aio_suspend
aio_write
lio_listio
pthread_cancel
pthread_mutex_consistent
pthread_mutex_getprioceiling
pthread_mutex_setprioceiling
pthread_mutexattr_getprioceiling
pthread_mutexattr_getprotocol
pthread_mutexattr_getrobust
pthread_mutexattr_setprioceiling
pthread_mutexattr_setprotocol
pthread_mutexattr_setrobust
pthread_setcancelstate
pthread_setcanceltype
pthread_testcancel
wordexp
wordfree
libm

当前的 libm 符号:https://android.googlesource.com/platform/bionic/+/master/libm/libm.map.txt

剩余 0 个缺失的 POSIX libm 函数。

仿生***页面

https://en.wikipedia.org/wiki/Bionic_(software)#Differences_from_POSIX

还有一些有趣的信息:

尽管仿生旨在实现所有 C11 和 POSIX,但(截至 Oreo)libc 中仍然缺少大约 70 个 POSIX 函数[8]。还有一些 POSIX 函数,例如 endpwent/getpwent/setpwent 系列不适用于 Android,因为它缺少 passwd 数据库。截至 Oreo,libm 已完成。

出于安全原因,某些函数故意不符合 POSIX 或 C 标准,例如 printf 不支持 %n 格式字符串。[9]

【讨论】:

以上是关于Android POSIX 兼容吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS OpenGL ES 与 Android OpenGL ES 兼容吗?

Google Play 开发者控制台是查看我的 Android 应用兼容设备列表的唯一方法吗?

如何在java(android)中以posix格式打印本地时区?

android高版本程序能在低版android系统上运行吗?

报警软件:兼容 iOS、Android、Mac、PC [关闭]

调试Xamarin.Android时出现缺少"Mono.Posix 2.0.0"的错误