HAL arayüzünü oluşturma

.

Koşullu olarak kullanılan tüm derleme işaretlerini tanımlamak için HIDL kullanmanız gerekir ve çerçeveyi derlemek. İlgili derleme işaretleri gruplanmalı ve tek .hal dosyası. Yapılandırma öğelerini belirtmek için HIDL kullanma şu faydaları içerir:

  • Sürümlü (yeni yapılandırma öğeleri eklemek için tedarikçi firmalar/OEM'ler HAL) ekleme
  • İyi belgelenmiş
  • SELinux kullanarak erişim denetimi
  • Yapılandırma öğeleri için Tedarikçi Firma Testi Paket (aralık kontrolü, öğeler arasında karşılıklı bağımlılık kontrolü vb.)
  • Hem C++ hem de Java'da otomatik olarak oluşturulan API'ler

Çerçeve tarafından kullanılan derleme işaretlerini tanımlama

Koşullu olarak derlemek için kullanılan derleme yapılandırmalarını çerçevesini kullanıp eski yapılandırmalardan yarılanarak kümeyi küçültebilirsiniz. Örneğin, surfaceflinger için aşağıdaki derleme işaretleri grubu tanımlanır:

  • TARGET_USES_HWC2
  • TARGET_BOARD_PLATFORM
  • TARGET_DISABLE_TRIPLE_BUFFERING
  • TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
  • NUM_FRAMEBUFFER_SURFACE_BUFFERS
  • TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK
  • VSYNC_EVENT_PHASE_OFFSET_NS
  • SF_VSYNC_EVENT_PHASE_OFFSET_NS
  • PRESENT_TIME_OFFSET_FROM_VSYNC_NS
  • MAX_VIRTUAL_DISPLAY_DIMENSION

HAL arayüzü oluşturma

Alt sistem derleme yapılandırmalarına HAL arayüzü üzerinden erişilirken yapılandırma değerleri vermeye yönelik arayüzler, HAL paketinde gruplandırılır android.hardware.configstore (şu anda 1.0 sürümünde). Örneğin, surfaceflinger için bir HAL arayüz dosyası oluşturmak üzere hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal:

package android.hardware.configstore@1.0;

interface ISurfaceFlingerConfigs {
    // TO-BE-FILLED-BELOW
};

.hal dosyasını oluşturduktan sonra, Yeni eklemek için hardware/interfaces/update-makefiles.sh .hal dosyasını Android.bp ve Android.mk dosya.

Derleme işaretleri için işlev ekleme

Her derleme işareti için arayüze yeni bir işlev ekleyin. Örneğin, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal:

interface ISurfaceFlingerConfigs {
    disableTripleBuffering() generates(OptionalBool ret);
    forceHwcForVirtualDisplays() generates(OptionalBool ret);
    enum NumBuffers: uint8_t {
        USE_DEFAULT = 0,
        TWO = 2,
        THREE = 3,
    };
    numFramebufferSurfaceBuffers() generates(NumBuffers ret);
    runWithoutSyncFramework() generates(OptionalBool ret);
    vsyncEventPhaseOffsetNs generates (OptionalUInt64 ret);
    presentTimeOffsetFromSyncNs generates (OptionalUInt64 ret);
    maxVirtualDisplayDimension() generates(OptionalInt32 ret);
};

İşlev eklerken:

  • Adları kısa ve öz tutun. Makefile değişkenini dönüştürmekten kaçınma adlarını işlev adlarına ayırarak uygulayın ve TARGET_ ve BOARD_ ön ekleri artık gerekli değil.
  • Yorum ekleyin. Geliştiricilerin yapılandırma öğesinin, çerçeve davranışını nasıl değiştirdiğini, geçerli değerleri ve ekleyebilirsiniz.

İşlev dönüş türleri Optional[Bool|String|Int32|UInt32|Int64|UInt64] Türler tanımlı types.hal içinde aynı dizinde yer alın ve temel değerleri bir değer HAL tarafından belirtilip belirtilmediğini gösteren bir alandır; gönderilmiyorsa varsayılan değeri kullanılır.

struct OptionalString {
    bool specified;
    string value;
};

Uygun olduğunda yapılandırma öğesini seçin ve dönüş türü olarak bu enum'u kullanın. Yukarıdaki örnekte, NumBuffers sıralaması, geçerli öğe sayısını sınırlandırmak için değerler. Bu tür özel veri türlerini tanımlarken alan veya sıralama değeri ( değer belirtilmediğinde/belirtilmediğinde belirtmek için USE_DEFAULT) gibi tarafından desteklenmektedir.

Tek bir derleme işaretinin HIDL. Modül sahipleri, alternatif olarak yakın ilgili derleme işaretlerini bir struct'ı vardır ve bu struct'ı döndüren bir işleve sahiptir (böylece azaltılabilir sayısı).

Örneğin, iki derleme işaretini tek bir struct'ta toplama seçeneği hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal sonra şununla eşleşir:

 interface ISurfaceFlingerConfigs {
    // other functions here
    struct SyncConfigs {
        OptionalInt64 vsyncEventPhaseoffsetNs;
        OptionalInt64 presentTimeoffsetFromSyncNs;
    };
    getSyncConfigs() generates (SyncConfigs ret);
    // other functions here
};

Tek bir HAL işlevine alternatifler

Tüm derleme işaretleri için tek bir HAL işlevi kullanmaya alternatif olarak HAL arayüz, getBoolean(string key) ve getInteger(string key) gibi basit işlevler de sunar. Asıl key=value çift, ayrı dosyalarda ve HAL hizmetinde depolanır bu dosyaları okuyarak/ayrıştırarak değerler sağlar.

Bu yaklaşımın tanımlanması kolay olsa da HIDL tarafından sağlanan (zorunlu sürüm oluşturma, belgeleme kolaylığı, erişim denetimi) Bu nedenle önerilmez.

Tek ve çoklu arayüz

Yapılandırma öğeleri için HAL arayüzünün tasarımı iki seçenekler:

  • Tüm yapılandırma öğelerini kapsayan tek bir arayüz
  • Her biri ilgili yapılandırmalar içeren birden çok arayüz öğe

Tek bir arayüz, kolaylaşır ancak daha fazla cihaz kullandıkça yapılandırma öğeleri tek dosyaya eklenir. Bunun yanı sıra, erişim denetimi ayrıntılı olmadığından, arayüze erişim izni verilen bir işlem, yapılandırma öğelerine (kısmi bir yapılandırma öğeleri verildi). Alternatif olarak, erişim izni verilmezse yapılandırma öğeleri okuyun.

Bu sorunlar nedeniyle Android, tek bir HAL'ye sahip birden çok arayüz kullanır. bir grup ilgili yapılandırma öğesinin bulunduğu arayüzdür. Örneğin, surfaceflinger ile ilgili ISurfaceflingerConfigs yapılandırma öğeleri için ve Bluetooth ile ilgili olarak IBluetoothConfigs yapılandırma öğeleri.