עכשיו, כשרכיבי ספריית ממשק המשתמש שברכב והמשאבים שלה מוטמעים באפליקציות, כדי להתאים אישית את האפליקציות האלה, יצרני ציוד מקורי צריכים לספק שתי שכבות-על:
-
שכבת-על בזמן ה-build מוסיפה את כל המשאבים הנדרשים לשכבת-העל של המשאבים בסביבת זמן הריצה (RRO). הנתונים האלה כוללים:
- Drawables
- סגנונות (לדוגמה, מראה הטקסט)
- משאבים משותפים (לדוגמה, צבעים)
-
התיקייה RRO overlay מכילה את המשאבים שמשמשים ליצירת RRO אחד לכל אפליקציית יעד. המשאבים האלה יכולים להתייחס רק ל:
- ערכים שמוגדרים באותו קובץ RRO (לדוגמה, עבור צבע זה יהיה ערך הקסדצימלי).
- משאבי מסגרת של Android (לדוגמה,
@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 היעד, או ב-RRO עצמו. המשמעות היא ש-RRO לא יכול להוסיף מזהים חדשים, כמו רכיבי גרפיקה, צבעים או סגנונות חדשים.
-
יכולים להפנות למזהי משאבים שהוגדרו במסגרת, בין שהמשאבים האלה מוגדרים ב-
/frameworks/base/core/res
ובין שהם מוגדרים באמצעות שכבת-על בזמן ה-build. צריך להפנות למזהים האלה באמצעות מרחב השמותandroid:
:-
ל-RROs ציבוריים של 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
בקובץ ה-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
, שאפשר להשתמש בו כדי להגדיר אמצעי בקרת גישה. לדוגמה, אפשר לציין מי יכול להוסיף שכבות-על למשאבים ואילו משאבים אפשר להוסיף להם שכבות-על. כתוצאה מכך, עכשיו אפשר לקבץ משאבים בדרכים שונות כדי שאפשר יהיה להוסיף להם שכבות-על של 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:
- הרחבת מסגרות/בסיס באמצעות שכבת-על בזמן ה-build, והוספת המשאבים הנדרשים.
- אפשר להפנות למקורות המידע האלה מ-RRO של יצרן ציוד מקורי באמצעות שמות מרחבים של
*android:
.
לדוגמה, הדרך הבאה מאפשרת להוסיף קובץ drawable ספציפי ל-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.