Tổng quan về Bộ công cụ phát triển gốc dành cho nhà cung cấp (VNDK)

Bộ công cụ phát triển gốc dành cho nhà cung cấp (VNDK) là một bộ thư viện được các thư viện khác sử dụng hoặc tệp nhị phân, trong phân vùng sản phẩm hoặc nhà cung cấp, trong thời gian chạy cho dlopen.

Tại sao nên chọn VNDK?

AOSP chỉ cho phép cập nhật khung trong đó phân vùng hệ thống có thể được nâng cấp lên phiên bản mới nhất phiên bản khung trong khi phân vùng nhà cung cấp vẫn không thay đổi. Mặc dù được xây dựng ở nhiều thời điểm lần, các tệp nhị phân trong mỗi phân vùng phải hoạt động được với nhau.

Các bản cập nhật chỉ dành cho khung bao gồm những thách thức sau:

  • Phần phụ thuộc giữa mô-đun khung và mô-đun của nhà cung cấp. Trước Android 8.0, các mô-đun trong phân vùng hệ thống và nhà cung cấp có thể liên kết với nhau. Tuy nhiên, các phần phụ thuộc từ các mô-đun nhà cung cấp được áp đặt không mong muốn đối với việc phát triển mô-đun khung.
  • Các tiện ích cho thư viện AOSP. của Android yêu cầu tất cả thiết bị Android phải vượt qua CTS khi phân vùng hệ thống được thay thế có Hình ảnh hệ thống chung (GSI) chuẩn. Tuy nhiên, khi các nhà cung cấp mở rộng AOSP (Dự án nguồn mở Android) các thư viện để tăng hiệu suất hoặc thêm các chức năng bổ sung cho HIDL của ứng dụng các quá trình triển khai, cài đặt ROM phân vùng hệ thống bằng GSI tiêu chuẩn có thể làm hỏng việc triển khai HIDL của nhà cung cấp. Để xem hướng dẫn về để ngăn chặn những sự cố như vậy, xem Tiện ích VNDK.

Để giải quyết những thách thức này, Android có một số tính năng như dưới dạng VNDK (được mô tả trong phần này), HIDL, hwbinder, lớp phủ cây thiết bị và lớp phủ sepolicy.

Điều khoản dành riêng cho VNDK

Các tài liệu liên quan đến VNDK sử dụng các thuật ngữ sau:
  • Mô-đun tham chiếu đến thư viện dùng chung hoặc tệp thực thi. Mô-đun tạo thời gian xây dựng phần phụ thuộc.
  • Quy trình là các tác vụ của hệ điều hành được tạo từ các tệp thực thi. Quy trình tạo ra thời gian chạy phần phụ thuộc.
  • Các thuật ngữ đủ điều kiện Khung có liên quan đến phân vùng system:
    • Tệp thực thi của khung đề cập đến các tệp thực thi trong /system/bin hoặc /system/xbin.
    • Thư viện dùng chung khung tham chiếu đến các thư viện dùng chung trong /system/lib[64].
    • Mô-đun khung tham chiếu đến cả hai thư viện dùng chung khung và các tệp thực thi khung.
    • Quy trình khung là các quy trình được tạo từ khung tệp thực thi, chẳng hạn như /system/bin/app_process.
  • Các cụm từ đủ điều kiện cho nhà cung cấp có liên quan đến phân vùng vendor:
    • Tệp thực thi của nhà cung cấp tham chiếu đến các tệp thực thi trong /vendor/bin
    • Thư viện chia sẻ của nhà cung cấp tham chiếu đến thư viện chia sẻ trong /vendor/lib[64].
    • Mô-đun nhà cung cấp tham chiếu đến cả tệp thực thi của nhà cung cấp và thư viện chia sẻ của nhà cung cấp.
    • Quy trình của nhà cung cấp là những quy trình được tạo từ nhà cung cấp Các tệp thực thi, chẳng hạn như /vendor/bin/android.hardware.camera.provider@2.4-service.

Các khái niệm về VNDK

