Google, Siyah topluluklar için ırksal eşitliği ilerletmeye kararlıdır. Nasıl olduğunu gör.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

HIDL

HAL arayüz tanımlama dili veya HIDL ("hide-l" olarak telaffuz edilir), bir HAL ile kullanıcıları arasındaki arayüzü belirten bir arayüz tanımlama dilidir (IDL). Arabirimler ve paketler halinde toplanan tiplerin ve yöntem çağrılarının belirlenmesine izin verir. Daha geniş kapsamlı olarak, HIDL bağımsız olarak derlenebilecek kod tabanları arasında iletişim kurmak için bir sistemdir.

HIDL'nin süreçler arası iletişim (IPC) için kullanılması amaçlanmıştır. İşlemler arasındaki iletişim Binderized olarak adlandırılır . Bir işleme bağlanması gereken kütüphaneler için bir geçiş modu da mevcuttur (Java'da desteklenmez).

HIDL, paketler halinde toplanan arabirimlerde (bir sınıfa benzer şekilde) düzenlenmiş veri yapılarını ve yöntem imzalarını belirtir. HIDL sözdizimi, farklı bir anahtar kelime kümesine rağmen, C ++ ve Java programcılarına tanıdık gelecektir. HIDL ayrıca Java tarzı ek açıklamalar kullanır.

HIDL tasarımı

HIDL'nin amacı HAL'nin yeniden oluşturulması gerekmeden çerçevenin değiştirilebilmesidir. HAL'lar, satıcılar veya SOC üreticileri tarafından oluşturulacak ve aygıtın kendi bölümünde, HAL'ları yeniden derlemeden çerçevenin bir OTA ile değiştirilmesini sağlayacak şekilde bir /vendor bölümü içine yerleştirilecektir.

HIDL tasarımı aşağıdaki endişeleri dengeler:

  • Birlikte çalışabilirlik . Çeşitli mimariler, araç zincirleri ve derleme yapılandırmalarıyla derlenebilecek işlemler arasında güvenilir şekilde birlikte çalışabilir arayüzler oluşturun. HIDL arabirimleri sürümlidir ve yayınlandıktan sonra değiştirilemez.
  • Verimlilik . HIDL, kopyalama işlemi sayısını en aza indirmeye çalışır. HIDL tanımlı veriler, paketten çıkarılmadan kullanılabilen C ++ standart düzen veri yapılarında C ++ koduna teslim edilir. HIDL ayrıca paylaşılan bellek arabirimleri sağlar ve RPC'ler doğal olarak biraz yavaş olduğundan, HIDL, RPC çağrısı kullanmadan veri aktarmanın iki yolunu destekler: paylaşılan bellek ve Hızlı Mesaj Kuyruğu (FMQ).
  • Sezgisel . HIDL önler dikenli sadece kullanılarak bellek mülkiyet sorunları in RPC (bkz parametreleri Android Arayüz Tanımlama Dili (AIDL) ); yöntemlerden etkin bir şekilde geri döndürülemeyen değerler geri arama işlevleri ile döndürülür. Ne aktarım için HIDL'ye veri aktarma ne de HIDL'den veri alma, verilerin sahipliğini değiştirmez; sahiplik her zaman çağrı işlevinde kalır. Verilerin yalnızca çağrılan fonksiyonun süresi boyunca kalması gerekir ve çağrılan fonksiyon döndükten hemen sonra imha edilebilir.

Geçiş modunu kullanma

Android'in önceki sürümlerini çalıştıran cihazları Android O'ya güncellemek için, hem geleneksel (hem de eski) HAL'leri, HAL'yi bağlayıcı ve aynı işlem (geçiş) modlarında sunan yeni bir HIDL arayüzüne sarabilirsiniz. Bu sarma hem HAL hem de Android çerçevesine şeffaftır.

Geçiş modu yalnızca C ++ istemcileri ve uygulamaları için kullanılabilir. Android'in önceki sürümlerini çalıştıran cihazlarda Java ile yazılmış HAL'ler yoktur, bu nedenle Java HAL'lar doğal olarak ciltlenir.

Bir .hal dosyası derlendiğinde hidl-gen , bağlayıcı iletişimi için kullanılan başlıklara ek olarak BsFoo.h ek bir geçiş dosyası başlık dosyası üretir; bu başlık, dlopen edilecek fonksiyonları tanımlar. Geçiş HAL'ları çağrıldıkları işlemde çalıştıklarından, çoğu durumda geçiş yöntemi doğrudan işlev çağrısı (aynı iş parçacığı) tarafından çağrılır. oneway onlar (bu vasıta kullandığı herhangi HAL bunları işlemek için HAL beklemek amaçlanmamıştır gibi yöntemler kendi iplik çalıştırmak oneway geçişi modundadır yöntemlerle parçacığı güvenli olmalıdır).

