Arayüzler ve paketler

HIDL, nesne odaklı soyut bir tür olan arayüzler etrafında oluşturulmuştur. yaygın dil türlerini konuşacağız. Her arayüz bir paketin parçasıdır.

Paketler

Paket adlarının package.subpackage gibi alt düzeyleri olabilir. İlgili içeriği oluşturmak için kullanılan Yayınlanan HIDL paketlerinin kök dizini: hardware/interfaces veya vendor/vendorName (örneğin, Pixel için vendor/google) cihazlar). Paket adı, kök dizin altında bir veya daha fazla alt dizin oluşturur. dizin; bir paket tanımlayan tüm dosyalar aynı dizinde bulunur. Örneğin, package android.hardware.example.extension.light@2.0 bulundu hardware/interfaces/example/extension/light/2.0 altında.

Aşağıdaki tabloda paket önekleri ve konumları listelenmiştir:

Paket öneki Konum Arayüz türleri
android.hardware.* hardware/interfaces/* HAL
android.frameworks.* frameworks/hardware/interfaces/* çerçeveler/ ilgili
android.system.* system/hardware/interfaces/* sistem/ ilgili
android.hidl.* system/libhidl/transport/* core

Paket dizini, .hal uzantısına sahip dosyaları içeriyor. Hepsini dosyası, paketi adlandıran bir package ifadesi ve ait olduğu sürümdür. types.hal dosyası varsa arayüz tanımlamaz ancak her kullanıcının erişebileceği veri türlerini yer alır.

Arayüz tanımı

types.hal dışında diğer tüm .hal dosyaları pek de iyi olmadığını unutmayın. Bir arayüz genellikle aşağıdaki gibi tanımlanır:

interface IBar extends IFoo { // IFoo is another interface
    // embedded types
    struct MyStruct {/*...*/};

    // interface methods
    create(int32_t id) generates (MyStruct s);
    close();
};

