Eski HAL'ler

HAL, donanım tedarikçilerinin uygulayabileceği standart bir arayüz tanımlar. Bu sayede Android, alt düzey sürücü uygulamaları konusunda tarafsız olabilir. HAL kullanmak, üst düzey sistemi etkilemeden veya değiştirmeden işlevleri uygulamanıza olanak tanır. Bu sayfada, Android 8.0'dan itibaren artık desteklenmeyen eski mimari açıklanmaktadır. Android 8.0 ve sonraki sürümler için lütfen HAL'e Genel Bakış başlıklı makaleyi inceleyin.

HAL bileşenleri

Şekil 1. HAL bileşenleri

Ürününüzün sağladığı donanım için ilgili HAL'i (ve sürücüyü) uygulamanız gerekir. HAL uygulamaları genellikle paylaşılan kitaplık modüllerine (.so dosyaları) yerleştirilir ancak Android, HAL uygulaması ile cihaz sürücüleri arasında standart bir etkileşim zorunluluğu getirmediğinden durumunuza en uygun işlemi yapabilirsiniz. Ancak Android sisteminin donanımınızla doğru şekilde etkileşim kurmasını sağlamak için her donanıma özgü HAL arayüzünde tanımlanan sözleşmeye uymanız gerekir.

HAL'lerin tahmin edilebilir bir yapıya sahip olmasını sağlamak için her donanıma özgü HAL arayüzünde hardware/libhardware/include/hardware/hardware.h içinde tanımlanmış ö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ü, modüller ve cihazlar olmak üzere iki bileşenden oluşur.

HAL modülleri

Modül, paketlenmiş HAL uygulamanızı temsil eder ve paylaşılan kitaplık (.so file) olarak depolanır. 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ı (hw_module_t) tanımlar. Android, HAL modülünü doğru şekilde bulup yüklemek için bu meta verileri kullanır.

Ayrıca hw_module_t yapısı, modül için açık bir işlevin işaretçisini içeren başka bir yapı olan hw_module_methods_t yapısının işaretçisini içerir. Bu open işlevi, HAL'ın soyutlama görevi gördüğü donanımla iletişimi başlatmak için kullanılır. Donanıma özgü her HAL, genellikle genel hw_module_t struct'u söz konusu donanım parçasıyla ilgili ek bilgilerle genişletir. Örneğin, kamera HAL'inde camera_module_t yapısı, kameraya özgü diğer 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'i uygulayıp modül yapısını oluşturduğunuzda HAL_MODULE_INFO_SYM olarak adlandırmanız gerekir. Nexus 9 ses HAL'inden ö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ı

Cihaz, ürününüzün donanımını soyutlar. Örneğin, bir ses modülü birincil ses cihazı, USB ses cihazı veya Bluetooth A2DP ses cihazı içerebilir.

Cihaz, hw_device_t yapısıyla temsil edilir. Modüllere benzer şekilde her cihaz türü, donanımın belirli özellikleri için işlev işaretçileri içeren genel hw_device_t'ün ayrıntılı bir sürümünü tanımlar. Örneğin, audio_hw_device_t yapı türü ses cihazı işlemlerine ait işlev işaretçileri 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, donanıma özgü her HAL arayüzü kendi özelliklerini ve koşullarını daha fazla tanımlayabilir. Ayrıntılar için HAL referans dokümanlarına ve her HAL'e ait talimatlara bakın.

HAL modülleri oluşturma

HAL uygulamaları, modüllere (.so) yerleştirilir 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şturup kaynak dosyalarınızı işaretleyerek modüllerinizi derleyebilirsiniz. Genel olarak, paylaşılan kitaplıklarınızın düzgün bir şekilde bulunup yüklenmesi için belirli bir biçimde adlandırılması gerekir. Adlandırma şeması modülden modüle biraz farklılık gösterir ancak genel kalıbı <module_type>.<device_name> şeklindedir.

Eski HAL

Eski HAL terimi, genel olarak Android 8.0 öncesi tüm HAL'leri (Android 8'de desteği sonlandırılmıştır) ifade eder. Android sistem arayüzlerinin çoğu (kamera, ses, sensörler vb.) "hardware/libhardware/include/hardware" altında tanımlanır ve kaba sürüm numaralarına ve kabaca kararlı bir ABI'ye sahiptir. Birkaç alt sistemde ("libhardware_legacy" içinde veya kod tabanı boyunca dağıtılmış kablosuz bağlantı, radyo arayüzü katmanı ve Bluetooth dahil) standartlaştırılmamış başka arayüzler bulunur. Eski HAL'ler hiçbir zaman kararlılık garantisi sağlamamıştır.