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:
hidl_death_recipient
HIDL sınıfını/arayüzünü alt sınıfa sokun (C++ kodunu girin (HIDL'de değil).serviceDied()
yöntemini geçersiz kılın.hidl_death_recipient
alt sınıfının bir nesnesini örneklendirin.- İ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
veyaMQDescriptorUnsync
. 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.
FMQ hakkında daha fazla bilgi için bkz. Fast Message Queue (FMQ).