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猴所提到的,你可以看一下仿生源代码.您可以在此处找到更多信息.
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网站上找到更多信息
官方仿生树文档引用
在 bionic/ 中运行 ./libc/tools/check-symbols-glibc.py 以获得由 glibc 实现但不是由 bionic 实现的 POSIX 函数的当前列表。目前(2017-10):
Run Code Online (Sandbox Code Playgroud)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
还有一些有趣的信息:
尽管 Bionic 的目标是实现所有 C11 和 POSIX,但(从 Oreo 开始)libc 中仍然缺少大约 70 个 POSIX 函数[8]。还有一些 POSIX 函数,例如 endpwent/getpwent/setpwent 系列,不适用于 Android,因为它缺少 passwd 数据库。从 Oreo 开始,libm 已经完成。
有些函数出于安全原因故意不符合 POSIX 或 C 标准,例如 printf 不支持 %n 格式字符串。 [9]
| 归档时间: |
|
| 查看次数: |
7777 次 |
| 最近记录: |