Ek kaynaklar

Aşağıdaki kaynaklarda kod konumları, araçlar, test ve lisanslama hakkında ayrıntılı bilgi verilmektedir.

Sorgulanabilir kod konumu

Sorgulanabilir tedarikçi arayüzü nesnesinin kodu system/libvintf konumuna gider.

El yazısı manifest dosyaları ve uyumluluk matrisleri zor olabilir. Başlangıç için standart bir manifest/uyumluluk matrisi oluşturmak üzere aşağıdaki araçları kullanın.

LSHAL

LSHAL, cihaz tarafında bulunan ve cihazdaki tüm kayıtlı HAL'leri hwservicemanager ve tüm kullanılabilir geçiş uygulamalarını (ör. android.hardware.foo@1.0-impl.so) listeleyen bir araçtır. Ayrıca, listeden yola çıkarak cihaz manifesti dosyası da oluşturabilir:

adb shell su 0 /system/bin/lshal --init-vintf

Aşağıdakileri göz önünde bulundurun:

  1. Bir paket hem hwservicemanager'ya kaydedilmişse hem de geçiş HAL'si olarak bulunmuşsa <transport>, hwbinder olarak ayarlanır.
  2. Manifest'e SELinux sürümü yazılmamış. Aşağıda açıklandığı gibi, öğenin assemble_vintf aracılığıyla yerleştirilmesi önerilir.
  3. Oluşturulan HAL manifest dosyası yanlış olabilir. Cihaz manifestosu ile vendor.img'nın sağladıkları arasındaki tutarsızlıkları düzeltmek için insan müdahalesi gerekir.

ASSEMBLE_VINTF

assemble_vintf, aşağıdaki işlevleri yerine getiren bir ana makine tarafı aracıdır:

  1. Uyumluluk matrisinin veya manifest dosyasının geçerli olduğunu doğrular.
  2. Derleme sırasında kullanılabilen manifestlere/uyumluluk matrislerine değişkenler ekler ve cihaza yüklenmesi gereken yeni bir dosya oluşturur.
  3. Oluşturulan dosya ile ikizi arasındaki uyumluluğu kontrol eder.
  4. Manifest dosyası verilirse isteğe bağlı olarak manifest dosyasıyla uyumlu bir standart uyumluluk matrisi oluşturur.

Örnek: Bir çerçeve manifest dosyasından cihaz uyumluluğu matrisi oluşturma

assemble_vintf -m --hals-only \
    -i system/libhidl/manifest.xml \
    -o device/manufacturer/device_name/compatibility_matrix.xml

Tüm HAL'lerin optional="true" olarak ayarlandığını unutmayın.

Örnek: Cihaz manifest dosyasından iskelet çerçevesi uyumluluk matrisi oluşturma

assemble_vintf -m --hals-only \
    -i device/foo/bar/manifest.xml \
    -o path/to/place/output/compatibility_matrix.xml

Tüm HAL'lerin optional="true" olarak ayarlandığını unutmayın.

Örnek: Değişkenlerden cihaz manifesti XML dosyaları oluşturma

Derleme sırasında, aşağıdaki değişkenler device/manufacturer/device_name/BoardConfig.mk içinde tanımlanmışsa:

# Vendor manifest is named DEVICE_MANIFEST_FILE for legacy reasons.
DEVICE_MANIFEST_FILE := \
    device/manufacturer/device_name/vendor_manifest.xml
ODM_MANIFEST_FILES := \
    device/manufacturer/device_name/odm_manifest.xml
ODM_MANIFEST_SKUS := sku1 sku2
ODM_MANIFEST_SKU1_FILES := \
    device/manufacturer/device_name/odm_manifest_sku1.xml
ODM_MANIFEST_SKU2_FILES := \
    device/manufacturer/device_name/odm_manifest_sku2.xml

Ardından, cihaz manifesti XML dosyalarını oluşturmak için aşağıdaki komutlar yürütülür (derleme sisteminde, uygulama ayrıntılarını atlamak için değiştirilir):

# vendor manifest; only when DEVICE_MANIFEST_FILE is set
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) assemble_vintf \
    $(addprefix,-i ,$(DEVICE_MANIFEST_FILE)) \
    -o $(TARGET_OUT_VENDOR)/etc/vintf/manifest.xml

# ODM manifests
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest.xml

