HIDL C++

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.) Şuradan 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 bazı ipuçları vereceğim. 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).