Google, Siyah topluluklar için ırksal eşitliği ilerletmeye kararlıdır. Nasıl olduğunu gör.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Binder IPC'yi kullanma

Bu sayfa, Android 8'deki bağlayıcı sürücüsünde yapılan değişiklikleri açıklar, bağlayıcı IPC'nin kullanımı hakkında ayrıntılar sağlar ve gerekli SELinux ilkesini listeler.

Ciltçi sürücüsündeki değişiklikler

Android 8'den başlayarak, Android çerçevesi ve HAL'ler artık bağlayıcı kullanarak birbirleriyle iletişim kuruyor. Bu iletişim bağlayıcı trafiği önemli ölçüde artırdığından, Android 8 bağlayıcı IPC'yi hızlı tutmak için tasarlanmış çeşitli iyileştirmeler içerir. SoC satıcıları ve OEM'ler doğrudan android-4.4, android-4.9 ve daha yüksek çekirdek / ortak projenin ilgili dallarından birleşmelidir.

Çoklu ciltleme alanları (bağlamlar)

Akış yukarı dahil olmak üzere Common-4.4 ve üstü

Bağlayıcı trafiğini çerçeve (aygıttan bağımsız) ve satıcı (aygıta özgü) kod arasında temiz bir şekilde bölmek için Android 8, bağlayıcı bağlam kavramını tanıttı. Her bağlayıcı bağlamın kendi aygıt düğümü ve kendi bağlam (hizmet) yöneticisi vardır. Bağlam yöneticisine yalnızca ait olduğu cihaz düğümü üzerinden erişebilir ve bir bağlayıcı düğümü belirli bir bağlamdan geçirirken, aynı bağlamdan yalnızca başka bir işlemle erişilebilir, böylece etki alanları birbirinden tamamen yalıtılır. Kullanımla ilgili ayrıntılar için bkz. Vndbinder ve vndservicemanager .

Dağılım-toplamak

Akış yukarı dahil olmak üzere Common-4.4 ve üstü

Android'in önceki sürümlerinde, bir ciltçi çağrısındaki her veri parçası üç kez kopyalandı:

  • Bir kez çağrı sürecinde bir Parcel seri hale getirmek için
  • Çekirdek sürücüsüne girdikten sonra Parcel hedef işleme kopyalamak için
  • Hedef süreçte Parcel serileştirilmesi için bir kez

Android 8, kopya sayısını 3'ten 1'e düşürmek için dağılım toplama optimizasyonunu kullanıyor. İlk olarak bir Parcel veri serileştirmek yerine, veriler orijinal yapısında ve bellek düzeninde kalır ve sürücü hemen hedef prosese kopyalar. Veriler hedeflenen işlemden sonra, yapı ve bellek düzeni aynıdır ve veriler başka bir kopyaya gerek duyulmadan okunabilir.

İnce taneli kilitleme

Akış yukarı dahil olmak üzere Common-4.4 ve üstü

Önceki Android sürümlerinde, bağlayıcı sürücüsü, kritik veri yapılarına eşzamanlı erişime karşı korumak için küresel bir kilit kullandı. Kilit için minimum çekişme olsa da, asıl sorun, düşük öncelikli bir iplik kilidi elde edip daha sonra önlenmişse, aynı kilidi alması gereken daha yüksek öncelikli dişleri ciddi şekilde geciktirebilmesiydi. Bu platformda önemsizliğe neden oldu.

Bu sorunu çözmek için yapılan ilk girişimler, küresel kilidi tutarken önleme özelliğini devre dışı bırakmayı içeriyordu. Ancak, bu gerçek bir çözümden ziyade bir hackti ve sonunda yukarı akış tarafından reddedildi ve atıldı. Sonraki girişimler, Ocak 2017'den bu yana bir sürümü Pixel cihazlarda çalışan kilitlemeyi daha hassas hale getirmeye odaklandı. Bu değişikliklerin çoğu halka açık hale getirilirken, sonraki sürümlerde önemli iyileştirmeler yapıldı.

İnce taneli kilitleme uygulamasındaki küçük sorunları belirledikten sonra, farklı bir kilitleme mimarisine sahip gelişmiş bir çözüm tasarladık ve tüm genel çekirdek dallarındaki değişiklikleri sunduk. Bu uygulamayı çok sayıda farklı cihazda test etmeye devam ediyoruz; önemli sorunların farkında olmadığımız için, bu Android 8 ile birlikte gönderilen cihazlar için önerilen uygulamadır.

