Google cam kết thúc đẩy công bằng chủng tộc cho các cộng đồng Đen. Xem thế nào.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Bộ phát triển bản địa nhà cung cấp (VNDK)

Bộ công cụ phát triển bản địa của nhà cung cấp (VNDK) là một bộ thư viện dành riêng cho các nhà cung cấp để thực hiện HAL của họ. Các VNDK gửi trong system.img và được liên kết động với mã nhà cung cấp khi chạy.

Tại sao VNDK?

Android 8.0 trở lên cho phép cập nhật chỉ 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 trong khi phân vùng nhà cung cấp không thay đổi. Điều này ngụ ý rằng các nhị phân được xây dựng tại các thời điểm khác nhau phải có khả năng làm việc với nhau; VNDK bao gồm các thay đổi API / ABI trên các bản phát hành Android.

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

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

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

Tài nguyên VNDK

Phần này bao gồm các tài nguyên VNDK sau:

  • Khái niệm VNDK (bên dưới) mô tả các thư viện chia sẻ khung, HALs cùng quy trình (SP-HAL) và thuật ngữ VNDK.
  • Tiện ích mở rộng VNDK phân loại các thay đổi cụ thể của nhà cung cấp thành các danh mục. Ví dụ: các thư viện có chức năng mở rộng mà các mô đun nhà cung cấp dựa vào phải được sao chép vào phân vùng nhà cung cấp, nhưng các thay đổi không tương thích ABI đều bị cấm.
  • Hỗ trợ hệ thống xây dựng VNDK mô tả các cấu hình hệ thống xây dựng và cú pháp định nghĩa mô-đun có liên quan đến VNDK.
  • Công cụ Định nghĩa VNDK giúp di chuyển cây nguồn của bạn sang Android 8.0 trở lên.
  • Linker Namespace cung cấp khả năng kiểm soát chi tiết đối với các liên kết thư viện dùng chung.
  • Thư mục, Quy tắc và sepolicy xác định cấu trúc thư mục cho các thiết bị chạy Android 8.0 trở lên, quy tắc VNDK và sepolicy liên quan.
  • Bài thuyết trình Thiết kế VNDK minh họa các khái niệm VDNK cơ bản được sử dụng trong Android 8.0 trở lên.

Khái niệm VNDK

Trong một thế giới Android 8.0 lý tưởng và cao hơn, các quy trình khung không tải thư viện dùng chung của nhà cung cấp, tất cả các quy trình của nhà cung cấp chỉ tải thư viện dùng chung của nhà cung cấp (và một phần của thư viện dùng chung khung) và 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 chất kết dính.

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

Các phần sau đây chi tiết cách VNDK xử lý các thư viện chia sẻ khung cho các nhà cung cấp và HALs cùng quy trình (SP-HAL).

Thư viện chia sẻ khung cho nhà cung cấp

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

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

Các cách tiếp cận khác nhau được sử dụng tùy thuộc vào đặc điểm của các thư viện chia sẻ. Kết quả là, các thư viện chia sẻ khung được phân thành ba loại phụ:

  • Thư viện LL-NDKThư viện chia sẻ khung được biết là ổn định. Các nhà phát triển của họ cam kết duy trì sự ổn định API / ABI của họ.
    • 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)Thư viện chia sẻ khung an toàn để được sao chép hai lần. Mô-đun khungMô-đun nhà cung cấp có thể liên kết với các bản sao của chính họ. Thư viện chia sẻ khung có thể trở thành thư viện VNDK đủ điều kiện chỉ khi đáp ứng các tiêu chí sau:
    • Nó không gửi / nhận IPC đến / từ khung.
    • Nó không liên quan đến máy ảo ART.
    • Nó không đọc / ghi tệp / phân vùng với định dạng tệp không ổn định.
    • Nó không có giấy phép phần mềm đặc biệt đòi hỏi phải xem xét pháp lý.
    • Chủ sở hữu mã của nó không phản đối việc sử dụng của nhà cung cấp.
  • Thư viện chỉ khung (FWK-CHỈ)Thư viện chia sẻ khung không thuộc các danh mục được đề cập ở trên. Những thư viện này:
    • Được coi là khung chi tiết thực hiện nội bộ.
    • Không được truy cập bởi các mô-đun nhà cung cấp.
    • Có ABI / API không ổn định và không có đảm bảo tương thích API / ABI.
    • Không được sao chép.

HAL cùng quy trình (SP-HAL)

Same-Process HAL ( SP-HAL ) là một tập hợp các HAL được xác định trước được triển khai như Thư viện chia sẻ của nhà cung cấp và được tải vào các quy trình khung . SP-HAL được phân lập bởi một không gian tên liên kết (điều khiển các thư viện và ký hiệu hiển thị cho các thư viện dùng chung). SP-HAL phải chỉ phụ thuộc vào LL-NDKVNDK-SP .

VNDK-SP là tập hợp con được xác định trước của các thư viện VNDK đủ điều kiện. Các thư viện VNDK-SP được xem xét cẩn thận để đảm bảo các thư viện VNDK-SP tải gấp đôi vào các quy trình khung không gây ra vấn đề. Cả SP-HAL và VNDK-SP đều đượ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

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

Sau đây là các thư viện chỉ khung với ngoại lệ RS (FWK-CHỈ-RS) :

  • libft2.so (Render)
  • libmediandk.so (Rendercript)

