Spazi dei nomi per le librerie native

Android 7.0 ha introdotto gli spazi dei nomi per le librerie native per limitare la visibilità delle API interne e risolvere le situazioni in cui le app utilizzano accidentalmente le librerie della piattaforma anziché le proprie. Per le modifiche specifiche per le app, consulta il post del blog Android for Developers Miglioramento della stabilità con le limitazioni dei simboli C/C++ privati in Android 7.0.

Architettura

In Android 7.0 e versioni successive, le librerie di sistema sono separate dalle librerie di 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 accadeva con OpenSSL). Inoltre, rimuove le situazioni in cui le app utilizzano accidentalmente le librerie della piattaforma anziché le proprie (come riscontrato con libpng). È difficile per le librerie delle app utilizzare per sbaglio le librerie di sistema interne (e viceversa).

Aggiungere altre 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 e elencandole esplicitamente nei file .txt.

Le cartelle della raccolta 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 fa riferimento al nome del produttore (ad es. awesome.company). COMPANYNAME deve corrispondere a [A-Za-z0-9_.-]+; caratteri alfanumerici, _, . (punto) e -. È possibile avere più file .txt in un dispositivo se alcune librerie provengono da fornitori di soluzioni esterni.

Le librerie native nella partizione system rese pubbliche dai produttori di dispositivi DEVONO avere il nome 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 raccolta DEVE corrispondere al COMPANYNAME nel nome del file txt in cui è elencato il nome della raccolta.

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

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

  1. La libreria nativa nel fornitore deve essere etichettata correttamente in modo da essere accessibile alle app. Se l'accesso è richiesto da app (incluse quelle 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 tramite le sue dipendenze, non deve dipendere da librerie di sistema diverse da VNDK-SP e LLNDK. Individua l'elenco delle librerie VNDK-SP e LLNDK all'indirizzo development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv.

A partire da Android 15, le librerie pubbliche del fornitore possono essere inserite in un APEX del fornitore. Quando sono pacchettizzate in un codice APEX del fornitore, elenca le librerie in una proprietà provideNativeLibs nel file manifest APEX.

Aggiorna le app in modo che non utilizzino librerie native non pubbliche

Questa funzionalità è abilitata 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. Cosa aspettarsi se la tua app esegue il collegamento a librerie native private. L'elenco delle librerie native Android accessibili alle app (note anche come librerie native pubbliche) è riportato nella sezione 3.1.1 del CDD. Le app che hanno come target la versione 24 o versioni successive e che utilizzano librerie non pubbliche devono essere aggiornate. Per ulteriori dettagli, vedi Collegamento delle app NDK alle librerie della piattaforma .

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 usando il tag <uses-native-library> nel file manifest dell'app. Se una parte della biblioteca 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 compaiono nel file manifest dell'app.