Mulai 27 Maret 2025, sebaiknya gunakan android-latest-release
, bukan aosp-main
, untuk mem-build dan berkontribusi pada AOSP. Untuk mengetahui informasi selengkapnya, lihat Perubahan pada AOSP.
Mengimplementasikan HAL USB
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Rilis Android 8.0 memindahkan penanganan perintah USB dari skrip
init
ke daemon USB native untuk konfigurasi dan keandalan
kode yang lebih baik. Untuk konfigurasi fungsi Gadget, skrip init
(pemicu properti) digunakan untuk melakukan operasi gadget khusus perangkat.
Pada rilis sebelumnya, konfigurasi khusus perangkat ini dicapai melalui
skrip init
khusus perangkat (menggunakan pemicu properti). Beralih ke desain
Hardware Abstraction Layer (HAL) menghasilkan implementasi yang jauh lebih bersih
yang memecahkan masalah ini:
- Operasi seperti penulisan ke node sysfs kernel dapat gagal, tetapi tidak
disebarkan kembali ke kode framework yang menetapkan pemicu properti. Akibatnya, framework salah mengasumsikan bahwa operasi telah berhasil meskipun
telah gagal secara diam-diam.
- Skrip
init
memiliki jumlah operasi terbatas yang dapat
dijalankan.
Rilis Android 12 menambahkan dukungan HAL Gadget USB untuk Model Kontrol
Jaringan (NCM) dan panggilan API yang menampilkan nomor versi HAL dan kecepatan USB. Untuk mengetahui informasi
selengkapnya tentang panggilan API yang tersedia melalui HAL USB, lihat
ringkasan paket android.hardware.usb
.
HAL dan Treble
Skrip init
khusus perangkat digunakan sebagai pengganti
lapisan HAL untuk melakukan operasi USB khusus perangkat. USB (melalui ADB) adalah
antarmuka utama untuk men-debug masalah sistem. Memiliki daemon native untuk melakukan
konfigurasi USB akan menghilangkan dependensi pada kode framework sehingga meskipun
framework mengalami error, USB akan tetap berjalan.
Berdasarkan
model
Treble yang juga diperkenalkan di Android 8.0, semua HAL diisolasi dari layanan
System dan diwajibkan untuk berjalan di daemon native-nya sendiri. Hal ini menghilangkan
persyaratan untuk memiliki daemon USB eksklusif karena lapisan HAL berfungsi sebagai daemon USB
dengan baik.
Penerapan HAL default menangani semua perangkat pra-Android 8.0. Oleh karena itu, tidak akan ada pekerjaan khusus perangkat untuk perangkat pra-Android 8.0. Android 8.0 menggunakan antarmuka
HAL untuk membuat kueri status port USB dan melakukan pertukaran peran data dan
peran daya.
Implementasi
Antarmuka HAL USB baru harus diterapkan di setiap perangkat yang diluncurkan di Android 8.0.
Implementasi default harus menangani perangkat pra-Android 8.0. Implementasi
default sudah memadai jika perangkat menggunakan class dual_role_usb
untuk melaporkan
status port type-c. Perubahan kecil mungkin diperlukan dalam skrip USB khusus perangkat
untuk mentransfer kepemilikan node typc-c ke sistem.
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-07-27 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-07-27 UTC."],[],[],null,["# Implement USB HAL\n\nThe Android 8.0 release moves handling of USB commands out of `init`\nscripts and into a native USB daemon for better configuration and code\nreliability. For the Gadget function configuration, `init` scripts\n(property triggers) are used to perform device-specific gadget operations.\n\nIn previous releases, these device-specific configurations were achieved through\ndevice-specific `init` scripts (using property triggers). Moving to a\nHardware Abstraction Layer (HAL) design results in a much cleaner implementation\nthat solves these problems:\n\n1. Operations such as writes to the kernel sysfs nodes could fail but not be propagated back to the frameworks code that sets the property trigger. As a result, frameworks incorrectly assumes the operations have succeeded even though they have silently failed.\n2. `init` scripts have a limited number of operations that could be executed.\n\nThe Android 12 release adds USB Gadget HAL support for Network Control\nModels (NCM) and API calls that return both the HAL version number and USB speed. For more\ninformation on the API calls available through the USB HAL, see\n[the `android.hardware.usb` package summary](https://developer.android.com/reference/android/hardware/usb/package-summary).\n\nHAL and Treble\n--------------\n\n\nThe device-specific `init` scripts were used as a substitution for\nHAL layers to perform device-specific USB operations. USB (through ADB) is a\nprimary interface for debugging system issues. Having a native daemon to perform\nUSB configuration eliminates the dependency on the framework code so even if the\nframework crashes USB should be running.\n\n\nUnder the\n[Treble](https://android-developers.googleblog.com/2017/05/here-comes-treble-modular-base-for.html)\nmodel also introduced in Android 8.0, all of the HALs are isolated from System\nservices and are required to run in their own native daemons. This eliminates\nthe requirement to have an exclusive USB daemon as the HAL layer nicely doubles\nas a USB daemon.\n\n\nThe default HAL implementation takes care of all pre-Android 8.0 devices. Therefore, there\nwouldn't be any device-specific work for the pre-Android 8.0 devices. Android 8.0 uses the HAL\ninterface to query the status of USB ports and to perform data role and power\nrole swaps.\n\nImplementation\n--------------\n\n\nNew USB HAL interface needs to be implemented on every device launching on Android 8.0.\nThe default implementation should take care of pre-Android 8.0 devices. The default\nimplementation is sufficient if the device uses the `dual_role_usb` class to report\ntype-c port status. Trivial changes might be required in device-specific USB scripts\nto transfer ownership of the typc-c nodes to system."]]