Thuật ngữ VNDK

  • Các mô-đun đề cập đến Thư viện dùng chung hoặc Thực thi .
  • Các quy trình là các tác vụ hệ điều hành được sinh ra từ Executables .
  • Các thuật ngữ đủ tiêu chuẩn khung tham chiếu đến các khái niệm liên quan đến phân vùng hệ thống .
  • Các thuật ngữ đủ tiêu chuẩn của nhà cung cấp đề cập đến các khái niệm liên quan đến phân vùng nhà cung cấp .

Ví dụ:

  • Khung thực thi tham chiếu đến các tệp thực thi trong /system/bin hoặc /system/xbin .
  • Thư viện chia sẻ khung tham khảo các thư viện dùng chung trong /system/lib[64] .
  • Các mô-đun khung tham chiếu đến cả Thư viện chia sẻ khungThực thi khung .
  • Các quy trình khung là các quy trình được sinh ra từ Khung thực thi (ví dụ /system/bin/app_process ).
  • Nhà cung cấp thực thi đề cập đến thực thi trong /vendor/bin
  • Thư viện dùng chung của nhà cung cấp đề cập đến các thư viện dùng chung dưới /vendor/lib[64] .
  • Mô-đun nhà cung cấp đề cập đến cả Thư viện thực thi nhà cung cấpThư viện chia sẻ nhà cung cấp .
  • Các quy trình của nhà cung cấp là các quy trình được sinh ra từ các nhà cung cấp thực thi (ví dụ
  • /vendor/bin/android.hardware.camera.provider@2.4-service ).

Phiên bản VNDK

Trong Android 9, các thư viện chia sẻ VNDK được phiên bản:

  • ro.vndk.version hệ thống ro.vndk.version được tự động thêm vào /vendor/default.prop .
  • Các thư viện chia sẻ VNDK được cài đặt vào / /system/lib[64]/vndk-${ro.vndk.version} lib [64[ / vndk -$ nbro.vndk.version /system/lib[64]/vndk-${ro.vndk.version} .
  • Các thư viện chia sẻ VNDK-SP được cài đặt vào / /system/lib[64]/vndk-sp-${ro.vndk.version} lib[64[/vndk-sp-$ nbro.vndk.version /system/lib[64]/vndk-sp-${ro.vndk.version} .
  • Tệp cấu hình liên kết động được cài đặt vào /system/etc/ld.config.${ro.vndk.version}.txt .

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

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

Nâng cấp thiết bị

Nếu thiết bị Android 8.x vô hiệu hóa thực thi thời gian chạy VNDK bằng cách được xây dựng mà không có BOARD_VNDK_VERSION , thiết bị có thể thêm PRODUCT_USE_VNDK_OVERRIDE := false cho BoardConfig.mk khi nâng cấp lên Android 9.

Nếu PRODUCT_USE_VNDK_OVERRIDEfalse , thuộc tính ro.vndk.lite sẽ tự động được thêm vào /vendor/default.prop và giá trị của nó sẽ là true . Do đó, trình liên kết động sẽ tải cấu hình không gian tên của trình liên kết từ /system/etc/ld.config.vndk_lite.txt , chỉ cách ly SP-HAL và VNDK-SP.

Để nâng cấp thiết bị Android 7.0 trở xuống lên Android 9, hãy thêm BoardConfig.mk PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false vào BoardConfig.mk .

Bộ kiểm tra nhà cung cấp (VTS)

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

Nếu thuộc tính ro.product.first_api_level lớn hơn 27, thuộc tính ro.vndk.lite không được xác định. VtsTreblePlatformVersionTest sẽ thất bại nếu ro.vndk.lite được xác định trong thiết bị Android 9 mới ra mắt.

Tài liệu Lịch sử

Phần này theo dõi các thay đổi đối với tài liệu VNDK.

Thay đổi Android 9

  • Thêm phần phiên bản VNDK.
  • Thêm phần VTS.
  • Một số loại VNDK đã được đổi tên:
    • LL-NDK-Indirect đã được đổi tên thành LL-NDK-Private.
    • VNDK-Indirect đã được đổi tên thành VNDK-Private.
    • VNDK-SP-Indirect-Private đã được đổi tên thành VNDK-SP-Private.
    • VNDK-SP-Indirect đã bị xóa.

Thay đổi Android 8.1

  • Thư viện SP-NDK đã được sáp nhập vào thư viện LL-NDK.
  • Thay thế libui.so bằng libft2.so trong phần không gian tên RS. Đó là một lỗi bao gồm libui.so .
  • Thêm libGLESv3.solibandroid_net.so vào thư viện LL-NDK.
  • Thêm libion.so vào thư viện VNDK-SP.
  • Xóa libstdc++.so khỏi các thư viện LL-NDK. Sử dụng libc++.so Thay vào đó. Một số phiên bản của bộ công cụ độc lập có thể thêm -lstdc++ vào các cờ liên kết mặc định. Để tắt mặc định, thêm -nodefaultlibs -lc -lm -ldl vào LDFLAGS .
  • Chuyển libz.so từ thư viện LL-NDK sang thư viện VNDK-SP. Trong một số cấu hình, libz.so có thể tiếp tục là LL-NDK. Tuy nhiên, không nên có sự khác biệt quan sát được.