2014-12-22 15 views
12

È compatibile con Android POSIX? So che usa il kernel di Linux, ma non sono sicuro se ciò significa che è POSIX compatibile, in quanto lo standard POSIX si occupa più delle funzioni di userland. Quindi è compatibile?È compatibile con Android POSIX?

Ad esempio, se utilizzo solo le funzioni ANSI e POSIX nel mio programma C, sarebbe compilato ed eseguito su Android senza bisogno di modifiche al codice?

+2

Anche Linux non è completamente compatibile POSIX :) –

+0

@ShmilTheCat Ho pensato che non è certificato perché costa? – sashoalm

+0

IMO è più che problemi di costo, vedere https://personal.opengroup.org/~ajosey/tr28-07-2003.txt –

risposta

17

GNU libc (glibc) è troppo grande e complicato per i telefoni cellulari, quindi Android implementa la propria versione speciale di libc che è Bionic libc, che a sua volta non supporta pienamente POSIX, una delle funzionalità più carenti nell'androide Bionic libc è pthread_cancel() quindi se non lo usi il tuo codice probabilmente andrà bene.

E anche come @code monkey menzionato si può dare un'occhiata al bionico source code. È possibile trovare ulteriori informazioni here.

+5

[This] (http: //www.kandroid. org/ndk/docs/system/libc/OVERVIEW.html) è anche un buon link che elenca le differenze. Puoi anche cercare in [github] (https://github.com/android/platform_bionic). –

+0

@codemonkey ho modificato la domanda per includere il collegamento al codice sorgente, grazie. – Kiloreux

+0

Rapporto Bionic vs Glibc: http://irati.eu/wp-content/uploads/2012/07/bionic_report.pdf –

10

Android non è completamente POSIX compatibile. Innanzitutto quello che posso notare è la libreria c predefinita. Come forse saprai, si chiama glibc. Ma Android ha la sua libreria c - bionica. Ecco alcune note.

Alcune funzioni all'interno intestazioni POSIX e il sistema di chiamata di Bionic sono stub o involucri per il comportamento Android-specifica, causando un comportamento intenzionale in alcuni casi.

Android utilizza il kernel basato su Linux, quindi si può dire che è POSIX compatibile. Ma in generale Android non è conforme alle specifiche Unix come POSIX. Inoltre si può leggere qualcosa di simile

Bionic non include C++ gestione delle eccezioni, forse come Google non non utilizzare le eccezioni C++ e eccezioni Java sono disponibili una volta che la macchina virtuale Java viene avviato

Bionic fa non includere la standard Template Library, e gli sviluppatori devono includere manualmente se ne hanno bisogno

C'è costruito su misura grande NDK - CrystaX NDK

Le caratteristiche principali del CrystaX NDK:

caratteri estesi. NDK di Google non supporta caratteri wide in modo corretto in C o C++. Con CrystaX NDK, è possibile ottenere il supporto completo dei caratteri ampio. È possibile effettuare facilmente il porting del codice esistente che utilizza ampi caratteri/stringhe/stream o scrivere un nuovo codice.

I toolchain più recenti CrystaX NDK include le più recenti versioni di compilatori GCC e Clang oltre a stalle. Ciò consente agli sviluppatori di di utilizzare nuove funzionalità di lingua (come le nuove funzionalità di C++ 11 ). Tutti i compilatori sono costruiti con ottimizzazioni di livello alto e basso che consentono la generazione del codice più efficiente per l'hardware di destinazione .

C++ 11 Dal momento che il sostegno CrystaX NDK include le versioni più recenti di GCC e Clang, supporta molte nuove funzionalità C++ 11 quotate in C++ 0x/C++ 11 Supporto nella GCC e C++ Supporto 98 e C++ 11 in Clang. Nell'aggiunta , l'NDK di CrystaX offre classi C++ 11 pienamente funzionanti std :: thread, std :: mutex, std :: chrono ecc. Queste classi non sono disponibili nel NDK di Google a causa della mancanza di funzionalità in Android Bionic libc . Abbiamo esaminato questo problema e risolto il problema, quindi nel CrystaX NDK puoi semplicemente usarli e dimenticare ifdefs.

Supporto Objective-C Le uniche lingue supportate da Google NDK sono C e C++. CrystaX NDK aggiunge il supporto di Objective-C oltre a C e C++. Solo il linguaggio principale è supportato fin d'ora; funziona su Le librerie simili al cacao sono in corso. Per iniziare a utilizzare Objective-C nel progetto , è sufficiente aggiungere i file di origine con l'estensione .m (Objective-C) o .mm (Objective-C++) e specificarli in LOCAL_SRC_FILES in Android.mk.

Per continuare ... Se non si vede qualche grande funzionalità qui, non esitate a contattarci e chiedere per esso. Puoi anche utilizzare il nostro tracker bug/bug per segnalare bug o richieste di funzionalità. E, naturalmente, i contributi sono i benvenuti!

È possibile trovare ulteriori informazioni su Official CrystaX NDK site

2

So che questa risposta è po 'datata, ma sarebbe integrare le risposte di cui sopra.

Sì, Android non è compatibile con POSIX, principalmente a causa delle restrizioni di libc (Bionic). Tuttavia, usando CrystaX NDK potresti non sentire la differenza così difficile, solo perché usare lo sviluppo di CrystaX NDK per Android diventa molto più compatibile con POSIX. Abbiamo implementato molte parti libc (buggy o assenti in Bionic) da soli in libcrystax.so, core di CrystaX NDK, e lo abbiamo fatto senza alterare il tipico flusso di sviluppo. Miglioreremo ulteriormente, dal momento che libcrystax non supporta ancora completo set POSIX, ma a partire da ora supporta molte cose come caratteri e stringhe ampie, supporto completo per locales (input e output specifici della locale) , libreria matematica completa con funzioni complesse e di tipo generico, backend completamente funzionante per la libreria standard C++ (due implementazioni disponibili, a scelta - GNU libstdC++ o LLVM libC++) e tonnellate di altre correzioni e miglioramenti.

Solo per mostrare come CrystaX NDK rende più facile lo sviluppo nativo per Android - abbiamo incluso Boost 1.57.0 in CrystaX NDK 10.1.0, che abbiamo creato dalle sue origini senza alcuna modifica - solo perché in CrystaX NDK Boost rimane in cima a molto più base conforme a POSIX rispetto all'NDK di Google.

2

Ufficiale Bionic in tree documentazione citazione

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

Run ./libc/tools/check-symbols-glibc.py in bionico/per l'attuale elenco delle funzioni POSIX implementato da glibc ma non da bionico.Attualmente (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 

attuali simboli libm: https://android.googlesource.com/platform/bionic/+/master/libm/libm.map.txt

0 rimanenti funzioni mancanti libm POSIX.

pagina

Bionic Wikipedia

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

ha anche alcune informazioni interessanti:

Sebbene obiettivi bionico per implementare tutti C11 e POSIX, ci sono ancora (come di Oreo) circa 70 funzioni POSIX mancanti [8] da libc. Ci sono anche funzioni POSIX come la famiglia di endpwent/getpwent/setpwent che non sono applicabili ad Android perché non ha un database passwd. A partire da Oreo, libm è completo.

Alcune funzioni deliberatamente non sono conformi agli standard POSIX o C per motivi di sicurezza, come printf che non supporta la stringa di formattazione% n. [9]

Problemi correlati