Công cụ định nghĩa VNDK

Công cụ định nghĩa VNDK giúp các nhà cung cấp di chuyển cây nguồn của họ sang một Môi trường Android 8.0. Công cụ này quét các tệp nhị phân trong hệ thống và nhà cung cấp hình ảnh sau đó sẽ phân giải các phần phụ thuộc. Dựa trên biểu đồ phần phụ thuộc của mô-đun, cũng có thể phát hiện các lỗi vi phạm đối với các khái niệm của VNDK và thông tin chi tiết/đề xuất để di chuyển mô-đun giữa các phân vùng. Nếu một Hệ thống chung Hình ảnh (GSI) đã được chỉ định, công cụ định nghĩa VNDK có thể so sánh hệ thống của bạn với GSI và xác định các thư viện mở rộng.

Phần này đề cập đến 3 lệnh thường dùng để định nghĩa VNDK công cụ:

  • vndk. Tính VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES, và EXTRA_NETWORK_LIBRARIES để giải quyết vấn đề hệ thống xây dựng trong Android 8.0 và cao hơn.
  • check-dep. Kiểm tra các phần phụ thuộc của mô-đun vi phạm từ mô-đun nhà cung cấp vào thư viện chia sẻ theo khung không đủ điều kiện.
  • deps. In các phần phụ thuộc giữa các thư viện dùng chung và tệp thực thi.

Để biết thêm thông tin chi tiết về cách sử dụng lệnh nâng cao, hãy tham khảo README.md trong kho lưu trữ Công cụ định nghĩa VNDK.

vndk

Lệnh con vndk tải các thư viện dùng chung và tệp thực thi từ phân vùng hệ thống và phân vùng nhà cung cấp, sau đó phân giải mô-đun các phần phụ thuộc để xác định những thư viện phải được sao chép vào /system/lib[64]/vndk-sp-${VER}/vendor/lib[64]. Các tuỳ chọn cho lệnh con vndk bao gồm:

Lựa chọn Mô tả
--system Trỏ tới một thư mục chứa các tệp nằm trong hệ thống phân vùng.
--vendor Trỏ tới một thư mục chứa các tệp thuộc một nhà cung cấp phân vùng.
--aosp-system Trỏ tới thư mục chứa các tệp nằm trong thư mục chung hình ảnh hệ thống (GSI).
--load-extra-deps Trỏ đến một tệp mô tả các phần phụ thuộc ngầm ẩn, chẳng hạn như dlopen().

Ví dụ: để tính toán các tập hợp thư viện VNDK, hãy chạy lệnh sau Lệnh con vndk:

./vndk_definition_tool.py vndk \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor \
    --aosp-system ${ANDROID_PRODUCT_OUT}/../generic_arm64_ab/system\
    --load-extra-deps dlopen.dep

Chỉ định các phần phụ thuộc bổ sung bằng định dạng tệp đơn giản. Mỗi dòng đại diện cho một với tệp trước dấu hai chấm, tuỳ thuộc vào tệp sau dấu hai chấm. Ví dụ:

/system/lib/libart.so: /system/lib/libart-compiler.so

Dòng này cho công cụ định nghĩa VNDK biết rằng libart.so phụ thuộc vào libart-compiler.so.

Đích cài đặt

Công cụ định nghĩa VNDK liệt kê các thư viện và thư mục cài đặt tương ứng cho các danh mục sau:

Danh mục Thư mục
vndk_sp Phải cài đặt để truy cập /system/lib[64]/vndk-sp-${VER}
vndk_sp_ext Phải cài đặt để truy cập /vendor/lib[64]/vndk-sp
extra_vendor_libs Phải cài đặt để truy cập /vendor/lib[64]

Mẫu hệ thống xây dựng

Sau khi thu thập kết quả từ công cụ định nghĩa VNDK, nhà cung cấp có thể tạo một Android.mk rồi điền vào VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIESEXTRA_VENDOR_LIBRARIES đến tự động hoá quy trình sao chép thư viện vào bản cài đặt được chỉ định đích.

ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)
VNDK_SP_LIBRARIES := ##_VNDK_SP_##
VNDK_SP_EXT_LIBRARIES := ##_VNDK_SP_EXT_##
EXTRA_VENDOR_LIBRARIES := ##_EXTRA_VENDOR_LIBS_##