Gerçek zamanlı öncelikli miras

Ortak-4.4 ve ortak-4.9 (yukarı akış yakında)

Bağlayıcı sürücüsü her zaman iyi öncelikli kalıtım desteklemiştir. Android'de artan sayıda işlem gerçek zamanlı önceliğe göre çalıştığından, bazı durumlarda gerçek zamanlı bir iş parçacığı bir bağlayıcı çağrısı yaparsa, bu çağrıyı işleyen işlemdeki iş parçacığının da gerçek zamanlı önceliğe sahip olması mantıklıdır. . Bu kullanım durumlarını desteklemek için, Android 8 artık bağlayıcı sürücüsünde gerçek zamanlı öncelikli miras uygulamaktadır.

İşlem düzeyinde öncelik devralmaya ek olarak, düğüm önceliği devralma , bir düğümün (bağlayıcı hizmet nesnesi) bu düğüme çağrıların yürütülmesi gereken minimum önceliği belirlemesine izin verir. Android'in önceki sürümleri, düğüm önceliği devralmayı güzel değerlerle zaten destekliyordu, ancak Android 8, gerçek zamanlı zamanlama politikaları düğümü devralması için destek ekliyor.

Kullanıcı alanı değişiklikleri

Android 8, tek bir istisna dışında ortak çekirdekteki geçerli cilt sürücüsü ile çalışmak için gereken tüm kullanıcı alanı değişikliklerini içerir: /dev/binder için gerçek zamanlı öncelikli kalıtım özelliğini devre dışı bırakan orijinal uygulama bir ioctl kullandı. Müteakip geliştirme, öncelik mirasının kontrolünü bağlayıcı mod başına (bağlam başına değil) daha ince taneli bir yönteme dönüştürdü. Bu nedenle, ioctl Android ortak dalında değildir ve bunun yerine ortak çekirdeklerimizde sunulur .

Bu değişikliğin etkisi, gerçek zamanlı öncelikli kalıtımın her düğüm için varsayılan olarak devre dışı bırakılmış olmasıdır. Android performans ekibi, hwbinder etki alanındaki tüm düğümler için gerçek zamanlı öncelikli kalıtımın etkinleştirilmesini yararlı buldu. Aynı etkiyi elde etmek için, kullanıcı alanındaki bu değişikliği seçin.

Ortak çekirdekler için SHA'lar

Ciltçi sürücüsünde gerekli değişiklikleri almak için uygun SHA ile eşitleyin:

  • Ortak-3.18
    cc8b90c121de ANDROID: bağlayıcı: geri yükleme sırasında prio izinlerini kontrol etme.
  • Ortak-4.4
    76b376eac7a2 ANDROID: bağlayıcı: geri yükleme sırasında prio izinlerini kontrol etme.
  • Ortak-4.9
    ecd972d4f9b5 ANDROID: bağlayıcı: geri yükleme sırasında prio izinlerini kontrol etme.

Ciltçi IPC kullanma

Tarihsel olarak, satıcı süreçleri iletişim için bağlayıcı süreçler arası iletişim (IPC) kullanmıştır. Android 8'de, /dev/binder aygıt düğümü çerçeve işlemlerine özel hale gelir, yani satıcı süreçleri artık ona erişemez. Tedarikçi işlemleri /dev/hwbinder , ancak AIDL arabirimlerini HIDL'yi kullanacak şekilde dönüştürmeleri gerekir. Satıcı süreçleri arasında AIDL arabirimlerini kullanmaya devam etmek isteyen satıcılar için Android, aşağıda açıklandığı gibi bağlayıcı IPC'yi destekler.

vndbinder

Android satıcı hizmetleri tarafından kullanılmak üzere 8 destekleri yeni bağlayıcı alanı kullanılarak erişilen /dev/vndbinder yerine /dev/binder . /dev/vndbinder , Android artık aşağıdaki üç IPC alanına sahiptir:

IPC Alanı Açıklama
/dev/binder AIDL arayüzleri ile çerçeve / uygulama işlemleri arasında IPC
/dev/hwbinder HIDL arayüzleri ile çerçeve / satıcı süreçleri arasında IPC
HIDL arayüzleri ile tedarikçi süreçleri arasında IPC
/dev/vndbinder AIDL Arayüzleri ile satıcı / satıcı süreçleri arasında IPC

