Das VNDK erfordert mehrere Änderungen an einer Codebasis, um die Bedenken zwischen Anbieter und System zu trennen. Verwenden Sie die folgende Anleitung, um VNDK in einer Anbieter-/OEM-Codebasis zu aktivieren.
Erstellen Sie Systembibliotheken
Das Build-System enthält verschiedene Arten von Objekten, darunter Bibliotheken (gemeinsam genutzt, statisch oder Header) und Binärdateien.
-
core
werden vom System-Image auf dem System-Image verwendet. Diese Bibliotheken können nicht von den Bibliothekenvendor
,vendor_available
,vndk
“ odervndk-sp
verwendet werden.cc_library { name: "libThatIsCore", ... }
-
vendor-only
(oderproprietary
) Bibliotheken werden vom Anbieter-Image auf dem Anbieter-Image verwendet.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
-
vendor_available
Bibliotheken werden vom Anbieter-Image auf dem Anbieter-Image verwendet (können Duplikate voncore
enthalten).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
-
vndk
Bibliotheken werden vom Hersteller-Image auf dem System-Image verwendet.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
-
vndk-sp
Bibliotheken werden vom Hersteller-Image und indirekt auch vom System-Image verwendet.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
-
llndk
Bibliotheken werden sowohl vom System als auch vom Hersteller-Image verwendet.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Wenn eine Bibliothek als vendor_available:true
markiert ist, wird sie zweimal erstellt:
- Einmal für die Plattform (und daher in
/system/lib
installiert) - Einmal für den Anbieter (und daher in
/vendor/lib
oder VNDK APEX installiert)
Die Herstellerversionen von Bibliotheken werden mit -D__ANDROID_VNDK__
erstellt. Mit diesem Flag werden private Systemkomponenten deaktiviert, die sich in zukünftigen Android-Versionen erheblich ändern können. Darüber hinaus exportieren verschiedene Bibliotheken unterschiedliche Headersätze (z. B. liblog
). Spezifische Optionen für eine Anbietervariante eines Ziels können in einer Android.bp
Datei angegeben werden in:
target: { vendor: { … } }
Aktivieren von VNDK für eine Codebasis
So aktivieren Sie das VNDK für eine Codebasis:
- Bestimmen Sie die Eignung, indem Sie die erforderlichen Größen der
vendor.img
undsystem.img
Partitionen berechnen. - Aktivieren Sie
BOARD_VNDK_VERSION=current
. Sie könnenBoardConfig.mk
hinzufügen oder Komponenten direkt damit erstellen (z. B.m -j BOARD_VNDK_VERSION=current MY-LIB
).
Nach der Aktivierung von BOARD_VNDK_VERSION=current
erzwingt das Build-System die folgenden Abhängigkeits- und Header-Anforderungen.
Abhängigkeiten verwalten
Ein vendor
, das von einer core
abhängt, die nicht in vndk
oder als vendor
vorhanden ist, muss mit einer der folgenden Optionen aufgelöst werden:
- Die Abhängigkeit kann entfernt werden.
- Wenn die
core
demvendor
gehört, kann sie alsvendor_available
“ odervendor
markiert werden. - Eine Änderung, durch die das Kernobjekt Teil des
vndk
wird, kann an Google weitergegeben werden.
Wenn eine core
außerdem Abhängigkeiten von einer vendor
aufweist, muss die vendor
in eine core
umgewandelt werden oder die Abhängigkeit muss auf andere Weise entfernt werden (z. B. durch Entfernen der Abhängigkeit oder durch Verschieben der Abhängigkeit in eine vendor
). ).
Header verwalten
Globale Header-Abhängigkeiten müssen entfernt werden, damit das Build-System weiß, ob die Header mit oder ohne -D__ANDROID_VNDK__
erstellt werden sollen. Auf libutils-Header wie utils/StrongPointer.h
kann beispielsweise weiterhin über die Header-Bibliothek libutils_headers
zugegriffen werden.
Einige Header (z. B. unistd.h
) können nicht mehr transitiv, sondern lokal eingebunden werden.
Schließlich wurde der öffentliche Teil von private/android_filesystem_config.h
nach cutils/android_filesystem_config.h
verschoben. Um diese Header zu verwalten, führen Sie einen der folgenden Schritte aus:
- Entfernen Sie die Abhängigkeit von
private/android_filesystem_config.h
, indem Sie nach Möglichkeit alleAID_*
Makros durchgetgrnam
/getpwnam
Aufrufe ersetzen. Zum Beispiel:-
(uid_t)AID_WIFI
wirdgetpwnam("wifi")->pw_uid
. -
(gid_t)AID_SDCARD_R
wird zugetgrnam("sdcard_r")->gr_gid
.
private/android_filesystem_config.h
. -
- Für hartcodiertes AIS schließen Sie
cutils/android_filesystem_config.h
ein.