HAL, donanım satıcılarının uygulayabileceği standart bir arayüz tanımlar; bu, Android'in alt düzey sürücü uygulamaları konusunda bağımsız olmasını sağlar. HAL kullanmak, üst düzey sistemi etkilemeden veya değiştirmeden işlevsellik uygulamanıza olanak tanır. Bu sayfada, Android 8.0'dan itibaren artık desteklenmeyen eski mimari açıklanmaktadır. Android 8.0 ve üzeri için lütfen HAL'a Genel Bakış'a bakın.
Ürününüzün sağladığı belirli donanım için ilgili HAL'yi (ve sürücüyü) uygulamanız gerekir. HAL uygulamaları genellikle paylaşılan kitaplık modüllerinde ( .so
dosyaları) yerleşik olarak bulunur, ancak Android, HAL uygulaması ile aygıt sürücüleri arasında standart bir etkileşimi zorunlu kılmadığı için, durumunuza en uygun olanı yapabilirsiniz. Ancak Android sisteminin donanımınızla doğru şekilde etkileşime geçmesini sağlamak için donanıma özgü her HAL arayüzünde tanımlanan sözleşmeye uymanız gerekir .
HAL'lerin öngörülebilir bir yapıya sahip olmasını garanti etmek için, her donanıma özgü HAL arayüzünde hardware/libhardware/include/hardware/hardware.h
dosyasında tanımlanan özellikler bulunur. Bu arayüz, Android sisteminin HAL modüllerinizin doğru sürümlerini tutarlı bir şekilde yüklemesine olanak tanır. HAL arayüzü iki bileşenden oluşur: modüller ve cihazlar.
HAL modülleri
Bir modül, paylaşılan bir kitaplık ( .so file
) olarak depolanan paketlenmiş HAL uygulamanızı temsil eder. hardware/libhardware/include/hardware/hardware.h
başlık dosyası, bir modülü temsil eden ve modülün sürümü, adı ve yazarı gibi meta verileri içeren bir yapıyı ( hw_module_t
) tanımlar. Android, HAL modülünü doğru şekilde bulmak ve yüklemek için bu meta verileri kullanır.
Ek olarak, hw_module_t
yapısı, modül için açık bir işleve yönelik bir işaretçi içeren başka bir yapıya ( hw_module_methods_t
) yönelik bir işaretçi içerir. Bu açık işlev, HAL'in soyutlama görevi gördüğü donanımla iletişimi başlatmak için kullanılır. Her donanıma özgü HAL genellikle genel hw_module_t
yapısını söz konusu donanım parçası için ek bilgilerle genişletir. Örneğin, kamera HAL'sinde, camera_module_t
yapısı, diğer kameraya özgü işlev işaretçilerinin yanı sıra bir hw_module_t
yapısı içerir:
typedef struct camera_module { hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); } camera_module_t;
Bir HAL uygulayıp modül yapısını oluşturduğunuzda, onu HAL_MODULE_INFO_SYM
olarak adlandırmalısınız. Nexus 9 ses HAL'sinden örnek:
struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = AUDIO_MODULE_API_VERSION_0_1, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = AUDIO_HARDWARE_MODULE_ID, .name = "NVIDIA Tegra Audio HAL", .author = "The Android Open Source Project", .methods = &hal_module_methods, }, };
HAL cihazları
Bir cihaz, ürününüzün donanımını soyutlar. Örneğin, bir ses modülü bir birincil ses cihazını, bir USB ses cihazını veya bir Bluetooth A2DP ses cihazını içerebilir.
Bir cihaz hw_device_t
yapısıyla temsil edilir. Bir modüle benzer şekilde, her aygıt türü, donanımın belirli özelliklerine yönelik işlev işaretçilerini içeren genel hw_device_t
ayrıntılı bir sürümünü tanımlar. Örneğin, audio_hw_device_t
yapı türü, ses cihazı işlemlerine yönelik işlev işaretçilerini içerir:
struct audio_hw_device { struct hw_device_t common; /** * used by audio flinger to enumerate what devices are supported by * each audio_hw_device implementation. * * Return value is a bitmask of 1 or more values of audio_devices_t */ uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); ... }; typedef struct audio_hw_device audio_hw_device_t;
Bu standart özelliklere ek olarak, her donanıma özel HAL arayüzü, kendine ait daha fazla özellik ve gereksinimi tanımlayabilir. Ayrıntılar için HAL referans belgelerinin yanı sıra her HAL'e ilişkin ayrı talimatlara bakın.
HAL modülleri oluşturun
HAL uygulamaları modül ( .so
) dosyalarına yerleşiktir ve uygun olduğunda Android tarafından dinamik olarak bağlanır. HAL uygulamalarınızın her biri için Android.mk
dosyaları oluşturarak ve kaynak dosyalarınızı işaret ederek modüllerinizi oluşturabilirsiniz. Genel olarak, paylaşılan kitaplıklarınızın düzgün bir şekilde bulunabilmesi ve yüklenebilmesi için belirli bir biçimde adlandırılması gerekir. Adlandırma şeması modülden modüle biraz farklılık gösterir ancak şu genel modeli izler: <module_type>.<device_name>
.