Spazi dei nomi per librerie native

Android 7.0 ha introdotto gli spazi dei nomi per le librerie native per limitare la visibilità dell'API interna e risolvere situazioni in cui le app utilizzano accidentalmente le librerie della piattaforma anziché le proprie. Vedere la stabilità Migliorare con Restrizioni privata C / C ++ tipografiche utilizzate nella Android 7.0 Android Developers post sul blog per le modifiche alle applicazioni specifiche.

Architettura

In Android 7.0 e versioni successive, le librerie di sistema sono separate dalle librerie di app.

Spazi dei nomi per librerie native

Figura 1. namespace per le librerie native

Gli spazi dei nomi per le librerie native impediscono alle app di utilizzare API native della piattaforma privata (come è stato fatto con OpenSSL). Rimuove anche situazioni in cui le applicazioni utilizzano accidentalmente librerie della piattaforma diversa dalla propria (come testimoniato con libpng ). È difficile per le librerie di app utilizzare le librerie di sistema interne per errore (e viceversa).

Aggiunta di librerie native aggiuntive

Oltre alle librerie native pubbliche standard, i fornitori di silicio (a partire da Android 7.0) e i produttori di dispositivi (a partire da Android 9) possono scegliere di fornire librerie native aggiuntive accessibili alle app inserendole nelle rispettive cartelle delle librerie ed elencandole esplicitamente in .txt File.

Le cartelle della libreria sono:

  • /vendor/lib (per 32 bit) e /vendor/lib64 (64 bit) per le librerie di fornitori di silicio
  • /system/lib (per 32-bit) e /system/lib64 (64-bit) per le librerie da produttori di dispositivi

I file .txt sono:

  • /vendor/etc/public.libraries.txt per le librerie da produttori di chip
  • /system/etc/public.libraries-COMPANYNAME.txt per le librerie da produttori di dispositivi, dove COMPANYNAME fa riferimento a un nome del costruttore (come awesome.company ). COMPANYNAME deve corrispondere con [A-Za-z0-9_.-]+ ; caratteri alfanumerici, _, . (punto) e -. È possibile avere più file .txt di questo tipo in un dispositivo se alcune librerie provengono da fornitori di soluzioni esterni.

Librerie native del system partizione che sono resi pubblici dai produttori di dispositivi devono essere nominati lib*COMPANYNAME.so , per esempio, libFoo.awesome.company.so . In altre parole, libFoo.so senza il suffisso del nome dell'azienda NON DEVE essere reso pubblico. Il COMPANYNAME nel nome del file libreria deve corrispondere con il COMPANYNAME nel nome del file txt in cui è elencato il nome della libreria.

Le librerie native che fanno parte di AOSP NON DEVONO essere rese pubbliche (ad eccezione delle librerie native pubbliche standard che sono pubbliche per impostazione predefinita). Solo le librerie aggiuntive aggiunte dai fornitori di silicio o dai produttori di dispositivi possono essere rese accessibili alle app.

A partire da Android 8.0, le librerie pubbliche dei fornitori hanno le seguenti restrizioni aggiuntive e configurazioni richieste:

  1. La libreria nativa nel fornitore deve essere adeguatamente etichettata in modo che possa essere accessibile alle app. Se l'accesso è richiesto da qualsiasi applicazioni (incluse le applicazioni di terze parti), la biblioteca deve essere etichettato come same_process_hal_file in un vendor specifici file_contexts file come segue:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    dove libnative.so è il nome della libreria nativa.
  2. La libreria, direttamente o in modo transitivo attraverso le sue dipendenze, non deve dipendere da librerie di sistema diverse dalle librerie VNDK-SP e LLNDK. Individuare l'elenco delle librerie VNDK-SP e LLNDK a development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv .

Aggiornamento delle app per non utilizzare librerie native non pubbliche

Questa funzionalità è abilitata solo per le applicazioni destinate all'SDK versione 24 o successiva; per la compatibilità a ritroso, vedi Tabella 1. Che cosa aspettarsi se la vostra applicazione è il collegamento con le librerie private native . L'elenco delle librerie native Android accessibili alle app (note anche come librerie native pubbliche) è elencato nella sezione CDD 3.1.1. Le app destinate a 24 o versioni successive e che utilizzano biblioteche non pubbliche devono essere aggiornate. Vedere NDK Apps Collegamento alle librerie della piattaforma per maggiori dettagli.

Aggiornamento delle app per le dipendenze della libreria nativa

Le applicazioni che bersaglio SDK versione 31 (Android 12) o superiore devono specificare in modo esplicito i loro natali dipendenze delle librerie condivise utilizzando il <uses-native-library> tag nel manifesto app. Se una parte della libreria richiesta non esiste sul dispositivo, l'app non è installata. Quando si installano le applicazioni, questi vengono forniti solo con le librerie condivise native che hanno richiesto. Ciò significa che le app non possono accedere alle librerie condivise native che non vengono visualizzate nel manifesto dell'app.