Hizmetler ve veri aktarımı

Bu sayfada, hizmetlerin nasıl kaydolup keşfedileceği ve .hal içindeki arayüzlerde tanımlanan yöntemleri çağırarak verileri bir hizmete gönderin dosyası olarak da kaydedebilir.

Hizmetleri kaydet

HIDL arayüz sunucuları (arayüzü uygulayan nesneler) kaydedilebilir hizmet olarak adlandırabilirsiniz. Kaydedilen adın arayüzle veya paket adı. Ad belirtilmezse "default" (varsayılan) adı kullanılır. kullanılır; bu, aynı etiketin iki uygulamasını kaydetmesi gerekmeyen HAL'ler için kullanılmalıdır. kullanır. Örneğin, her bir anahtar kelimede tanımlanan hizmet kaydı için C++ çağrısı arayüz şöyle:

status_t status = myFoo->registerAsService();
status_t anotherStatus = anotherFoo->registerAsService("another_foo_service");  // if needed

HIDL arayüzünün sürümü, arayüzün kendisinde bulunur. Evet hizmet kaydı ile otomatik olarak ilişkilendirilir ve yöntem çağrısı (android::hardware::IInterface::getInterfaceVersion()) her HIDL arayüzünde. Sunucu nesnelerinin kaydedilmesi gerekmez ve iletilebilir HIDL yöntem parametreleri aracılığıyla HIDL yöntemi çağrıları yapan başka bir işleme gönderir.

Hizmetleri keşfedin

Belirli bir arayüz için ada ve kullanıcıya göre istemci kodu kullanılarak yapılan istekler İstenen HAL sınıfında getService aranıyor:

// C++
sp<V1_1::IFooService> service = V1_1::IFooService::getService();
sp<V1_1::IFooService> alternateService = V1_1::IFooService::getService("another_foo_service");
// Java
V1_1.IFooService service = V1_1.IFooService.getService(true /* retry */);
V1_1.IFooService alternateService = V1_1.IFooService.getService("another", true /* retry */);

HIDL arayüzünün her sürümü ayrı bir arayüz olarak ele alınır. Böylece, IFooService sürüm 1.1 ve IFooService sürüm 2.2 her ikisi de "foo_service" olarak kaydedilebilir ve Her iki arayüzdeki getService("foo_service"), kaydedilen hizmetini kullanabilirsiniz. Bu nedenle çoğu durumda, (anlamı "varsayılan" adı) olması gerekir.

Tedarikçi Arayüzü Nesnesi ayrıca döndürülmüştür. Paketteki IFoo arayüzü için android.hardware.foo@1.0, IFoo::getService, her zaman şunun için bildirilen aktarım yöntemini kullanır: Giriş mevcutsa cihaz manifestinde android.hardware.foo; Taşıma yöntemi kullanılamıyorsa nullptr döndürülür.

Bazı durumlarda, kullanıcı rızası almaksızın hizmeti almalısınız. Bu durum örneğin, bir müşteri bir web sitesini veya bir teşhis programında (örneğin, atrace) kullanması gerekir. İçinde bu durumda, C++'ta tryGetService veya C++ gibi ek API'ler sağlanır. Java'da getService("instance-name", false). Eski API Java'da sağlanan getService de hizmetle birlikte kullanılmalıdır bildirimleri etkinleştirebilirsiniz. Bu API'nin kullanılması, bir sunucunun istemci, tekrar denenmeyen bu API'lerden biriyle istekte bulunduktan sonra kendini kaydeder.

Hizmet ölümü bildirimleri

