Vendor Native Development Kit (VNDK) yêu cầu một số thay đổi đối với cơ sở mã để tách các mối lo ngại 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.
Thư viện hệ thống xây dựng
Hệ thống xây dựng chứa nhiều 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 các thư viện hệ thống.
- Các thư viện
core
được dùng bởi hình ảnh hệ thống, trên hình ảnh hệ thống.vendor
,vendor_available
,vndk
hoặcvndk-sp
không thể 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) ... }
- Nhà cung cấp sử dụng thư viện
vendor_available
trên hình ảnh nhà cung cấp (có thể chứa 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, } ... }
- Hình ảnh nhà cung cấp và hình ảnh hệ thống đều sử dụng các thư viện
vndk-sp
một cách gián tiếp.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- Cả hình ảnh hệ thống và hình ảnh nhà cung cấp đều sử dụng các thư viện
llndk
.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 lib đượ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 (chẳng hạn như liblog
). Bạn có thể chỉ định các lựa chọn dành riêng cho một biến thể của nhà cung cấp của 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 cần thiết 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 các thành phần 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 sau đây về phần phụ thuộc và tiêu đề.
Quản lý phần phụ thuộc
Một đối tượng vendor
phụ thuộc vào một thành phần core
không tồn tại trong vndk
hoặc dưới dạng một đối tượng vendor
phải được phân giải bằng một trong các lựa 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
. - Thay đổi khiến đối tượng cốt lõi trở thành một phần của
vndk
có thể được chuyển lên Google.
Ngoài ra, nếu 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 chuyển 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 bằng cách 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 có nên tạo tiêu đề có hoặc không 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 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 gián tiếp nữa nhưng có thể đưa vào một cách 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
.