Bağlayıcı IPC kullan

Bu sayfada, Android 8'deki bağlayıcı sürücüsünde yapılan değişiklikler açıklanmaktadır. ve gerekli SELinux politikasını listeler.

Bağlayıcı sürücüsünde yapılan değişiklikler

Android 8'den itibaren Android çerçevesi ve HAL'ler artık birbirine ekleyebilirsiniz. Bu iletişim, bağlayıcılığı önemli ölçüde artırırken, trafiğe göre, Android 8, bağlayıcı IPC'yi korumak için tasarlanmış çeşitli iyileştirmeler içerir. hızlıdır. SoC tedarikçileri ve OEM'ler doğrudan işletmenin ilgili şubelerinden birleşmelidir. android-4.4, android-4.9 ve sonraki sürümler kernel/common projesi için geçerli olmalıdır.

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

Common-4.4 ve sonraki sürümler (yukarı akış dahil)

Bağlayıcı trafiğini çerçeve (cihazdan bağımsız) ve satıcı (cihaza özgü) kodu için Android 8'de bağlayıcı göz atın. Her bağlayıcı bağlamının kendi cihaz düğümü ve kendi bağlamı vardır (hizmet) yöneticisiyle birlikte çalışır. Bağlam yöneticisine yalnızca cihaz üzerinden erişebilirsiniz. ve bir bağlayıcı düğümünü belirli bir çerçeveden geçirirken söz konusu bağlamdan yalnızca başka bir süreç tarafından erişilebilir. ve alanları birbirinden tamamen ayırmaktır. Kullanımla ilgili ayrıntılar için bkz. vndbinder ve vndservicemanager.

Dağılım Toplayıcı

Common-4.4 ve sonraki sürümler (yukarı akış dahil)

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

  • Seri haline getirdikten sonra Parcel. arama sürecinde
  • Parcel öğesini hedefe kopyalamak için çekirdek sürücüsüne geldiğinizde işlem
  • Hedef işlemdeki Parcel, seri durumdan çıkarılır.

Android 8 kullanım alanları dağılım-toplayıcı optimizasyon'u kullanarak kopya sayısını 3'ten 1'e indirin. Şunun yerine: veriler önce Parcel içinde serileştiriliyorsa veriler orijinal haliyle kalır. Böylece, sürücü bunu hemen hedefe kopyalar ve bahsedeceğim. Veriler hedef süreçten geçtikten sonra, yapı ve bellek Aynı düzen aynı ve veriler başka bir kopya gerekmeden okunabiliyor.

Ayrıntılı kilitleme

Common-4.4 ve sonraki sürümler (yukarı akış dahil)

Önceki Android sürümlerinde bağlayıcı sürücüsü, verileri korumak için genel kilit kullanıyordu. verilere karşı koruma sağlar. Asgari düzeyde sorun, düşük öncelikli bir iş parçacığının ve daha sonra önlem olarak alınır. Bu da, aynı kilidi alması gereken yüksek öncelikli ileti dizileri. Bu durum, platformu.

