W systemie Android 7.0 wprowadzono przestrzenie nazw dla bibliotek natywnych, aby ograniczyć widoczność wewnętrznych interfejsów API i rozwiązać sytuacje, w których aplikacje przypadkowo używają bibliotek platformy zamiast własnych. Zapoznaj się z wpisem na blogu „ Poprawianie stabilności za pomocą prywatnych ograniczeń symboli C/C++ w systemie Android 7.0 dla programistów Androida”, aby uzyskać informacje o zmianach specyficznych dla aplikacji.
Architektura
W systemie Android 7.0 i nowszych biblioteki systemowe są oddzielone od bibliotek aplikacji.

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 aplikacje przypadkowo używają bibliotek platformy zamiast własnych (jak widać w przypadku 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 akta.
Foldery biblioteki to:
-
/vendor/lib
(dla wersji 32-bitowej) i/vendor/lib64
(dla wersji 64-bitowej) dla bibliotek od dostawców krzemu -
/system/lib
(dla wersji 32-bitowej) i/system/lib64
(dla wersji 64-bitowej) dla bibliotek producentów urządzeń
Pliki .txt to:
-
/vendor/etc/public.libraries.txt
dla bibliotek od dostawców krzemu -
/system/etc/public.libraries-COMPANYNAME.txt
dla bibliotek producentów urządzeń, gdzieCOMPANYNAME
odnosi się do nazwy producenta (np.awesome.company
).COMPANYNAME
musi odpowiadać[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ń.
Biblioteki natywne na partycji system
, które są upubliczniane przez producentów urządzeń, MUSZĄ mieć nazwę lib*COMPANYNAME.so
, na przykład libFoo.awesome.company.so
. Innymi słowy, libFoo.so
bez sufiksu nazwy firmy NIE MOŻE być upubliczniany. COMPANYNAME
w nazwie pliku biblioteki MUSI być zgodna z COMPANYNAME
w nazwie pliku txt, w której znajduje się nazwa biblioteki.
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:
- Natywna biblioteka dostawcy musi być odpowiednio oznaczona, aby była dostępna dla aplikacji. Jeśli dostęp jest wymagany przez dowolne aplikacje (w tym aplikacje innych firm), biblioteka musi być oznaczona jako
same_process_hal_file
w plikufile_contexts
specyficznym dla dostawcy w następujący sposób:/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
gdzielibnative.so
jest nazwą biblioteki natywnej. - 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. Znajdź 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 dla aplikacji przeznaczonych na pakiet SDK w wersji 24 lub nowszej; Aby uzyskać zgodność z poprzednimi wersjami, zobacz Tabela 1. Czego można się spodziewać, jeśli aplikacja łączy się z prywatnymi bibliotekami natywnymi . 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 Linking to Platform Libraries , aby uzyskać więcej informacji.
Aktualizowanie aplikacji pod kątem ich natywnych zależności bibliotecznych
Aplikacje przeznaczone dla zestawu SDK w wersji 31 (Android 12) lub nowszej muszą jawnie określić ich natywne zależności bibliotek udostępnionych przy użyciu tagu <uses-native-library>
w manifeście aplikacji. Jeśli jakakolwiek część żądanej biblioteki nie istnieje na urządzeniu, aplikacja nie jest zainstalowana. Gdy aplikacje są zainstalowane, otrzymują tylko te natywne biblioteki współdzielone, o które prosiły. Oznacza to, że aplikacje nie mogą uzyskać dostępu do natywnych bibliotek udostępnionych, które nie są wyświetlane w manifeście aplikacji.