התאמה אישית של אפליקציות

עכשיו, כשהרכיבים והמשאבים של הספרייה של ממשק המשתמש של הרכב נכנסים לאפליקציות, כדי להתאים אישית יצרני ציוד מקורי חייבים לספק שתי שכבות-על:

  • שכבת-על בזמן Build מוסיפה את המשאבים הדרושים שכבת-על של משאב זמן ריצה (RRO). התכונות כוללות:

    • פריטים שניתנים להזזה
    • סגנונות (לדוגמה, מראה הטקסט)
    • משאבים משותפים (לדוגמה, צבעים)
  • התיקייה שכבת-על RRO מכילה את המשאבים ששימשו ליצירת RRO אחד לכל אפליקציית יעד. מקורות המידע האלה יכולים להתייחס רק ל:

    • ערכים שמוגדרים באותו RRO (לדוגמה, עבור צבע, הערך יהיה הקסדצימלי) ).
    • משאבי Android framework (לדוגמה, @android:color/accent).
    • משאב שמוגדר בשכבת-העל של זמן build שלמעלה.

מבנה כללי

המבנה המוצע של שכבת-העל להתאמה אישית הוא:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ משאבים ליצירת שכבות-על בזמן ה-build

    • rro/

      • Android.mk Makefile המשמש ליצירת ה-RRO של כל חבילת יעד על סמך המשאבים שבתיקייה הזו.

      • AndroidManifest.xml תבנית של קובץ מניפסט שנעשה בה שימוש למעלה makefile.

      • res/ שכבות-על של זמן ריצה שיחולו על כל אפליקציות היעד.

ליצרני ציוד מקורי יכול להיות יותר מאחד מהמבנים האלה, בהתאם למספר המותגים שהם רוצים. ביעד build יחיד ( טיפול במספר מותגים).

שכבות-על של משאבים בזמן ריצה

תיקיית RRO בתיקיית שכבת-העל של ה-OEM צריכה להכיל משאבים שניתן להחיל על כל אפליקציות היעד. לקובצי RRO יש מגבלות שמשפיעות על היכולת שלהם ליצור שכבת-על של משאבים מורכבים. לסיכום, RRO:

  • לא ניתן להפנות למזהי משאבים שהוגדרו ב-APK היעד או בקובץ ה-APK RRO עצמו. המשמעות היא שמזהי RRO לא יכולים להוסיף מזהים חדשים, כמו פריטי גרפיקה, צבעים או צבעים חדשים

  • יכול לעיין במזהי המשאבים שמוגדרים שלנו, האם משאבים אלו מוגדרים ב-/frameworks/base/core/res או באמצעים בשכבת-על בזמן ה-build. צריך לציין את המזהים האלה באמצעות המאפיין android: name-space:

    • להגדרות RRO גלויות לכולם של DeviceDefault, צריך להשתמש ב-android.
      לדוגמה, @android:style/TextAppearance.DeviceDefault.Large.

    • לכל האחרים (לא ציבוריים או משאבים שנוספו באמצעות שכבת-על בזמן ה-build), משתמשים *android.
      לדוגמה, @*android/style:TextAppearance.OEM.Brand1.Title.

בנוסף למשאבים, התיקייה RRO חייבת להכיל:

  • AndroidManifest.xml בדוגמה שלמטה, RRO_PACKAGE_NAME וגם TARGET_PACKAGE_NAME הם placeholders של קובצי makefile:

    <?xml version=1.0 encoding=utf-8?>
    <manifest xmlns:android=http://schemas.android.com/apk/res/android”
        package={{RRO_PACKAGE_NAME}} />
        <application android:hasCode=false />
        <overlay android:priority=10
            android:targetPackage={{TARGET_PACKAGE_NAME}}
            android:requiredSystemPropertyName=ro.product.sku
            android:requiredSystemPropertyValue=<your-product-sku> />
    </manifest>
    
  • Android.mk שבו oem ב-createfile הבא מגדיר את הקידומת שיש לכל ה-RRO שנוצר.
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      CAR_UI_RRO_SET_NAME := oem
      CAR_UI_RESOURCE_DIR := $(LOCAL_PATH)/res
      CAR_UI_RRO_TARGETS := $(CAR_UI_RRO_PACKAGE_NAMES)
      include packages/apps/Car/libs/car-ui-lib/generate_rros.mk
      

הגדרת RRO

יש תמיכה בקובץ תצורה חדש, overlayable.xml, שניתן להשתמש בו כדי להגדיר לבקרת גישה. לדוגמה, תוכלו לציין מי יכול ליצור שכבות-על של משאבים ואילו משאבים – כשכבת-על. לכן אפשר עכשיו לקבץ משאבים בדרכים שונות זמינות לשכבת-על של RRO שונים.

כדי להגדיר בקרת גישה ל-RRO:

  1. בתיקייה res/values, יוצרים את overlayable.xml.
  2. יוצרים את תגי המשאבים <overlayable>.
  3. הגדרת המאפיין name לתג <overlayable>, חייב להיות ייחודי בחבילה. כל שכבת-על יכולה לטרגט רק קבוצה אחת שניתנת לשכבת-על.
  4. הגדרת התג <policy> בתוך <overlayable>.
  5. מגדירים את קבוצות המשאבים שאפשר להוסיף כשכבת-על. לדוגמה:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