Trong phiên bản Android 8.0 trở lên lý tưởng, các quy trình khung sẽ không tải thư viện chia sẻ của nhà cung cấp, tất cả quy trình của nhà cung cấp chỉ tải thư viện chia sẻ của nhà cung cấp (và một phần thư viện dùng chung trong khung) và hoạt động giao tiếp giữa các quy trình khung và quy trình của nhà cung cấp được điều chỉnh bởi HIDL và phần cứng liên kết.

Một thế giới như vậy bao gồm khả năng các API công khai, ổn định từ thư viện dùng chung khung có thể không đủ cho các nhà phát triển mô-đun của nhà cung cấp (mặc dù API có thể thay đổi giữa các bản phát hành Android), bắt buộc phải có một số phần thư viện dùng chung khung có thể truy cập được vào quy trình của nhà cung cấp. Ngoài ra, như các yêu cầu về hiệu suất có thể dẫn đến việc bị xâm phạm, một số yêu cầu thiết yếu về thời gian phản hồi HAL phải được xử lý theo cách khác.

Các phần sau đây trình bày chi tiết cách VNDK xử lý các thư viện dùng chung khung cho nhà cung cấp và HAL (Lớp trừu tượng phần cứng) cùng quá trình (SP-HAL).

Khung thư viện chia sẻ dành cho nhà cung cấp

Phần này mô tả tiêu chí để phân loại thư viện dùng chung có thể truy cập vào các quy trình của nhà cung cấp. Có 2 phương pháp hỗ trợ nhà cung cấp mô-đun trên nhiều bản phát hành Android:

  1. Ổn định các ABI/API của thư viện dùng chung trong khung. Các mô-đun khung mới và mô-đun của nhà cung cấp cũ có thể sử dụng cùng một thư viện dùng chung để giảm mức sử dụng bộ nhớ và dung lượng lưu trữ. Bạn cũng có thể tránh sử dụng thư viện chia sẻ riêng biệt một số vấn đề tải hai lần. Tuy nhiên, chi phí phát triển để duy trì sự ổn định ABI/API là cao và không thực tế để ổn định tất cả ABI/API được xuất mọi thư viện chia sẻ khung.
  2. Sao chép thư viện chia sẻ của khung cũ. Đi kèm với sự mạnh mẽ hạn chế đối với các kênh phụ, được định nghĩa là mọi cơ chế giao tiếp giữa các mô-đun khung và mô-đun của nhà cung cấp, bao gồm (nhưng không giới hạn ở) liên kết, ổ cắm, đường ống, bộ nhớ dùng chung, tệp dùng chung và các thuộc tính hệ thống. Có không được có hoạt động giao tiếp trừ phi giao thức truyền thông bị treo và ổn định (ví dụ: HIDL qua hwbinder). Việc tải thư viện dùng chung lên 2 lần có thể khiến vấn đề; ví dụ: nếu một đối tượng do thư viện mới tạo sẽ được truyền vào các hàm từ thư viện cũ, nên có thể xảy ra lỗi khi các thư viện này có thể diễn giải đối tượng theo cách khác.