Dolaylı olarak açık bir extends bildirimi olmayan arayüz şuna benzer: android.hidl.base@1.0::IBase (şuna benzer: Java'da java.lang.Object.) Dolaylı olarak IBase arayüzü içe aktarılmış, içe aktarılmaması gereken ve olamayacak birkaç ayrılmış yöntem bildirir yeniden beyan edilmiş veya başka şekillerde kullanılmış değildir. Bu yöntemler şunlardır:

  • ping
  • interfaceChain
  • interfaceDescriptor
  • notifySyspropsChanged
  • linkToDeath
  • unlinkToDeath
  • setHALInstrumentation
  • getDebugInfo
  • debug
  • getHashChain

İçe aktarma işlemi

import beyanı, pakete erişmek için kullanılan HIDL mekanizmasıdır başka bir pakette kullanabilirsiniz. import ifadesi iki varlıkla ilgilidir:

  • İçe aktarma varlığı, bir paket veya bir arayüz
  • İçe aktarılan varlık (paket veya arayüz

İçe aktaran varlık, import ifadesi. İfade bir paketin types.hal, içe aktarılmakta olan öğe tüm paket tarafından görülebilir; Bu, paket düzeyinde bir içe aktarmadır. İfade, içe aktarılan varlık arayüzün kendisidir; bu arayüz düzeyinde içe aktarma.

İçe aktarılan varlık, import öğesinden sonraki değere göre belirlenir. anahtar kelime. Değerin tam bir ad olması gerekmez; bileşen atlandığında, otomatik olarak mevcut paketteki bilgilerle doldurulur. Tam değerler için aşağıdaki içe aktarma durumları desteklenir:

  • Tüm paketten içe aktarma işlemleri. Değer bir paket adı ve sürümünü kullanıyorsanız (söz dizimi aşağıda açıklanmıştır) ise paketin tamamı içe aktaran varlık.
  • Kısmi içe aktarmalar. Değer:
    • Bir arayüz, paketin types.hal ve bu arayüz içe aktarılan varlığa aktarılır.
    • types.hal içinde tanımlanan bir UDT ise yalnızca bu UDT, içe aktarılan varlık (types.hal içindeki diğer türler içe aktarılmaz).
  • Yalnızca türleri içe aktarma işlemleri. Değer bir kısmi içe aktarma işlemi yukarıda açıklanmıştır, ancak bunun yerine types anahtar kelimesi kullanılmıştır yalnızca belirtilen arayüz adının types.hal'sindeki UDT'ler, paketi içe aktarıldı.

İçe aktaran varlık aşağıdakilerin bir kombinasyonuna erişim elde eder:

  • İçe aktarılan paketin types.hal içinde tanımlanan ortak UDT'leri;
  • İçe aktarılan paketin arayüzleri (tüm paketi içe aktarma işlemi için) veya (kısmi içe aktarma işlemi için) içe aktarma işleminde kullanılan ve/veya bunları devralabilir.

İçe aktarma ifadesi, içe aktarılan paketin veya arayüzün adı ve sürümü:

import android.hardware.nfc@1.0;            // import a whole package
import android.hardware.example@1.0::IQuux; // import an interface and types.hal
import android.hardware.example@1.0::types; // import just types.hal

Arayüz devralma

Arayüz, önceden tanımlanmış bir arayüzün uzantısı olabilir. Uzantılar aşağıdaki üç türden biri olabilir:

  • Arayüz, API'sini içeren başka bir özelliğe işlev ekleyebilir değişmedi.
  • Paket, API'sini kullanarak başka bir pakete işlev ekleyebilir değişmedi.
  • Arayüz, paketten veya belirli bir arayüzden türleri içe aktarabilir.

Bir arayüz yalnızca bir diğer arayüzü genişletebilir (birden fazla devralma işlemi yapılamaz). Sıfır olmayan bir alt sürüm numarasına sahip bir paketteki her arayüz bir paketinin önceki sürümünde kullanabilirsiniz. Örneğin, bir derivative paketinin 4.0 sürümündeki IBar Paketin 1.2 sürümündeki bir IFoo arayüzünü (genişletir) original ve original paketinin 1.3 sürümü oluşturuldu, IBar sürüm 4.1, şu sürüm 1.3'ü uzatamaz: IFoo. Bunun yerine, IBar 4.1 sürümünün süresi uzatılmalıdır IFoo 1.2 sürümüne bağlı IBar sürüm 4.0. IBar sürümü 5.0, aşağıdaki durumlarda IFoo sürüm 1.3'ü uzatabilir gerekir.

Arayüz uzantıları, kitaplık bağımlılığı veya çapraz HAL katılımı anlamına gelmez. Bunlar, oluşturulan kodda veri yapısını ve yöntemini içe aktarır. irdeleyelim. Bir HAL'deki her yöntem, söz konusu HAL.

Satıcı uzantıları

Bazı durumlarda, tedarikçi firma uzantıları temel nesnesi olarak tanımlanabilir. Aynı nesne ana HAL adı ve sürümü altında ve uzantının (sağlayıcı) HAL adı ve sürümü.

Sürüm oluşturma

Paketlerin sürümü vardır ve arayüzlerde kendi paketlerinin sürümü bulunur. Sürümler, ana.ikincil olmak üzere iki tam sayıyla ifade edilir.

  • Ana sürümler geriye dönük uyumlu değildir. Artış ana sürüm numarası, alt sürüm numarasını 0 olarak sıfırlar.
  • Küçük sürümler geriye dönük uyumludur. Gelecek projelerde küçük bir sayı, yeni sürümün kontrol edin. Yeni veri yapıları ve yöntemler eklenebilir ancak mevcut veri yapıları ve yöntemler eklenebilir veri yapıları veya yöntem imzaları değiştirilebilir.

Bir cihazda bir HAL'nin birden çok ana veya alt sürümü bulunabilir olanak tanır. Ancak ana sürüm yerine alt sürüm tercih edilmelidir. sürümü, çünkü önceki alt sürüm arayüzüyle çalışan istemci kodu aynı arayüzün sonraki alt sürümleriyle de çalışır. Daha fazla sürüm oluşturma ve tedarikçi firma uzantıları ile ilgili ayrıntılar için HIDL Sürümü Oluşturma.

Arayüz düzeni özeti

Bu bölümde, HIDL arayüz paketinin (ör. hardware/interfaces) ve sunulan bilgileri bir araya getirir her şeyi inceleyeceğiz. Okumadan önce şu konuları bildiğinizden emin olun: HIDL sürümü, şununla karma oluşturma: hidl-gen kavramlarını içeren bir ekiple çalışmanın ayrıntıları Genel olarak HIDL ve aşağıdaki tanımlar:

Terim Tanım
Uygulama İkili Arabirimi (ABI) Uygulama programlama arayüzü ve gerekli ikili program bağlantıları.
tam ad (fqName) Hidl türünü ayırt etmek için kullanılan ad. Örnek: android.hardware.foo@1.0::IFoo
paket HIDL arayüzü ve türleri içeren paket. Örnek: android.hardware.foo@1.0
paket kökü HIDL arayüzlerini içeren kök paket. Örnek: HIDL arayüzü android.hardware, paket kökünde yer alıyor android.hardware.foo@1.0.
paket kök yolu Android kaynak ağacında, paket kökünün eşlendiği konum.

Daha fazla tanım için HIDL'ye bakın Terminoloji.

Her dosya, paket kök eşleme ve tam adı

Paket kökleri, bağımsız değişken olarak hidl-gen ile belirtilmiş -r android.hardware:hardware/interfaces. Örneğin, paket: vendor.awesome.foo@1.0::IFoo ve hidl-gen -r vendor.awesome:some/device/independent/path/interfaces gönderilir, arayüz dosyası şu konumda olmalıdır: $ANDROID_BUILD_TOP/some/device/independent/path/interfaces/foo/1.0/IFoo.hal.

Uygulamada, awesome adlı bir tedarikçi veya OEM için önerilir. standart arayüzlerini vendor.awesome'ye yerleştirdi. Paketten sonra yolu seçildi. Bunun ABI'sına dahil edildiği için değiştirilmemelidir hoşuma gidiyor.

Paket yolu eşlemesi benzersiz olmalıdır

Örneğin, -rsome.package:$PATH_A ve -rsome.package:$PATH_B, $PATH_A eşit olmalıdır Tutarlı bir arayüz dizini için $PATH_B (bu da sürüm oluşturma daha kolaydır).

Paket kökü, bir sürüm oluşturma dosyası içermelidir

Örneğin bir paket yolu oluşturursanız -r vendor.awesome:vendor/awesome/interfaces, şunları da yapmalısınız: dosyayı oluşturma $ANDROID_BUILD_TOP/vendor/awesome/interfaces/current.txt, -Lhash hidl-gen (bu Karma oluşturma işlemi şununla yapılıyor: hidl-gen gibi).

Arayüzler cihazdan bağımsız olarak sunulur. konumlar

Pratikte, arayüzleri dallar arasında paylaşmanızı öneririz. Bu Böylece maksimum sayıda kod yeniden kullanılabilir ve farklı platformlarda maksimum cihazlar ve kullanım alanları.