Android POSIX est-il compatible?

est compatible avec Android POSIX? Je sais qu'il utilise le noyau Linux, mais je ne suis pas sûr que cela signifie QU'il est compatible avec POSIX, car la norme POSIX traite davantage des fonctions userland. Donc, est-il compatible?

par exemple, si j'utilise seulement les fonctions ANSI et POSIX dans mon programme C, compilerait-il et fonctionnerait-il sur Android sans avoir besoin de changements de code?

13
demandé sur sashoalm 2014-12-22 17:17:21

4 réponses

GNU libc (glibc) est trop grand et compliqué pour les téléphones mobiles, donc Android implémente sa propre version spéciale de libc qui est la libc bionique, qui elle-même ne supporte pas pleinement POSIX , l'une des fonctionnalités les plus manquantes de la libc bionique android est pthread_cancel() donc si vous ne l'utilisez pas, votre code fera probablement l'affaire.

et aussi comme @code monkey mentionné, vous pouvez jeter un oeil au bionique code source . Vous pouvez trouver d'autres information ici .

18
répondu Kiloreux 2014-12-22 17:38:01

Android N'est pas entièrement compatible POSIX. Tout d'abord, ce que je peux remarquer est la bibliothèque C par défaut. Comme vous le savez peut-être, on l'appelle glibc. Mais Android a sa propre bibliothèque c-bionique. Voici quelques notes.

certaines fonctions des en-têtes POSIX et system call de Bionic sont des talons ou wrappers pour un comportement spécifique à Android, provoquant un comportement non intentionnel dans certains cas.

Android utilise un noyau linux, donc vous pouvez dire qu'il est conforme à POSIX. Mais en général Android ne respecte pas les spécifications Unix telles que POSIX soit. Aussi, vous pouvez lire quelque chose comme ça

Bionic n'inclut pas la gestion des exceptions C++, peut-être comme Google n'utilisez pas les exceptions C++ et les exceptions Java sont disponibles dès que le Java virtual machine est en route

Bionic ne comprend pas la bibliothèque de modèles Standard, et les développeurs doit inclure manuellement s'ils en ont besoin

il est grand NDK - CrystaX NDK personnalisé de construction

les principales caractéristiques de la CrystaX NDK:

caractères Larges. Le NDK de Google ne supporte pas les caractères larges correctement en C ou C++. Avec le CrystaX NDK, vous obtenez le plein standard conforme large le support des caractères. Vous pouvez facilement porter le code existant qui utilise large caractères/chaînes de caractères / flux ou écrire un nouveau code.

Les plus récentes marques D'outils le CrystaX NDK comprend les plus récentes versions des compilateurs GCC et Clang ainsi que des écuries. Cela permet les développeurs d'utiliser de nouvelles capacités langagières (comme le nouveau c++ 11 caractéristique.) Tous les compilateurs sont construits avec haut et bas niveau optimisations qui permettent la génération du code le plus efficace pour le matériel cible.

C++11 support depuis le CrystaX NDK inclut les versions les plus récentes de GCC et Clang, il soutient beaucoup de nouveaux C++ 11 caractéristiques figurant sur C++0x/C++11 supporte dans GCC et C++98 et C++11 supporte dans Clang. Dans de plus, le CrystaX NDK offre des classes C++ 11 entièrement opérationnelles std:: thread, std::mutex, std:: chrono etc. Ces classes ne sont pas disponible dans le NDK Google en raison du manque de fonctionnalité dans Libc bionique Android. Nous avons étudié ce problème et résolu, ainsi, dans le CrystaX NDK, vous pouvez simplement les utiliser et oublier les ifdefs.

objectif-c les langues prises en charge par Google NDK sont C et C++. Le CrystaX NDK ajoute le soutien de L'Objectif-C en plus de C et C++. Seule la langue de base est prise en charge à partir de maintenant; Cacao-comme les bibliothèques est en cours. Pour commencer à utiliser L'Objectif C dans votre projet, il suffit d'ajouter des fichiers source avec l'extension .m (Objectif-C )ou.mm (Objectif-C++) et les spécifier dans LOCAL_SRC_FILES dans Android.mk.

à suivre... Si vous ne voyez pas un grand trait ici, ne hésitez pas à nous contacter et demander. Vous pouvez également utiliser notre problème/bug tracker de rapport de bugs ou des demandes de fonctionnalités. Et, bien sûr,, les contributions sont les bienvenues!

vous pouvez trouver plus d'information sur site officiel de CrystaX NDK

10
répondu CROSP 2014-12-22 14:45:42

bionique officiel dans la documentation de l'arbre citation

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

Run ./libc/tools/check-symbols-glibc.py dans bionic / pour la liste actuelle des fonctions POSIX implémentées par glibc mais pas par bionic. Actuellement (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

Actuel libm symboles: https://android.googlesource.com/platform/bionic/+/master/libm/libm.map.txt

0 fonctions manquantes de la libm POSIX.

Bionic page Wikipedia

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

a aussi quelques informations intéressantes:

bien que bionic vise à implémenter tout C11 et POSIX, il manque encore (à partir de Oreo) environ 70 fonctions POSIX[8] de libc. Il existe également des fonctions POSIX telles que la famille endpwent/getpwent/setpwent qui ne sont pas applicables à Android car il manque une base de données passwd. À partir d'Oreo, libm est terminé.

certaines fonctions ne sont délibérément pas conformes aux normes POSIX ou C pour des raisons de sécurité, telles que printf qui ne supporte pas le format %n chaîne.[9]

3

je sais que cette réponse est un peu dépassée, mais elle compléterait les réponses ci-dessus.

Oui, Android n'est pas compatible POSIX, principalement en raison de ses restrictions libc (Bionic). Cependant, en utilisant CrystaX NDK vous ne pouvez pas sentir cette différence si difficile-juste parce que l'utilisation de CrystaX NDK développement pour Android devenir beaucoup plus compatible avec POSIX. Nous avons implémenté de nombreuses parties de libc (buggy ou absent dans Bionic) par nous-mêmes dans libcrystax.donc, noyau de CrystaX NDK, et l'a fait sans modifier le flux de développement typique. Nous allons encore l'améliorer, puisque libcrystax ne supporte pas encore full POSIX set, mais à partir de maintenant, il supporte beaucoup de choses telles que des caractères larges et des chaînes de caractères, un support complet pour les locales (entrées et sorties spécifiques à la locale), une bibliothèque complète de maths incluant des fonctions complexes et de type-générique, un support complet pour la bibliothèque C++ Standard (deux implémentations disponibles, à votre choix-GNU libstdc++ ou LLVM libc++) et des tonnes d'autres correctifs et améliorations.

juste pour montrer comment CrystaX NDK rend le développement natif pour Android plus facile - nous avons inclus Boost 1.57.0 dans CrystaX NDK 10.1.0, que nous avons construit à partir de ses sources sans aucune modification - juste parce que dans CrystaX NDK Boost rester sur le dessus de beaucoup plus de base conforme à POSIX que dans NDK de Google.

2
répondu Dmitry Moskalchuk 2015-01-20 19:12:25