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

Menggunakan Pengikat IPC

Halaman ini menjelaskan perubahan pada driver binder di Android 8, memberikan detail tentang penggunaan IPC binder, dan mencantumkan kebijakan SELinux yang diperlukan.

Perubahan pada driver pengikat

Mulai Android 8, kerangka kerja Android dan HAL sekarang berkomunikasi satu sama lain menggunakan pengikat. Karena komunikasi ini secara dramatis meningkatkan lalu lintas pengikat, Android 8 menyertakan beberapa peningkatan yang dirancang untuk menjaga IPC pengikat tetap cepat. SoC vendor dan OEM harus menggabungkan langsung dari cabang-cabang yang relevan dari android-4.4, android-4.9, dan lebih tinggi dari kernel / umum proyek.

Beberapa domain pengikat (konteks)

Common-4.4 dan lebih tinggi, termasuk upstream

Untuk bersih perpecahan lalu lintas pengikat antara kerangka kerja (perangkat-independen) dan penjual (khusus perangkat) kode, Android 8 memperkenalkan konsep konteks pengikat. Setiap konteks pengikat memiliki simpul perangkatnya sendiri dan pengelola konteks (layanannya) sendiri. Anda dapat mengakses manajer konteks hanya melalui simpul perangkat yang dimilikinya dan, ketika melewati simpul pengikat melalui konteks tertentu, itu dapat diakses dari konteks yang sama hanya dengan proses lain, sehingga benar-benar mengisolasi domain dari satu sama lain. Untuk detail penggunaan, lihat vndbinder dan vndservicemanager .

Sebar-kumpul

Common-4.4 dan lebih tinggi, termasuk upstream

Dalam rilis Android sebelumnya, setiap bagian data dalam panggilan pengikat disalin tiga kali:

  • Setelah cerita bersambung menjadi Parcel dalam proses memanggil
  • Setelah di driver kernel untuk menyalin Parcel untuk proses target
  • Setelah unserialize yang Parcel dalam proses sasaran

Android 8 menggunakan pencar-mengumpulkan optimasi untuk mengurangi jumlah salinan dari 3 sampai 1. Daripada serialisasi data dalam Parcel pertama, data yang tetap dalam struktur dan memori tata letak asli dan sopir segera salinan ke proses target. Setelah data dalam proses target, struktur dan tata letak memori sama dan data dapat dibaca tanpa memerlukan salinan lain.

Penguncian berbutir halus

Common-4.4 dan lebih tinggi, termasuk upstream

Dalam rilis Android sebelumnya, driver pengikat menggunakan kunci global untuk melindungi terhadap akses bersamaan ke struktur data penting. Meskipun ada sedikit pertentangan untuk kunci, masalah utamanya adalah jika utas berprioritas rendah memperoleh kunci dan kemudian didahulukan, hal itu dapat secara serius menunda utas berprioritas lebih tinggi yang perlu mendapatkan kunci yang sama. Hal ini menyebabkan jank di platform.

Upaya awal untuk menyelesaikan masalah ini melibatkan penonaktifan preemption sambil menahan kunci global. Namun, ini lebih merupakan peretasan daripada solusi sejati, dan akhirnya ditolak oleh hulu dan dibuang. Upaya selanjutnya berfokus pada membuat penguncian lebih halus, versi yang telah berjalan pada perangkat Pixel sejak Januari 2017. Meskipun sebagian besar perubahan tersebut dipublikasikan, peningkatan substansial dilakukan pada versi berikutnya.

Setelah mengidentifikasi masalah kecil dalam implementasi penguncian berbutir halus, kami merancang solusi yang ditingkatkan dengan arsitektur penguncian yang berbeda dan mengirimkan perubahan di semua cabang kernel umum. Kami terus menguji implementasi ini pada sejumlah besar perangkat yang berbeda; karena kami tidak mengetahui adanya masalah yang belum terselesaikan, ini adalah implementasi yang disarankan untuk pengiriman perangkat dengan Android 8.

Warisan prioritas waktu nyata

Common-4.4 dan common-4.9 (upstream segera hadir)