Verilen bir IFoo.hal , BsFoo.h yaratmak (örneğin, ek özellikleri sağlamak için HIDL yaratılan yöntemler sarar oneway başka bir iş parçacığı çalıştırmak işlemleri). Bu dosya BpFoo.h dosyasına benzer, ancak bağlayıcı kullanarak IPC çağrılarını iletmek yerine, istenen işlevler doğrudan çağrılır. HAL'ların gelecekteki uygulamaları, FooFast HAL ve FooAccurate HAL gibi birden fazla uygulama sağlayabilir . Bu gibi durumlarda, her ek uygulama için bir dosya oluşturulacaktır (örneğin, PTFooFast.cpp ve PTFooAccurate.cpp ).

Bağlayıcı düz geçiş HAL'ları

Geçiş modunu destekleyen HAL uygulamalarını ciltleyebilirsiniz. abcd@MN::IFoo bir HAL arayüzü verildiğinde iki paket oluşturulur:

  • abcd@MN::IFoo-impl . HAL uygulamasını içerir ve IFoo* HIDL_FETCH_IFoo(const char* name) işlevini ortaya koyar. Eski cihazlarda, bu pakettir dlopen ed ve uygulama kullanarak örneği HIDL_FETCH_IFoo . hidl-gen ve -Lc++-impl -Landroidbp-impl ve -Landroidbp-impl -Lc++-impl kullanarak temel kodu oluşturabilirsiniz.
  • abcd@MN::IFoo-service . Geçiş halindeki HAL'ı açar ve kendisini, bağdaştırılmış bir hizmet olarak kaydederek aynı HAL uygulamasının hem geçmeli hem de ciltli olarak kullanılmasını sağlar.

IFoo türü IFoo , sp<IFoo> IFoo::getService(string name, bool getStub) örneğine erişmek için sp<IFoo> IFoo::getService(string name, bool getStub) IFoo . getStub doğruysa, getService yalnızca geçiş modunda açmaya çalışır. getStub yanlışsa, getService bağlayıcı bir hizmet bulmaya çalışır; bu başarısız olursa, geçidi hizmeti bulmaya çalışır. getStub parametresi, defaultPassthroughServiceImplementation dışında hiçbir zaman kullanılmamalıdır. (Android O ile başlatılan cihazlar tamamen bağlayıcı cihazlardır, bu nedenle geçiş modunda bir hizmet açılmasına izin verilmez.)

HIDL dilbilgisi

Tasarım gereği, HIDL dili C'ye benzer (ancak C ön işlemcisini kullanmaz). Aşağıda açıklanmayan tüm noktalama işaretleri ( = ve | 'nin bariz kullanımı dışında) dilbilgisinin bir parçasıdır.

Not: HIDL kod stili hakkında ayrıntılar için Kod Stili Kılavuzu'na bakın .

  • /** */ bir doküman yorumunu belirtir. Bunlar yalnızca tür, yöntem, alan ve numaralandırma değeri bildirimlerine uygulanabilir.
  • /* */ çok satırlı bir yorumu belirtir.
  • // satır sonuna kadar bir yorumu belirtir. // dışında, yeni satırlar diğer tüm boşluklarla aynıdır.
  • Aşağıdaki örnek dilbilgisinde, // satırın sonuna kadar olan metin dilbilgisinin bir parçası değildir, bunun yerine dilbilgisi hakkında bir yorumdur.
  • [empty] , terimin boş olabileceği anlamına gelir.
  • ? bir değişmez kelimeyi veya terimi izlemek isteğe bağlıdır.
  • ... belirtildiği gibi noktalama işaretleri içeren sıfır veya daha fazla öğe içeren diziyi belirtir. HIDL'de değişken bir argüman yok.
  • Virgül ayrı dizi elemanları.
  • Noktalı virgüller, son öğe dahil olmak üzere her öğeyi sonlandırır.
  • BÜYÜK HARF, terminalsizdir.
  • italics , integer veya identifier (standart C ayrıştırma kuralları) gibi bir simge ailesidir.
  • constexpr , C stili sabit bir ifadedir ( 1 + 1 ve 1L << 3 ).
  • import_name , HIDL Sürüm Oluşturma'da açıklandığı gibi nitelenen bir paket veya arabirim adıdır.
  • Küçük harflerle words değişmez jetonladır.

Misal:

ROOT =
    PACKAGE IMPORTS PREAMBLE { ITEM ITEM ... }  // not for types.hal
  | PACKAGE IMPORTS ITEM ITEM...  // only for types.hal; no method definitions

ITEM =
    ANNOTATIONS? oneway? identifier(FIELD, FIELD ...) GENERATES?;
  |  safe_union identifier { UFIELD; UFIELD; ...};
  |  struct identifier { SFIELD; SFIELD; ...};  // Note - no forward declarations
  |  union identifier { UFIELD; UFIELD; ...};
  |  enum identifier: TYPE { ENUM_ENTRY, ENUM_ENTRY ... }; // TYPE = enum or scalar
  |  typedef TYPE identifier;

VERSION = integer.integer;

