Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

HIDL Java

Android 8.0 merancang ulang OS Android untuk menentukan antarmuka yang jelas antara platform Android yang tidak bergantung perangkat dan kode khusus perangkat dan vendor. Android telah mendefinisikan banyak antarmuka seperti itu dalam bentuk antarmuka HAL, yang didefinisikan sebagai header C di hardware/libhardware . HIDL mengganti antarmuka HAL ini dengan antarmuka yang stabil dan berversi, yang bisa ada di Java (dijelaskan di bawah) atau sebagai antarmuka HIDL sisi klien dan server di C ++ .

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

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

Menjadi klien

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

Menambahkan perpustakaan

Anda perlu menambahkan dependensi pada pustaka rintisan HIDL yang sesuai jika Anda ingin menggunakannya. Biasanya, ini adalah pustaka 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 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 pustaka di Android 10

Jika Anda memiliki aplikasi sistem / vendor yang menargetkan Android 10 dan lebih tinggi, Anda harus menyertakan pustaka ini secara statis. Untuk aplikasi lama, perilaku lama dipertahankan. Atau, dimungkinkan untuk hanya menggunakan kelas HIDL dari JAR khusus yang diinstal pada perangkat dengan Java API stabil yang tersedia menggunakan mekanisme uses-library ada untuk aplikasi sistem. Untuk menghemat ruang di perangkat, ini adalah pendekatan yang disarankan. Untuk detail selengkapnya, lihat Menerapkan Pustaka SDK Java .

Mulai 10, versi "dangkal" dari pustaka ini juga tersedia. Ini termasuk kelas yang dimaksud tetapi tidak termasuk kelas dependen. Misalnya, android.hardware.foo-V1.0-java-shallow menyertakan kelas dalam paket foo, tetapi tidak menyertakan kelas dalam 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

Pustaka basis dan pengelola HIDL juga tidak lagi tersedia di jalur kelas boot. Sebaliknya, mereka telah dipindahkan ke namespace baru dengan jarjar . Modul pada classpath booting menggunakan HIDL perlu menggunakan varian dangkal dari library tersebut serta menambahkan jarjar_rules: ":framework-jarjar-rules" ke Android.bp mereka untuk menghindari kode duplikat dan membuat aplikasi sistem / vendor menggunakan API tersembunyi .

Mengubah sumber Java Anda

Hanya ada satu versi ( @1.0 ) dari layanan ini, jadi kode ini hanya mengambil versi itu. Lihat ekstensi antarmuka untuk mengetahui cara menangani berbagai versi 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 framework di Java mungkin perlu melayani antarmuka untuk menerima callback asinkron dari HAL.

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

  1. Tentukan antarmuka Anda di HIDL.
  2. Buka /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 , lalu tulis kelas baru untuk memperluasnya 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 stub (keduanya proxy dan stub sesuai dengan antarmuka).

-Lmakefile menghasilkan aturan yang menjalankan perintah ini pada waktu build dan memungkinkan Anda menyertakan android.hardware.foo-V1.0-java dan menautkan ke file yang sesuai. Skrip yang secara otomatis melakukan ini untuk proyek yang penuh dengan antarmuka dapat ditemukan di hardware/interfaces/update-makefiles.sh . Jalur dalam contoh ini bersifat relatif; hardware / interfaces bisa menjadi direktori sementara di bawah pohon kode Anda untuk memungkinkan Anda mengembangkan HAL sebelum menerbitkannya.

Menjalankan layanan

HAL menyediakan antarmuka IFoo , yang harus membuat callback asinkron ke kerangka kerja melalui antarmuka IFooCallback . Antarmuka IFooCallback tidak terdaftar dengan nama sebagai layanan yang dapat ditemukan; sebagai gantinya, IFoo harus berisi metode seperti setFooCallback(IFooCallback x) .

Untuk menyiapkan IFooCallback dari versi 1.0 paket android.hardware.foo , tambahkan android.hardware.foo-V1.0-java ke 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 you will be receiving callbacks from.
// 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 layanan tertentu mengimplementasikan antarmuka IFoo di semua perangkat, ada kemungkinan bahwa pada perangkat tertentu layanan dapat menyediakan kemampuan tambahan yang diimplementasikan dalam ekstensi antarmuka IBetterFoo , sebagai berikut:

interface IFoo {
   ...
};

interface IBetterFoo extends IFoo {
   ...
};

Memanggil kode yang sadar akan antarmuka yang diperluas dapat menggunakan metode Java castFrom() untuk mentransmisikan antarmuka dasar dengan aman ke antarmuka yang diperluas:

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.
}