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:
/dev/vndbinder
erişimi.{transfer, call}
kancasını bağlavndservicemanager
.- Ç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. - Ş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;