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

HIDL Jawa

Di Android 8.0, OS Android dirancang ulang untuk mendefinisikan antarmuka yang jelas antara platform Android yang tidak bergantung pada perangkat, dan kode khusus perangkat dan vendor. Android sudah didefinisikan banyak antarmuka seperti dalam bentuk HAL interface, didefinisikan sebagai C header di hardware/libhardware . HIDL diganti interface HAL ini dengan stabil, interface berversi, yang baik dapat di Jawa (dijelaskan di bawah) atau menjadi client dan server-side antarmuka HIDL di C ++ .

Antarmuka HIDL dimaksudkan untuk digunakan terutama dari kode asli, dan sebagai hasilnya HIDL difokuskan pada pembuatan otomatis kode efisien dalam C++. Namun, antarmuka HIDL juga harus tersedia untuk digunakan langsung dari Java, karena beberapa subsistem Android (seperti Telephony) memiliki antarmuka Java HIDL.

Halaman-halaman di bagian ini menjelaskan frontend Java untuk antarmuka HIDL, merinci cara membuat, mendaftar, dan menggunakan layanan, dan menjelaskan bagaimana klien HAL dan HAL yang ditulis dalam Java berinteraksi dengan sistem HIDL RPC.

Menjadi klien

Ini adalah contoh dari klien untuk sebuah antarmuka IFoo dalam paket android.hardware.foo@1.0 yang terdaftar sebagai nama layanan default dan layanan tambahan dengan kustom nama layanan second_impl .

Menambahkan perpustakaan

Anda perlu menambahkan dependensi pada pustaka rintisan HIDL yang sesuai jika Anda ingin menggunakannya. Biasanya, ini adalah perpustakaan statis:

// in Android.bp
static_libs: [ "android.hardware.foo-V1.0-java", ],
// in Android.mk
LOCAL_STATIC_JAVA_LIBRARIES += android.hardware.foo-V1.0-java

Jika Anda tahu bahwa Anda sudah menarik dependensi pada pustaka ini, Anda juga dapat menggunakan tautan bersama:

// in Android.bp
libs: [ "android.hardware.foo-V1.0-java", ],
// in Android.mk
LOCAL_JAVA_LIBRARIES += android.hardware.foo-V1.0-java

Pertimbangan tambahan untuk menambahkan perpustakaan di Android 10

Jika Anda memiliki sistem atau aplikasi vendor yang menargetkan Android 10 atau lebih tinggi, Anda dapat menyertakan pustaka ini secara statis. Anda juga dapat menggunakan (hanya) kelas HIDL dari guci kustom diinstal pada perangkat dengan stabil Java API yang tersedia menggunakan yang ada uses-library mekanisme untuk aplikasi sistem. Pendekatan terakhir menghemat ruang pada perangkat. Untuk lebih jelasnya, lihat Pelaksana Java SDK Perpustakaan . Untuk aplikasi lama, perilaku lama dipertahankan.

Mulai Android 10, versi "dangkal" dari pustaka ini juga tersedia. Ini termasuk kelas yang dimaksud tetapi tidak termasuk salah satu kelas dependen. Misalnya, android.hardware.foo-V1.0-java-shallow termasuk kelas dalam paket foo, tetapi tidak termasuk kelas di android.hidl.base-V1.0-java , yang berisi kelas dasar dari semua HIDL antarmuka. Jika Anda membuat pustaka yang sudah memiliki kelas dasar antarmuka pilihan yang tersedia sebagai dependensi, Anda dapat menggunakan yang berikut ini:

// in Android.bp
static_libs: [ "android.hardware.foo-V1.0-java-shallow", ],
// in Android.mk
LOCAL_STATIC_JAVA_LIBRARIES += android.hardware.foo-V1.0-java-shallow

Basis HIDL dan pustaka pengelola juga tidak lagi tersedia di classpath boot untuk aplikasi (sebelumnya, terkadang digunakan sebagai API tersembunyi, karena pemuat kelas pertama delegasi Android). Sebaliknya, mereka telah pindah ke namespace baru dengan jarjar , dan aplikasi yang menggunakan ini (aplikasi tentu priv) harus memiliki salinan mereka sendiri terpisah. Modul pada classpath boot menggunakan HIDL harus menggunakan dangkal varian dari perpustakaan Jawa ini dan untuk menambahkan jarjar_rules: ":framework-jarjar-rules" untuk mereka Android.bp untuk menggunakan versi dari perpustakaan ini yang ada di bagasi classpath.

Memodifikasi sumber Java Anda

