Eski HAL'ler

HAL, donanım satıcılarının uygulaması için standart bir arabirim tanımlar ve bu, Android'in alt düzey sürücü uygulamaları konusunda agnostik olmasını sağlar. Bir HAL kullanmak, üst düzey sistemi etkilemeden veya değiştirmeden işlevsellik uygulamanıza izin verir. Bu sayfada, Android 8.0'dan itibaren artık desteklenmeyen eski mimari açıklanmaktadır. Android 8.0 ve üstü için lütfen HAL'a Genel Bakış bölümüne bakın.

HAL bileşenleri

Şekil 1. HAL bileşenleri

Ü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şiktir, ancak Android, HAL uygulaması ile aygıt sürücüleri arasında standart bir etkileşimi zorunlu kılmadığı için, durumunuz için en iyi olanı yapabilirsiniz. Bununla birlikte, Android sisteminin donanımınızla doğru şekilde etkileşim kurmasını sağlamak için donanıma özgü her HAL arabiriminde tanımlanan sözleşmeye uymanız gerekir .

HAL'lerin öngörülebilir bir yapıya sahip olmasını garanti etmek için, donanıma özgü her HAL arayüzü, hardware/libhardware/include/hardware/hardware.h içinde tanımlanan özelliklere sahiptir. Bu arabirim, Android sisteminin HAL modüllerinizin doğru sürümlerini tutarlı bir şekilde yüklemesini sağlar. Bir 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ı ( hw_module_t ) tanımlar. Android, HAL modülünü doğru bir ş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 işaretçi içeren hw_module_methods_t adlı başka bir yapıya işaretçi içerir. Bu açık işlev, HAL'ın bir soyutlama olarak hizmet ettiği donanımla iletişimi başlatmak için kullanılır. Her bir donanıma özgü HAL, genellikle genel hw_module_t yapısını o belirli 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çileriyle birlikte 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 uyguladığınızda ve 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ı, bir USB ses cihazı veya bir Bluetooth A2DP ses cihazı içerebilir.

Bir aygıt, hw_device_t yapısıyla temsil edilir. Bir modüle benzer şekilde, her aygıt türü, donanımın belirli özellikleri için işlev işaretçileri 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ç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 arabirimi, kendi özelliklerinden ve gereksinimlerinden daha fazlasını tanımlayabilir. Ayrıntılar için HAL referans belgelerine ve ayrıca her HAL için ayrı talimatlara bakın.

HAL modülleri oluşturma

HAL uygulamaları, modül ( .so ) dosyalarına yerleştirilmiştir 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 bulunabilmeleri ve yüklenebilmeleri için belirli bir biçimde adlandırılmaları gerekir. Adlandırma şeması modülden modüle biraz değişir, ancak şu genel modeli izler: <module_type>.<device_name> .

Eski HAL

Eski HAL terimi, genel olarak tüm Android 8.0 öncesi HAL'leri ifade eder (Android 8'de kullanımdan kaldırılmıştır). Android sistem arabirimlerinin çoğu (kamera, ses, sensörler vb.) "donanım/libhardware/include/hardware" altında tanımlanır ve kabaca sürümlendirmeye ve kabaca kararlı bir ABI'ya sahiptir. Birkaç alt sistem (Wi-Fi, Radyo Arayüz Katmanı ve Bluetooth dahil), "libhardware_legacy" içinde standartlaştırılmamış başka arayüzlere sahiptir veya kod tabanı boyunca serpiştirilmiştir. Eski HAL'ler hiçbir zaman katı kararlılık garantileri sağlamadı.