HAL arayüzünü oluşturma

Çerçeveyi koşullu olarak derlemek için kullanılan tüm derleme işaretlerini tanımlamak için HIDL'yi kullanmanız gerekir. İlgili derleme işaretleri gruplandırılmalı ve tek bir .hal dosyasına dahil edilmelidir. Yapılandırma öğelerini belirtmek için HIDL'yi kullanmak aşağıdaki avantajları içerir:

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

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

Çerçeveyi koşullu olarak derlemek için kullanılan derleme yapılandırmalarını tanımlayarak başlayın. Ardından, grubu küçültmek için eski yapılandırmalardan vazgeçin. Ö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 için derleme yapılandırmalarına HAL arayüzünden erişilir. Yapılandırma değerlerini vermek için kullanılan arayüzler ise android.hardware.configstore (şu anda sürüm 1.0'da) içinde gruplandırılır. Örneğin, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal konumunda surfaceflinger için bir HAL arayüz dosyası oluşturmak amacıyla:

package android.hardware.configstore@1.0;

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

.hal dosyasını oluşturduktan sonra, yeni .hal dosyasını Android.bp ve Android.mk dosyalarına eklemek için hardware/interfaces/update-makefiles.sh komutunu çalıştırın.

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şken adlarını işlev adlarına dönüştürmekten kaçının ve TARGET_ ve BOARD_ ön eklerinin artık gerekli olmadığını unutmayın.
  • Yorum ekleyin. Geliştiricilerin, yapılandırma öğesinin amacını, çerçeve davranışını nasıl değiştirdiğini, geçerli değerleri ve diğer alakalı bilgileri anlamalarına yardımcı olun.

İşlev dönüş türleri Optional[Bool|String|Int32|UInt32|Int64|UInt64] olabilir. Türler, types.hal öğesinde aynı dizinde tanımlanır ve temel değerleri, değerin HAL tarafından belirtilip belirtilmediğini belirten bir alanla sarmalar. Belirtilmezse varsayılan değer kullanılır.

struct OptionalString {
    bool specified;
    string value;
};

Uygun olduğunda yapılandırma öğesinin türünü en iyi temsil eden enum'u tanımlayın ve bu sıralamayı döndürülen türü olarak kullanın. Yukarıdaki örnekte NumBuffers sıralaması, geçerli değerlerin sayısını sınırlamak için tanımlanmıştır. Bu tür özel veri türlerini tanımlarken, değerin HAL tarafından belirtilip belirtilmediğini belirtmek için bir alan veya sıralama değeri (örneğin, USE_DEFAULT) ekleyin.

Tek bir derleme işaretinin HIDL'de tek bir işlev haline gelmesi zorunlu değildir. Modül sahipleri, alternatif olarak yakından ilgili derleme işaretlerini bir struct'ta toplayabilir ve bu struct'ı döndüren bir işleve sahip olabilir (böylece işlev çağrılarının sayısı azaltılabilir).

Örneğin, hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal içinde iki derleme işaretini tek bir struct'da toplama seçeneği şu şekildedir:

 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 sağlar. Gerçek key=value çiftleri ayrı dosyalarda depolanır ve HAL hizmeti, bu dosyaları okuyarak/ayrıştırarak değerler sağlar.

Bu yaklaşımın tanımlanması kolay olsa da HIDL'nin sağladığı avantajları (zorunlu sürüm oluşturma, belgeleme kolaylığı, erişim denetimi) içermez ve dolayısıyla önerilmez.

Tek ve çoklu arayüz

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

  • Tüm yapılandırma öğelerini kapsayan tek bir arayüz
  • Her biri bir dizi ilgili yapılandırma öğesini kapsayan birden çok arayüz

Tek bir arayüz kullanımı daha kolaydır, ancak tek dosyaya daha fazla yapılandırma öğesi eklendiğinden yönetilemez hale gelebilir. Ayrıca, erişim denetimi çok ayrıntılı değildir. Bu nedenle, arayüze erişim izni verilen bir işlem tüm yapılandırma öğelerini okuyabilir (kısmi bir yapılandırma öğeleri kümesine erişim izni verilmez). Alternatif olarak, erişim izni verilmezse yapılandırma öğeleri okunamaz.

Bu sorunlar nedeniyle Android, ilgili yapılandırma öğeleri grubu için tek bir HAL arayüzüne sahip birden çok arayüz kullanır. Örneğin, surfaceflinger ile ilgili yapılandırma öğeleri için ISurfaceflingerConfigs ve Bluetooth ile ilgili yapılandırma öğeleri için IBluetoothConfigs.