Các phương pháp khác nhau được sử dụng tuỳ thuộc vào đặc điểm của thư viện. Do đó, các thư viện dùng chung khung được phân loại thành ba loại danh mục phụ:

  • Thư viện LL-NDKThư viện chia sẻ khung được biết là ổn định. Nhà phát triển cam kết duy trì Độ ổn định của API/ABI.
    • LL-NDK bao gồm các thư viện sau: libEGL.so, libGLESv1_CM.so libGLESv2.so, libGLESv3.so libandroid_net.so, libc.so, libdl.so, liblog.so, libm.so, libnativewindow.so, libneuralnetworks.so, libsync.so, libvndksupport.solibvulkan.so,
  • Thư viện VNDK đủ điều kiện (VNDK)Khung được chia sẻ Các thư viện an toàn để được sao chép hai lần. Mô-đun khungMô-đun của nhà cung cấp có thể liên kết với các bản sao của riêng họ. Đã chia sẻ một khung thư viện VNDK chỉ có thể trở thành thư viện VNDK đủ điều kiện nếu đáp ứng các điều kiện sau: tiêu chí:
    • Hệ thống không gửi/nhận IPC đến/từ khung.
    • URL này không liên quan đến máy ảo ART.
    • Ứng dụng này không đọc/ghi tệp/phân vùng có định dạng tệp không ổn định.
    • Phần mềm này không có giấy phép phần mềm đặc biệt cần xem xét pháp lý.
    • Chủ sở hữu mã nguồn không phản đối cách sử dụng của nhà cung cấp.
  • Thư viện chỉ dành cho khung (CHỈ FWK)Khung được chia sẻ Thư viện không thuộc các danh mục nêu trên. Các thư viện:
    • Được coi là chi tiết triển khai nội bộ của khung.
    • Mô-đun nhà cung cấp không được phép truy cập.
    • Có ABI/API không ổn định và không đảm bảo khả năng tương thích với API/ABI.
    • Không được sao chép.

Lớp trừu tượng phần cứng (HAL) cùng quy trình (SP-HAL)

HAL cùng quá trình (SP-HAL) là một tập hợp các HAL được xác định trước được triển khai dưới dạng Thư viện được chia sẻ dành cho nhà cung cấp và được tải vào Khung Quy trình. SP-HAL được tách riêng bởi một không gian tên trình liên kết (kiểm soát các thư viện dùng chung và biểu tượng mà bạn thấy). SP-HAL phải chỉ phụ thuộc vào LL-NDKVNDK-SP.

VNDK-SP là một nhóm nhỏ được xác định trước gồm các thư viện VNDK đủ điều kiện. Thư viện VNDK-SP đều được xem xét kỹ lưỡng để đảm bảo tải hai lần thư viện VNDK-SP vào khung không gây ra sự cố. Cả SP-HAL và VNDK-SP được xác định bởi Google.

Các thư viện sau đây được phê duyệt SP-HAL:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

Thư viện VNDK-SP chỉ định vndk: { support_system_process: true } trong tệp Android.bp của họ. Nếu vndk: {private:true} cũng là đã chỉ định, thì các thư viện này được gọi là VNDK-SP-Private và chúng không hiển thị với SP-HALS.

Sau đây là các thư viện chỉ dành cho khung có ngoại lệ về RS (FWK-ONLY-RS):

  • libft2.so (Tập lệnh kết xuất)
  • libmediandk.so (Tập lệnh kết xuất)

Tạo phiên bản VNDK

Thư viện chia sẻ VNDK được tạo phiên bản:

  • Thuộc tính hệ thống ro.vndk.version sẽ tự động được thêm vào /vendor/default.prop
  • Thư viện dùng chung VNDK và VNDK-SP được cài đặt dưới dạng một đỉnh VNDK com.android.vndk.v${ro.vndk.version} và được gắn với /apex/com.android.vndk.v${ro.vndk.version}

Giá trị của ro.vndk.version do thuật toán chọn bên dưới:

  • Nếu BOARD_VNDK_VERSION không bằng current, sử dụng BOARD_VNDK_VERSION.
  • Nếu BOARD_VNDK_VERSION bằng current:
    • Nếu PLATFORM_VERSION_CODENAMEREL, hãy sử dụng PLATFORM_SDK_VERSION (ví dụ: 28).
    • Nếu không, hãy sử dụng PLATFORM_VERSION_CODENAME (ví dụ: P).

Bộ thử nghiệm nhà cung cấp (VTS)

Bộ thử nghiệm nhà cung cấp Android (VTS) yêu cầu thuộc tính ro.vndk.version không trống. Cả hai thiết bị mới ra mắt và các thiết bị nâng cấp phải xác định ro.vndk.version. Một số thử nghiệm VNDK trường hợp (ví dụ: VtsVndkFilesTestVtsVndkDependencyTest) dựa vào ro.vndk.version để tải các tập dữ liệu phù hợp của thư viện VNDK đủ điều kiện.