Prima una piccola nota sulla libc. La libc di Android è la libica di Bionic (https://github.com/android/platform_bionic/) anziché GNU libc (glibc). Quindi la libc contenuta nell'NDK è Bionic, così come la libc disponibile sui dispositivi Android.
Per quanto riguarda glibc, è possibile costruirlo con NDK. Tuttavia, il nome si scontrerà con la libc di sistema quando installata sui dispositivi Android. Nota che questo è solo se si va a costruire una libreria dinamica. Se si crea GNU libc come libreria statica, l'intero problema sopra riportato viene aggirato, poiché non è mai necessario installare una libreria statica.
Ora rispondere alle vostre domande:
Q1: Se si sta costruendo la glibc utilizzando l'NDK, poi l'Android.mk utilizza la BUILD_STATIC_LIBRARY variabile per costruire librerie statiche. Tuttavia, se non usi NDK, probabilmente avrai bisogno di entrare in un sacco di mal di testa (non so quanto). Non posso dirti di più su questo perché non ho provato una build di glibc, né statica né dinamica. Inoltre, sembra che il collegamento statico con glibc sia altamente scoraggiato, almeno per le piattaforme non mobili.
Da un punto di vista della rottura, non vi è alcuna differenza tra collegamento statico e collegamento dinamico. Da un punto di vista di avvio, un eseguibile statico si avvia più rapidamente mentre il passaggio di caricamento delle librerie dinamiche non è necessario. Non c'è penalità di memoria o di velocità di esecuzione in eseguibili collegati statici o dinamici. I requisiti di archiviazione su disco sono maggiori per eseguibili statici.
Per quanto riguarda i problemi con la funzionalità libc bionico mancante, è possibile utilizzare il metodo utilizzato dalla maggior parte dei software GNU, che è, di fornire la propria implementazione di una funzione nel caso in cui manca dalle librerie di sistema. Ho compilato file-5.11, GNU make 3.82, diffutils-2.8 per Android passando gli strumenti NDK/include/libs agli autotools (./configure ...). Sembra che questi programmi contengano implementazioni della maggior parte della funzione di libreria non core, nel caso in cui le librerie standard non li forniscano (in questo caso Bionic).
Nota: cercherò di creare un glibc statico e aggiornare la risposta come e quando riesco/non riesco.
Non si tratta solo dell'utilizzo su disco, ma anche dell'utilizzo in memoria. Quando si collegano le librerie jni dell'app Android contro Bionic libc, si eredita l'accesso condiviso di sola lettura a una copia già in memoria. –
Potrebbe indicarmi la vostra fonte di informazioni su questo? Voglio saperne di più, ma non riesco a trovare nulla su questo. So che se le librerie contengono dati, i dati non sembrano condivisi tra i processi, tuttavia potrebbe trattarsi solo di replica copy-on-write delle pagine di memoria se il codice della libreria modifica le sue variabili di dati interne. – Samveen
Credo che ChrisStratton menzioni - il caso della libc collegata staticamente. Ogni processo finirebbe con la sua copia intera di TUTTE le sezioni della stessa libreria. Con il collegamento dinamico, sei corretto @Samveen – Tuxdude