Przestrzenie nazw dla bibliotek natywnych

W systemie Android 7.0 wprowadzono przestrzenie nazw dla bibliotek natywnych, aby ograniczyć widoczność wewnętrznego interfejsu API i rozwiązać sytuacje, w których aplikacje przypadkowo używają bibliotek platformy zamiast własnych. Zobacz poprawianiu stabilności z ograniczeniami Prywatna C / C ++ symbolu w Android 7.0 Android Developers blogu dla aplikacji konkretnych zmian.

Architektura

W systemie Android 7.0 i nowszych biblioteki systemowe są oddzielone od bibliotek aplikacji.

Przestrzenie nazw dla bibliotek natywnych

Rysunek 1. Przestrzenie nazw dla bibliotek natywnych

Przestrzenie nazw dla bibliotek natywnych uniemożliwiają aplikacjom korzystanie z natywnych interfejsów API na prywatnej platformie (tak jak miało to miejsce w przypadku OpenSSL). Usuwa również sytuacje, w których przypadkowo aplikacje używają bibliotek platformy zamiast własnych (o czym świadczą z libpng ). Bibliotekom aplikacji trudno jest przypadkowo użyć wewnętrznych bibliotek systemowych (i odwrotnie).

Dodanie dodatkowych bibliotek natywnych

Oprócz standardowych publicznych bibliotek natywnych, dostawcy układów (od Androida 7.0) i producenci urządzeń (od Androida 9) mogą udostępniać dodatkowe biblioteki natywne dostępne dla aplikacji, umieszczając je w odpowiednich folderach biblioteki i wyraźnie wymieniając je w pliku .txt pliki.

Foldery biblioteki to:

  • /vendor/lib (32-bitowa) oraz /vendor/lib64 (64-bitowy) dla bibliotek pochodzących od dostawców silikonowych
  • /system/lib (32-bitowa) oraz /system/lib64 (64-bitowy) dla biblioteki z producentów sprzętu

Pliki .txt to:

  • /vendor/etc/public.libraries.txt bibliotek pochodzących od dostawców silikonowych
  • /system/etc/public.libraries-COMPANYNAME.txt dla bibliotek z producentami urządzeń, gdzie COMPANYNAME odnosi się do nazwy producenta (takie jak awesome.company ). COMPANYNAME musi być zgodny z [A-Za-z0-9_.-]+ ; znaki alfanumeryczne, _, . (kropka) i -. Istnieje możliwość posiadania wielu takich plików .txt na urządzeniu, jeśli niektóre biblioteki pochodzą od zewnętrznych dostawców rozwiązań.

Natywne biblioteki w system partycji, które są upublicznione przez producentów urządzeń musi być nazwany lib*COMPANYNAME.so np libFoo.awesome.company.so . Innymi słowy, libFoo.so bez nazwy firmy przyrostkiem NIE MUSI być upublicznione. COMPANYNAME w bibliotece Nazwa pliku musi pasować do COMPANYNAME w nazwie pliku txt, w którym nazwa biblioteki jest na liście.

Biblioteki natywne będące częścią AOSP NIE MOGĄ być upubliczniane (z wyjątkiem standardowych publicznych bibliotek natywnych, które są domyślnie publiczne). Tylko dodatkowe biblioteki dodane przez dostawców krzemu lub producentów urządzeń mogą być udostępniane aplikacjom.

Począwszy od systemu Android 8.0, biblioteki publiczne dostawców mają następujące dodatkowe ograniczenia i wymagane konfiguracje:

  1. Natywna biblioteka dostawcy musi być odpowiednio oznaczona, aby była dostępna dla aplikacji. Jeśli dostęp jest wymagane przez wszelkie aplikacje (w tym aplikacji firm trzecich), biblioteka musi być oznaczony jako same_process_hal_file w specyficzny dla dostawcy file_contexts pliku w następujący sposób:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    gdzie libnative.so jest nazwą rodzimej biblioteki.
  2. Biblioteka, bezpośrednio lub przechodnie przez swoje zależności, nie może zależeć od bibliotek systemowych innych niż biblioteki VNDK-SP i LLNDK. Zlokalizuj listę bibliotek VNDK-SP i LLNDK w development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv .

Aktualizowanie aplikacji, aby nie korzystały z niepublicznych bibliotek natywnych

Ta funkcja jest włączona tylko w aplikacjach przeznaczonych na pakiet SDK w wersji 24 lub nowszej; dla wstecznej kompatybilności, patrz Tabela 1. Co się spodziewać, jeśli aplikacja jest łączenie wobec prywatnych bibliotek natywnych . Lista bibliotek natywnych systemu Android dostępnych dla aplikacji (znanych również jako publiczne biblioteki natywne) znajduje się w sekcji CDD 3.1.1. Aplikacje przeznaczone na 24 lub nowsze wersje i korzystające z bibliotek niepublicznych powinny zostać zaktualizowane. Zobacz NDK Apps Łączenie bibliotek Platformy więcej szczegółów.

Aktualizowanie aplikacji pod kątem ich natywnych zależności bibliotecznych

Aplikacje cel SDK w wersji 31 (Android 12) lub wyższy musi wyraźnie określić ich natywnych bibliotek współdzielonych wymaga za pomocą <uses-native-library> tag w pliku manifestu aplikacji. Jeśli jakakolwiek część żądanej biblioteki nie istnieje na urządzeniu, aplikacja nie jest zainstalowana. Po zainstalowaniu aplikacji, są one zaopatrzone tylko w rodzimych bibliotek dzielonych, że już wymagane. Oznacza to, że aplikacje nie mogą uzyskać dostępu do natywnych bibliotek udostępnionych, które nie są wyświetlane w manifeście aplikacji.