Binder IPC'yi Kullanma

Bu sayfa, Android 8'deki bağlayıcı sürücüsündeki değişiklikleri açıklar, bağlayıcı IPC'yi kullanma hakkında ayrıntılar sağlar ve gerekli SELinux politikasını listeler.

Bağlayıcı 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 kurar. Bu iletişim, bağlayıcı trafiğini ö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 android-4.4 ilgili şubelerine doğrudan birleştirme gerektiğini android-4,9 ve daha yüksek çekirdek / ortak projesi.

Birden çok bağlayıcı etki alanı (bağlamlar)

Yukarı akış dahil olmak üzere Common-4.4 ve üstü

Temiz bölünme için çerçeve arasında birleştirici trafiği (aygıttan bağımsız) ve satıcı (cihaza özgü) kodu, Android 8, bir bağlayıcı madde bağlamında kavramını ortaya koymuştur. Her bağlayıcı bağlamının kendi aygıt düğümü ve kendi bağlam (hizmet) yöneticisi vardır. Bağlam yöneticisine yalnızca ait olduğu aygıt düğümü aracılığıyla erişebilirsiniz ve bir bağlayıcı düğümü belirli bir bağlamdan geçirirken, aynı bağlamdan yalnızca başka bir işlem tarafından erişilebilir, böylece etki alanlarını birbirinden tamamen yalıtır. Kullanmayla ilgili ayrıntılı bilgi için bkz vndbinder ve vndservicemanager .

dağıtmak-toplamak

Yukarı akış dahil olmak üzere Common-4.4 ve üstü

Android'in önceki sürümlerinde, bir bağlayıcı çağrıdaki her veri parçası üç kez kopyalandı:

  • Bir içine getirilmeye kez Parcel çağıran sürecinde
  • Çekirdek sürücüsünde kez kopyalamak için Parcel hedef sürecine
  • Nesneleştirmek kez Parcel hedef sürecinde

Android 8 kullanımları optimizasyon dağınık toplamak yerine verileri seri hale 1'e 3 ila kopya sayısını azaltmak için Parcel verileri özgün yapısı ve bellek düzeni kalıntıları ve hedef sürecine sürücü hemen kopyalar, ilk. Veriler hedef işleme girdikten sonra yapı ve bellek düzeni aynıdır ve veriler başka bir kopya gerektirmeden okunabilir.

İnce taneli kilitleme

Yukarı akış 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şı koruma sağlamak için genel bir kilit kullanıyordu. Kilit için minimum çekişme olsa da, asıl sorun, düşük öncelikli bir iş parçacığı kilidi elde ederse ve daha sonra önlenirse, aynı kilidi elde etmesi gereken yüksek öncelikli iş parçacıklarını ciddi şekilde geciktirebilirdi. Bu, platformda çöplüğe neden oldu.

Bu sorunu çözmeye yönelik ilk girişimler, genel kilit tutulurken önceden almanın devre dışı bırakılmasını içeriyordu. Ancak bu, gerçek bir çözümden çok bir saldırıydı ve sonunda yukarı akış tarafından reddedildi ve atıldı. Sonraki girişimler, bir sürümü Ocak 2017'den beri Pixel cihazlarda çalışan kilitlemeyi daha ayrıntılı hale getirmeye odaklandı. Bu değişikliklerin çoğu herkese 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 mimarisi ile geliştirilmiş bir çözüm geliştirdik ve tüm ortak çekirdek dallarındaki değişiklikleri sunduk. Bu uygulamayı çok sayıda farklı cihazda test etmeye devam ediyoruz; Bekleyen herhangi bir sorunun farkında olmadığımız için, Android 8 ile gönderilen cihazlar için önerilen uygulama budur.

Gerçek zamanlı öncelikli devralma

Common-4.4 ve common-4.9 (yukarı akış yakında)

Bağlayıcı sürücüsü her zaman iyi öncelikli devralmayı desteklemiştir. Android'de artan sayıda işlem gerçek zamanlı öncelikte çalıştığından, bazı durumlarda artık gerçek zamanlı bir iş parçacığı bir bağlayıcı çağrısı yaparsa, işlemdeki bu çağrıyı işleyen 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 devralma uygular.

İşlem öncelik seviyesi kalıtım Buna ek olarak düğüm öncelikli kalıtım (hizmeti nesnesi bağlayıcı) bir düğüm bu düğüme çağrılar yürütülür gereken minimum bir öncelik belirtmek sağlar. Android'in önceki sürümleri, Nice değerleriyle düğüm önceliği devralmayı zaten destekliyordu, ancak Android 8, gerçek zamanlı zamanlama ilkeleri düğüm devralması için destek ekler.

Kullanıcı alanı değişiklikleri

