A partire dal 27 marzo 2025, ti consigliamo di utilizzare android-latest-release
anziché aosp-main
per compilare e contribuire ad AOSP. Per ulteriori informazioni, vedi Modifiche ad AOSP.
Attiva VNDK
Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Il Vendor Native Development Kit (VNDK) richiede diverse modifiche a una base di codice per separare i problemi tra il fornitore e il sistema. Utilizza la guida riportata di seguito per attivare VNDK in un codebase del fornitore/OEM.
Creare librerie di sistema
Il sistema di compilazione contiene diversi tipi di oggetti, tra cui librerie
(condivise, statiche o di intestazione) e file binari.
Figura 1. Crea librerie di sistema.
- Le librerie
core
vengono utilizzate dall'immagine di sistema. Queste librerie non possono essere utilizzate dalle librerie vendor
, vendor_available
, vndk
o vndk-sp
.
cc_library {
name: "libThatIsCore",
...
}
- Le librerie
vendor-only
(o proprietary
) vengono utilizzate dall'immagine del fornitore.
cc_library {
name: "libThatIsVendorOnly",
proprietary: true,
# or: vendor: true, # (for things in AOSP)
...
}
- Le librerie
vendor_available
vengono utilizzate dall'immagine del fornitore, sull'immagine del fornitore (possono contenere duplicati di core
).
cc_library {
name: "libThatIsVendorAvailable",
vendor_available: true,
...
}
- Le librerie
vndk
vengono utilizzate dall'immagine del fornitore nell'immagine di sistema.
cc_library {
name: "libThatIsVndk",
vendor_available: true,
vndk: {
enabled: true,
}
...
}
- Le librerie
vndk-sp
vengono utilizzate dall'immagine del fornitore e anche dall'immagine di sistema indirectamente.
cc_library {
name: "libThatIsVndkSp",
vendor_available: true,
vndk: {
enabled: true,
support_system_process: true,
}
...
}
- Le librerie
llndk
vengono utilizzate sia dalle immagini di sistema sia da quelle del fornitore.
cc_library {
name: "libThatIsLlndk",
llndk: {
symbol_file: "libthatisllndk.map.txt"
}
...
}
Quando una libreria è contrassegnata come vendor_available:true
, viene compilata
due volte:
- Una volta per la piattaforma (e quindi installata su
/system/lib
)
- Una volta per il fornitore (e quindi installato in
/vendor/lib
o VNDK APEX)
Le versioni del fornitore delle librerie sono create con -D__ANDROID_VNDK__
.
I componenti di sistema privati che potrebbero cambiare in modo significativo nelle versioni future di Android vengono disattivati con questo flag. Inoltre, librerie diverse esportano un insieme diverso di intestazioni (ad esempio liblog
). Le opzioni specifiche per una variante del fornitore di un target possono essere specificate in un file Android.bp
in:
target: { vendor: { … } }
Attivare VNDK per una base di codice
Per attivare il VNDK per una base di codice:
- Determina l'idoneità calcolando le dimensioni richieste delle partizioni
vendor.img
e system.img
.
- Attiva
BOARD_VNDK_VERSION=current
. Puoi aggiungere elementi a BoardConfig.mk
o creare direttamente componenti con questo tipo di proprietà (ad es. m -j BOARD_VNDK_VERSION=current MY-LIB
).
Dopo aver attivato BOARD_VNDK_VERSION=current
, il sistema di compilazione impone i seguenti requisiti di dipendenze e intestazioni.
Gestire le dipendenze
Un oggetto vendor
che dipende da un componente core
che non esiste in vndk
o come oggetto vendor
deve essere risolto utilizzando una delle seguenti opzioni:
- La dipendenza può essere rimossa.
- Se il componente
core
è di proprietà di vendor
, può essere contrassegnato come vendor_available
o vendor
.
- Una modifica che rende l'oggetto principale parte del
vndk
potrebbe essere trasferita a Google.
Inoltre, se un componente core
ha dipendenze da un componente vendor
, il componente vendor
deve essere trasformato in un componente core
o la dipendenza deve essere rimossa in un altro modo (ad esempio rimuovendo la dipendenza o spostandola in un componente vendor
).
Le dipendenze delle intestazioni globali devono essere rimosse per consentire al sistema di compilazione di sapere se compilare le intestazioni con o senza -D__ANDROID_VNDK__
.
Ad esempio, è ancora possibile accedere alle intestazioni libutils come utils/StrongPointer.h
utilizzando la libreria di intestazioni libutils_headers
.
Alcune intestazioni (ad esempio unistd.h
) non possono più essere incluse in modo transitivo, ma possono essere incluse localmente.
Infine, la parte pubblica di private/android_filesystem_config.h
è stata spostata in cutils/android_filesystem_config.h
. Per gestire queste intestazioni, esegui una delle seguenti operazioni:
- Rimuovi la dipendenza da
private/android_filesystem_config.h
sostituendo tutte le
AID_*
macro con chiamate getgrnam
/
getpwnam
, se possibile. Ad esempio:
(uid_t)AID_WIFI
diventa
getpwnam("wifi")->pw_uid
.
(gid_t)AID_SDCARD_R
diventa
getgrnam("sdcard_r")->gr_gid
.
Per maggiori dettagli, consulta
private/android_filesystem_config.h
.
- Per l'AIS hardcoded, includi
cutils/android_filesystem_config.h
.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-07-27 UTC."],[],[],null,["# Enable VNDK\n\nThe Vendor Native Development Kit (VNDK) requires several changes to a codebase to separate\nconcerns between vendor and system. Use the following guide to enable VNDK in a vendor/OEM\ncodebase.\n\nBuild system libraries\n----------------------\n\nThe build system contains several types of objects including libraries\n(shared, static, or header) and binaries.\n\n**Figure 1.** Build system libraries.\n\n- `core` libraries are used by the system image, on the system image. These libraries can't be used by `vendor`, `vendor_available`, `vndk`, or `vndk-sp` libraries. \n\n ```carbon\n cc_library {\n name: \"libThatIsCore\",\n ...\n }\n ```\n- `vendor-only` (or `proprietary`) libraries are used by the vendor image, on the vendor image. \n\n ```carbon\n cc_library {\n name: \"libThatIsVendorOnly\",\n proprietary: true,\n # or: vendor: true, # (for things in AOSP)\n ...\n }\n ```\n- `vendor_available` libraries are used by the vendor image, on the vendor image (may contain duplicates of `core`). \n\n ```carbon\n cc_library {\n name: \"libThatIsVendorAvailable\",\n vendor_available: true,\n ...\n }\n ```\n- `vndk` libraries are used by the vendor image, on the system image. \n\n ```carbon\n cc_library {\n name: \"libThatIsVndk\",\n vendor_available: true,\n vndk: {\n enabled: true,\n }\n ...\n }\n ```\n- `vndk-sp` libraries are used by the vendor image, and also by the system image indirectly. \n\n ```carbon\n cc_library {\n name: \"libThatIsVndkSp\",\n vendor_available: true,\n vndk: {\n enabled: true,\n support_system_process: true,\n }\n ...\n }\n ```\n- `llndk` libraries are used by both the system and vendor images. \n\n ```carbon\n cc_library {\n name: \"libThatIsLlndk\",\n llndk: {\n symbol_file: \"libthatisllndk.map.txt\"\n }\n ...\n }\n ```\n\nWhen a lib is marked as `vendor_available:true`, it's built\ntwice:\n\n- Once for platform (and thus installed to `/system/lib`)\n- Once for vendor (and thus installed to `/vendor/lib` or VNDK APEX)\n\nThe vendor versions of libs are built with `-D__ANDROID_VNDK__`.\nPrivate system components that may change significantly in future versions of\nAndroid are disabled with this flag. In addition, different libraries export a\ndifferent set of headers (such as `liblog`). Options specific to a\nvendor variant of a target can be specified in an `Android.bp` file\nin: \n\n```text\ntarget: { vendor: { … } }\n```\n\nEnable VNDK for a codebase\n--------------------------\n\nTo enable the VNDK for a codebase:\n\n1. Determine eligibility by calculating the required sizes of `vendor.img` and `system.img` partitions.\n2. Enable `BOARD_VNDK_VERSION=current`. You can add to `BoardConfig.mk` or build components with it directly (for example, `m -j BOARD_VNDK_VERSION=current `\u003cvar translate=\"no\"\u003eMY-LIB\u003c/var\u003e).\n\nAfter enabling `BOARD_VNDK_VERSION=current`, the build system\nenforces the following dependency and header requirements.\n\n### Manage dependencies\n\nA `vendor` object that depends on a `core` component\nthat doesn't exist in `vndk` or as a `vendor` object\nmust be resolved using one of the following options:\n\n- The dependency can be removed.\n- If the `core` component is owned by `vendor`, it can be marked as `vendor_available` or `vendor`.\n- A change making the core object part of the `vndk` may be upstreamed to Google.\n\nIn addition, if a `core` component has dependencies on a\n`vendor` component, the `vendor` component must be made\ninto a `core` component **or** the dependency must be\nremoved in another way (for example, by removing the dependency or by moving the\ndependency into a `vendor` component).\n\n### Manage headers\n\nGlobal header dependencies must be removed to enable the build system to know\nwhether to build the headers with or without `-D__ANDROID_VNDK__`.\nFor example, libutils headers such as `utils/StrongPointer.h` can\nstill be accessed using the header library\n[`libutils_headers`](https://android.googlesource.com/platform/system/core/+/android16-release/libutils/include/utils).\n\nSome headers (such as `unistd.h`) can no longer be included transitively\nbut can be included locally.\n\nFinally, the public part of `private/android_filesystem_config.h`\nhas been moved to `cutils/android_filesystem_config.h`. To manage\nthese headers, do one of the following:\n\n- Remove the dependency to `private/android_filesystem_config.h` by replacing all `AID_*` macros with [getgrnam](http://man7.org/linux/man-pages/man3/getgrnam.3.html)/ [getpwnam](http://man7.org/linux/man-pages/man3/getpwnam.3.html) calls if possible. For example:\n - `(uid_t)AID_WIFI` becomes `getpwnam(\"wifi\")-\u003epw_uid`.\n - `(gid_t)AID_SDCARD_R` becomes `getgrnam(\"sdcard_r\")-\u003egr_gid`.\n\n For details, refer to [private/android_filesystem_config.h](https://android.googlesource.com/platform/system/core/+/android16-release/libcutils/include/private/android_filesystem_config.h).\n- For hard-coded AIS, include `cutils/android_filesystem_config.h`."]]