# ODM manifests for each sku
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_SKU1_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku1.xml
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_SKU2_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku2.xml

VINTF nesnesi, çalışma zamanında tedarikçi manifestlerini ve ODM manifestlerini cihaz manifesti olarak birleştirir. Ayrıntılar için Cihaz manifesti başlıklı makaleyi inceleyin.

Örnek: Değişkenlerden cihaz uyumluluğu matrisi XML dosyaları oluşturma

Derleme sırasında, aşağıdaki değişkenler device/manufacturer/device_name/BoardConfig.mk içinde tanımlanmışsa:

# vendor compatibility matrix is named DEVICE_MATRIX_FILE for legacy reasons.
DEVICE_MATRIX_FILE := \
    device/manufacturer/device_name/vendor_compatibility_matrix.xml \
    device/manufacturer/device_name/vendor_compatibility_matrix_additional.xml

Ardından, cihaz uyumluluğu matrisi XML dosyalarını oluşturmak için aşağıdaki komutlar çalıştırılır (derleme sisteminde, uygulama ayrıntılarını atlamak için değiştirilir):

# vendor compatibility matrix; only when DEVICE_MATRIX_FILE is set
assemble_vintf \
    $(addprefix,-i ,$(DEVICE_MATRIX_FILE)) \
    -o $(TARGET_OUT_VENDOR)/etc/vintf/compatibility_matrix.xml

VINTF nesnesi, çalışma zamanında cihaz uyumluluk matrisi olarak satıcı uyumluluk matrisini kullanır. Ayrıntılar için Cihaz uyumluluğu matrisi başlıklı makaleye bakın.

Örnek: Değişkenlerden çerçeve manifesti XML dosyaları oluşturma

Aşağıdaki değişkenler device/manufacturer/device_name/BoardConfig.mk içinde tanımlanabilir:

# Device-specific system manifest is named DEVICE_FRAMEWORK_MANIFEST_FILE for legacy reasons
DEVICE_FRAMEWORK_MANIFEST_FILE := \
    device/manufacturer/device_name/device_system_manifest.xml

# Product manifest
PRODUCT_MANIFEST_FILES := \
    device/manufacturer/device_name/product_manifest.xml

Çerçeve manifest XML dosyalarını oluşturmak için aşağıdaki komutlar (derleme sisteminde, uygulama ayrıntılarını atlamak üzere değiştirilmiş olarak) yürütülür:

# system manifest
assemble_vintf \
    -i system/libhidl/vintfdata/manifest.xml \
    $(addprefix,-i ,$(DEVICE_FRAMEWORK_MANIFEST_FILE)) \
    -o $(TARGET_OUT)/etc/vintf/manifest.xml

# product manifest
assemble_vintf \
    $(addprefix,-i ,$(PRODUCT_MANIFEST_FILES)) \
    -o $(TARGET_OUT_PRODUCT)/etc/vintf/manifest.xml

VINTF nesnesi, çalışma zamanında sistem manifestosu, sistem manifestosu parçaları, ürün manifestosu ve ürün manifestosu parçalarını çerçeve manifestosu olarak birleştirir. Ayrıntılar için Framework manifest başlıklı makaleyi inceleyin.

Örnek: Değişkenlerden çerçeve uyumluluğu matrisi XML dosyaları oluşturma

Ürün FCM'sini ve cihaza özel sistem FCM'sini tanımlamak için device/manufacturer/device_name/BoardConfig.mk içinde aşağıdaki değişkenler tanımlanabilir:

DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE := \
    device/manufacturer/device_name/product_compatibility_matrix.xml
# Device-specific system compatibility matrix is named
# DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE for legacy reasons.
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := \
    device/manufacturer/device_name/device_system_compatibility_matrix.xml