Bu sorunu çözmek için gerçekleştirilen ilk denemelerde, global kilidi basılı tutuyorsunuz. Ancak bu, gerçek bir çözümden çok bir saldırıydı. ve sonunda üretim kanalı tarafından reddedildi ve silindi. Sonraki denemeler kilitlemeyi daha hassas hale getirmeye odaklanmıştır; (Ocak 2017'den beri) Pixel cihazlarda Bu değişikliklerin büyük bir kısmı sonraki sürümlerde önemli iyileştirmeler yapıldı.

Ayrıntılı kilitleme uygulamasındaki küçük sorunları belirledikten sonra farklı bir kilitleme mimarisine sahip daha iyi bir çözüm geliştirdi ve tüm yaygın çekirdek dallarındaki değişiklikler. Bunu test etmeye devam ediyoruz çok sayıda farklı cihazda uygulanmasını sağlar; farkında olmadığımız için sorun çözülmüştür. Bu, nakliye hizmeti ve en iyi uygulamaları paylaşacağız.

Gerçek zamanlı öncelik devralma

Common-4.4 and common-4.9 (upstream yakında)

Bağlayıcı sürücüsü, güzel öncelik devralmayı her zaman desteklemiştir. Kullanıcı Android'de gerçek zamanlı öncelikte çalışan işlemlerin sayısındaki artış oranı. durumlarda artık, gerçek zamanlı bir iş parçacığının bir bağlayıcı çağrı yapması halinde o çağrıyı işleyen süreçteki iş parçacığı da gerçek zamanlı öncelikte çalışır. Alıcı: desteklemesine rağmen Android 8'de artık gerçek zamanlı öncelik devralma dosyalarından birini seçebilirsiniz.

İşlem düzeyinde öncelik devralmaya ek olarak düğüm önceliği devralma, bir düğümün (bağlayıcı hizmet nesnesi) minimum değer belirtmesini sağlar bu düğüme yapılan çağrıların yürütüleceği öncelik. Önceki sürümleri Android, güzel değerlerle düğüm önceliği devralmayı zaten destekliyordu, ancak Android 8, gerçek zamanlı planlama politikaları düğüm devralma desteği sunmaya başladı.

Kullanıcı alanı değişiklikleri

Android 8, mevcut ortak çekirdekte bir bağlayıcı sürücüsü, bir istisna hariç: Orijinal için gerçek zamanlı öncelik devralmayı devre dışı bırakmak /dev/binder şunu kullandı: ioctl değerleri gösterilir. Sonraki geliştirmelerde öncelik kontrolüne geçiş yapıldı daha ayrıntılı bir yönteme geçiş yapılmasını sağlar (bağlayıcı modu başına değil, Bağlam). Dolayısıyla, ioctl Android ortak dalında yer almaz ve ortak çekirdeklerimizde yer alıyor.

Bu değişikliğin etkisi, gerçek zamanlı öncelik devralmanın Google tarafından her düğüm için varsayılan olarak ayarlanır. Android performans ekibi bunu buldu tüm düğümler için gerçek zamanlı öncelik devralmayı etkinleştirme açısından yararlıdır. hwbinder alanı. Aynı etkiyi elde etmek için elinizi bu değişikliği yapın.

Yaygın çekirdekler için SHA'lar

Bağlayıcı sürücüsünde gerekli değişiklikleri almak için uygun SHA'yı senkronize edin:

  • Genel-3,18
    cc8b90c121de ANDROID: bağlayıcı: Geri yüklemede öncelikli izinleri kontrol etmeyin.
  • Genel-
    4,4 76b376eac7a2 ANDROID: bağlayıcı: Geri yüklemede öncelik izinlerini kontrol etme.
  • Genel-
    4,9 ecd972d4f9b5 ANDROID: binder: Geri yüklemede öncelik izinlerini kontrol etme.

Bağlayıcı IPC ile çalışma

Tedarikçi süreçleri geçmişte bağlayıcı işlemler arası iletişimi kullanıyordu. (IPC) temel alınır. Android 8'de, /dev/binder cihaz düğümü çerçeve süreçlerine özgüdür, yani tedarikçi firma süreçleri artık erişimi olur. Tedarikçi firma işlemleri /dev/hwbinder hizmetine erişebilir, ancak AIDL arayüzlerini HIDL kullanacak şekilde dönüştürmeleri gerekir. Devam etmek isteyen satıcılar için tedarikçi firma işlemleri arasındaki AIDL arayüzlerini kullanarak, Android'in bağlayıcı IPC'yi bakın. Kararlı AIDL, Android 10'da herkese hem de kararlılık sorunu çözmek için hem /dev/binder HIDL ve /dev/hwbinder çözüldüğünü garanti eder. Kararlı sürümünü kullanmak için AIDL, bkz. HAL'ler için AIDL.

Vndbinder

Android 8, tedarikçi hizmetleri tarafından kullanılmak üzere, erişilen yeni bir bağlayıcı alan adını destekler /dev/binder yerine /dev/vndbinder kullanılıyor. Şununla /dev/vndbinder ile birlikte Android'de artık şu üç özellik var: IPC alanları:

IPC Alanı Açıklama
/dev/binder AIDL arayüzleriyle çerçeve/uygulama işlemleri arasında IPC
/dev/hwbinder HIDL arayüzleriyle çerçeve/tedarikçi firma işlemleri arasında IPC
HIDL arayüzleriyle tedarikçi işlemleri arasında IPC
/dev/vndbinder AIDL arayüzleriyle tedarikçi/tedarikçi firma işlemleri arasında IPC

/dev/vndbinder öğesinin görünmesi için çekirdek yapılandırmasının yapıldığından emin olun CONFIG_ANDROID_BINDER_DEVICES. öğe şuna ayarlandı: "binder,hwbinder,vndbinder" (Android'de varsayılan ayardır.) yaygın çekirdek ağaçları)

Normalde tedarikçi işlemleri bağlayıcı sürücüyü doğrudan açmaz ve bunun yerine libbinder kullanıcı alanı kitaplığına bağlarsanız şunu açar: bağlayıcı sürücüsü. ::android::ProcessState() için yöntem ekleniyor libbinder için bağlayıcı sürücüyü seçer. Tedarikçi süreçleri ProcessState, çağrısından önce bu yöntemi çağırın IPCThreadState veya genel olarak bağlayıcı çağrıları yapmadan önce. Alıcı: kullanıyorsanız aşağıdaki çağrıyı, tedarikçi firma işleminin main(). adımlarından sonra yapın (istemci ve sunucu):

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

vndservicemanager

Bağlayıcı hizmetleri daha önce servicemanager, başka süreçler tarafından alınabilir hale gelir. Android 8'de servicemanager artık yalnızca çerçeve ve uygulama tarafından kullanılıyor ve tedarikçi süreçleri artık bu belgeye erişemez.

Ancak, satıcı hizmetleri artık vndservicemanager, yeni bir /dev/vndbinder kullanan servicemanager örneği (/dev/binder yerine) ve çerçeve servicemanager. Tedarikçi süreçlerinin vndservicemanager ile konuşmada yapılan değişiklikler; Bir tedarikçinin süreci açıldığında /dev/vndbinder, hizmet aramaları otomatik olarak şu adrese gider: vndservicemanager

vndservicemanager ikili programı, Android'in varsayılanına dahil edildi cihaz oluşturma dosyaları.

SELinux politikası

İletişim kurmak için bağlayıcı işlevini kullanmak isteyen tedarikçi süreçleri birbirlerinin aşağıdakilere ihtiyacı vardır:

  1. /dev/vndbinder erişimi.
  2. {transfer, call} kancasını bağla vndservicemanager.
  3. Çağrı yapmak isteyen herhangi bir tedarikçi firma alanı A için binder_call(A, B) tedarikçi firma bağlayıcı arayüzü üzerinden tedarikçi firma alanına B gönderilir.
  4. Şuradaki {add, find} hizmet için izin: vndservicemanager.

1. ve 2. şartları karşılamak için vndbinder_use() kullanın. makro:

vndbinder_use(some_vendor_process_domain);

3. şartı karşılamak için tedarikçi firmanın binder_call(A, B) maddesi bağlayıcının üzerine konuşması gereken A ve B süreçleri yeniden adlandırmanız gerekiyor.

4. gereksinimi karşılamak için hizmet adlarının, ve kuralların nasıl işlendiğini takip etmelisiniz.

SELinux hakkında ayrıntılar için bkz. Security-Advanced Android'de Linux. Android 8.0'da SELinux hakkında ayrıntılı bilgi için bkz. Android için SELinux 8.0'dan itibaren herhangi bir işlem gerçekleştirmez.

Hizmet adları

Tedarikçi daha önce, kayıtlı hizmet adlarını bir service_contexts dosyası ve ilgili erişim kuralları eklendi yapabilirsiniz. Şuradan örnek service_contexts dosyası: 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, Bunun yerine vndservice_contexts dosyası yükleyin. Şuraya taşınan tedarikçi hizmetleri: vndservicemanager (ve bunlar zaten eski sürümde mevcut) service_contexts dosyası) yeni vndservice_contexts dosyası.

Hizmet etiketleri

Önceden, u:object_r:atfwd_service:s0 gibi hizmet etiketleri service.te dosyasında tanımlandı. Örnek:

type atfwd_service,      service_manager_type;

Android 8'de türü şu şekilde değiştirmeniz gerekir: vndservice_manager_type ve kuralı vndservice.te dosya Örnek:

type atfwd_service,      vndservice_manager_type;

hizmet yöneticisi kuralları

Daha önce, alanlara hizmet ekleme veya mevcut hizmetleri bulma erişimi verilen kurallar 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 yürürlükte kalabilir ve aynı sınıfı kullanabilir. Örnek:

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