Bir hizmet öldüğünde bildirim almak isteyen müşteriler ölüm alabilir bildirimler veya çerçeveler. İstemci, bildirim almak için zorunluluk:

  1. hidl_death_recipient HIDL sınıfını/arayüzünü alt sınıfa sokun (C++ kodunu girin (HIDL'de değil).
  2. serviceDied() yöntemini geçersiz kılın.
  3. hidl_death_recipient alt sınıfının bir nesnesini örneklendirin.
  4. İzlemek için hizmette linkToDeath() yöntemini çağırın, IDeathRecipient'ın arayüz nesnesini geçmelidir. Bu yöntemi, ölen kişinin veya iletinin gönderildiği proxy'nin sahipliğini almaz. çağrılır.

Sözde kod örneği (C++ ve Java benzerdir):

class IMyDeathReceiver : hidl_death_recipient {
  virtual void serviceDied(uint64_t cookie,
                           wp<IBase>& service) override {
    log("RIP service %d!", cookie);  // Cookie should be 42
  }
};
....
IMyDeathReceiver deathReceiver = new IMyDeathReceiver();
m_importantService->linkToDeath(deathReceiver, 42);

Vefat eden kişi birden fazla farklı hizmete kaydedilebilir.

Veri aktarımı

Veriler, .hal dosya. İki tür yöntem vardır:

  • Engelleme yöntemleri, sunucu bir yardımcı olur.
  • Tek yönlü yöntemler, verileri yalnızca tek bir yönde gönderir ve engelleyebilirsiniz. RPC çağrılarında devam eden veri miktarı uygulamayı aşıyorsa çağrılar engellenebilir veya bir hata göstergesi döndürebilir (davranış (henüz belirlenmemiştir).

Değer döndürmeyen ancak oneway engelleme işlemi devam ediyor.

HIDL arayüzünde belirtilen tüm yöntemler tek bir yönde çağrılır. HAL'den veya HAL'ye gönderebilirsiniz. Arayüz, yalnızca kullanıcının bir yöne doğru gitmesini sağlar. Çağrıların kaynaklanması gereken mimariler HAL, HAL paketinde iki (veya daha fazla) arayüz sağlamalı ve uygun bir arayüz oluşturabilirsiniz. client ve server, arayüzün çağrı yönüne göre kullanılır (HAL, bir arayüzün sunucusu ve başka bir arayüzün istemcisi olabilir) arayüz).

Geri çağırma işlevleri

Geri çağırma kelimesi, birbirinden farklı iki farklı kavram eşzamanlı geri çağırma ve eşzamansız geri çağırma.

Eşzamanlı geri çağırma, aşağıdaki sonuçları döndüren bazı HIDL yöntemlerinde kullanılır: dışı verilerdir. Birden fazla değer (veya primitif olmayan tür), sonuçlarını bir geri çağırma işlevi aracılığıyla döndürür. Yalnızca bir değeri döndürülür ve bu değer temel bir türdeyse geri çağırma kullanılmaz ve değeri yöntemden döndürülür. Sunucu, HIDL yöntemlerini uygular ve istemci geri çağırmayı uygular.

Eşzamansız geri çağırmalar, HIDL arayüzü sunucusunun şunları yapmasına olanak tanır: aramalardan kaynaklanır. Bu, ikinci bir arayüzün bir örneği iletilerek yapılır ilk arayüzden bahsedeceğiz. İlk arayüzün istemcisi ikinci sunucu tarafından kullanılır. İlk arayüzün sunucusu, ikinci arayüz nesnesini anlatacağım. Örneğin, bir HAL uygulaması, arayüz nesnesini ifade eder. Kullanılan arayüzlerdeki yöntemler eşzamansız geri çağırma engelleniyor olabilir (ve çağrı yapana değerler döndürebilir) veya oneway. Örnek için "Eşzamansız geri çağırmalar" bölümüne bakın inç HIDL C++.

Bellek sahipliğini basitleştirmek için yöntem çağrıları ve geri çağırmalar yalnızca in parametrelerini desteklemez ve out veya inout parametreleri.

İşlem başına sınırlar

HIDL'de gönderilen veri miktarına işlem başına sınırlar uygulanmaz. ve geri çağırma seçenekleri vardır. Ancak, işlem başına 4 KB'yi aşan çağrılar, fazla kabul edilir. Böyle bir durum söz konusuysa verilen HIDL arayüzünün mimarisini yeniden tasarlamak önerilir. Diğer bir sınırlama ise HIDL için sunulan kaynaklardır. aynı anda birden fazla işlemi yönetebilen gelişmiş bir altyapı mevcuttur. Birden çok işlemler, birden çok iş parçacığı veya bir işleme veya birden fazla oneway çağrısına çağrı gönderme işlemini sürecin hızlıca işlemediği durumlardır. Maksimum toplam alan tüm eşzamanlı işlemler için kullanılabilir varsayılan olarak 1 MB'tır.

İyi tasarlanmış bir arayüzde, bu kaynak sınırlamalarının aşılmaması neler olur? bu sınırı aşan çağrı, belirtilen zamana kadar engellenebilir. kullanılabilir hale gelir veya bir aktarım hatasına işaret eder. Geçtiği her işlem başına sınırları aşarak veya HIDL uygulama kaynaklarını aşmadan toplu devam eden işlemler, hata ayıklamayı kolaylaştırmak için günlüğe kaydedilir.

Yöntem uygulamaları

HIDL gerekli türleri, yöntemleri ve öğeleri açıklayan başlık dosyaları oluşturur. geri çağırmaları için kullanın. HIDL'nin tanımladığı prototip yöntemleri ve geri çağırmalar hem istemci hem de sunucu kodu için aynıdır. HIDL sistemi, Search Ads 360'taki yöntemlerin proxy uygulamalarını IPC aktarımı için verileri düzenleyen arayan tarafı ve saplama Bu kod, çağrı alan tarafında, bu verilerin geliştirici uygulamalarına aktarıldığı ele alacağız.

Verinin sahibi, işlevi çağıran kişi (HIDL yöntemi veya geri çağırma)dır işleve aktarılan yapılar ve çağrıdan sonra sahipliği korunur; inç Arayanın depolama alanında yer açması veya serbest bırakması gerekmeyen her durumda geçerlidir.

  • C++'ta veriler salt okunur olabilir (bu verilere yazma girişimi segmentasyon hatası) ve çağrı süresince geçerlidir. Müşteri, verileri çağrının ötesine aktarmak için derin kopyalayın.
  • Java'da kod, verilerin yerel bir kopyasını (normal bir Java nesnesi) alır. ve bu verilerin atık toplamasına izin verebilir.

RPC dışı veri aktarımı

HIDL, RPC çağrısı kullanmadan veri aktarmak için iki yol sunar: paylaşılan bellek ve Fast Message Queue (FMQ) özellikleri yalnızca C++'ta desteklenir.

  • Paylaşılan anı. Yerleşik HIDL türü memory tahsis edilen paylaşılan belleği temsil eden bir nesneyi iletmek için kullanılır. Paylaşılan anıyı eşlemek için alma işleminde kullanılabilir.
  • Fast Message Queue (FMQ). HIDL şablonlu bir mesaj sunuyor beklemesiz mesaj iletmeyi uygulayan sıra türü olabilir. Çekirdeği kullanmaz veya bağlama dayalı modda (cihazlar arası iletişim bu özelliklere sahip olabilir). HAL genellikle sıranın sonunu, dahili bir parametre aracılığıyla RPC üzerinden iletilebilecek bir nesne oluşturmak HIDL türü MQDescriptorSync veya MQDescriptorUnsync. Bu nesnesi, sıranın diğer ucunu ayarlamak için alma işlemi tarafından kullanılabilir.
    • Senkronizasyon sıralarının taşmasına izin verilmez ve bu sıraların yalnızca bir tanesi olabilir yardımcı olur.
    • Senkronizasyonu kaldırma sıralarının taşmasına izin verilir ve bu sıralar çok sayıda okuyucuya sahip olabilir. Her biri verileri zamanında okuyacak veya kaybolacak.
    ziyaret edin. İki türün de başarısız olmasına izin verilmez (boş bir kuyruktan okuma başarısız olur) ve her tür için yalnızca bir yazar olabilir.

FMQ hakkında daha fazla bilgi için bkz. Fast Message Queue (FMQ).