VNDK yêu cầu một số thay đổi đối với cơ sở mã để phân biệt mối quan tâm giữa nhà cung cấp và hệ thống. Sử dụng hướng dẫn sau để kích hoạt VNĐK trong cơ sở mã 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ác thư viện (được chia sẻ, tĩnh hoặc tiêu đề) và các tệp nhị phân.
- thư viện
core
được sử dụng bởi hình ảnh hệ thống, trên hình ảnh hệ thống. Các thư viện này không thể được sử dụng bởi các thư việnvendor
,vendor_available
,vndk
hoặcvndk-sp
.cc_library { name: "libThatIsCore", ... }
- Các thư viện
vendor-only
(hoặcproprietary
) được sử dụng bởi hình ảnh nhà cung cấp, trên hình ảnh nhà cung cấp.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- Các thư viện
vendor_available
được sử dụng bởi hình ảnh nhà cung cấp, trên hình ảnh 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 sử dụng bởi image nhà cung cấp, trên image hệ thống.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- Thư viện
vndk-sp
được sử dụng bởi hình ảnh nhà cung cấp và cả hình ảnh hệ thống một cách gián tiếp.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- Thư viện
llndk
được sử dụng bởi cả hình ảnh hệ thống và nhà cung cấp.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Khi một lib được đánh dấu là vendor_available:true
, nó đượ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 VNĐK APEX)
Các phiên bản lib của nhà cung cấp được xây dựng với -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 hóa với cờ này. Ngoài ra, các thư viện khác nhau xuất một bộ tiêu đề khác nhau (chẳng hạn như liblog
). Các tùy chọn dành riêng cho biến thể nhà cung cấp của mục tiêu có thể được chỉ định trong tệp Android.bp
trong:
target: { vendor: { … } }
Kích hoạt VNĐK cho codebase
Để kích hoạt VNĐK cho codebase:
- Xác định tính đủ điều kiện bằng cách tính toán kích thước yêu cầu của 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 xây dựng các thành phần trực tiếp với nó (ví dụ:m -j BOARD_VNDK_VERSION=current MY-LIB
).
Sau khi kích hoạt BOARD_VNDK_VERSION=current
, hệ thống xây dựng sẽ thực thi các yêu cầu tiêu đề và phụ thuộc sau.
Quản lý sự 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 giải quyết bằng một trong các tùy chọn sau:
- Sự phụ thuộc có thể được loại bỏ.
- Nếu thành phần
core
được sở hữu bởivendor
, 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 cập nhật lên Google.
Ngoài ra, nếu thành phần core
có các phần phụ thuộc vào 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 loại bỏ theo cách khác (ví dụ: bằng cách loại bỏ phần phụ thuộc hoặc bằng cách chuyển phần phụ thuộc vào thành phần vendor
. ).
Quản lý tiêu đề
Các phần phụ thuộc của tiêu đề chung phải được loại bỏ để cho phép hệ thống xây dựng biết có nên xây dựng các tiêu đề có hoặc không có -D__ANDROID_VNDK__
. Ví dụ: các tiêu đề libutils như utils/StrongPointer.h
vẫn có thể được truy cập bằng thư viện tiêu đề libutils_headers
.
Một số tiêu đề (chẳng hạn như unistd.h
) không còn có thể được đưa vào tạm thời nữa nhưng có thể được đư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 thực hiện một trong các thao tác sau:
- Xóa 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ã hóa cứng, hãy bao gồm
cutils/android_filesystem_config.h
.