/dev/vndbinder öğesinin CONFIG_ANDROID_BINDER_DEVICES için CONFIG_ANDROID_BINDER_DEVICES çekirdek yapılandırma öğesinin "binder,hwbinder,vndbinder" olarak ayarlandığından emin "binder,hwbinder,vndbinder" (bu Android'in genel çekirdek ağaçlarında varsayılan "binder,hwbinder,vndbinder" ).

Normalde, satıcı süreçleri bağlayıcı sürücüsünü doğrudan libbinder ve bunun yerine bağlayıcı sürücüsünü açan libbinder kullanıcı alanı kütüphanesine libbinder . ::android::ProcessState() yöntemi libbinder için bağlayıcı sürücüsü libbinder . Satıcı süreçleri, ProcessState, IPCThreadState çağrısından önce veya genel olarak herhangi bir bağlayıcı çağrısı yapmadan önce bu yöntemi çağırmalıdır. Kullanmak için, bir satıcı sürecinin (istemci ve sunucu) main() yönteminden sonra aşağıdaki çağrıyı yapın:

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

vndservicemanager

Daha önce, bağlayıcı hizmetler, diğer işlemler tarafından alınabilecekleri servicemanager kaydedildi. Android 8'de, servicemanager artık sadece çerçeve ve uygulama süreçleri tarafından kullanılıyor ve satıcı süreçleri artık erişemiyor.

Ancak, satıcı hizmetleri artık kullanabilirsiniz vndservicemanager , yeni bir örneğini servicemanager that use /dev/vndbinder yerine /dev/binder ve çerçeve ile aynı kaynaklardan inşa edildiği servicemanager . Satıcı süreçlerinin vndservicemanager ile konuşmak için değişiklik yapmasına gerek vndservicemanager ; Bir satıcı işlemi / dev/vndbinder , servis aramaları otomatik olarak vndservicemanager .

vndservicemanager ikili vndservicemanager , Android'in varsayılan cihaz vndservicemanager .

SELinux politikası

Birbirleriyle iletişim kurmak için bağlayıcı işlevini kullanmak isteyen satıcı süreçleri aşağıdakilere ihtiyaç duyar:

  1. /dev/vndbinder .
  2. Bağlayıcı {transfer, call} , vndservicemanager .
  3. Satıcı bağlayıcı arabirimi üzerinden satıcı etki alanı B'ye çağrı yapmak isteyen herhangi bir satıcı etki alanı A için binder_call(A, B) .
  4. vndservicemanager içinde {add, find} hizmetlerine vndservicemanager .

Gereksinim 1 ve 2'yi yerine getirmek için vndbinder_use() makrosunu kullanın:

vndbinder_use(some_vendor_process_domain);

Gereksinim 3'ü yerine getirmek için, bağlayıcı üzerinden konuşması gereken A ve B satıcı süreçleri için binder_call(A, B) yerinde kalabilir ve yeniden adlandırılması gerekmez.

Gereksinim 4'ü yerine getirmek için, hizmet adlarının, hizmet etiketlerinin ve kurallarının işlenme biçiminde değişiklikler yapmanız gerekir.

SELinux ile ilgili ayrıntılar için bkz . Android'de Güvenliği Geliştirilmiş Linux . Android 8.0'daki SELinux hakkında ayrıntılar için bkz. Android 8.0 için SELinux .

Hizmet adları

Daha önce, satıcı bir service_contexts dosyasında kayıtlı servis adlarını işler ve bu dosyaya erişmek için ilgili kuralları service_contexts . , Örnek service_contexts dosya 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

Android 8'de, vndservicemanager yükleri vndservice_contexts yerine dosya. Göç Satıcı hizmetleri vndservicemanager (eski zaten ve hangi service_contexts dosyası) yeni eklenmelidir vndservice_contexts dosyası.

Servis etiketleri

Daha önce, bir service.te dosyasında u:object_r:atfwd_service:s0 gibi hizmet etiketleri tanımlanmıştı. Misal:

type atfwd_service,      service_manager_type;

Android 8'de, türü vndservice_manager_type değiştirmeli ve kuralı vndservice.te dosyasına vndservice.te . Misal:

type atfwd_service,      vndservice_manager_type;

Servis yöneticisi kuralları

Önceden, kurallar, servicemanager hizmet eklemek veya servicemanager hizmet bulmak için alanlara erişim izni servicemanager . Misal:

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

Android 8'de bu tür kurallar yerinde kalabilir ve aynı sınıfı kullanabilir. Misal:

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