Hanya ada satu versi ( @1.0 ) dari layanan ini, sehingga kode ini mengambil hanya versi itu. Lihat ekstensi antarmuka untuk bagaimana menangani beberapa versi yang berbeda dari layanan.

import android.hardware.foo.V1_0.IFoo;
...
// retry to wait until the service starts up if it is in the manifest
IFoo server = IFoo.getService(true /* retry */); // throws NoSuchElementException if not available
IFoo anotherServer = IFoo.getService("second_impl", true /* retry */);
server.doSomething(…);

Menyediakan layanan

Kode kerangka kerja di Java mungkin perlu melayani antarmuka untuk menerima panggilan balik asinkron dari HAL.

Untuk IFooCallback antarmuka dalam versi 1.0 dari android.hardware.foo paket, Anda dapat mengimplementasikan antarmuka Anda di Jawa menggunakan langkah-langkah berikut:

  1. Tentukan antarmuka Anda di HIDL.
  2. Terbuka /tmp/android/hardware/foo/IFooCallback.java sebagai referensi.
  3. Buat modul baru untuk implementasi Java Anda.
  4. Periksa kelas abstrak android.hardware.foo.V1_0.IFooCallback.Stub , kemudian menulis kelas baru untuk memperluas dan menerapkan metode abstrak.

Melihat file yang dibuat secara otomatis

Untuk melihat file yang dibuat secara otomatis, jalankan:

hidl-gen -o /tmp -Ljava \
  -randroid.hardware:hardware/interfaces \
  -randroid.hidl:system/libhidl/transport android.hardware.foo@1.0

Perintah-perintah ini menghasilkan direktori /tmp/android/hardware/foo/1.0 . Untuk file hardware/interfaces/foo/1.0/IFooCallback.hal , ini menghasilkan file /tmp/android/hardware/foo/1.0/IFooCallback.java , yang merangkum antarmuka Java, kode proxy, dan bertopik (kedua proksi dan stub sesuai dengan antarmuka).

-Lmakefile menghasilkan aturan-aturan yang menjalankan perintah ini pada waktu membangun dan memungkinkan Anda untuk memasukkan android.hardware.foo-V1.0-java dan link terhadap file yang sesuai. Sebuah script yang secara otomatis melakukan hal ini untuk proyek penuh interface dapat ditemukan di hardware/interfaces/update-makefiles.sh . Jalur dalam contoh ini relatif; perangkat keras/antarmuka dapat menjadi direktori sementara di bawah pohon kode Anda untuk memungkinkan Anda mengembangkan HAL sebelum menerbitkannya.

Menjalankan layanan

HAL menyediakan IFoo antarmuka, yang harus membuat callback asynchronous ke kerangka atas IFooCallback antarmuka. The IFooCallback antarmuka tidak terdaftar dengan nama sebagai layanan ditemukan; sebaliknya, IFoo harus berisi metode seperti setFooCallback(IFooCallback x) .

Untuk mengatur IFooCallback dari versi 1.0 dari android.hardware.foo paket, tambahkan android.hardware.foo-V1.0-java untuk Android.mk . Kode untuk menjalankan layanan ini adalah:

import android.hardware.foo.V1_0.IFoo;
import android.hardware.foo.V1_0.IFooCallback.Stub;
....
class FooCallback extends IFooCallback.Stub {
    // implement methods
}
....
// Get the service from which you will be receiving callbacks.
// This also starts the threadpool for your callback service.
IFoo server = IFoo.getService(true /* retry */); // throws NoSuchElementException if not available
....
// This must be a persistent instance variable, not local,
//   to avoid premature garbage collection.
FooCallback mFooCallback = new FooCallback();
....
// Do this once to create the callback service and tell the "foo-bar" service
server.setFooCallback(mFooCallback);

Ekstensi antarmuka

Dengan asumsi diberikan alat layanan IFoo antarmuka di semua perangkat, itu mungkin bahwa pada perangkat tertentu layanan mungkin memberikan kemampuan tambahan yang diimplementasikan dalam ekstensi antarmuka IBetterFoo , sebagai berikut:

interface IFoo {
   ...
};

interface IBetterFoo extends IFoo {
   ...
};

Kode telepon menyadari antarmuka diperpanjang dapat menggunakan castFrom() metode Java untuk aman melemparkan antarmuka dasar untuk antarmuka diperpanjang:

IFoo baseService = IFoo.getService(true /* retry */); // throws NoSuchElementException if not available
IBetterFoo extendedService = IBetterFoo.castFrom(baseService);
if (extendedService != null) {
  // The service implements the extended interface.
} else {
  // The service implements only the base interface.
}