Android POSIX兼容吗?

sas*_*alm 14 c android posix

Android POSIX兼容吗?我知道它使用Linux内核,但我不知道这意味着它是POSIX兼容的,随着越来越多的用户空间与功能POSIX标准的交易.那么,它兼容吗?

例如,如果我在C程序中仅使用ANSI和POSIX函数,它是否可以在Android上编译和运行而无需进行任何代码更改?

Kil*_*eux 19

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

而且正如@code猴所提到的,你可以看一下仿生源代码.您可以在此处找到更多信息.

  • [This](http://www.kandroid.org/ndk/docs/system/libc/OVERVIEW.html)也是列出差异的好链接.你也可以查看[github](https://github.com/android/platform_bionic). (5认同)

CRO*_*OSP 6

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的主要特点:

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

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

C++ 11支持由于CrystaX NDK包含最新版本的GCC和Clang,它支持许多新的C++ 11功能,这些功能列在C++ 0x/C++ 11上,支持GCC和C++ 98和C++ 11支持Clang.此外,CrystaX NDK提供了完全可用的C++ 11类std :: thread,std :: mutex,std :: chrono等.由于Android Bionic libc缺乏功能,这些类在Google NDK中不可用.我们调查了这个问题并修复了它,所以在CrystaX NDK中你可以使用它们而忘记ifdef.

Objective-C支持Google NDK支持的唯一语言是C和C++.除了C和C++之外,CrystaX NDK还增加了对Objective-C的支持.到目前为止只支持核心语言; 关于Cocoa类库的工作正在进行中.要在项目中开始使用Objective-C,只需添加扩展名为.m(Objective-C)或.mm(Objective-C++)的源文件,并在Android.mk中的LOCAL_SRC_FILES中指定它们.

继续......如果你在这里没有看到一些很棒的功能,请不要犹豫与我们联系并要求它.您还可以使用我们的问题/错误跟踪器来报告错误或功能请求.当然,欢迎捐款!

您可以在官方CrystaX NDK网站上找到更多信息


Cir*_*四事件 5

官方仿生树文档引用

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
Run Code Online (Sandbox Code Playgroud)

当前的 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

还有一些有趣的信息:

尽管 Bionic 的目标是实现所有 C11 和 POSIX,但(从 Oreo 开始)libc 中仍然缺少大约 70 个 POSIX 函数[8]。还有一些 POSIX 函数,例如 endpwent/getpwent/setpwent 系列,不适用于 Android,因为它缺少 passwd 数据库。从 Oreo 开始,libm 已经完成。

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