2014-12-22 2 views
12

Поддерживается ли Android POSIX? Я знаю, что он использует ядро ​​Linux, но я не уверен, что это означает, что он совместим с POSIX, поскольку стандарт POSIX больше связан с функциями userland. Итак, совместима ли она?Поддерживается ли Android POSIX?

Например, если я использую только функции ANSI и POSIX в своей программе на языке C, будет ли она компилироваться и запускаться на Android без каких-либо изменений кода?

+2

Даже Linux не полностью совместим с POSIX :) –

+0

@ShmilTheCat Я думал, что он просто не сертифицирован, потому что он стоит денег? – sashoalm

+0

IMO его более чем проблемы с расходами, см. Https://personal.opengroup.org/~ajosey/tr28-07-2003.txt –

ответ

17

GNU libc (glibc) слишком большой и сложный для мобильных телефонов, поэтому Android реализует собственную специальную версию libc, которая является Bionic libc, которая сама по себе не полностью поддерживает POSIX, одну из самых недостающих функций в android Bionic libc is pthread_cancel(), поэтому, если вы его не используете, ваш код, вероятно, будет хорошо.

А также как упомянутая обезьяна @code вы можете взглянуть на bionic source code. Вы можете найти дополнительную информацию here.

+5

[This] (http: //www.kandroid. org/ndk/docs/system/libc/OVERVIEW.html) также является хорошей ссылкой, в которой перечислены различия. Вы также можете посмотреть в [github] (https://github.com/android/platform_bionic). –

+0

@codemonkey Я редактировал вопрос, чтобы включить ссылку на исходный код, спасибо. – Kiloreux

+0

Отчет Bionic vs Glibc: http://irati.eu/wp-content/uploads/2012/07/bionic_report.pdf –

10

Android не полностью совместим с POSIX. Сначала я могу заметить библиотеку по умолчанию c. Как вы знаете, это называется glibc. Но у Android есть своя библиотека c - bionic. Вот несколько заметок.

Некоторые функции в заголовках POSIX и системных вызовов Bionic являются окурки или оберток для Android-специфического поведения, вызывая непреднамеренное поведение в некоторых случаях.

Android использует Linux-ядро, поэтому вы можете сказать, что он совместим с POSIX. Но в целом Android не соответствует спецификациям Unix, таким как POSIX. Также вы можете прочитать что-то вроде этого

Bionic не включает C++ обработки исключений, возможно, как Google делает не использовать исключение C++ и Java исключения доступны после того, как виртуальная машина Java запускается

Bionic делает не включают в себя стандартную библиотеку шаблонов, и разработчики должны включить его вручную, если им нужно это

Там оТЛИЧНЫЙ обычай строить NDK - CrystaX NDK

Ключевые особенности CrystaX НДК:

Широкие символы. Google NDK не поддерживает широкие символы в C или C++. С CrystaX NDK вы получаете полную стандартную совместимую широкую поддержку . Вы можете легко переносить существующий код, который использует широкие символы/строки/потоки или написать новый код.

Самые последние инструментальные цепочки The 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 и т. Д. Эти классы не являются , доступными в Google NDK из-за отсутствия функциональности в Android Bionic libc , Мы исследовали эту проблему и исправили ее, , поэтому в CrystaX NDK вы можете просто использовать их и забыть о ifdefs.

Поддержка Objective-C Поддерживаются только языки, поддерживаемые Google NDK: C и C++. CrystaX NDK добавляет поддержку Objective-C в дополнение к C и C++. На данный момент поддерживается только основной язык; работа над . Какаоподобные библиотеки находятся в процессе. Чтобы начать использовать Objective-C в проекте , просто добавьте исходные файлы с расширением .m (Objective-C) или .mm (Objective-C++) и укажите их в LOCAL_SRC_FILES в Android.mk.

Продолжение следует ... Если вы не видите здесь замечательной функции, не не стесняйтесь обращаться к нам и просить об этом. Вы также можете использовать нашу проблему/ошибку трекер, чтобы сообщать об ошибках или запросах функций. И, конечно же, вклады приветствуются!

Вы можете найти более подробную информацию о Official CrystaX NDK site

2

Я знаю, что этот ответ немного устарел, но он будет дополнять ответы выше.

Да, Android не совместим с POSIX, в основном из-за ограничений libc (Bionic). Однако, используя CrystaX NDK, вы можете не почувствовать эту разницу так сильно - просто потому, что использование технологии CrystaX NDK для Android станет намного более совместимой с POSIX. Мы внедрили многие части libc (багги или отсутствующие в Bionic) самостоятельно в libcrystax.so, ядро ​​CrystaX NDK, и сделали это без изменения типичного потока разработки. Мы собираемся улучшить его дальше, поскольку libcrystax еще не поддерживает полный набор POSIX, но на данный момент он поддерживает множество функций, таких как широкие символы и строку, полную поддержку локалей (вход и выход для локали) , полная математическая библиотека, включающая сложные и типовые функции, полностью работающий бэкенд для стандартной библиотеки C++ (две доступные версии по вашему выбору - GNU libstdC++ или LLVM libC++), а также множество других исправлений и улучшений.

Просто, чтобы показать, как CrystaX NDK упрощает разработку для Android - мы включили Boost 1.57.0 в CrystaX NDK 10.1.0, который мы создали из его источников без каких-либо изменений - только потому, что в CrystaX NDK Boost stay в верхней части много больше POSIX-совместимой базы, чем в Google NDK.

2

Официальный Bionic в дереве документации цитатой

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

Run ./libc/tools/check-symbols-glibc.py в бионический/для текущего списка функций POSIX реализуемый Glibc но не бионическим.В настоящее время (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 функции.

Bionic Wikipedia страница

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

Также есть некоторые интересные данные:

Хотя бионическая цель реализовать все C11 и POSIX, есть еще (по состоянию на Oreo) около 70 функций POSIX отсутствуют [8] из libc. Существуют также функции POSIX, такие как семейство endpwent/getpwent/setpwent, которые неприменимы для Android, поскольку в нем отсутствует база данных passwd. Что касается Oreo, libm завершен.

Некоторые функции сознательно не соответствуют стандартам POSIX или C по соображениям безопасности, таким как printf, который не поддерживает строку формата% n. [9]

Смежные вопросы