Android 7.0 ha introdotto gli spazi dei nomi per le librerie native per limitare l'API interna visibilità e risolvere le situazioni in cui le app usano accidentalmente la piattaforma delle loro librerie anziché le proprie. Consulta la sezione Informazioni sul Stabilità con limitazioni relative ai simboli C/C++ in Android 7.0 Android Post del blog per sviluppatori relativo a modifiche specifiche delle app.
Architettura
In Android 7.0 e versioni successive, le librerie di sistema sono separate dalle librerie di app.
Gli spazi dei nomi per le librerie native impediscono alle app di utilizzare annunci nativi della piattaforma privata
API (come accadeva con OpenSSL). Rimuove anche le situazioni in cui le app
usano accidentalmente le librerie della piattaforma invece delle proprie (come abbiamo visto
con libpng
). È difficile per le librerie delle app usare
librerie di sistema per errore (e viceversa).
Aggiungere altre librerie native
Oltre alle librerie native pubbliche standard, sono disponibili fornitori di silicio (a partire da Android 7.0) e i produttori di dispositivi (a partire da Android 9) potrebbero decidere di fornire librerie native aggiuntive accessibile alle app inserendole nelle rispettive cartelle della libreria ed elencandole in modo esplicito nei file .txt.
Le cartelle della raccolta sono:
/vendor/lib
(per 32 bit) e/vendor/lib64
(per 64 bit) per le librerie di fornitori di silicio/system/lib
(per 32 bit) e/system/lib64
(per 64 bit) per le librerie dei produttori di dispositivi
I file .txt sono:
/vendor/etc/public.libraries.txt
per librerie di fornitori di silicio/system/etc/public.libraries-COMPANYNAME.txt
per le librerie dei produttori di dispositivi, doveCOMPANYNAME
si riferisce al nome del produttore (ad esempioawesome.company
).COMPANYNAME
deve corrispondere a[A-Za-z0-9_.-]+
; caratteri alfanumerici, _, . (punto) e -. È possibile Avere più file .txt di questo tipo in un dispositivo se alcune librerie provengono da una soluzione esterna di Google Cloud.
Librerie native nella partizione system
rese pubbliche dai produttori di dispositivi
DEVE essere denominato lib*COMPANYNAME.so
, ad esempio libFoo.awesome.company.so
.
In altre parole, libFoo.so
senza il suffisso del nome dell'azienda NON DEVE essere reso pubblico.
Il valore COMPANYNAME
nel nome del file della raccolta DEVE corrispondere al valore COMPANYNAME
nella
txt in cui è elencato il nome della libreria.
Le librerie native che fanno parte di AOSP NON DEVONO essere rese pubbliche (a eccezione del modello biblioteche native pubbliche che sono pubbliche per impostazione predefinita). Solo le librerie aggiuntive aggiunte da fornitori di silicio o produttori di dispositivi possono essere resi accessibili alle app.
A partire da Android 8.0, le librerie pubbliche dei fornitori hanno a disposizione le seguenti funzionalità aggiuntive limitazioni e configurazioni richieste:
- La libreria nativa del fornitore deve essere etichettata correttamente in modo da poter essere
accessibile alle app. Se è richiesto l'accesso da parte di app (incluse terze parti
app di terze parti), la raccolta deve essere etichettata come
same_process_hal_file
in un filefile_contexts
specifico del fornitore, come segue:/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
dovelibnative.so
è il nome della libreria nativa. - La libreria, direttamente o transitivamente attraverso le sue dipendenze, non deve
dipendono da librerie di sistema diverse dalle librerie VNDK-SP e LLNDK. Individua l'elenco
librerie VNDK-SP e LLNDK su
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv
.
A partire da Android 15, le librerie pubbliche dei fornitori possono essere inserite in un
l'APEX del fornitore. Quando sono pacchettizzate nell'APEX di un fornitore, elenca le librerie
in una proprietà provideNativeLibs
nel file manifest APEX.
Aggiorna le app per non utilizzare librerie native non pubbliche
Questa funzionalità è attiva solo per le app che hanno come target l'SDK versione 24 o successive. per la compatibilità con le versioni precedenti, consulta la Tabella 1.Che cosa succede se l'app si collega a librerie native private. L'elenco di librerie native Android accessibili alle app (note anche come pubbliche native) è elencato nella sezione CDD 3.1.1. App che hanno come target 24 o in un secondo momento e utilizzando librerie non pubbliche. Vedi NDK Collegamento di app alle librerie della piattaforma per ulteriori dettagli.
Aggiornare le app per le dipendenze delle librerie native
Le app che hanno come target l'SDK versione 31 (Android 12) o versioni successive devono
specificare esplicitamente le dipendenze della libreria condivisa nativa utilizzando il
Tag <uses-native-library>
nel file manifest dell'app. Se uno o più dei componenti
la libreria non esiste sul dispositivo, l'app non è installata. Una volta installate, le app vengono
forniti solo delle librerie condivise native che hanno richiesto. Ciò significa che
Le app non possono accedere alle librerie condivise native che non sono visualizzate nel file manifest dell'app.