Android POSIX兼容吗?我知道它使用Linux内核,但我不确定这是否意味着它与POSIX兼容,因为POSIX标准更多地涉及用户区功能。那么,它兼容吗?
例如,如果我在我的C程序中仅使用ANSI和POSIX函数,它是否可以在Android上编译和运行而无需进行任何代码更改?
答案 0 :(得分:18)
pthread_cancel()
因此,如果您不使用它,您的代码可能会正常运行。
正如@code猴所提到的,你可以看一下仿生source code。您可以找到其他信息here。
答案 1 :(得分:6)
Android不完全兼容POSIX。首先我注意到的是默认的c库。你可能知道它被称为glibc。但Android有自己的c库 - 仿生。这是一些笔记。
Bionic的POSIX和系统调用头中的一些功能是存根 或针对Android特定行为的包装器,导致意外行为 在某些情况下。
Android使用基于Linux的内核,因此您可以说它符合POSIX标准。但一般来说Android也不符合POSIX等Unix规范。 你也可以阅读类似的东西
Bionic不包括C ++异常处理,也许就像谷歌那样 不使用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支持Clang中的GCC和C ++ 98和C ++ 11支持。在 此外,CrystaX NDK提供完全可用的C ++ 11类 std :: thread,std :: mutex,std :: chrono等。这些类不是 由于缺乏功能,因此可在Google NDK中使用 Android Bionic libc。我们调查了这个问题并修复了它, 所以在CrystaX NDK中你可以使用它们而忘记ifdefs。
Objective-C支持Google NDK支持的唯一语言是C. 和C ++。除C外,CrystaX NDK还增加了Objective-C的支持 和C ++。到目前为止只支持核心语言;从事于 可可类库正在进行中。开始使用Objective-C 您的项目,只需添加扩展名为.m的源文件 (Objective-C)或.mm(Objective-C ++)并在其中指定它们 Android.mk中的LOCAL_SRC_FILES。
继续......如果你在这里没有看到一些很棒的功能,那就不要了 犹豫与我们联系并要求它。您也可以使用我们的问题/错误 跟踪器报告错误或功能请求。而且当然, 欢迎捐款!
答案 2 :(得分:3)
树形文档中的Bionic官方报价
运行./libc/tools/check-symbols-glibc.py in bionic /获取glibc实现的POSIX函数的当前列表,但不是bionic实现的。目前(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
还有一些有趣的信息:
尽管bionic的目标是实现所有C11和POSIX,但仍有(从Oreo开始)大约有70个POSIX函数从libc中丢失[8]。还有一些POSIX函数,例如endpwent / getpwent / setpwent系列,它们不适用于Android,因为它缺少passwd数据库。从奥利奥开始,libm已经完成。
出于安全原因,某些功能故意不符合POSIX或C标准,例如printf不支持%n格式字符串。[9]
答案 3 :(得分:2)
我知道这个答案有点过时了,但它会补充上面的答案。
是的,Android不兼容POSIX,主要是因为它的libc(Bionic)限制。但是,使用CrystaX NDK你可能感觉不到那么难 - 只是因为使用针对Android的CrystaX NDK开发变得更加POSIX兼容。我们已经在我们自己的libcrystax.so(CrystaX NDK的核心)中实现了许多libc部分(错误或缺少Bionic),并且在不改变典型开发流程的情况下完成了它。我们将进一步改进它,因为libcrystax还不支持完整 POSIX集,但截至目前,它支持很多东西,如宽字符和字符串,完全支持locales(locale-特定的输入和输出),完整的数学库,包括复杂和类型泛型函数,完全工作的标准C ++库后端(两种可用的实现,根据您的选择 - GNU libstdc ++或LLVM libc ++)以及大量其他修复和改进。
只是为了展示CrystaX NDK如何让Android的原生开发更容易 - 我们将Boost 1.57.0包含在CrystaX NDK 10.1.0中,我们从它的源代码构建而没有任何修改 - 只是因为在CrystaX NDK Boost保持不变与Google的NDK相比, 更多符合POSIX标准的基础。