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 safIFoo
arayüzünü tanımlar.IFoo.hal
dosyasındaIFoo
arayü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
.IFoo
sınıfından devralınan ve arayüzünHwBinder
proxy (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
.IFoo
uygulamasına referans içeren ve arayüzünHwBinder
stub'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
. HemHwBinder
proxy'sinin hem deHwBinder
stub'ı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.hal
dosyasında tanımlanan türler şu şekilde tanımlanır:::android::hardware::mypackage::V1_2::MyPackageType