Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Bộ công cụ phát triển bản địa củ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 để triển khai HAL của họ. Các tàu VNDK trong system.img và được liên kết động để mã nhà cung cấp trong thời gian chạy.

Tại sao lại là VNDK?

Android 8.0 trở lên cho phép các bản cập nhật chỉ dành cho khuôn khổ, 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 của nhà cung cấp được giữ nguyên. Điều này ngụ ý rằng các tệp nhị phân được xây dựng tại các thời điểm khác nhau phải có thể làm việc với nhau; VNDK bao gồm các thay đổi về 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 những thách thức sau:

  • Sự phụ thuộc giữa các module khuôn khổ và các module nhà cung cấp. Trước Android 8.0, các mô-đun của cả hai bên 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 các mô-đun khung.
  • Phần mở rộng đến 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 tiêu chuẩn (GSI). Tuy nhiên, khi các nhà cung cấp mở rộng 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 bằng GSI tiêu chuẩn có thể phá vỡ việc triển khai HIDL của nhà cung cấp. (Đối với các hướng dẫn về việc ngăn chặn vỡ như vậy, nhìn thấy 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, thiết bị cây che phủ , và lớp phủ sepolicy.

Nguồn VNDK

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

  • Khái niệm VNDK (dưới đây) mô tả khuôn khổ các thư viện chia sẻ, Hals cùng quá trình (SP-Hals), và thuật ngữ VNDK.
  • VNDK mở rộng phân loại nhà cung cấp cụ thay đổi thành các loại. Ví dụ: các thư viện có chức năng mở rộng mà các mô-đun của nhà cung cấp dựa vào phải được sao chép vào phân vùng của nhà cung cấp, nhưng các thay đổi không tương thích với ABI bị cấm.
  • VNDK xây dựng hệ thống hỗ trợ mô tả các cấu hình xây dựng hệ thống và cú pháp định nghĩa mô-đun có liên quan đến VNDK.
  • Các Definition VNDK Công cụ giúp cây nguồn di cư của mình lên Android 8.0 và cao hơn.
  • Linker Namespace cung cấp điều khiển hạt mịn hơn mối liên kết thư viện chia sẻ.
  • Thư mục, Quy tắc và sepolicy định nghĩa cấu trúc thư mục cho các thiết bị chạy Android 8.0 và cao hơn, quy tắc VNDK, và sepolicy liên quan.
  • Các VNDK Thiết kế trình bày minh họa các khái niệm cơ bản VDNK sử dụng trong Android 8.0 và cao hơ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 các thư viện được chia sẻ của nhà cung cấp, tất cả các quy trình của nhà cung cấp chỉ tải các thư viện được chia sẻ của nhà cung cấp (và một phần của thư viện được chia sẻ trong khung) và thông tin liên lạc 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 rằng các API công khai, ổn định từ các thư viện được chia sẻ trong khuôn khổ có thể không đủ cho các nhà phát triển mô-đun của nhà cung cấp (mặc dù các 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 đối với 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 phản hồi phải được xử lý theo cách khác.

Các phần dưới đây trình bày chi tiết cách VNDK xử lý các thư viện chia sẻ khuôn khổ cho các nhà cung cấp và các HAL trong cùng một 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 được chia sẻ có thể truy cập 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 Abis / API của khuôn khổ này chia sẻ thư viện. Mô-đun khung mới và mô-đun cũ của nhà cung cấp có thể sử dụng cùng một thư viện được chia sẻ để giảm dung lượng bộ nhớ và dung lượng lưu trữ. Một thư viện được 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ì các 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ẻ khuôn khổ là không thực tế.
  2. Sao chép khuôn khổ cũ các thư viện chia sẻ. Đi kèm với 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 của 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 được chia sẻ và thuộc tính hệ thống. Không được có thông tin liên lạc trừ khi giao thức truyền thông được đóng băng và ổn định (ví dụ: HIDL thông qua hwbinder). Các thư viện được chia sẻ tải hai lần cũng có thể gây ra sự cố; ví dụ, nếu một đối tượng được tạo bởi thư viện mới được chuyển vào các hàm từ thư viện cũ, một lỗi có thể xảy ra vì các thư viện này có thể diễn giải đối tượng theo cách khác.

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 dùng chung. Do đó, các thư viện chia sẻ khung được phân loại thành ba loại phụ:

  • LL-NDK Librarieskhung Shared Libraries được biết đến là ổn định. Các nhà phát triển của họ cam kết duy trì tính ổ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.so , và libvulkan.so ,
  • Đủ điều kiện VNDK Libraries (VNDK)khung Shared Libraries được an toàn để được sao chép hai lần. Khung ModulesVendor Modules có thể liên kết với các bản sao của chính họ. Một thư viện dùng chung trong khuôn khổ chỉ có thể trở thành một thư viện VNDK đủ điều kiện nếu nó đáp ứng các tiêu chí sau:
    • Nó không gửi / nhận IPC đến / từ khuôn khổ.
    • Nó không liên quan đến máy ảo ART.
    • Nó không đọc / ghi tệp / phân vùng có định dạng tệp không ổn định.
    • Nó không có giấy phép phần mềm đặc biệt yêu cầu đánh giá pháp lý.
    • Chủ sở hữu mã của nó không phản đối cách sử dụng của nhà cung cấp.
  • Khung-Only Libraries (FWK-ONLY)khuôn khổ Shared Libraries mà không làm thuộc về các loại nêu trên. Các thư viện này:
    • Được coi là chi tiết thực hiện nội bộ khung.
    • Không được truy cập bởi các mô-đun của nhà cung cấp.
    • Có ABI / API không ổn định và không có đảm bảo khả năng tương thích API / ABI.
    • Không được sao chép.

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

Cùng Process HAL (SP-HAL) là một tập hợp của Hals định trước thực hiện như Vendor Shared Libraries và nạp vào khung Processes. SP-HAL được phân lập bởi một không gian tên trình liên kết (kiểm soát các thư viện và ký hiệu hiển thị cho các thư viện được chia sẻ). SP-Hals phải chỉ phụ thuộc vào LL-NDKVNDK-SP.

VNDK-SP là một 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 việc nạp hai lần các thư viện VNDK-SP vào các quy trình khung không gây ra sự cố. Cả SP-HAL và VNDK-SP đều được Google định nghĩa.

Các thư viện sau là SP-HAL đã được phê duyệt:

  • 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 file Android.bp của họ. Nếu vendor_available: false cũng được chỉ định, sau đó các thư viện này được gọi là VNDK-SP-tư nhân và họ là vô hình với SP-Hals.

Sau đây là thư viện khuôn khổ chỉ với RS ngoại lệ (FWK-CHỈ-RS):

  • libft2.so (RenderScript)
  • libmediandk.so (RenderScript)

Thuật ngữ VNDK

  • Modules tham khảo hoặc Shared Libraries hoặc chương trình chạy.
  • Quá trình đang hoạt động nhiệm vụ hệ thống sinh ra từ chương trình chạy.
  • Khung -qualified thuật ngữ đề cập đến các khái niệm liên quan đến phân vùng hệ thống.
  • Nhà cung cấp về -qualified tham khảo các khái niệm liên quan đến phân vùng nhà cung cấp.

Ví dụ:

  • Khung chương trình chạy tham khảo thực thi trong /system/bin hoặc /system/xbin .
  • Khung Shared Libraries tham khảo thư viện chia sẻ dưới /system/lib[64] .
  • Khung Modules tham khảo cả khung Shared Librarieskhuôn khổ chương trình chạy.
  • Khung Processes là quá trình sinh ra từ khuôn khổ chương trình chạy (ví dụ như /system/bin/app_process ).
  • Executables nhà cung cấp tham khảo thực thi trong /vendor/bin
  • Vendor Shared Libraries tham khảo thư viện chia sẻ dưới /vendor/lib[64] .
  • Modules nhà cung cấp tham khảo cho cả hai nhà cung cấp chương trình chạynhà cung cấp Shared Libraries.
  • Processes nhà cung cấp là quá trình sinh ra từ nhà cung cấp Tệp thực thi (ví dụ như
  • /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 tạo phiên bản:

  • Các ro.vndk.version sở hữu hệ thống được tự động thêm vào /vendor/default.prop .
  • VNDK thư viện chia sẻ được cài đặt để /system/lib[64]/vndk-${ro.vndk.version} .
  • VNDK-SP thư viện chia sẻ được cài đặt để /system/lib[64]/vndk-sp-${ro.vndk.version} .
  • Các tập tin cấu hình mối 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 lựa chọn bởi các thuật toán dưới đây:

  • 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 , sử dụng PLATFORM_SDK_VERSION (ví dụ 28 ).
    • Nếu không, sử dụng PLATFORM_VERSION_CODENAME (ví dụ P ).

Nâng cấp thiết bị

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

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

Để nâng cấp thiết bị Android 7.0 hoặc thấp hơn để Android 9, thêm PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false để BoardConfig.mk .

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

Android 9 người bán hàng thử nghiệm Suite (VTS) nhiệm vụ một tổ chức phi rỗng ro.vndk.version tài sản. Cả hai mới tung ra các thiết bị và các thiết bị nâng cấp phải xác định ro.vndk.version . Một số trường hợp thử nghiệm VNDK (ví dụ VtsVndkFilesTestVtsVndkDependencyTest ) dựa trên ro.vndk.version tài sản để tải phù hợp đủ điều kiện thư viện VNDK bộ dữ liệu.

Nếu ro.product.first_api_level tài sản lớn hơn 27, các ro.vndk.lite sở hữu không được xác định. VtsTreblePlatformVersionTest sẽ thất bại nếu ro.vndk.lite được định nghĩa trong một 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.

Android 9 thay đổi

  • Thêm phần phiên bản VNDK.
  • Thêm phần VTS.
  • Một số danh mục VNDK đã được đổi tên:
    • LL-NDK-Indirect đã được đổi tên thành LL-NDK-Private.
    • VNDK-Gián tiếp đã được đổi tên thành VNDK-Riêng tư.
    • VNDK-SP-Indirect-Private đã được đổi tên thành VNDK-SP-Private.
    • VNDK-SP-Gián tiếp đã bị xóa.

Những thay đổi của Android 8.1

  • Các thư viện SP-NDK đã được hợp nhất thành các thư viện LL-NDK.
  • Thay libui.so với libft2.so trong RS phần namespace. Đó là một lỗi để bao gồm libui.so .
  • Thêm libGLESv3.solibandroid_net.so đến thư viện LL-NDK.
  • Thêm libion.so đến thư viện VNDK-SP.
  • Di libstdc++.so từ các thư viện LL-NDK. Sử dụng libc++.so thay thế. Một số phiên bản của dãy công cụ độc lập có thể thêm -lstdc++ để những lá cờ mối liên kết mặc định. Để vô hiệu hóa giá trị mặc định, thêm -nodefaultlibs -lc -lm -ldl để LDFLAGS .
  • Di chuyển libz.so từ LL-NDK để 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 được có sự khác biệt có thể quan sát được.