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

Membuat Antarmuka HAL

Anda harus menggunakan HIDL untuk mendeskripsikan semua flag build yang digunakan untuk mengompilasi framework secara bersyarat. Bendera build yang relevan harus dikelompokkan dan disertakan dalam satu file .hal . 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
  • Pemeriksaan kesehatan untuk item-item konfigurasi melalui Vendor Test Suite (pemeriksaan jangkauan, pemeriksaan antar-ketergantungan antar item, dll.)
  • API yang dibuat secara otomatis di C ++ dan Java

Mengidentifikasi tanda build yang digunakan oleh framework

Mulailah dengan mengidentifikasi konfigurasi build yang digunakan untuk mengompilasi framework secara bersyarat, lalu tinggalkan konfigurasi yang sudah usang untuk memperkecil set. Misalnya, kumpulan tanda build berikut 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 build untuk subsistem diakses melalui antarmuka HAL, sedangkan antarmuka untuk memberikan nilai konfigurasi dikelompokkan dalam paket HAL android.hardware.configstore (saat ini di versi 1.0). Misalnya, untuk membuat file antarmuka HAL untuk surfaceflinger , di hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal :

package android.hardware.configstore@1.0;

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

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

Menambahkan fungsi untuk bendera build

Untuk setiap bendera build, tambahkan fungsi baru ke antarmuka. Misalnya, di 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:

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

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

struct OptionalString {
    bool specified;
    string value;
};

Jika sesuai, tentukan enum yang paling mewakili jenis item konfigurasi dan gunakan enum itu sebagai jenis kembalian. Dalam contoh di atas, enum NumBuffers didefinisikan untuk membatasi jumlah nilai yang valid. Saat menentukan tipe data khusus seperti itu, tambahkan bidang atau nilai enum (misalnya, USE_DEFAULT ) untuk menunjukkan jika nilainya adalah / tidak ditentukan oleh HAL.

Satu flag build tidak wajib menjadi satu fungsi di HIDL. Sebagai alternatif, pemilik modul dapat menggabungkan tanda build yang terkait erat ke dalam struct dan memiliki fungsi yang mengembalikan struct tersebut (hal itu dapat mengurangi jumlah panggilan fungsi).

Misalnya, opsi untuk menggabungkan dua flag build ke dalam satu struct 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 flag build, antarmuka HAL juga menyediakan fungsi sederhana seperti getBoolean(string key) dan getInteger(string key) . Pasangan key=value aktual disimpan dalam file terpisah dan layanan HAL memberikan nilai dengan membaca / mengurai file tersebut.

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

Antarmuka tunggal dan ganda

Desain antarmuka HAL untuk item konfigurasi menghadirkan dua pilihan:

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

Antarmuka tunggal lebih mudah tetapi bisa menjadi tidak dapat dikelola karena lebih banyak item konfigurasi ditambahkan ke satu file. Selain itu, kontrol akses tidak terlalu rumit, sehingga proses yang diberi akses ke antarmuka dapat membaca semua item konfigurasi (akses ke sebagian set item konfigurasi tidak dapat diberikan). Alternatifnya, jika akses tidak diberikan, item konfigurasi tidak dapat dibaca.

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