Является ли Android POSIX-совместимым?
Совместим ли Android POSIX? Я знаю, что он использует ядро Linux, но я не уверен, что это означает, что он совместим с POSIX, так как стандарт POSIX больше связан с функциями userland. Итак, это совместимо?
Например, если я использую только функции ANSI и POSIX в моей программе C, будет ли она компилироваться и работать на Android без необходимости каких-либо изменений кода?
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
Беги ./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