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_
veBOARD_
ö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.