Bộ phát triển gốc của nhà cung cấp (VNDK) yêu cầu một số thay đổi đối với cơ sở mã để phân tách các vấn đề giữa nhà cung cấp và hệ thống. Hãy làm theo hướng dẫn sau để bật VNDK trong cơ sở mã của nhà cung cấp/OEM.
Xây dựng thư viện hệ thống
Hệ thống xây dựng chứa một số loại đối tượng, bao gồm cả thư viện (dùng chung, tĩnh hoặc tiêu đề) và tệp nhị phân.

Hình 1. Xây dựng thư viện hệ thống.
- Thư viện
core
được hình ảnh hệ thống sử dụng trên hình ảnh hệ thống. Thư việnvendor
,vendor_available
,vndk
hoặcvndk-sp
không thể sử dụng các thư viện này.cc_library { name: "libThatIsCore", ... }
- Thư viện
vendor-only
(hoặcproprietary
) được hình ảnh nhà cung cấp sử dụng trên hình ảnh nhà cung cấp.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- Thư viện
vendor_available
được hình ảnh của nhà cung cấp sử dụng trên hình ảnh của nhà cung cấp (có thể chứa các bản sao củacore
).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
- Thư viện
vndk
được hình ảnh nhà cung cấp sử dụng trên hình ảnh hệ thống.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- Thư viện
vndk-sp
được hình ảnh nhà cung cấp và hình ảnh hệ thống sử dụng gián tiếp.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- Thư viện
llndk
được cả hệ thống và hình ảnh của nhà cung cấp sử dụng.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Khi một thư viện được đánh dấu là vendor_available:true
, thư viện đó sẽ được tạo
hai lần:
- Một lần cho nền tảng (và do đó được cài đặt vào
/system/lib
) - Một lần cho nhà cung cấp (và do đó được cài đặt vào
/vendor/lib
hoặc VNDK APEX)
Các phiên bản nhà cung cấp của thư viện được tạo bằng -D__ANDROID_VNDK__
.
Các thành phần hệ thống riêng tư có thể thay đổi đáng kể trong các phiên bản Android trong tương lai sẽ bị vô hiệu hoá bằng cờ này. Ngoài ra, các thư viện khác nhau sẽ xuất một nhóm tiêu đề khác nhau (chẳng hạn như liblog
). Bạn có thể chỉ định các tuỳ chọn dành riêng cho biến thể nhà cung cấp của một mục tiêu trong tệp Android.bp
trong:
target: { vendor: { … } }
Bật VNDK cho cơ sở mã
Cách bật VNDK cho một cơ sở mã:
- Xác định điều kiện bằng cách tính toán kích thước bắt buộc của các phân vùng
vendor.img
vàsystem.img
. - Bật
BOARD_VNDK_VERSION=current
. Bạn có thể thêm vàoBoardConfig.mk
hoặc tạo thành phần trực tiếp bằngBoardConfig.mk
(ví dụ:m -j BOARD_VNDK_VERSION=current MY-LIB
).
Sau khi bật BOARD_VNDK_VERSION=current
, hệ thống xây dựng sẽ thực thi các yêu cầu về phần phụ thuộc và tiêu đề sau.
Quản lý phần phụ thuộc
Đối tượng vendor
phụ thuộc vào thành phần core
không tồn tại trong vndk
hoặc dưới dạng đối tượng vendor
phải được phân giải bằng một trong các tuỳ chọn sau:
- Bạn có thể xoá phần phụ thuộc này.
- Nếu thành phần
core
thuộc sở hữu củavendor
, thì thành phần đó có thể được đánh dấu làvendor_available
hoặcvendor
. - Một thay đổi làm cho đối tượng cốt lõi trở thành một phần của
vndk
có thể được chuyển ngược lên Google.
Ngoài ra, nếu một thành phần core
có các phần phụ thuộc trên thành phần vendor
, thì thành phần vendor
phải được tạo thành thành phần core
hoặc phần phụ thuộc phải được xoá theo cách khác (ví dụ: bằng cách xoá phần phụ thuộc hoặc di chuyển phần phụ thuộc vào thành phần vendor
).
Quản lý tiêu đề
Bạn phải xoá các phần phụ thuộc tiêu đề chung để cho phép hệ thống xây dựng biết liệu có tạo tiêu đề có -D__ANDROID_VNDK__
hay không.
Ví dụ: bạn vẫn có thể truy cập vào các tiêu đề libutils như utils/StrongPointer.h
bằng cách sử dụng thư viện tiêu đề libutils_headers
.
Bạn không thể đưa một số tiêu đề (chẳng hạn như unistd.h
) vào một cách chuyển tiếp nữa
nhưng có thể đưa vào cục bộ.
Cuối cùng, phần công khai của private/android_filesystem_config.h
đã được chuyển sang cutils/android_filesystem_config.h
. Để quản lý các tiêu đề này, hãy làm theo một trong những cách sau:
- Xoá phần phụ thuộc vào
private/android_filesystem_config.h
bằng cách thay thế tất cả các macroAID_*
bằng lệnh gọigetgrnam
/getpwnam
nếu có thể. Ví dụ:(uid_t)AID_WIFI
trở thànhgetpwnam("wifi")->pw_uid
.(gid_t)AID_SDCARD_R
trở thànhgetgrnam("sdcard_r")->gr_gid
.
private/android_filesystem_config.h
. - Đối với AIS được mã hoá cứng, hãy thêm
cutils/android_filesystem_config.h
.