עכשיו, כשהרכיבים והמשאבים של הספרייה של ממשק המשתמש של הרכב נכנסים לאפליקציות, כדי להתאים אישית יצרני ציוד מקורי חייבים לספק שתי שכבות-על:
-
שכבת-על בזמן 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 עצמו. המשמעות היא שRROs לא יכולים להוסיף מזהים חדשים כמו פריטים ניתנים להזזה, צבעים או
-
יכול לעיין במזהי המשאבים שמוגדרים שלנו, האם משאבים אלו מוגדרים ב-
/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:
- בתיקייה
res/values
, יוצרים אתoverlayable.xml
. - יוצרים את תגי המשאבים
<overlayable>
. - הגדרת המאפיין
name
לתג<overlayable>
, חייב להיות ייחודי בחבילה. כל שכבת-על יכולה לטרגט רק קבוצה אחת שניתנת לשכבת-על. - הגדרת התג
<policy>
בתוך<overlayable>
. - מגדירים את קבוצות המשאבים שאפשר להוסיף כשכבת-על. מוצרים לדוגמה:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
כדי להחיל את השינויים הבאים על פרויקט RRO:
- בתיקייה
res/xml
, יוצרים אתoverlays.xml
. אפשר לעיין ברשומה דוגמת הקוד הבאה עבורoverlay
. - מגדירים את המשאבים שרוצים לשנות.
- הוספת
android:resourcesMap="@xml/overlays"
אל<overlay>
ב-AndroidManifest.xml
. לדוגמה, בדוגמת הקוד שבהמשך, ראו את הערך עבור<overlay>
- צריך להגדיר את
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.