Google is committed to advancing racial equity for Black communities. See how.
דף זה תורגם על ידי Cloud Translation API.
Switch to English

HIDL C ++

אנדרואיד O ארכיטקטורה מחדש את מערכת ההפעלה של Android כדי להגדיר ממשקים ברורים בין פלטפורמת אנדרואיד שאינה תלויה במכשיר לבין קוד ספציפי למכשיר ולספק. אנדרואיד כבר מגדירה ממשקים רבים כאלה בצורה של ממשקי HAL, המוגדרים ככותרות C hardware/libhardware . HIDL מחליף ממשקי HAL אלה בממשקים יציבים ומותקנים, שיכולים להיות ממשקי HIDL בצד הלקוח והשרת ב- C ++ (המתואר בהמשך) או ב- Java .

העמודים בסעיף זה מתארים יישומי C ++ של ממשקי HIDL, כולל פרטים על הקבצים שנוצרו אוטומטית .hal HIDL .hal ידי hidl-gen ה- hidl-gen , כיצד ארוזים קבצים אלה וכיצד לשלב קבצים אלה בקוד C ++ משתמש בהם.

יישומי לקוח ושרת

ממשקי HIDL כוללים יישומי לקוח ושרת:

  • לקוח של ממשק HIDL הוא הקוד המשתמש בממשק על ידי קריאת שיטות עליו.
  • שרת הוא יישום של ממשק HIDL שמקבל שיחות מלקוחות ומחזיר תוצאות (במידת הצורך).

במעבר בין libhardware של libhardware ל- HIDL HAL, יישום HAL הופך לשרת והתהליך הקריאה ל- HAL הופך ללקוח. יישומי ברירת מחדל יכולים לשרת HALs גם דרך מעבר, וגם יכולים להשתנות לאורך זמן:

איור 1. התקדמות פיתוח עבור HALs מדור קודם.

יצירת לקוח HAL

התחל על ידי הכללת ספריות ה- HAL בקובץ המקומי:

  • הפוך: LOCAL_SHARED_LIBRARIES += android.hardware.nfc@1.0
  • shared_libs: [ …, android.hardware.nfc@1.0 ] : shared_libs: [ …, android.hardware.nfc@1.0 ]

לאחר מכן, כלול את קבצי כותרת ה- HAL:

#include <android/hardware/nfc/1.0/IFoo.h>
…
// in code:
sp<IFoo> client = IFoo::getService();
client->doThing();

יצירת שרת HAL

כדי ליצור את יישום HAL, עליך להחזיק את קבצי ה- .hal שמייצגים את ה- HAL שלך וכבר יצרו קבצי HAL שלך באמצעות -Lmakefile או -Landroidbp ב- hidl-gen ( ./hardware/interfaces/update-makefiles.sh עושה זאת בשביל קבצי HAL פנימיים ומהווה התייחסות טובה). בעת העברה דרך libhardware מ- libhardware , אתה יכול לעשות הרבה מהעבודה הזו בקלות באמצעות c2hal.

כדי ליצור את הקבצים הדרושים ליישום ה- HAL שלך:

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 יעבוד במצב מעבר, דרושה לך הפונקציה HIDL_FETCH_IModuleName השוכנת ב- /(system|vendor|...)/lib(64)?/hw/android.hardware.package@3.0-impl( OPTIONAL_IDENTIFIER ).so כאשר OPTIONAL_IDENTIFIER הוא מחרוזת המזהה את יישום מעבר. דרישות מצב המעבר מתקיימות באופן אוטומטי על ידי הפקודות הנ"ל, היוצרות גם את היעד android.hardware.nfc@1.0-impl , אך ניתן להשתמש בכל סיומת. למשל android.hardware.nfc@1.0-impl-foo משתמש ב- -foo כדי להבדיל את עצמו.

אם HAL הוא גרסה מינורית או סיומת של HAL אחר, יש להשתמש ב- HAL הבסיס לשם שמות בינארית זו. לדוגמה, יישומי android.hardware.graphics.mapper@2.1 עדיין צריכים להיות בינאריים הנקראים android.hardware.graphics.mapper@2.0-impl( OPTIONAL_IDENTIFIER ) . בדרך כלל, OPTIONAL_IDENTIFIER כאן יכלול את גרסת ה- HAL בפועל. על ידי מתן שם בינארי כך, לקוחות 2.0 יכולים לאחזר אותו ישירות, ו -2.1 לקוחות יכולים להעלות את היישום.

לאחר מכן, מלא את הבדים בפונקציונליות והגדר דמון. קוד דמון לדוגמא (תומך בהחלפה):

#include <hidl/LegacySupport.h>

int main(int /* argc */, char* /* argv */ []) {
    return defaultPassthroughServiceImplementation<INfc>("nfc");
}

defaultPassthroughServiceImplementation dlopen() את ספריית -impl שסופקה ויספק אותה כשירות מקושר. קוד דמון לדוגמא (לשירות טהור מקושר):

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 will never exceed
    // 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
}

הדמון הזה בדרך כלל חי ב- $PACKAGE + "-service-suffix" (למשל, android.hardware.nfc@1.0-service ), אך הוא יכול להיות בכל מקום. ההפרדה למחלקה מסוימת של HALs היא התכונה hal_<module> (למשל, hal_nfc) . יש להחיל מאפיין זה על הדמון שמריץ HAL מסוים (אם אותו תהליך משרת מספר HALs, ניתן להחיל עליו מספר תכונות).