PACKAGE = package android.hardware.identifier[.identifier[...]]@VERSION;

PREAMBLE = interface identifier EXTENDS

EXTENDS = <empty> | extends import_name  // must be interface, not package

GENERATES = generates (FIELD, FIELD ...)

// allows the Binder interface to be used as a type
// (similar to typedef'ing the final identifier)
IMPORTS =
   [empty]
  |  IMPORTS import import_name;

TYPE =
  uint8_t | int8_t | uint16_t | int16_t | uint32_t | int32_t | uint64_t | int64_t |
 float | double | bool | string
|  identifier  // must be defined as a typedef, struct, union, enum or import
               // including those defined later in the file
|  memory
|  pointer
|  vec<TYPE>
|  bitfield<TYPE>  // TYPE is user-defined enum
|  fmq_sync<TYPE>
|  fmq_unsync<TYPE>
|  TYPE[SIZE]

FIELD =
   TYPE identifier

UFIELD =
   TYPE identifier
  |  safe_union identifier { FIELD; FIELD; ...} identifier;
  |  struct identifier { FIELD; FIELD; ...} identifier;
  |  union identifier { FIELD; FIELD; ...} identifier;

SFIELD =
   TYPE identifier
  |  safe_union identifier { FIELD; FIELD; ...};
  |  struct identifier { FIELD; FIELD; ...};
  |  union identifier { FIELD; FIELD; ...};
  |  safe_union identifier { FIELD; FIELD; ...} identifier;
  |  struct identifier { FIELD; FIELD; ...} identifier;
  |  union identifier { FIELD; FIELD; ...} identifier;

SIZE =  // Must be greater than zero
     constexpr

ANNOTATIONS =
     [empty]
  |  ANNOTATIONS ANNOTATION

ANNOTATION =
  |  @identifier
  |  @identifier(VALUE)
  |  @identifier(ANNO_ENTRY, ANNO_ENTRY  ...)

ANNO_ENTRY =
     identifier=VALUE

VALUE =
     "any text including \" and other escapes"
  |  constexpr
  |  {VALUE, VALUE ...}  // only in annotations

ENUM_ENTRY =
     identifier
  |  identifier = constexpr

terminoloji

Bu bölümde HIDL ile ilgili aşağıdaki terimler kullanılmaktadır:

binderized HIDL'nin, Binder benzeri bir mekanizma üzerinden uygulanan işlemler arasındaki uzak yordam çağrıları için kullanıldığını gösterir. Ayrıca bkz. Geçiş .
geri arama, eşzamansız HAL kullanıcısı tarafından sunulan, HAL'ye (HIDL yöntemi ile) iletilen ve HAL tarafından herhangi bir zamanda veri döndürmesi için çağrılan arabirim.
geri arama, senkron Sunucunun HIDL yöntemi uygulamasından istemciye veri döndürür. Boşluk veya tek bir ilkel değer döndüren yöntemler için kullanılmaz.
müşteri Belirli bir arabirimin yöntemlerini çağıran işlem. HAL veya çerçeve işlemi, bir arabirimin istemcisi ve diğerinin sunucusu olabilir. Ayrıca bkz. Geçiş .
uzanır Başka bir arabirime yöntem ve / veya tür ekleyen bir arabirimi belirtir. Bir arabirim yalnızca bir arabirimi genişletebilir. Aynı paket adında küçük bir sürüm artışı veya yeni bir paket (ör. Bir satıcı uzantısı) daha eski bir paket üzerinde oluşturmak için kullanılabilir.
üretir İstemciye değerler döndüren bir arabirim yöntemini belirtir. Bir ilkel olmayan değeri veya birden fazla değeri döndürmek için senkronize geri arama işlevi oluşturulur.
arayüz Yöntem ve türlerin toplanması. C ++ veya Java'da bir sınıfa çevrilir. Bir arabirimdeki tüm yöntemler aynı yönde çağrılır: istemci işlemi, sunucu işlemi tarafından uygulanan yöntemleri çağırır.
tek yön Bir HIDL yöntemine uygulandığında, yöntemin değer döndürmediğini ve engellenmediğini gösterir.
paket Bir sürümü paylaşan arayüzlerin ve veri türlerinin toplanması.
passthrough HIDL şekli olan sunucu paylaşılan kütüphanesi, dlopen istemci tarafından ed. Geçiş modunda, istemci ve sunucu aynı işlemdir ancak ayrı kod tabanlarıdır. Yalnızca eski kod tabanlarını HIDL modeline getirmek için kullanılır. Ayrıca bkz .
sunucu Bir arayüzün yöntemlerini uygulayan süreç. Ayrıca bkz. Geçiş .
Ulaşım Verileri sunucu ve istemci arasında taşıyan HIDL altyapısı.
versiyon Bir paketin sürümü. Büyük ve küçük olmak üzere iki tamsayıdan oluşur. Küçük sürüm artışları, tür ve yöntem ekleyebilir (ancak değiştiremez).