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 il post del blog Miglioramento della stabilità con le restrizioni dei simboli C/C++ privati ​​in Android 7.0 per sviluppatori Android per modifiche specifiche dell'applicazione.

Architettura

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

Spazi dei nomi per le librerie native

Figura 1. Spazi dei nomi 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 le situazioni in cui le app utilizzano accidentalmente le librerie della piattaforma anziché le proprie (come testimoniato con libpng ). È difficile che le librerie di app utilizzino per errore le librerie di sistema interne (e viceversa).

Aggiunta di ulteriori librerie native

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 (per 64 bit) per le librerie dei 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 le librerie dei fornitori di silicio
  • /system/etc/public.libraries-COMPANYNAME.txt per le librerie dei produttori di dispositivi, dove COMPANYNAME si riferisce al nome del produttore (come awesome.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 fornitori di soluzioni esterne.

Le librerie native nella partizione system rese pubbliche dai produttori del dispositivo DEVONO essere denominate 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 COMPANYNAME nel nome del file della libreria DEVE corrispondere al 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 presentano le seguenti restrizioni aggiuntive e configurazioni richieste:

  1. La libreria nativa nel fornitore deve essere etichettata correttamente in modo che possa essere accessibile alle app. Se l'accesso è richiesto da qualsiasi app (incluse le app di terze parti), la libreria deve essere etichettata come same_process_hal_file in un file file_contexts specifico del fornitore 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 transitivamente 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 in 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 alla versione SDK 24 o successiva; per la compatibilità con le versioni precedenti, consulta la Tabella 1. Cosa aspettarsi se la tua app si collega a librerie native private . L'elenco delle librerie native Android accessibili alle app (note anche come librerie native pubbliche) è elencato nella sezione 3.1.1 del CDD. Le app destinate a 24 o versioni successive e che utilizzano librerie non pubbliche devono essere aggiornate. Per ulteriori dettagli, consulta Collegamento delle app NDK alle librerie della piattaforma .

Aggiornamento delle app per le dipendenze della libreria nativa

Le applicazioni destinate alla versione SDK 31 (Android 12) o successiva devono specificare in modo esplicito le dipendenze della libreria condivisa nativa utilizzando il tag <uses-native-library> nel manifesto dell'app. Se qualsiasi parte della libreria richiesta non esiste sul dispositivo, l'app non è installata. Quando le app vengono installate, vengono fornite solo 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.