Pengandar pengikat selalu mendukung pewarisan prioritas yang bagus. Karena semakin banyak proses di Android yang berjalan pada prioritas waktu nyata, dalam beberapa kasus sekarang masuk akal jika utas waktu nyata membuat panggilan pengikat, utas dalam proses yang menangani panggilan itu juga berjalan pada prioritas waktu nyata . Untuk mendukung kasus penggunaan ini, Android 8 sekarang mengimplementasikan pewarisan prioritas real-time di driver binder.

Selain warisan prioritas transaksi-tingkat, warisan prioritas simpul memungkinkan node (pengikat objek layanan) untuk menentukan prioritas minimum di mana panggilan menjadi node ini harus dieksekusi. Versi Android sebelumnya telah mendukung pewarisan prioritas simpul dengan nilai yang bagus, tetapi Android 8 menambahkan dukungan untuk pewarisan simpul kebijakan penjadwalan waktu nyata.

Perubahan ruang pengguna

Android 8 mencakup semua userspace perubahan yang diperlukan untuk bekerja dengan driver pengikat saat ini di kernel yang sama dengan satu pengecualian: The original implementasi untuk menonaktifkan real-time warisan prioritas /dev/binder menggunakan sebuah ioctl . Pengembangan selanjutnya mengalihkan kontrol pewarisan prioritas ke metode yang lebih halus yaitu per mode pengikat (dan bukan per konteks). Dengan demikian, ioctl tidak di cabang umum Android dan bukan diserahkan dalam kernel kita bersama .

Efek dari perubahan ini adalah bahwa real-time warisan prioritas dinonaktifkan secara default untuk setiap node. Tim kinerja Android telah menemukan itu bermanfaat untuk mengaktifkan real-time prioritas warisan untuk semua node dalam hwbinder domain. Untuk mencapai efek yang sama, ceri-memilih perubahan ini di userspace.

SHA untuk kernel umum

Untuk mendapatkan perubahan yang diperlukan pada driver pengikat, sinkronkan ke SHA yang sesuai:

  • Umum-3.18
    cc8b90c121de ANDROID: pengikat: jangan periksa izin sebelumnya saat memulihkan.
  • Umum-4.4
    76b376eac7a2 ANDROID: pengikat: jangan periksa izin sebelumnya saat memulihkan.
  • Umum-4.9
    ecd972d4f9b5 ANDROID: pengikat: jangan periksa izin sebelumnya saat memulihkan.

Menggunakan pengikat IPC

Secara historis, proses vendor telah menggunakan binder interprocess communication (IPC) untuk berkomunikasi. Di Android 8, yang /dev/binder perangkat node menjadi eksklusif untuk proses kerangka, yang berarti proses penjual tidak lagi memiliki akses ke sana. Proses Vendor dapat mengakses /dev/hwbinder , tetapi harus mengkonversi antarmuka AIDL mereka untuk penggunaan HIDL. Untuk vendor yang ingin terus menggunakan antarmuka AIDL antar proses vendor, Android mendukung binder IPC seperti yang dijelaskan di bawah ini.

vndbinder

Android 8 mendukung domain pengikat baru untuk digunakan oleh layanan penjual, diakses menggunakan /dev/vndbinder bukan /dev/binder . Dengan penambahan /dev/vndbinder , Android kini memiliki berikut tiga domain IPC:

Domain IPC Keterangan
/dev/binder IPC antara kerangka kerja/proses aplikasi dengan antarmuka AIDL
/dev/hwbinder IPC antara proses kerangka kerja/vendor dengan antarmuka HIDL
IPC antara proses vendor dengan antarmuka HIDL
/dev/vndbinder IPC antara proses vendor/vendor dengan Antarmuka AIDL

Untuk /dev/vndbinder muncul, memastikan item konfigurasi kernel CONFIG_ANDROID_BINDER_DEVICES diatur ke "binder,hwbinder,vndbinder" (ini adalah default pada pohon kernel umum Android).

