W Androidzie 7.0 wprowadzono przestrzenie nazw dla bibliotek natywnych, aby ograniczyć wewnętrzny interfejs API widoczność i rozwiązywanie problemów, kiedy aplikacje przypadkowo korzystają z platformy, do własnych bibliotek. Zobacz poprawki Stabilność z ograniczeniami dotyczącymi prywatnych symboli C/C++ w Androidzie 7.0 Android Post na blogu dla deweloperów zawierający informacje o zmianach w poszczególnych aplikacjach.
Architektura
W Androidzie 7.0 i nowszych biblioteki systemowe są oddzielone od bibliotek aplikacji.
Przestrzenie nazw dla bibliotek natywnych uniemożliwiają aplikacjom korzystanie z natywnej platformy prywatnej
interfejsów API (tak jak w OpenSSL). Eliminuje również sytuacje, w których aplikacje
przypadkowe korzystanie z bibliotek platformy zamiast własnych (jak widać,
korzystając z libpng
). Biblioteki aplikacji mogą mieć trudności z używaniem wewnętrznych
przez przypadek (i odwrotnie).
Dodaj dodatkowe biblioteki natywne
Oprócz standardowych publicznych bibliotek natywnych, dostawców krzemów (od Androida 7.0) oraz producenci urządzeń (począwszy od Androida 9) mogą udostępnić dodatkowe biblioteki natywne; są dostępne dla aplikacji, umieszczając je w odpowiednich folderach biblioteki i podając ich listę w plikach .txt.
Foldery w bibliotece to:
/vendor/lib
(w wersji 32-bitowej) i/vendor/lib64
(w wersji 64-bitowej) dla bibliotek dostawców krzemu/system/lib
(w wersji 32-bitowej) i/system/lib64
(w wersji 64-bitowej) dla bibliotek producentów urządzeń
Pliki .txt:
/vendor/etc/public.libraries.txt
w przypadku bibliotek od dostawców krzemu/system/etc/public.libraries-COMPANYNAME.txt
w przypadku bibliotek producentów urządzeń, gdzieCOMPANYNAME
odnosi się do nazwy producenta (np.awesome.company
). WartośćCOMPANYNAME
musi pasować do:[A-Za-z0-9_.-]+
; znaki alfanumeryczne, _, . (kropka) i -. To możliwe mieć na urządzeniu wiele takich plików .txt, jeśli niektóre biblioteki pochodzą z rozwiązania zewnętrznego. dostawców usług.
Biblioteki natywne w partycji system
, które są upubliczniane przez producentów urządzeń
MUSI mieć nazwę lib*COMPANYNAME.so
, np. libFoo.awesome.company.so
.
Innymi słowy, wiadomości libFoo.so
bez sufiksu nazwy firmy NIE MOGĄ być publikowane publicznie.
Pole COMPANYNAME
w nazwie pliku biblioteki MUSI być zgodne z COMPANYNAME
w
.txt z nazwą biblioteki.
Biblioteki natywne, które wchodzą w skład AOSP, NIE MOGĄ być publiczne (z wyjątkiem bibliotek standardowych) publicznych bibliotek natywnych, które domyślnie są publiczne). Tylko biblioteki dodane przez dostawców krzemów i producentów urządzeń.
Począwszy od Androida 8.0, biblioteki publiczne dostawców obejmują te dodatkowe Ograniczenia i wymagane konfiguracje:
- Biblioteka natywna w dostawcy musi być odpowiednio oznaczona etykietą,
dostępne dla aplikacji. Jeśli jakakolwiek aplikacja wymaga dostępu (w tym
aplikacje innych firm), biblioteka musi być oznaczona etykietą
same_process_hal_file
w określonym przez dostawcę plikufile_contexts
w ten sposób:/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
gdzielibnative.so
to nazwa biblioteki natywnej. - Biblioteka, ani bezpośrednio, ani pośrednio przez swoje zależności, nie może
zależą od bibliotek systemowych innych niż biblioteki VNDK-SP i LLNDK. Znajdź listę
Biblioteki VNDK-SP i LLNDK w
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv
Począwszy od Androida 15 biblioteki publiczne dostawców można umieszczać w
dostawcy APEX. Po spakowaniu w APEX dostawcy podaj listę bibliotek
we właściwości provideNativeLibs
w pliku manifestu APEX.
Zaktualizuj aplikacje, aby nie używały niepublicznych bibliotek natywnych
Ta funkcja jest włączona tylko w przypadku aplikacji kierowanych na pakiet SDK w wersji 24 lub nowszej. w celu uzyskania zgodności wstecznej, zapoznaj się z tabelą 1.Czego możesz się spodziewać w przypadku łączenia aplikacji z prywatnymi bibliotekami natywnymi Lista bibliotek natywnych Androida dostępnych dla aplikacji (nazywana też publicznych bibliotek natywnych) są wymienione w sekcji 3.1.1 CDD. Aplikacje kierowane na wersję 24 lub i korzystanie z bibliotek niepublicznych należy zaktualizować. Zobacz NDK Aplikacje łączące się z bibliotekami platformy , gdzie znajdziesz więcej informacji.
Zaktualizuj aplikacje pod kątem zależności bibliotek natywnych
Aplikacje kierowane na pakiet SDK w wersji 31 (Android 12) lub nowszej muszą
wyraźnie określić zależności natywnych zasobów wspólnych, korzystając z tagu
<uses-native-library>
w manifeście aplikacji. Jeśli jakakolwiek część żądanego
Biblioteka nie istnieje na urządzeniu, oznacza to, że aplikacja nie jest zainstalowana. Zainstalowane aplikacje
mogą udostępniać tylko natywne biblioteki udostępnione, o które poprosili. Oznacza to, że
Aplikacje nie mają dostępu do natywnych bibliotek udostępnionych, które nie są widoczne w manifeście aplikacji.