Birkaç istisna dışında, HIDL arayüz paketleri hardware/interfaces
veya vendor/
dizinde bulunur. hardware/interfaces
üst düzey doğrudan android.hardware
paketinin ad alanına eşlenir; sürüm, paket (arayüz değil) ad alanı altındaki bir alt dizindir.
hidl-gen
derleyicisi .hal
dosyalarını bir .h
ve .cpp
dosyası kümesi halinde derler. Otomatik olarak oluşturulan bu dosyalardan, istemci/sunucu uygulamalarının bağlantı kurduğu paylaşılan bir kitaplık oluşturulur. Bu paylaşılan kitaplığı oluşturan Android.bp
dosyası hardware/interfaces/update-makefiles.sh
betiği tarafından otomatik olarak oluşturulur. hardware/interfaces
her yeni paket eklediğinizde veya mevcut bir pakete/paketten .hal
dosyaları eklediğinizde/kaldırdığınızda, oluşturulan paylaşılan kitaplığın güncel olduğundan emin olmak için betiği yeniden çalıştırmanız gerekir.
Örneğin, IFoo.hal
örnek dosyası hardware/interfaces/samples/1.0
konumunda bulunmalıdır. Örnek IFoo.hal
dosyası, örnekler paketinde bir IFoo arayüzü oluşturur:
package android.hardware.samples@1.0; interface IFoo { struct Foo { int64_t someValue; handle myHandle; }; someMethod() generates (vec<uint32_t>); anotherMethod(Foo foo) generates (int32_t ret); };
Oluşturulan dosyalar
Bir HIDL paketindeki otomatik olarak oluşturulan dosyalar, paketle aynı ada sahip tek bir paylaşılan kitaplığa bağlanır (örneğin, android.hardware.samples@1.0
). Paylaşılan kitaplık aynı zamanda istemciler ve sunucular tarafından eklenebilen tek bir üstbilgi olan IFoo.h
de dışa aktarır. Giriş olarak IFoo.hal
arayüz dosyasıyla birlikte hidl-gen
derleyicisini kullanan ciltleme modunda aşağıdaki otomatik oluşturulan dosyalar bulunur:
-
IFoo.h
. Bir C++ sınıfındaki safIFoo
arayüzünü açıklar;IFoo.hal
dosyasındakiIFoo
arayüzünde tanımlanan yöntemleri ve türleri içerir ve gerektiğinde C++ türlerine çevrilir. Bu arayüzü uygulamak için kullanılan RPC mekanizmasıyla (örn.HwBinder
) ilgili ayrıntıları içermez . Sınıf, paket ve sürümle ad alanına sahiptir, örneğin::android::hardware::samples::IFoo::V1_0
. Hem istemciler hem de sunucular bu başlığı içerir: Üzerinde yöntemleri çağırmak için istemciler ve bu yöntemleri uygulamak için sunucular. -
IHwFoo.h
. Arayüzde kullanılan veri türlerini serileştiren işlevlere ilişkin bildirimleri içeren başlık dosyası. Geliştiriciler asla başlığını doğrudan eklememelidir (herhangi bir sınıf içermez). -
BpHwFoo.h
.IFoo
miras alan ve arayüzünHwBinder
proxy (istemci tarafı) uygulamasını açıklayan bir sınıf. Geliştiriciler asla bu sınıfa doğrudan başvurmamalıdır. -
BnHwFoo.h
. BirIFoo
uygulamasına referans içeren ve arayüzünHwBinder
saplama (sunucu tarafı) uygulamasını açıklayan bir sınıf. Geliştiriciler asla bu sınıfa doğrudan başvurmamalıdır. -
FooAll.cpp
. HemHwBinder
proxy'si hem deHwBinder
saplaması için uygulamaları içeren bir sınıf. Bir istemci bir arayüz yöntemini çağırdığında, proxy otomatik olarak istemciden gelen argümanları sıralar ve işlemi ciltleyici çekirdek sürücüsüne gönderir, bu da işlemi diğer taraftaki saplamaya iletir (bu daha sonra gerçek sunucu uygulamasını çağırır).
Dosyalar aidl-cpp
tarafından oluşturulan dosyalara benzer şekilde yapılandırılmıştır (ayrıntılar için HIDL Genel Bakışındaki "Geçiş modu" konusuna bakın). HIDL tarafından kullanılan RPC mekanizmasından bağımsız, otomatik olarak oluşturulan tek dosya IFoo.h
; diğer tüm dosyalar HIDL tarafından kullanılan HwBinder RPC mekanizmasına bağlıdır. Bu nedenle, istemci ve sunucu uygulamaları hiçbir zaman IFoo
dışında herhangi bir şeye doğrudan atıfta bulunmamalıdır . Bunu başarmak için yalnızca IFoo.h
ekleyin ve oluşturulan paylaşılan kitaplığa bağlantı verin.
Paylaşılan kitaplıklara bağlanma
Bir paketteki herhangi bir arabirimi kullanan bir istemci veya sunucu, söz konusu paketin paylaşılan kitaplığını aşağıdaki konumlardan birine (1) dahil etmelidir:
- Android.mk'de :
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- Android.bp'de :
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
Eklemeniz gerekebilecek ek kütüphaneler:
libhidlbase | Standart HIDL veri türlerini içerir. Android 10'dan itibaren bu, daha önce libhidltransport ve libhwbinder bulunan tüm simgeleri de içerir. |
---|---|
libhidltransport | HIDL çağrılarının farklı RPC/IPC mekanizmaları üzerinden taşınmasını yönetir. Android 10 bu kitaplığı kullanımdan kaldırıyor. |
libhwbinder | Bağlayıcıya özgü semboller. Android 10 bu kitaplığı kullanımdan kaldırıyor. |
libfmq | Hızlı Mesaj Kuyruğu IPC. |
Ad alanları
Return<T>
ve Void()
gibi HIDL işlevleri ve türleri ::android::hardware
ad alanında bildirilir. Bir paketin C++ ad alanı, paket adı ve sürümüne göre belirlenir. Örneğin, hardware/interfaces
altındaki sürüm 1.2'ye sahip bir mypackage paketi aşağıdaki niteliklere sahiptir:
- C++ ad alanı
::android::hardware::mypackage::V1_2
- Bu paketteki
IMyInterface
tam adı :::android::hardware::mypackage::V1_2::IMyInterface
. (IMyInterface
bir tanımlayıcıdır, ad alanının parçası değildir). - Paketin
types.hal
dosyasında tanımlanan türler şu şekilde tanımlanır:::android::hardware::mypackage::V1_2::MyPackageType