Android POSIX兼容吗?

时间:2014-12-22 14:17:22

标签: android c posix

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

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

4 个答案:

答案 0 :(得分:18)

对于手机来说,GNU libc(glibc)太大而且复杂,所以Android实现了自己的特殊版本的libc,即Bionic libc,它本身并不完全支持POSIX,它是android Bionic libc中最缺乏的功能之一是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。

     

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

您可以在Official CrystaX NDK site

上找到更多信息

答案 2 :(得分:3)

树形文档中的Bionic官方报价

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

  

运行./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标准的基础。