Android 8, Android işletim sisteminin mimarisini yeniden tasarlarken ile
bağımsız Android platformunun yanı sıra cihaza ve satıcıya özgü kod sağlar.
Android bu tür pek çok arayüzü halihazırda HAL arayüzleri şeklinde tanımlamaktadır.
hardware/libhardware
içinde C başlıkları olarak tanımlanır. HIDL bunların yerini alıyor
İstemci ve sürümü çalıştırılabilen kararlı, sürümü oluşturulmuş arayüzlere sahip HAL arayüzleri
C++'taki sunucu tarafı HIDL arayüzleri (aşağıda açıklanmıştır) veya
Java.
Bu bölümdeki sayfalarda HIDL arayüzlerinin C++ uygulamaları açıklanmaktadır.
HIDL'den otomatik olarak oluşturulan dosyalarla ilgili ayrıntılar dahil .hal
hidl-gen
derleyici tarafından sağlanan dosyalar, bunların nasıl paketlendiği ve
onları kullanan C++ koduyla nasıl entegre edeceğinizi göstereceğim.
İstemci ve sunucu uygulamaları
HIDL arayüzlerinde istemci ve sunucu uygulamaları bulunur:
- HIDL arayüzünün istemci, yöntemlerini çağırarak arayüz oluşturun.
- Sunucu, HIDL arayüzünün kullanıldığı bir Müşterilerden gelen aramaları alır ve sonuçları döndürür (gerekirse).
libhardware
HAL'den HIDL HAL'lere geçiş yaparken HAL,
sunucu haline gelir ve HAL'ye çağrı yapan süreç de
teslim edilir. Varsayılan uygulamalar hem geçiş hem de bağlama dayalı içerik sunabilir
HAL'ler (HAL'ler):
Şekil 1. Eski HAL'lerin geliştirilmesi.
HAL istemcisini oluşturma
HAL kitaplıklarını yapma dosyasına ekleyerek başlayın:
- Yap:
LOCAL_SHARED_LIBRARIES += android.hardware.nfc@1.0
- Yakında:
shared_libs: [ …, android.hardware.nfc@1.0 ]
Sonra, HAL üst bilgi dosyalarını ekleyin:
#include <android/hardware/nfc/1.0/IFoo.h> … // in code: sp<IFoo> client = IFoo::getService(); client->doThing();
HAL sunucusunu oluşturma
HAL uygulamasını oluşturmak için .hal
dosyalarına sahip olmanız gerekir
HAL'nizi temsil eden ve
hidl-gen
uygulamasında -Lmakefile
veya -Landroidbp
(./hardware/interfaces/update-makefiles.sh
bunu dahili
iyi bir referanstır.) Şu kişilerden HAL'leri aktarırken:
libhardware
, c2hal kullanarak bu işin büyük bir kısmını kolayca yapabilirsiniz.
HAL'nizi uygulamak üzere gerekli dosyaları oluşturmak için:
PACKAGE=android.hardware.nfc@1.0 LOC=hardware/interfaces/nfc/1.0/default/ m -j hidl-gen hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport $PACKAGE hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport $PACKAGE
HAL'nin geçiş modunda çalışması için
ikamet eden HIDL_FETCH_IModuleName
fonksiyonu
/(system|vendor|...)/lib(64)?/hw/android.hardware.package@3.0-impl(OPTIONAL_IDENTIFIER).so
burada OPTIONAL_IDENTIFIER, geçişi tanımlayan bir dizedir
hakkında bilgi edindiniz. Geçiş modu gereksinimleri,
yukarıdaki komutları da ekler. Bunlar, android.hardware.nfc@1.0-impl
ancak herhangi bir uzantı kullanılabilir. Örneğin
android.hardware.nfc@1.0-impl-foo
, şu işlemler için -foo
kullanıyor:
ortaya çıkarmasını sağlamaya
yardımcı olur.
HAL, başka bir alt sürüm veya
HAL, bu ikili programı adlandırmak için temel HAL'yi kullanmalıdır. Örneğin,
android.hardware.graphics.mapper@2.1
uygulama,
adı verilen ikili sistemde olmalıdır
android.hardware.graphics.mapper@2.0-impl(OPTIONAL_IDENTIFIER)
.
Genellikle buradaki OPTIONAL_IDENTIFIER, gerçek HAL değerini içerir
sürümünü değil. İkili programı bu şekilde adlandırarak, 2.0 istemcileri ikili dosyayı doğrudan alabilir.
2.1 istemcileri ise uygulamayı
yükseltebilir.
Daha sonra, saplamaları işlevsellikle doldurun ve bir arka plan programı kurun. Örnek arka plan kodu (geçişi destekler):
#include <hidl/LegacySupport.h> int main(int /* argc */, char* /* argv */ []) { return defaultPassthroughServiceImplementation<INfc>("nfc"); }
defaultPassthroughServiceImplementation
arama
Sağlanan -impl
kitaplığı için dlopen()
ve bunu şu şekilde sağlar:
bir hizmet sunmaktır. Örnek arka plan programı kodu (tamamen bağlayıcı hizmet için):
int main(int /* argc */, char* /* argv */ []) { // This function must be called before you join to ensure the proper // number of threads are created. The threadpool never exceeds // size one because of this call. ::android::hardware::configureRpcThreadpool(1 /*threads*/, true /*willJoin*/); sp<INfc> nfc = new Nfc(); const status_t status = nfc->registerAsService(); if (status != ::android::OK) { return 1; // or handle error } // Adds this thread to the threadpool, resulting in one total // thread in the threadpool. We could also do other things, but // would have to specify 'false' to willJoin in configureRpcThreadpool. ::android::hardware::joinRpcThreadpool(); return 1; // joinRpcThreadpool should never return }
Bu arka plan programı genellikle $PACKAGE + "-service-suffix"
içinde yaşıyor (için
android.hardware.nfc@1.0-service
), ancak herhangi bir yerde de olabilir.
Belirli bir öğenin sepolicy
HAL sınıfı, hal_<module>
özelliğidir (örneğin,
hal_nfc)
. Bu özellik,
belirli HAL'ler (aynı süreç birden fazla HAL'ye hizmet ediyorsa, birden fazla özellik
olabileceğini unutmayın).