Biasanya, proses penjual tidak buka driver pengikat langsung dan bukan link terhadap libbinder perpustakaan userspace, yang membuka driver pengikat. Menambahkan metode untuk ::android::ProcessState() memilih driver pengikat untuk libbinder . Proses penjual harus memanggil metode ini sebelum menelepon ke ProcessState, IPCThreadState , atau sebelum membuat panggilan pengikat pada umumnya. Untuk penggunaan, menempatkan panggilan berikutnya setelah main() dari proses penjual (client dan server):

ProcessState::initWithDriver("/dev/vndbinder");

vndservicemanager

Sebelumnya, layanan pengikat yang terdaftar dengan servicemanager , di mana mereka dapat diambil oleh proses lainnya. Di Android 8, servicemanager sekarang digunakan secara eksklusif oleh framework dan aplikasi proses dan proses penjual tidak dapat lagi mengakses itu.

Namun, layanan penjual sekarang dapat menggunakan vndservicemanager , contoh baru dari servicemanager yang menggunakan /dev/vndbinder bukan /dev/binder dan yang dibangun dari sumber yang sama sebagai kerangka servicemanager . Proses penjual tidak perlu melakukan perubahan berbicara dengan vndservicemanager ; ketika proses vendor yang membuka / dev/vndbinder , pencarian layanan otomatis pergi ke vndservicemanager .

The vndservicemanager biner termasuk dalam makefiles perangkat default Android.

kebijakan SELinux

Proses vendor yang ingin menggunakan fungsionalitas pengikat untuk berkomunikasi satu sama lain memerlukan hal berikut:

  1. Akses ke /dev/vndbinder .
  2. Binder {transfer, call} kait ke vndservicemanager .
  3. binder_call(A, B) untuk setiap vendor domain A yang ingin menelepon ke penjual domain B melalui antarmuka penjual pengikat.
  4. Izin untuk {add, find} jasa di vndservicemanager .

Untuk memenuhi persyaratan 1 dan 2, gunakan vndbinder_use() makro:

vndbinder_use(some_vendor_process_domain);

Untuk memenuhi kebutuhan 3, binder_call(A, B) vendor proses A dan B yang perlu berbicara lebih pengikat dapat tinggal di tempat, dan tidak perlu mengubah nama.

Untuk memenuhi persyaratan 4, Anda harus membuat perubahan dalam cara penanganan nama layanan, label layanan, dan aturan.

Untuk rincian tentang SELinux, lihat Security-Enhanced Linux di Android . Untuk rincian tentang SELinux di Android 8.0, lihat SELinux untuk Android 8.0 .

Nama layanan

Sebelumnya, proses penjual terdaftar nama layanan dalam service_contexts berkas dan ditambahkan sesuai aturan untuk mengakses file itu. Contoh service_contexts file dari device/google/marlin/sepolicy :

AtCmdFwd                              u:object_r:atfwd_service:s0
cneservice                            u:object_r:cne_service:s0
qti.ims.connectionmanagerservice      u:object_r:imscm_service:s0
rcs                                   u:object_r:radio_service:s0
uce                                   u:object_r:uce_service:s0
vendor.qcom.PeripheralManager         u:object_r:per_mgr_service:s0

Di Android 8, vndservicemanager beban yang vndservice_contexts file bukan. Vendor layanan migrasi ke vndservicemanager (dan yang sudah di tua service_contexts file) harus ditambahkan ke baru vndservice_contexts berkas.

Label layanan

Sebelumnya, layanan label seperti u:object_r:atfwd_service:s0 didefinisikan dalam service.te berkas. Contoh:

type atfwd_service,      service_manager_type;

Di Android 8, Anda harus mengubah jenis untuk vndservice_manager_type dan memindahkan aturan ke vndservice.te berkas. Contoh:

type atfwd_service,      vndservice_manager_type;

Aturan manajer layanan

Sebelumnya, aturan yang diberikan domain akses untuk menambah atau menemukan jasa dari servicemanager . Contoh:

allow atfwd atfwd_service:service_manager find;
allow some_vendor_app atfwd_service:service_manager add;

Di Android 8, aturan tersebut dapat tetap berlaku dan menggunakan kelas yang sama. Contoh:

allow atfwd atfwd_service:service_manager find;
allow some_vendor_app atfwd_service:service_manager add;