Przestrzenie nazw dla bibliotek natywnych

Android 7.0 wprowadził przestrzenie nazw dla bibliotek natywnych, aby ograniczyć widoczność interfejsów API wewnętrznych i rozwiązać problemy, które występują, gdy aplikacje przypadkowo używają bibliotek platformy zamiast własnych. Aby dowiedzieć się więcej o zmianach dotyczących konkretnych aplikacji, przeczytaj post na blogu dla deweloperów aplikacji na Androida Zwiększanie stabilności dzięki ograniczeniom symboli prywatnych w C/C++ w Androidzie 7.0.

Architektura

Na Androidzie 7.0 i nowszych biblioteki systemowe są oddzielone od bibliotek aplikacji.

Przestrzenie nazw bibliotek natywnych

Rysunek 1. Przestrzeń nazw dla bibliotek natywnych.

Nazwy przestrzeni dla bibliotek natywnych uniemożliwiają aplikacjom korzystanie z API natywnych dla platformy prywatnej (jak to miało miejsce w przypadku OpenSSL). Zapobiega też sytuacjom, w których aplikacje przypadkowo używają bibliotek platformy zamiast własnych (jak w przypadku libpng). Biblioteki aplikacji rzadko używają przypadkowo wewnętrznych bibliotek systemowych (i na odwrót).

Dodawanie dodatkowych bibliotek natywnych

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

Foldery biblioteki to:

  • /vendor/lib (dla wersji 32-bitowej) i /vendor/lib64 (dla wersji 64-bitowej) dla bibliotek od dostawców układów
  • /system/lib (dla wersji 32-bitowej) i /system/lib64 (dla wersji 64-bitowej) dla bibliotek od producentów urządzeń

Pliki .txt to:

  • /vendor/etc/public.libraries.txt dla bibliotek od dostawców układów scalonych
  • /system/etc/public.libraries-COMPANYNAME.txt w przypadku bibliotek od producentów urządzeń, gdzie COMPANYNAME odnosi się do nazwy producenta (np. awesome.company). COMPANYNAME musi być zgodny z [A-Za-z0-9_.-]+; znaki alfanumeryczne, _, . (kropka) i -. Na urządzeniu można mieć wiele takich plików .txt, jeśli niektóre biblioteki pochodzą od zewnętrznych dostawców.

Biblioteki natywne na partycji system, które są udostępniane przez producentów urządzeń, MUSZĄ mieć nazwę lib*COMPANYNAME.so, na przykład libFoo.awesome.company.so. Innymi słowy, libFoo.so bez przyrostka nazwy firmy NIE MOŻE być udostępniona publicznie. Wartość COMPANYNAME w nazwie pliku biblioteki MUSI być taka sama jak wartość COMPANYNAME w nazwie pliku txt, w którym podana jest nazwa biblioteki.

Biblioteki natywne, które są częścią AOSP, NIE MOGĄ być publiczne (z wyjątkiem standardowych bibliotek natywnych, które są publiczne domyślnie). Dostęp do aplikacji mogą mieć tylko dodatkowe biblioteki dodane przez dostawców układów scalonych lub producentów urządzeń.

Od Androida 8.0 biblioteki publiczne dostawców mają te dodatkowe ograniczenia i wymagane ustawienia:

  1. Biblioteka natywna dostawcy musi być odpowiednio oznaczona, aby aplikacje mogły z niej korzystać. Jeśli dostęp jest wymagany przez dowolną aplikację (w tym aplikacje innych firm), biblioteka musi być oznaczona jako same_process_hal_file w pliku file_contexts konkretnego dostawcy w ten sposób:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    , gdzie libnative.so to nazwa biblioteki natywnej.
  2. Biblioteka nie może bezpośrednio ani pośrednio (poprzez zależności) zależeć od bibliotek systemowych innych niż biblioteki VNDK-SP i LLNDK. Znajdź listę bibliotek VNDK-SP i LLNDK na stronie development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv.

Od Androida 15 biblioteki publiczne dostawcy można umieszczać w bibliotece APEX dostawcy. Jeśli biblioteki są zapakowane w plik APEX dostawcy, w pliku manifestu APEX podaj je w elementach provideNativeLibs.

Zaktualizuj aplikacje, aby nie używały niepublicznych bibliotek natywnych

Ta funkcja jest włączona tylko w przypadku aplikacji przeznaczonych na pakiet SDK w wersji 24 lub nowszej. Informacje o zgodności wstecznej znajdziesz w tabeli 1. Czego możesz się spodziewać, jeśli Twoja aplikacja jest powiązana z prywatnymi natywnymi bibliotekami. Lista natywnych bibliotek Androida dostępnych dla aplikacji (zwanych też publicznymi natywnymi bibliotekami) znajduje się w sekcji 3.1.1 dokumentu CDD. Aplikacje kierowane na Androida 24 lub nowszego, które korzystają z niepublicznych bibliotek, powinny zostać zaktualizowane. Więcej informacji znajdziesz w artykule NDK: Aplikacje łączące się z bibliotekami platformy .

zaktualizować aplikacje, aby używały natywnych bibliotek;

Aplikacje przeznaczone na wersję 31 (Android 12) lub nowszą muszą wyraźnie określać swoje zależności od natywnych bibliotek współdzielonych za pomocą elementu <uses-native-library> w pliku manifestu aplikacji. Jeśli jakakolwiek część żądanej biblioteki nie istnieje na urządzeniu, aplikacja nie jest zainstalowana. Po zainstalowaniu aplikacji są one tylko udostępniane natywnym bibliotekom współdzielonym, których dotyczy żądanie. Oznacza to, że aplikacje nie mają dostępu do natywnych bibliotek udostępnionych, które nie są wymienione w pliku manifestu aplikacji.