Paketler

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:

Derleyici tarafından oluşturulan dosyalar

Şekil 1. Derleyici tarafından oluşturulan dosyalar
  • IFoo.h . Bir C++ sınıfındaki saf IFoo arayüzünü açıklar; IFoo.hal dosyasındaki IFoo 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ün HwBinder 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 . Bir IFoo uygulamasına referans içeren ve arayüzün HwBinder 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 . Hem HwBinder proxy'si hem de HwBinder 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.

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