system_ext FCM, Soong modülleriyle birlikte yüklenmelidir. Ürün FCM'si Soong modülleriyle de yüklenebilir. Bu yöntem kullanılıyorsa DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE tanımlamayın. Ayrıca, Soong modülleriyle birden fazla ürün FCM sürümü ve system_ext FCM sürümü yüklenebilir. Aşağıdakileri tanımlayın:

  • device/manufacturer/device_name/Android.bp içinde bir modül tanımlayın. Örneğin (ürün FCM'si için system_ext yerine product yazın):
    vintf_compatibility_matrix {
        name: "system_ext_compatibility_matrix.xml",
        stem: "compatibility_matrix.xml",
        system_ext_specific: true,
        // product_specific: true, // for product FCM
        srcs: [
            "system_ext_compatibility_matrix.xml",
        ],
    }
  • Modülü device/manufacturer/device_name/device.mk konumuna yükleyin. Örneğin:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

Çerçeve uyumluluk matrisi XML dosyalarını oluşturmak için aşağıdaki komutlar (derleme sisteminde, uygulama ayrıntılarını atlamak için değiştirilmiş olarak) yürütülür:

# common system compatibility matrix for each FCM version
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) \
POLICYVERS=$(POLICYVERS) \
BOARD_AVB_VBMETA_VERSION=$(BOARD_AVB_VBMETA_VERSION)
assemble_vintf \
    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml
    $(addprefix,-i ,$(DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE)) \
    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.device.xml

# framework compatibility matrixes at each FCM version
assemble_vintf
    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.{level}.xml \
    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.{level}.xml \
    --kernel=...

# product framework compatibility matrix; only when
# DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE is set or when the Soong module for
# product FCM is defined
assemble_vintf
    -i $(DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE)
    -o $(TARGET_OUT_PRODUCT)/etc/vintf/compatibility_matrix.xml

# system_ext framework compatibility matrix; only when the Soong module for
# system_ext FCM is defined
assemble_vintf
    -i <srcs for the soong module>
    -o $(TARGET_OUT_SYSTEM_EXT)/etc/vintf/compatibility_matrix.xml

Çalışma zamanında VINTF nesnesi, sistem uyumluluğu matrislerinin ve ürün uyumluluğu matrislerinin bir alt kümesini çerçeve uyumluluğu matrisi olarak birleştirir. Ayrıntılar için Framework uyumluluk matrisine bakın.

Örnek: Parçalardan tedarikçi manifesti oluşturma

Derleme sırasında birden fazla satıcı manifesti parçası paketlenebilir. Örneğin:

<!-- device/manufacturer/device_name/manifest_common.xml -->
<manifest version="1.0" type="device">
    <!-- common HALs here -->
</manifest>
<!-- device/manufacturer/device_name/ir.xml -->
<manifest version="1.0" type="device">
    <hal>
        <name>android.hardware.ir</name>
        <version>1.0</version>
        <!-- other fields -->
    </hal>
</manifest>
# device/manufacturer/device_name/BoardConfig.mk
DEVICE_MANIFEST_FILE := device/manufacturer/device_name/manifest_common.xml
ifdef BOARD_ENABLE_IR
    DEVICE_MANIFEST_FILE += device/manufacturer/device_name/ir.xml
endif

Ardından, assemble_vintf, BOARD_ENABLE_IR tanımlanmışsa IR HAL'ı tedarikçi manifestine ekler, BOARD_ENABLE_IR tanımlanmamışsa eklemez. Aşağıdaki komutlar (uygulama ayrıntılarını atlamak için değiştirilmiştir) satıcı manifestosunu oluşturmak üzere yürütülür:

# if BOARD_ENABLE_IR is defined
BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
    -i device/manufacturer/device_name/manifest_common.xml:device/manufacturer/device_name/ir.xml \
    -o $(TARGET_OUT_VENDOR)/manifest.xml

# if BOARD_ENABLE_IR is not defined
BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
    -i device/manufacturer/device_name/manifest_common.xml \
    -o $(TARGET_OUT_VENDOR)/manifest.xml

Ayrıntılar için bkz.:

assemble_vintf --help

Test

platform/system/libvintf projesi, serileştirme, seri durumdan çıkarma ve uyumluluk kontrolü için GTest'i kullanır.

Lisanslama

  • Nesneyi XML'ye/XML'den seri hale getirmek/seri durumdan çıkarmak için tinyxml2 (external/tinyxml2). BSD benzeri lisans.
  • Policydb sürümünü almak için libselinux (external/selinux/libselinux). Kamu alanı lisansı.
  • libz (external/zlib) for decompressing /proc/config.gz. BSD benzeri lisans.
  • libvintf projesi, Apache 2.0 lisansını (uygun MODULE_LICENSE_APACHE2 ve NOTICE dosyalarıyla birlikte) kullanır.