Paketler

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:

Derleyici tarafından oluşturulan dosyalar

Şekil 1. Derleyici tarafından oluşturulan dosyalar.

  • IFoo.h: C++ sınıfındaki saf IFoo arayüzünü tanımlar. IFoo.hal dosyasında IFoo 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ün HwBinder 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ün HwBinder 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. Hem HwBinder proxy'sinin hem de HwBinder 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.

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