Birkaç istisna dışında HIDL arayüz paketleri hardware/interfaces veya vendor/ dizininde bulunur. hardware/interfaces üst düzeyi doğrudan android.hardware paket ad alanıyla eşlenir; sürüm, paket (arayüz değil) ad alanının altındaki bir alt dizindir.
hidl-gen derleyicisi, .hal dosyalarını bir dizi .h ve .cpp dosyasına derler. Bu otomatik olarak oluşturulan dosyalardan, istemci/sunucu uygulamalarının bağlantı kuracağı bir paylaşılan kitaplık oluşturulur.
Bu paylaşılan kitaplığı oluşturan Android.bp dosyası, hardware/interfaces/update-makefiles.sh komut dosyası tarafından otomatik olarak oluşturulur. hardware/interfaces'e her yeni paket eklediğinizde veya mevcut bir pakete/paketten .hal dosyası eklediğinizde/kaldırdığınızda, oluşturulan ortak kitaplığın güncel olduğundan emin olmak için komut dosyasını yeniden çalıştırmanız gerekir.
Örneğin, IFoo.hal örnek dosyası hardware/interfaces/samples/1.0 içinde olmalıdır. Örnek IFoo.hal dosyası, samples 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
HIDL paketindeki otomatik olarak oluşturulan dosyalar, paketle aynı ada sahip tek bir paylaşılan kitaplığa (örneğin, android.hardware.samples@1.0) bağlanır. Paylaşılan kitaplık ayrıca, istemciler ve sunucular tarafından dahil edilebilecek tek bir üstbilgi (IFoo.h) dışa aktarır. hidl-gen derleyicisi, IFoo.hal arayüz dosyasını giriş olarak kullandığında, bağlayıcı modu aşağıdaki otomatik olarak oluşturulmuş dosyaları içerir:

Şekil 1. Derleyici tarafından oluşturulan dosyalar.
IFoo.h: C++ sınıfındaki safIFooarayüzünü tanımlar.IFoo.haldosyasındaIFooarayüzünde tanımlanan ve gerektiğinde C++ türlerine çevrilen yöntemleri ve türleri içerir. Bu arayüzü uygulamak için kullanılan RPC mekanizmasıyla (örneğin,HwBinder) ilgili ayrıntıları içermez. Sınıf, paket ve sürümle birlikte ad alanına eklenir (ör.::android::hardware::samples::IFoo::V1_0). Hem istemciler hem de sunucular bu başlığı içerir: İstemciler, bu yöntemlerde çağrı yapmak için, sunucular ise bu yöntemleri uygulamak için.IHwFoo.h. Arayüzde kullanılan veri türlerini seri hale getiren işlevlerin bildirimlerini içeren başlık dosyası. Geliştiriciler, üstbilgiyi hiçbir zaman doğrudan dahil etmemelidir (üstbilgi sınıf içermez).BpHwFoo.h.IFoosınıfından devralınan ve arayüzünHwBinderproxy (istemci tarafı) uygulamasını açıklayan bir sınıf. Geliştiriciler bu sınıfa hiçbir zaman doğrudan referans vermemelidir.BnHwFoo.h.IFoouygulamasına referans içeren ve arayüzünHwBinderstub'ini (sunucu tarafı) açıklayan bir sınıf. Geliştiriciler bu sınıfı hiçbir zaman doğrudan referans almamalıdır.FooAll.cpp. HemHwBinderproxy'sinin hem deHwBinderstub'ının uygulamalarını içeren bir sınıf. Bir istemci bir arayüz yöntemini çağırdığında proxy, istemciden gelen bağımsız değişkenleri otomatik olarak düzenler ve işlemi, diğer taraftaki stub'a (daha sonra gerçek sunucu uygulamasını çağıran) gönderen bağlayıcı çekirdek sürücüsüne gönderir.
Dosyalar, aidl-cpp tarafından oluşturulan dosyalara benzer şekilde yapılandırılır (ayrıntılar için HIDL'ye Genel Bakış bölümündeki "Geçiş modu"na bakın). HIDL tarafından kullanılan RPC mekanizmasından bağımsız olan tek otomatik olarak oluşturulan dosya IFoo.h'tür. Diğer tüm dosyalar, HIDL tarafından kullanılan HwBinder RPC mekanizmasına bağlıdır. Bu nedenle, istemci ve sunucu uygulamaları IFoo dışındaki hiçbir öğeyi doğrudan referans almamalıdır. Bunu yapmak için yalnızca IFoo.h'ü ekleyin ve oluşturulan paylaşılan kitaplığa bağlantı verin.
Paylaşılan kitaplıklara bağlantı verme
Bir paketteki herhangi bir arayüzü kullanan istemci veya sunucu, söz konusu paketin paylaşılan kitaplığını aşağıdaki konumlardan birinde (1) içermelidir:
- Android.mk dosyasında:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- Android.bp dosyasında:
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
Dahil etmeniz gerekebilecek ek kitaplıklar:
libhidlbase |
Standart HIDL veri türlerini içerir. Android 10'dan itibaren bu karakter grubu, daha önce libhidltransport ve libhwbinder karakter gruplarında bulunan tüm sembolleri de içerir.
|
|---|---|
libhidltransport |
HIDL çağrılarının farklı RPC/IPC mekanizmaları üzerinden aktarılmasını yönetir. Android 10'da bu kitaplığın desteği sonlandırıldı. |
libhwbinder |
Ciltlere özgü simgeler. Android 10'da bu kitaplığın desteği sonlandırıldı. |
libfmq |
Hızlı Mesaj Sırası IPC. |
Ad alanları
Return<T> ve Void() gibi HIDL işlevleri ve türleri ::android::hardware ad alanında tanımlanır.
Bir paketin C++ ad alanı, paket adı ve sürümüne göre belirlenir.
Örneğin, hardware/interfaces altında 1.2 sürümüne sahip mypackage adlı bir paket aşağıdaki özelliklere sahiptir:
- C++ ad alanı ise
::android::hardware::mypackage::V1_2 - Söz konusu paketteki
IMyInterface'nin tam nitelikli adı :::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterface, ad alanının parçası değil, bir tanımlayıcıdır). - Paketin
types.haldosyasında tanımlanan türler şu şekilde tanımlanır:::android::hardware::mypackage::V1_2::MyPackageType