Producenci urządzeń z Androidem zmieniają kod źródłowy bibliotek AOSP z różnych powodów. Niektórzy dostawcy ponownie implementują funkcje w bibliotekach AOSP, aby zwiększyć wydajność, a inni dodają do nich nowe elementy, nowe interfejsy API lub nowe funkcje. W tej sekcji znajdziesz wskazówki dotyczące rozszerzania bibliotek AOSP w sposób, który nie narusza zasad CTS/VTS.
Wymiana bezpośrednia
Wszystkie zmodyfikowane biblioteki udostępnione muszą być kompatybilne z binarnymi wersjami, zastępować swoje odpowiedniki w AOSP. Wszyscy dotychczasowi użytkownicy AOSP muszą mieć możliwość korzystania z zmodyfikowanej wspólnej biblioteki bez konieczności ponownego kompilowania. To wymaganie oznacza:
- Funkcji AOSP nie można usuwać.
- Struktury nie mogą być zmieniane, jeśli są widoczne dla użytkowników.
- Warunek wstępny funkcji nie może być wzmocniony.
- Funkcje muszą zapewniać równoważne możliwości.
- Warunek końcowy funkcji nie może być osłabiony.
Klasyfikacje rozszerzonych modułów
Klasyfikuj moduły według funkcji, które określają i wykorzystują.
Uwaga: zamiast określenia „interfejs API/ABI” użyto tutaj określenia „funkcje”, ponieważ można dodać funkcje bez zmiany interfejsu API/ABI.
W zależności od funkcji zdefiniowanych w module, moduły można podzielić na moduł DA i moduł DX:
-
Defining-only-AOSP Modules (DA-Module) nie definiują nowych funkcji, które nie były dostępne w odpowiedniku AOSP.
- Przykład 1. Niezmieniona biblioteka AOSP jest modułem DA.
- Przykład 2. Jeśli dostawca przepisze funkcje w
libcrypto.so
za pomocą instrukcji SIMD (bez dodawania nowych funkcji), zmodyfikowany modułlibcrypto.so
stanie się modułem DA.
-
Moduły definiujące rozszerzenia (DX-Module) definiują nowe funkcje lub nie mają odpowiednika w AOSP.
- Przykład 1. Jeśli dostawca doda do biblioteki
libjpeg.so
funkcję pomocniczą, aby uzyskać dostęp do niektórych danych wewnętrznych, zmodyfikowana bibliotekalibjpeg.so
stanie się biblioteką DX-Lib, a dodana funkcja będzie stanowić rozszerzenie biblioteki. - Przykład 2. Jeśli dostawca zdefiniuje bibliotekę niezgodną z AOSP o nazwie
libfoo.so
,libfoo.so
będzie biblioteką DX-Lib.
- Przykład 1. Jeśli dostawca doda do biblioteki
W zależności od funkcji używanych przez moduł można je podzielić na moduł UA i moduł UX.
-
Moduły korzystające tylko z AOSP (UA-Module) mogą używać tylko funkcji AOSP w swoich implementacjach. Nie korzystają z rozszerzeń innych niż AOSP.
- Przykład 1. Niezmieniona biblioteka AOSP jest UA-Module.
- Przykład 2. Jeśli zmodyfikowana biblioteka współdzielona
libjpeg.so
korzysta tylko z innych interfejsów API AOSP, będzie to moduł UA.
-
Moduły interfejsu użytkownika (UX-Module) korzystają w swoich implementacjach z niektórych funkcji niezgodnych z AOSP.
- Przykład 1. Jeśli zmodyfikowany moduł
libjpeg.so
korzysta z innej biblioteki o nazwielibjpeg_turbo2.so
, która nie jest biblioteką AOSP, zmodyfikowany modułlibjpeg.so
będzie modułem UX. - Przykład 2. Jeśli dostawca doda nową funkcję do zmodyfikowanego
libexif.so
, a zmodyfikowanylibjpeg.so
będzie używać nowo dodanej funkcji zlibexif.so
, zmodyfikowanylibjpeg.so
będzie modułem UX.
- Przykład 1. Jeśli zmodyfikowany moduł
Definicje i zastosowania są od siebie niezależne:
Używane funkcje | |||
---|---|---|---|
Tylko AOSP (UA) | Rozszerzony (UX) | ||
Zdefiniowane funkcje | Tylko AOSP (DA) | DAUA | DAUX |
Rozszerzony (DX) | DXUA | DXUX |
Mechanizm rozszerzenia VNDK
Moduły dostawców, które korzystają z rozszerzonych funkcji, nie będą działać, ponieważ biblioteka AOSP o tej samej nazwie nie ma rozszerzonych funkcji. Jeśli moduły dostawcy są bezpośrednio lub pośrednio zależne od rozszerzonych funkcji, dostawcy powinni skopiować biblioteki współdzielone DAUX, DXUA i DXUX do partycji dostawcy (procesy dostawcy zawsze najpierw szukają współdzielonych bibliotek w partycji dostawcy). Bibliotek LL-NDK nie można jednak kopiować, więc moduły dostawcy nie mogą korzystać z rozszerzonych funkcji zdefiniowanych przez zmodyfikowane biblioteki LL-NDK.
Biblioteki udostępnione DAUA mogą pozostać na partycji systemowej, jeśli odpowiadająca im biblioteka AOSP może zapewnić te same funkcje, a moduły dostawcy nadal działają, gdy partycja systemowa zostanie zastąpiona przez ogólny obraz systemu (GSI).
Zastąpienie jest ważne, ponieważ niezmodyfikowane biblioteki VNDK w GSI będą się łączyć ze zmodyfikowanymi bibliotekami wspólnymi w przypadku kolizji nazw. Jeśli biblioteki AOSP zostaną zmodyfikowane w sposób niezgodny z interfejsem API lub ABI, biblioteki AOSP w GSI mogą nie zostać połączone lub mogą powodować nieokreślone działanie.