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 toàn bộ mã nguồn để tách biệt các mối quan tâm giữa nhà cung cấp và hệ thống. Hãy sử dụng hướng dẫn sau đây để bật VNDK (Bộ công cụ phát triển gốc dành cho nhà cung cấp) trong toàn bộ mã nguồn của nhà cung cấp/OEM (Nhà sản xuất thiết bị gốc).
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 thư viện (dùng chung, tĩnh hoặc tiêu đề) và tệp nhị phân.
Hình 1. Thư viện hệ thống xây dựng.
- Hình ảnh hệ thống sử dụng thư viện
coretrên hình ảnh hệ thống. Các thư viện này không thể được sử dụng bởivendor,vendor_available,vndkhoặcvndk-spthư viện.cc_library { name: "libThatIsCore", ... }
- Hình ảnh nhà cung cấp sử dụng thư viện
vendor-only(hoặcproprietary) trên hình ảnh nhà cung cấp.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- Hình ảnh nhà cung cấp sử dụng thư viện
vendor_availabletrên hình ảnh nhà cung cấp (có thể chứa bản sao củacore).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
- Hình ảnh nhà cung cấp sử dụng thư viện
vndktrên hình ảnh hệ thống.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- Hình ảnh nhà cung cấp sử dụng thư viện
vndk-spvà cũng được hình ảnh hệ thống sử dụ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à 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, lib đó sẽ được xây dựng 2 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/libhoặc VNDK APEX)
Các phiên bản lib của nhà cung cấp được xây dựng 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 sau này 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 tập hợp 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 một biến thể của nhà cung cấp đối với 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 toàn bộ mã nguồn:
- 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.imgvàsystem.img. - Bật
BOARD_VNDK_VERSION=current. Bạn có thể thêm vàoBoardConfig.mkhoặc trực tiếp xây dựng các thành phần bằng cách này (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
Đố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 tuỳ chọn sau:
- Bạn có thể xoá phần phụ thuộc.
- Nếu thành phần
corethuộc sở hữu củavendor, thì bạn có thể đánh dấu thành phần đó làvendor_availablehoặcvendor. - Bạn có thể chuyển một thay đổi khiến đối tượng cốt lõi trở thành một phần của
vndklên Google.
Ngoài ra, nếu thành phần core có phần phụ thuộc vào thành phần vendor, thì bạn phải biến thành phần vendor thành thành phần core hoặc xoá phần phụ thuộc theo cách khác (ví dụ: bằng cách xoá phần phụ thuộc hoặc 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 xây dựng tiêu đề bằng -D__ANDROID_VNDK__ hay không.
Ví dụ: bạn vẫn có thể truy cập các tiêu đề libutils như utils/StrongPointer.h bằng thư viện tiêu đề
libutils_headers.
Bạn không thể bao gồm một số tiêu đề (chẳng hạn như unistd.h) một cách bắc cầu nữa nhưng có thể bao gồm 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.hbằng cách thay thế tất cả các macroAID_*bằng lệnh gọigetgrnam/getpwnamnếu có thể. Ví dụ:(uid_t)AID_WIFItrở thànhgetpwnam("wifi")->pw_uid.(gid_t)AID_SDCARD_Rtrở 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.