2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
VNDK 사용 설정
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
VNDK는 공급업체와 시스템 간의 문제를 분리하기 위해 코드베이스에 여러 변경사항을 적용합니다. 다음 가이드를 사용하여 VNDK를 공급업체/OEM 코드베이스에 사용 설정하세요.
빌드 시스템 라이브러리
빌드 시스템에는 라이브러리(공유, 정적 또는 헤더) 및 바이너리를 비롯한 여러 유형의 객체가 포함됩니다.
그림 1. 빌드 시스템 라이브러리
core
라이브러리는 시스템 이미지에서 시스템 이미지에 사용합니다. 이러한 라이브러리는 vendor
, vendor_available
, vndk
또는 vndk-sp
라이브러리에서 사용할 수 없습니다.
cc_library {
name: "libThatIsCore",
...
}
vendor-only
(또는 proprietary
) 라이브러리는 공급업체 이미지에서 공급업체 이미지에 사용합니다.
cc_library {
name: "libThatIsVendorOnly",
proprietary: true,
# or: vendor: true, # (for things in AOSP)
...
}
vendor_available
라이브러리는 공급업체 이미지에서 공급업체 이미지(core
의 중복이 포함될 수 있음)에 사용합니다.
cc_library {
name: "libThatIsVendorAvailable",
vendor_available: true,
...
}
vndk
라이브러리는 공급업체 이미지에서 시스템 이미지에 사용합니다.
cc_library {
name: "libThatIsVndk",
vendor_available: true,
vndk: {
enabled: true,
}
...
}
vndk-sp
라이브러리는 공급업체 이미지에서 사용하고 시스템 이미지에서도 간접적으로 사용합니다.
cc_library {
name: "libThatIsVndkSp",
vendor_available: true,
vndk: {
enabled: true,
support_system_process: true,
}
...
}
llndk
라이브러리는 시스템 이미지와 공급업체 이미지에서 모두 사용합니다.
cc_library {
name: "libThatIsLlndk",
llndk: {
symbol_file: "libthatisllndk.map.txt"
}
...
}
lib가 vendor_available:true
로 표시되면 다음과 같이 두 번 빌드됩니다.
- 플랫폼에 1회(따라서
/system/lib
에 설치됨)
- 공급업체에 1회(따라서
/vendor/lib
또는 VNDK APEX에 설치됨)
lib의 공급업체 버전은 -D__ANDROID_VNDK__
로 빌드됩니다.
Android의 향후 버전에서 크게 변경될 수 있는 비공개 시스템 구성요소는 이 플래그로 사용 중지됩니다. 또한 다른 라이브러리는 다른 헤더 집합(예: liblog
)을 내보냅니다. 타겟의 공급업체 변형과 관련된 옵션은 다음 위치의 Android.bp
파일에 지정할 수 있습니다.
target: { vendor: { … } }
코드베이스에 VNDK 사용 설정
코드베이스에 VNDK를 사용 설정하는 방법은 다음과 같습니다.
vendor.img
및 system.img
파티션에서 필요한 크기를 계산하여 자격 요건을 확인합니다.
BOARD_VNDK_VERSION=current
를 사용 설정합니다. BoardConfig.mk
에 추가하거나 이를 사용하여 구성요소를 직접 빌드할 수 있습니다(예: m -j BOARD_VNDK_VERSION=current MY-LIB
).
BOARD_VNDK_VERSION=current
를 사용 설정한 후에는 빌드 시스템에서 다음 종속 항목과 헤더 요구사항을 적용합니다.
종속 항목 관리
vndk
에 없거나 vendor
객체로 존재하지 않는 core
구성요소에 종속되는 vendor
객체는 다음 옵션 중 하나를 사용하여 해결해야 합니다.
- 종속 항목을 제거할 수 있습니다.
vendor
에서 core
구성요소를 소유한 경우 vendor_available
또는 vendor
로 표시될 수 있습니다.
vndk
의 핵심 객체 부분을 이루는 변경사항을 Google로 업스트림할 수 있습니다.
또한 core
구성요소가 vendor
구성요소에 종속되어 있다면 vendor
구성요소를 core
구성요소로 만들거나 또는 종속 항목이 다른 방법으로 삭제되어야 합니다(예: 종속 항목을 삭제하거나 vendor
구성요소로 이동).
빌드 시스템에서 헤더 빌드 시 -D__ANDROID_VNDK__
의 사용 여부를 알 수 있도록 전역 헤더의 종속 항목은 삭제되어야 합니다.
예를 들어 utils/StrongPointer.h
와 같은 libutils 헤더에 계속 헤더 라이브러리 libutils_headers
를 사용하여 액세스할 수 있습니다.
일부 헤더(예: unistd.h
)는 더 이상 전이하여 포함될 수 없지만 로컬로는 포함될 수 있습니다.
마지막으로 private/android_filesystem_config.h
의 공개 부분은 cutils/android_filesystem_config.h
로 이동했습니다. 이러한 헤더를 관리하려면 다음 중 하나를 실행해야 합니다.
- 가능하다면
getgrnam
/getpwnam
호출로 모든 AID_*
매크로를 대체하여 private/android_filesystem_config.h
에 연결된 종속 항목을 삭제합니다. 예:
(uid_t)AID_WIFI
가 getpwnam("wifi")->pw_uid
가 됩니다.
(gid_t)AID_SDCARD_R
이 getgrnam("sdcard_r")->gr_gid
가 됩니다.
자세한 내용은 private/android_filesystem_config.h
를 참조하세요.
- 하드 코딩 AIS의 경우
cutils/android_filesystem_config.h
를 포함합니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2024-04-26(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2024-04-26(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`."]]