#-------------------------------------------------------------------------------
# VNDK Modules
#-------------------------------------------------------------------------------
LOCAL_PATH := $(call my-dir)

define define-vndk-lib
include $$(CLEAR_VARS)
LOCAL_MODULE := $1.$2
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_PREBUILT_MODULE_FILE := $$(TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so
LOCAL_STRIP_MODULE := false
LOCAL_MULTILIB := first
LOCAL_MODULE_TAGS := optional
LOCAL_INSTALLED_MODULE_STEM := $1.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_RELATIVE_PATH := $3
LOCAL_VENDOR_MODULE := $4
include $$(BUILD_PREBUILT)

ifneq ($$(TARGET_2ND_ARCH),)
ifneq ($$(TARGET_TRANSLATE_2ND_ARCH),true)
include $$(CLEAR_VARS)
LOCAL_MODULE := $1.$2
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_PREBUILT_MODULE_FILE := $$($$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so
LOCAL_STRIP_MODULE := false
LOCAL_MULTILIB := 32
LOCAL_MODULE_TAGS := optional
LOCAL_INSTALLED_MODULE_STEM := $1.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_RELATIVE_PATH := $3
LOCAL_VENDOR_MODULE := $4
include $$(BUILD_PREBUILT)
endif  # TARGET_TRANSLATE_2ND_ARCH is not true
endif  # TARGET_2ND_ARCH is not empty
endef

$(foreach lib,$(VNDK_SP_LIBRARIES),\
    $(eval $(call define-vndk-lib,$(lib),vndk-sp-gen,vndk-sp,)))
$(foreach lib,$(VNDK_SP_EXT_LIBRARIES),\
    $(eval $(call define-vndk-lib,$(lib),vndk-sp-ext-gen,vndk-sp,true)))
$(foreach lib,$(EXTRA_VENDOR_LIBRARIES),\
    $(eval $(call define-vndk-lib,$(lib),vndk-ext-gen,,true)))


#-------------------------------------------------------------------------------
# Phony Package
#-------------------------------------------------------------------------------

include $(CLEAR_VARS)
LOCAL_MODULE := $(YOUR_DEVICE_NAME)-vndk
LOCAL_MODULE_TAGS := optional
LOCAL_REQUIRED_MODULES := \
    $(addsuffix .vndk-sp-gen,$(VNDK_SP_LIBRARIES)) \
    $(addsuffix .vndk-sp-ext-gen,$(VNDK_SP_EXT_LIBRARIES)) \
    $(addsuffix .vndk-ext-gen,$(EXTRA_VENDOR_LIBRARIES))
include $(BUILD_PHONY_PACKAGE)

endif  # ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)

phần phụ thuộc kiểm tra

Lệnh con check-dep quét các mô-đun của nhà cung cấp và kiểm tra các mô-đun phần phụ thuộc. Nếu phát hiện lỗi vi phạm, Chrome sẽ in ra phần phụ thuộc vi phạm và cách sử dụng thư viện và biểu tượng:

./vndk_definition_tool.py check-dep \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor \
    --tag-file eligible-list.csv \
    --module-info ${ANDROID_PRODUCT_OUT}/module-info.json \
    1> check_dep.txt \
    2> check_dep_err.txt

Ví dụ: kết quả mẫu sau đây cho thấy phần phụ thuộc vi phạm của libRS_internal.so thành libmediandk.so:

/system/lib/libRS_internal.so
        MODULE_PATH: frameworks/rs
        /system/lib/libmediandk.so
                AImageReader_acquireNextImage
                AImageReader_delete
                AImageReader_getWindow
                AImageReader_new
                AImageReader_setImageListener

Các tuỳ chọn cho lệnh con check-dep bao gồm:

Lựa chọn Mô tả
--tag-file Phải tham chiếu đến tệp thẻ thư viện đủ điều kiện (được mô tả bên dưới). Tệp này là Bảng tính do Google cung cấp, trong đó mô tả các danh mục khuôn khổ dùng chung thư viện.
--module-info Trỏ tới module-info.json do bản dựng Android tạo hệ thống. Nó giúp công cụ định nghĩa của VNDK liên kết các mô-đun nhị phân với nguồn .

Tệp thẻ thư viện đủ điều kiện

Google cung cấp một bảng tính VNDK đủ điều kiện (ví dụ: eligible-list.csv) gắn thẻ các thư viện dùng chung của khung có thể được sử dụng bởi các mô-đun nhà cung cấp:

Thẻ Mô tả
LL-NDK Các thư viện dùng chung có ABI/API ổn định mà cả hai bên đều có thể sử dụng khung và mô-đun nhà cung cấp.
LL-NDK-Riêng tư Các phần phụ thuộc riêng tư của thư viện LL-NDK. Mô-đun nhà cung cấp không được truy cập các thư viện này một cách trực tiếp.
VNDK-SP Các phần phụ thuộc thư viện dùng chung của khung SP-HAL.
VNDK-SP-Riêng tư Một số nhà cung cấp không thể truy cập trực tiếp vào các phần phụ thuộc VNDK-SP các mô-đun.
VNDK Thư viện dùng chung khung có sẵn cho các mô-đun của nhà cung cấp (ngoại trừ SP-HAL và SP-HAL-Dep).
VNDK-Riêng tư Một số nhà cung cấp không thể truy cập trực tiếp vào các phần phụ thuộc VNDK các mô-đun.
CHỈ DÀNH CHO FWK Thư viện chia sẻ chỉ dành cho khung mà nhà cung cấp không được truy cập các mô-đun (không theo cách trực tiếp lẫn gián tiếp).
FWK-CHỈ-RS Thư viện chia sẻ chỉ dành cho khung mà nhà cung cấp không được truy cập mô-đun (ngoại trừ trường hợp sử dụng RS).

Bảng sau đây mô tả các thẻ dùng cho thư viện chia sẻ của nhà cung cấp:

Thẻ Mô tả
SP-HAL (Lớp trừu tượng phần cứng) Các thư viện dùng chung triển khai HAL (Lớp trừu tượng phần cứng) trong cùng một quy trình.
Phần phụ thuộc SP-HAL Phần phụ thuộc của thư viện chia sẻ của nhà cung cấp SP-HAL (còn được gọi là phần phụ thuộc SP-HAL ngoại trừ LL-NDK và VNDK-SP).
CHỈ DÀNH CHO VND Các thư viện chia sẻ có thể nhìn thấy khung không được truy cập bởi mô-đun khung. Các thư viện VNDK mở rộng đã sao chép sẽ được gắn thẻ là CHỈ DÀNH CHO VND.

Mối quan hệ giữa các thẻ:

Mối quan hệ giữa các thẻ.

Hình 1. Mối quan hệ giữa các thẻ.

Phần phụ thuộc

Để gỡ lỗi các phần phụ thuộc của thư viện, lệnh con deps sẽ in các phần phụ thuộc của mô-đun:

./vndk_definition_tool.py deps \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

Dữ liệu đầu ra bao gồm nhiều dòng. Dòng không có ký tự tab bắt đầu một phần mới. Dòng có ký tự tab phụ thuộc vào dòng . Ví dụ:

/system/lib/ld-android.so
/system/lib/libc.so
        /system/lib/libdl.so

Kết quả này cho thấy ld-android.so không có phần phụ thuộc và libc.so phụ thuộc vào libdl.so.

Khi chỉ định tuỳ chọn --revert, deps lệnh con in cách sử dụng thư viện (đảo ngược phần phụ thuộc):

./vndk_definition_tool.py deps \
    --revert \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

Ví dụ:

/system/lib/ld-android.so
        /system/lib/libdl.so
        

Kết quả này cho thấy ld-android.so được sử dụng bởi libdl.so hay nói cách khác, libdl.so phụ thuộc vào ld-android.so. Ngoài ra, kết quả này cho thấy libdl.so là người dùng duy nhất của ld-android.so.

Khi chỉ định tuỳ chọn --symbol, deps lệnh con sẽ in các ký hiệu đang được sử dụng:

./vndk_definition_tool.py deps \
    --symbol \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor
    

Ví dụ:

/system/lib/libc.so
        /system/lib/libdl.so
                android_get_application_target_sdk_version
                dl_unwind_find_exidx
                dlclose
                dlerror
                dlopen
                dlsym

Kết quả này cho thấy libc.so phụ thuộc vào 6 hàm đã xuất từ libdl.so. Nếu cả lựa chọn --symbol và Tuỳ chọn --revert được chỉ định, những ký hiệu mà người dùng sử dụng sẽ được in.