Совместим ли Android POSIX?
Совместим ли Android POSIX? Я знаю, что оно использует ядро Linux, но я не уверен, означает ли это, что оно совместимо с POSIX, так как стандарт POSIX больше касается пользовательских функций. Так это совместимо?
Например, если я использую только функции ANSI и POSIX в моей программе на C, будет ли она компилироваться и работать на Android без каких-либо изменений кода?
4 ответа
GNU libc (glibc) слишком велик и сложен для мобильных телефонов, поэтому в Android реализована собственная специальная версия libc, которая называется Bionic libc, которая сама по себе не полностью поддерживает POSIX, одной из самых недостающих функций в Android Bionic libc является pthread_cancel()
так что если вы не используете его, ваш код, вероятно, будет хорошо.
А также, как упомянула обезьяна @code, вы можете взглянуть на бионический исходный код. Вы можете найти дополнительную информацию здесь.
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 NDK:
Широкие символы. NDK от Google не поддерживает широкие символы в C или 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::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.
Продолжение следует... Если вы не видите здесь какой-либо замечательной функции, не стесняйтесь обращаться к нам и попросить об этом. Вы также можете использовать нашу систему отслеживания ошибок / багов для сообщения об ошибках или запросах новых функций. И, конечно, взносы приветствуются!
Вы можете найти больше информации на официальном сайте CrystaX NDK
Официальный Bionic в цитате документации дерева
Запустите./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)
Также есть некоторая интересная информация:
Хотя 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.