İçin devre dışı gerçek zamanlı öncelik miras orijinal uygulanmasını: Android 8 tüm kullanıcı alanı bir istisna dışında ortak çekirdekte akım bağlayıcı sürücüsü ile çalışmalarına gerekli değişiklikleri içerir /dev/binder kullanılan bir ioctl . Müteakip geliştirme, öncelikli kalıtımın denetimini, bağlayıcı modu başına (bağlam başına değil) daha ayrıntılı bir yönteme geçirdi. Böylece, ioctl Android ortak dalında değildir ve bunun yerine bir ortak çekirdeklerinde ibraz .

Bu değişikliğin etkisi, gerçek zamanlı öncelik kalıtım her düğüm için varsayılan olarak devre dışıdır olmasıdır. Android Performance ekibi tüm düğümler için gerçek zamanlı öncelik devralma etkinleştirmek için bu yararlı bulduğu hwbinder etki. Aynı etki, kiraz almak Bunu başarmak için bu değişikliği userspace içinde.

Ortak çekirdekler için SHA'lar

Bağlayıcı sürücüsünde gerekli değişiklikleri elde etmek için uygun SHA ile eşitleyin:

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

Bağlayıcı IPC'yi kullanma

Tarihsel olarak, satıcı süreçleri iletişim kurmak için bağlayıcı süreçler arası iletişimi (IPC) kullanmıştır. Android 8'de, /dev/binder cihaz düğümü satıcı süreçleri artık erişmesini anlamına çerçeve süreçlerine özel hale gelir. Satıcı süreçleri erişebilir /dev/hwbinder ancak kullanım HIDL onların AIDL arayüzleri dönüştürmeniz 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 . Eklenmesiyle birlikte /dev/vndbinder , Android artık aşağıdaki üç IPC alan adına sahip:

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

İçin /dev/vndbinder görünmesini, çekirdek yapılandırma öğesi sağlamak CONFIG_ANDROID_BINDER_DEVICES ayarlandığında "binder,hwbinder,vndbinder" (bu Android'in ortak çekirdek ağaçlarında varsayılan).

Normalde, satıcı süreçleri doğrudan bağlayıcı sürücüsünü açmayın ve bunun yerine karşı bağlamak libbinder bağlayıcı sürücüsü açılır userspace kütüphane,. İçin bir yöntem ekleme ::android::ProcessState() için gerekli olan bağlayıcı sürücü seçer libbinder . Satıcı süreçleri içine çağırmadan önce bu yöntemi çağırmalıdır ProcessState, IPCThreadState veya genel olarak herhangi bir bağlayıcı aramaları yapmadan önce. Kullanım için, sonra aşağıdaki aramayı main() bir satıcı süreci (istemci ve sunucu):

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

vndservicemanager

Daha önce, bağlayıcı hizmetler ile kaydedildi servicemanager diğer süreçler tarafından alınamadı. Android 8'de, servicemanager şimdi çerçeve ve uygulama süreçlerine ve satıcı süreçlerinde artık erişim bunun özel kullanılır.

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çleri konuşursan değişiklik yapmak gerekmez vndservicemanager ; bir satıcı işlemi açtığında / dev/vndbinder , servis aramaları otomatik gidin vndservicemanager .

vndservicemanager ikili Android'in varsayılan aygıt makefiles dahildir.

SELinux politikası

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

  1. Erişim için /dev/vndbinder .
  2. Bağlayıcı {transfer, call} içine takar vndservicemanager .
  3. binder_call(A, B) satıcı bağlayıcı arayüzü üzerinden satıcı alanından B içine çağırmak isteyen her satıcı alanı A için.
  4. İzni {add, find} hizmet vndservicemanager .

Kullanmak, gereksinimleri 1 ve 2 yerine getirmek vndbinder_use() makro:

vndbinder_use(some_vendor_process_domain);

Gereksinimi 3, yerine getirmek binder_call(A, B) satıcı için bir işler ve B bağlayıcı üzerinde konuşma ihtiyacı yerinde kalabilir olması ve yeniden adlandırma ihtiyacı yoktur.

4. gereksinimi karşılamak için hizmet adlarının, hizmet etiketlerinin ve kuralların işlenme biçiminde değişiklikler yapmanız gerekir.

SELinux hakkında ayrıntılı bilgi için bkz Android'de Linux Security-Enhanced . Android 8.0 SELinux ilgili ayrıntılar için bkz Android 8.0 için SELinux'u .

Hizmet adları

Daha önce, satıcı süreçleri bir hizmet adları kayıtlı service_contexts dosyası ve bu dosyaya erişen kurallarını gelen ekledi. , Ö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ı.

Hizmet etiketleri

Daha önce, servis gibi etiketler u:object_r:atfwd_service:s0 bir tanımlandı service.te dosyası. Örnek:

type atfwd_service,      service_manager_type;

Android 8'de, size türünü değiştirmek gerekir vndservice_manager_type ve kuralı taşımak vndservice.te dosyası. Örnek:

type atfwd_service,      vndservice_manager_type;

Servis yöneticisi kuralları

Daha önce, gelen hizmet eklemek veya bulmak için alan adlarını erişim izni rules servicemanager . Örnek:

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. Örnek:

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