Поддерживается ли Android POSIX?

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Существует отличная пользовательская сборка NDK - CrystaX NDK

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

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

Самые последние инструментальные цепочки The CrystaX NDK включают в себя самые последние версии компиляторов GCC и Clang, а также конюшни. Это позволяет разработчикам использовать новые языковые возможности (например, новый С++ 11 функции). Все компиляторы построены с высоким и низким уровнем оптимизация, которая позволяет генерировать наиболее эффективный код для целевого оборудования.

Поддержка С++ 11 Так как CrystaX NDK включает самые последние версии GCC и Clang, он поддерживает множество новых функций С++ 11, перечисленных в С++ 0x/С++ 11 Поддержка в GCC и С++ 98 и С++ 11 Поддержка в Clang. В Кроме того, CrystaX NDK предлагает полностью работающие классы С++ 11 std:: thread, std:: mutex, std:: chrono и т.д. Эти классы не являются доступный в Google NDK из-за отсутствия функциональности в Android Bionic libc. Мы исследовали эту проблему и исправили ее, поэтому в CrystaX NDK вы можете просто использовать их и забыть о ifdefs.

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

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

Дополнительную информацию можно найти на Официальном сайте CrystaX NDK

Ответ 3

Я знаю, что этот ответ устарел, но он добавит ответы выше.

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

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

Ответ 4

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

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

Запустите./libc/tools/check-symbols-glibc.py в bionic/для текущего списка функций POSIX, реализованных glibc, но не с помощью 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 [8] из libc. Существуют также функции POSIX, такие как семейство endpwent/getpwent/setpwent, которые неприменимы для Android, поскольку в нем отсутствует база данных passwd. Что касается Oreo, libm завершен.

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