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.
directory; 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).
- Bir arayüz, paketin
- 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ıntypes.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ı.