Является ли Android POSIX-совместимым?



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



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

638   4  

4 ответов:

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

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

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

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

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

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

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

Есть отличная кастомная сборка NDK-CrystaX NDK

Основные характеристики CrystaX NDK:

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

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

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

Вы можете найти больше информация на официальном сайте CrystaX NDK

Официальная цитата Bionic in tree documentation

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_ (программное обеспечение) # Differences_from_POSIX

Также есть интересная информация:

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

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

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

Да, 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 остаются на вершине намного более POSIX-совместимой базы, чем в Google NDK.

Comments

    Ничего не найдено.