Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Membuat Antarmuka HAL

Anda harus menggunakan HIDL untuk menjelaskan semua flag build yang digunakan untuk mengompilasi kerangka kerja secara kondisional. Relevan membangun bendera harus dikelompokkan dan termasuk dalam satu .hal berkas. Menggunakan HIDL untuk menentukan item konfigurasi mencakup manfaat berikut:

  • Berversi (untuk menambahkan item konfigurasi baru, vendor/OEM harus secara eksplisit memperpanjang HAL)
  • Didokumentasikan dengan baik
  • Kontrol akses menggunakan SELinux
  • Kewarasan memeriksa item konfigurasi melalui vendor Test Suite (kisaran cek, antar-ketergantungan cek antara barang-barang, dll)
  • API yang dibuat secara otomatis di C++ dan Java

Mengidentifikasi flag build yang digunakan oleh framework

Mulailah dengan mengidentifikasi konfigurasi build yang digunakan untuk mengompilasi kerangka kerja secara kondisional, lalu mengabaikan konfigurasi usang untuk membuat set lebih kecil. Sebagai contoh, berikut himpunan membangun bendera diidentifikasi untuk surfaceflinger :

  • 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

Membuat antarmuka HAL

Konfigurasi membangun untuk subsistem diakses melalui antarmuka HAL, sementara antarmuka untuk memberikan nilai konfigurasi dikelompokkan dalam paket HAL android.hardware.configstore (saat ini di versi 1.0). Misalnya, untuk membuat file HAL antarmuka untuk surfaceflinger , di hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal :

package android.hardware.configstore@1.0;

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

Setelah membuat .hal berkas, jalankan hardware/interfaces/update-makefiles.sh untuk menambahkan baru .hal file ke Android.bp dan Android.mk file.

Menambahkan fungsi untuk membangun flag

Untuk setiap flag build, tambahkan fungsi baru ke antarmuka. Misalnya, dalam 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);
};

Saat menambahkan fungsi:

  • Singkat dengan nama. Hindari mengubah nama variabel makefile menjadi nama fungsi dan perlu diingat bahwa TARGET_ dan BOARD_ prefiks tidak lagi diperlukan.
  • Tambahkan komentar. Bantu developer memahami tujuan item konfigurasi, bagaimana item tersebut mengubah perilaku kerangka kerja, nilai yang valid, dan informasi relevan lainnya.

Jenis fungsi kembali dapat Optional[Bool|String|Int32|UInt32|Int64|UInt64] . Jenis didefinisikan dalam types.hal di direktori yang sama dan bungkus nilai primitif dengan bidang yang menunjukkan jika nilai ditentukan oleh HAL tersebut; jika tidak, nilai default yang digunakan.

struct OptionalString {
    bool specified;
    string value;
};

Jika sesuai, tentukan enum yang paling mewakili jenis item konfigurasi dan gunakan enum itu sebagai jenis pengembalian. Dalam contoh di atas, NumBuffers enum didefinisikan untuk membatasi jumlah nilai yang valid. Ketika mendefinisikan tipe data kustom seperti, menambahkan lapangan atau nilai enum (misalnya, USE_DEFAULT ) untuk yang menunjukkan jika nilai / tidak ditentukan oleh HAL.

Tidak wajib untuk satu flag build menjadi satu fungsi di HIDL. Pemilik modul dapat secara alternatif menggabungkan flag build yang terkait erat ke dalam struct dan memiliki fungsi yang mengembalikan struct itu (melakukan hal itu dapat mengurangi jumlah pemanggilan fungsi).

Sebagai contoh, pilihan untuk menggabungkan dua membangun bendera ke dalam struct tunggal di hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal adalah:

 interface ISurfaceFlingerConfigs {
    // other functions here
    struct SyncConfigs {
        OptionalInt64 vsyncEventPhaseoffsetNs;
        OptionalInt64 presentTimeoffsetFromSyncNs;
    };
    getSyncConfigs() generates (SyncConfigs ret);
    // other functions here
};

Alternatif untuk satu fungsi HAL

Sebagai alternatif untuk menggunakan fungsi HAL tunggal untuk semua bendera membangun, antarmuka HAL juga menyediakan fungsi sederhana seperti getBoolean(string key) dan getInteger(string key) . Sebenarnya key=value pasangan disimpan dalam file terpisah dan layanan HAL memberikan nilai dengan membaca / parsing file-file tersebut.

Meskipun pendekatan ini mudah didefinisikan, pendekatan ini tidak menyertakan manfaat yang diberikan oleh HIDL (versi yang diterapkan, kemudahan dokumentasi, kontrol akses) dan oleh karena itu tidak disarankan.

Antarmuka tunggal dan ganda

Desain antarmuka HAL untuk item konfigurasi menyajikan dua pilihan:

  • Antarmuka tunggal yang mencakup semua item konfigurasi
  • Beberapa antarmuka, yang masing-masing mencakup satu set item konfigurasi terkait

Antarmuka tunggal lebih mudah tetapi dapat menjadi tidak dapat dipertahankan karena lebih banyak item konfigurasi ditambahkan ke file tunggal. Selain itu, kontrol akses tidak berbutir halus, sehingga proses yang diberikan akses ke antarmuka dapat membaca semua item konfigurasi (akses ke sebagian set item konfigurasi tidak dapat diberikan). Atau, jika akses tidak diberikan, item konfigurasi tidak dapat dibaca.

Karena masalah ini, Android menggunakan beberapa antarmuka dengan antarmuka HAL tunggal untuk sekelompok item konfigurasi terkait. Misalnya, ISurfaceflingerConfigs untuk surfaceflinger -terkait konfigurasi item, dan IBluetoothConfigs untuk item konfigurasi Bluetooth-terkait.