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

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

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

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

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

מבנה כללי

מבנה שכבת העל המוצע להתאמה אישית הוא כדלקמן:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ . משאבי שכבת-על בזמן בנייה

    • rro/

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

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

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

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

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

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

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

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

    • עבור RROs Public Default Default, השתמש android .
      לדוגמה, @android:style/TextAppearance.DeviceDefault.Large .

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

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

  • AndroidManifest.xml . בדוגמה למטה, RRO_PACKAGE_NAME ו- TARGET_PACKAGE_NAME הם מצייני מיקום עבור קבצי ה-make:

    <?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 בקובץ makefile הבא מגדיר את הקידומת שתהיה לכל ה-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
      

הגדר RROs

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

כדי להגדיר בקרת גישה 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>
  

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

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

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

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

  • הרחב מסגרות/בסיס באמצעות שכבת -על בזמן בנייה , הוספת כל המשאבים הדרושים.
  • עיין במשאבים אלה מ-OEM RROs באמצעות *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 יש תחביר המאפשר להחיל אותם על בסיס מאפייני המערכת. כדי לטפל במספר מותגים בתמונת מערכת אחת, יצרני OEM יכולים להשתמש בזה באופן הבא (ראה מבנה כללי ).

<?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 זה להיות זמין רק אם מאפיין המערכת המתאים תואם לערך שסופק. יצרני OEM יכולים להגדיר מספר RROs אלה, כולם מופעלים סטטית, ויש להם רק אחד פעיל בכל פעם.

הוסף ספריית ממשק משתמש לרכב למטרה

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

# 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 .

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

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

כדי ללמוד אילו חבילות תומכות car-ui-lib , ראה רשימת חבילות המכילות car-ui-lib .