Bộ công cụ phát triển gốc dành cho nhà cung cấp (VNDK) yêu cầu một số thay đổi đối với cơ sở mã để tách biệt mối lo ngại giữa nhà cung cấp và hệ thống. Làm theo hướng dẫn sau để bật VNDK trong một nhà cung cấp/nhà sản xuất thiết bị gốc cơ sở mã.
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, trong đó có thư viện (được chia sẻ, 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. Cácvendor
,vendor_available
không thể sử dụng thư viện Thư việnvndk
hoặcvndk-sp
.cc_library { name: "libThatIsCore", ... }
- 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 của 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 nhà cung cấp sử dụng trên hình ảnh (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 ảnh hệ thống.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- Thư viện
vndk-sp
được sử dụng theo hình ảnh nhà cung cấp cũng như 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, } ... }
- Cả hình ảnh hệ thống và hình ảnh của nhà cung cấp đều sử dụng thư viện
llndk
.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Khi một lib được đánh dấu là vendor_available:true
, thư viện đó sẽ được tạo
2 lần:
- Khi 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 lib do nhà cung cấp cung cấp được xây dựng bằng -D__ANDROID_VNDK__
.
Các thành phần của hệ thống riêng tư có thể thay đổi đáng kể trong các phiên bản sau này của
Android bị vô hiệu hoá bằng cờ này. Ngoài ra, các thư viện khác nhau xuất
bộ tiêu đề khác (chẳng hạn như liblog
). Các tuỳ chọn dành riêng cho một
biến thể nhà cung cấp của một mục tiêu có thể được chỉ định trong tệp Android.bp
trong:
target: { vendor: { … } }
Bật VNDK cho cơ sở mã
Cách bật VNDK cho cơ sở mã:
- Xác định khả năng đủ điều kiện bằng cách tính toán kích thước bắt buộc 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 tạo các thành phần trực tiếp bằng công cụ đó (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
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
Đố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 lựa chọn sau:
- Bạn có thể xoá phần phụ thuộc này.
- Nếu thành phần
core
dovendor
sở hữu, thì thành phần này có thể sẽ được đánh dấu làvendor_available
hoặcvendor
. - Thay đổi khiến đối tượng cốt lõi của
vndk
có thể là ngược dòng 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 một
Thành phần vendor
, bạn phải tạo thành phần vendor
vào một thành phần core
hoặc phần phụ thuộc phải là
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 đề
Phần phụ thuộc tiêu đề chung phải được xoá để cho phép hệ thống xây dựng biết
tạo tiêu đề có hoặc không có -D__ANDROID_VNDK__
.
Ví dụ: các tiêu đề libutils như utils/StrongPointer.h
có thể
vẫn có thể truy cập được bằng cách sử dụng thư viện tiêu đề
libutils_headers
.
Không thể thêm một số tiêu đề (chẳng hạn như unistd.h
) theo cách bắc cầu 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 đến cutils/android_filesystem_config.h
. Để quản lý
các tiêu đề này, hãy thực hiện một trong những thao tác sau:
- Xoá phần phụ thuộc khỏi
private/android_filesystem_config.h
bằng cách thay thế tất cảAID_*
macro vớigetgrnam
/getpwnam
sẽ gọi 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 cố định giá trị trong mã, hãy thêm
cutils/android_filesystem_config.h
.