כדי להחיל את השינויים הבאים על פרויקט RRO:

  1. בתיקייה res/xml, יוצרים את overlays.xml. אפשר לעיין ברשומה דוגמת הקוד הבאה עבור overlay.
  2. מגדירים את המשאבים שרוצים לשנות.
  3. הוספת android:resourcesMap="@xml/overlays" אל <overlay> ב-AndroidManifest.xml. לדוגמה, בדוגמת הקוד שבהמשך, ראו את הערך עבור <overlay>
  4. צריך להגדיר את android:isStatic=”true” לשכבת-על סטטית. ניתן לטרגט כל שכבת-על בלבד אחת מהקבוצות שאפשר ליצור להן שכבת-על.

עיינו בדוגמה הבאה. הקטע הראשון שייך ליחידה הארגונית AndroidManifest.xml כשהחלק השני עוסק ב-overlays.xml.

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android.car.ui.rro"
      android:versionCode="1"
      android:versionName="1.0">
      <overlay android:targetName="OverlayableResources"
               android:resourcesMap="@xml/overlays"
               android:targetPackage="com.android.car.ui"
               android:priority="1"
               android:isStatic="false" />
  </manifest>
  <overlay>
      <item target="string/app_title" value="@ string/app_title" />
  </overlay>
  

עם אזהרה אחת, רכיבי RRO קיימים פועלים ב-Android 10. האזהרה כי צריך להתקין אותן עם ה-PackageManagerRRO, יש להתקין מראש את החבילות חתומה עם אותו מפתח כמו אפליקציית היעד. ב-Android 10, אפשר להוסיף קובצי פריסה כשכבת-על. אבל, לפעמים לשם כך נדרש שימוש ב-requireViewById() בזמן קבלת התצוגה במקום findViewById(). ב-Android 10, השינוי הזה הוטמע ב-car-ui-lib כדי תומכות בשכבות-על לפריסה.

הגרסה הראשית הבאה של Android תאפשר לך ליצור שכבת-על של קובץ פריסה להגדיר משאבים חדשים בחבילת ה-RRO ולהתייחס אליהם באופן פנימי.

הוספת משאבים ספציפיים ל-OEM

כדי להתגבר על מגבלות ה-RRO שמונעות הוספה של משאבים של ה-OEM:

  • הרחבת frameworks/base באמצעות שכבת-על מסוג build-time, והוספתם את כל הרכיבים הנחוצים במשאבי אנוש.
  • יש לעיין במשאבים הבאים מה-RRO של יצרני ה-OEM באמצעות רווחי שמות ב-*android:.

לדוגמה, כך אפשר להוסיף פריט גרפי ספציפי ל-OEM ולהשתמש בו ב-RRO:

  • <path-to-OEM-overlays>

    • overlay/framework/base/core/res/res/drawable/

      • oem_background_drawable.xml

    • rro/res/values

      • drawables.xml

        <resources>
            <item type="drawable" name="car_ui_toolbar_background">
                @*android:drawable/oem_background_drawable
            </item>
        </resources>
        

טיפול בכמה מותגים

לקובצי מניפסט RRO יש תחביר שמאפשר החלה מותנית בהתאם למערכת נכסים. כדי לטפל בכמה מותגים בתמונת מערכת אחת, יצרני ציוד מקורי יכולים להשתמש במאפיין הזה בתור הבאות (ראו מבנה כללי).

<?xml version=1.0 encoding=utf-8?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android”
    package={{RRO_PACKAGE_NAME}}/>
    <application android:hasCode=false/>
    <overlay android:priority=10
        android:targetPackage={{TARGET_PACKAGE_NAME}}
        android:requiredSystemPropertyName=ro.product.sku
        android:requiredSystemPropertyValue=<your-product-sku>/>
</manifest>

התחביר של android:requiredSystemPropertyName ו- android:requiredSystemPropertyValue יגרום להפעלת ה-RRO הזה רק אם מאפיין המערכת התואם תואם לערך שצוין. לאחר מכן, יצרני ציוד מקורי יכולים להגדיר כמה ל-RRO האלה, כולם מופעלים באופן סטטי, ורק אחד מהם פעיל בכל פעם.

הוספת הספרייה של ממשק המשתמש ברכב ליעד

כדי לשלב את ספריית ממשק המשתמש של הרכב ביעד של Android, עליך לכלול את קטע הקוד הבא:

# Include build-time overlays
    PRODUCT_PACKAGE_OVERLAYS += \
      <path-to-oem-overlays>/overlay
    # Define package names to generate RROs for
    CAR_UI_RRO_PACKAGE_NAMES += \
      com.android.car.ui.paintbooth \
      com.android.car.media \
      com.android.car.dialer \
      com.android.car.linkviewer \
      com.android.car.settings \
      com.android.car.systemupdater \
      com.google.android.apps.automotive.inputmethod \
      com.google.android.apps.automotive.templates.host \
      ...
    # Include generated RROs
    PRODUCT_PACKAGES += \
      oem-com-android-car-ui-paintbooth \
      oem-com-android-car-media \
      oem-com-android-car-dialer \
      oem-com-android-car-linkviewer \
      oem-com-android-car-settings \
      oem-com-android-car-systemupdater \
      oem-com-google-android-apps-automotive-inputmethod \
      oem-com-google-android-apps-automotive-templates-host \
      ...
  • ההגדרה הזו גורמת ל-<path-to-OEM-overlays>/rro/Android.mk ליצור RRO אחד לכל אחד מהם מהחבילות בעלות השם CAR_UI_RRO_PACKAGE_NAMES.

  • כולל את ה-RRO שנוצרו ב-PRODUCT_PACKAGES.

  • כולל שכבת-על בזמן build ב-PRODUCT_PACKAGE_OVERLAYS להוספת מוצרים ספציפיים ל-OEM במשאבי אנוש.

מידע על חבילות שתומכות ב-car-ui-lib זמין ברשימת החבילות שמכילות Car-ui-lib.