מערכת ההפעלה Android Automotive OS מאפשרת למשתמשים להתקין אפליקציות במכונית. כדי להגיע למשתמשים בפלטפורמה הזו, צריך להפיץ אפליקציה מותאמת לנהגים שתואמת ל-Android Automotive OS. אפשר להשתמש כמעט בכל הקוד והמשאבים מאפליקציית Android Auto, אבל צריך ליצור גרסת build נפרדת שעומדת בדרישות שמפורטות בדף הזה.
כדי להפעיל את אפליקציית הרכב ב-Android Automotive OS, צריך את הגרסה העדכנית ביותר של Templates Host, שמגיעה כאפליקציית מערכת.
סקירה כללית על הפיתוח
כדי להוסיף תמיכה ב-Android Automotive OS, צריך לבצע רק כמה שלבים, כפי שמתואר בקטעים בדף הזה:
- יצירת מודול לכלי רכב
- הצהרה על תמיכה ב-Android Automotive OS
- הצהרה על
CarAppService
ו-CarAppActivity
- עדכון יחסי התלות ב-Gradle
כדי לוודא שכל התכונות של Automotive OS מופעלות, צריך להשתמש ב-Android Studio Bumblebee ואילך.
יצירת מודול לכלי רכב
לחלק מהרכיבים של Android Automotive OS, כמו המניפסט, יש דרישות ספציפיות לפלטפורמה. יוצרים מודול שיכול להפריד את הקוד של הרכיבים האלה מהקוד האחר בפרויקט, כמו הקוד שמשמש את אפליקציית הטלפון.
כדי להוסיף מודול לכלי רכב לפרויקט קיים:
- ב-Android Studio, לוחצים על קובץ > חדש > מודול חדש.
- בוחרים באפשרות Automotive Module ולוחצים על Next.
- נותנים שם לאפליקציה או לספרייה. זה השם שיוצג למשתמשים באפליקציה שלכם ב-Android Automotive OS.
- מזינים שם למערך.
- עורכים את שם החבילה כך שיהיה זהה לשם של האפליקציה הקיימת.
בוחרים באפשרות API 29: Android 10 (Q) בשדה Minimum SDK (גרסת ה-SDK המינימלית), ולוחצים על Next (הבא). כל המכוניות שתומכות בספריית האפליקציות לכלי רכב ב-Android Automotive OS פועלות עם Android 10 API ברמה 29 ואילך, ולכן בחירת הערך הזה מטרגטת את כל המכוניות התואמות.
בוחרים באפשרות Add No Activity (הוספת 'אין פעילות') ולוחצים על Finish (סיום).
אם אתם מתחילים פרויקט חדש:
- ב-Android Studio, לוחצים על File (קובץ) > New (חדש) > New Project (פרויקט חדש).
- בוחרים באפשרות Automotive בקטע Project Type.
- בוחרים באפשרות No Activity (אין פעילות) ולוחצים על Next (הבא).
- נותנים שם לפרויקט. זה השם שיוצג למשתמשים באפליקציה שלכם ב-Android Automotive OS.
- מזינים שם חבילה. בקטע שמות של חבילות מוסבר בהרחבה איך בוחרים שם לחבילה.
בוחרים באפשרות API 29: Android 10 (Q) בשדה Minimum SDK (גרסת ה-SDK המינימלית), ולוחצים על Next (הבא).
כל המכוניות שתומכות בספריית האפליקציות לכלי רכב ב-Android Automotive OS פועלות עם Android 10 API ברמה 29 ואילך, ולכן בחירת הערך הזה מטרגטת את כל המכוניות התואמות.
אחרי שיוצרים את המודול ב-Android Studio, פותחים את הקובץ AndroidManifest.xml
במארז הרכב החדש:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.car.app">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
</manifest>
הרכיב application
מכיל כמה פרטי אפליקציה רגילים, וגם רכיב uses-feature
שמצהיר על תמיכה ב-Android Automotive OS. שימו לב שאין פעילויות שמוצהרות במניפסט.
בשלב הבא, מוסיפים למניפסט את הרכיבים הבאים של uses-feature
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.car.app"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" /> <uses-feature android:name="android.hardware.type.automotive" android:required="true" /> <uses-feature android:name="android.software.car.templates_host" android:required="true" /> <uses-feature android:name="android.hardware.wifi" android:required="false" /> <uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> <uses-feature android:name="android.hardware.screen.landscape" android:required="false" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> </manifest>
הרכיב uses-feature
הראשון מציין שהאפליקציה משתמשת ב-Templates Host כדי לפעול. הגדרה מפורשת של ארבעת הרכיבים הנותרים של uses-feature
לערך required="false"
מבטיחה שהאפליקציה לא תיצור התנגשויות עם תכונות החומרה הזמינות במכשירי Android Automotive OS.
עדכון יחסי התלות ב-Gradle
בתוך המודול לכלי רכב, צריך להוסיף תלות בארטיפקט androidx.car.app:app-automotive
, שכולל את ההטמעה של CarAppActivity
שנדרשת כדי שהאפליקציה תפעל ב-Android Automotive OS.
אם אתם מפתחים אפליקציה שתומכת גם ב-Android Auto וגם ב-Android Automotive OS, מומלץ לשמור את CarAppService
במודול נפרד שתוכלו לשתף בין המודולים לנייד ולרכב. אם משתמשים בגישה הזו, צריך לעדכן את מודול הרכב כך שיכלול את המודול המשותף באמצעות יחסי התלות בפרויקט של Gradle, כפי שמוצג בקטע הקוד הבא:
Groovy
buildscript { ... dependencies { ... implementation "androidx.car.app:app-automotive:car_app_library_version" implementation project(':shared_module_name') } }
Kotlin
buildscript { ... dependencies { ... implementation("androidx.car.app:app-automotive:car_app_library_version") implementation(project(":shared_module_name")) } }
הצהרת תמיכה ב-Android Automotive OS
כדי להצהיר שהאפליקציה תומכת ב-Android Automotive OS, משתמשים ברשומה הבאה במניפסט:
<application>
...
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>
...
</application>
הרשומה הזו במניפסט מתייחסת לקובץ XML שמצהיר על היכולות הרכביות שהאפליקציה תומכת בהן.
כדי לציין שיש לכם אפליקציה של ספריית האפליקציות של Android למכוניות, מוסיפים קובץ XML בשם automotive_app_desc.xml
לספרייה res/xml/
במודול של Android Automotive OS. הקובץ הזה צריך לכלול את התוכן הבא:
<automotiveApp>
<uses name="template"/>
</automotiveApp>
הצהרה על CarAppService ו-CarAppActivity
בדומה ל-Android Auto, מערכת Android Automotive OS משתמשת בהטמעה של CarAppService
כדי להריץ את האפליקציה. להוראות להטמעה ולהצהרה על CarAppService
, אפשר לעיין במאמרים יצירת CarAppService ו-Session והצהרה על CarAppService.
בניגוד ל-Android Auto, צריך לכלול רכיב אפליקציה נוסף, CarAppActivity
, שישמש כנקודת הכניסה לאפליקציה ל-Android Automotive OS. ההטמעה של הפעילות הזו כלולה ב-Artifact androidx.car.app:app-automotive
והיא אחראית על התקשורת עם אפליקציית המארח של התבנית כדי ליצור את ממשק המשתמש של האפליקציה. צריך להיות רק מופע אחד של הפעילות הזו במניפסט, וצריך להצהיר עליו באופן הבא:
<activity android:exported="true" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:name="androidx.car.app.activity.CarAppActivity" android:launchMode="singleTask" android:label="Your app name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="distractionOptimized" android:value="true" /> </activity>
- השדה
android:name
מוגדר לשם המלא של הכיתהCarAppActivity
מהארטיפקטapp-automotive
. - הערך של
android:exported
מוגדר כ-true
כי צריך להיות אפשר להפעיל את הפעילות מאפליקציה אחרת (כלומר, ממסוף האפליקציות). - הערך של
android:launchMode
מוגדר כ-singleTask
כדי שהמשתמש יוכל לחזור לאותה מופע של הפעילות ממרכז האפליקציות אם הוא מנווט למקום אחר. - הערך של
android:theme
מוגדר ל-@android:style/Theme.DeviceDefault.NoActionBar
כדי שהאפליקציה תשתמש בכל שטח המסך שזמין לה. - מסנן ה-Intent מציין שזו הפעילות של האפליקציה במרכז האפליקציות.
- יש רכיב
<meta-data>
שמציין למערכת ההפעלה שאפשר להשתמש באפליקציה כשיש הגבלות על חוויית המשתמש, למשל כשהרכב בתנועה.
דרישות נוספות לאפליקציות ניווט
באפליקציות ניווט, יש עוד כמה רשומות נדרשות במניפסט של CarAppActivity
, כפי שמוצג בקטע הקוד הבא:
<activity android:exported="true" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:name="androidx.car.app.activity.CarAppActivity" android:launchMode="singleTask" android:label="Your app name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <!-- Include the category below ONLY for navigation apps --> <category android:name="android.intent.category.APP_MAPS" /> </intent-filter> <!-- Include the intent-filter below ONLY for navigation apps --> <intent-filter> <action android:name="androidx.car.app.action.NAVIGATE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="geo" /> </intent-filter> <meta-data android:name="distractionOptimized" android:value="true" /> </activity>
- הקטגוריה הנוספת
android.intent.category.APP_MAPS
מעדכנת את המערכת שהאפליקציה שלכם יכולה להציג את המיקום של המשתמש. - מסנן הכוונה
androidx.car.app.action.NAVIGATE
מבטיח שלמשתמשים תהיה אפשרות להשתמש באפליקציה שלכם כשהם מטפלים בכוונה מרומזת לניווט מאפליקציה אחרת ברכב.
שיקולים נוספים
כדאי להביא בחשבון את השיקולים הבאים כשאתם מפתחים אפליקציה ל-Android Automotive OS:
שמות חבילות
מכיוון שאתם מפיצים חבילת Android נפרדת (APK) ל-Android Automotive OS, תוכלו לעשות שימוש חוזר בשם החבילה מהאפליקציה לנייד או ליצור שם חבילה חדש. אם משתמשים בשם חבילה שונה, לאפליקציה יהיו שני כרטיסי מוצר נפרדים ב-Play Store. אם משתמשים שוב בשם החבילה הנוכחי, לאפליקציה תהיה כרטיס אחד בשתי הפלטפורמות.
זו בעיקר החלטה עסקית. לדוגמה, אם יש לכם צוות אחד שעובד על האפליקציה לנייד וצוות נפרד שעובד על האפליקציה ל-Android Automotive OS, יכול להיות שיהיה הגיוני להשתמש בשמות חבילה נפרדים ולאפשר לכל צוות לנהל את דף האפליקציה שלו בחנות Play. אין הבדל גדול במאמץ הטכני הנדרש לשימוש בכל אחת מהגישות.
בטבלה הבאה מפורטים כמה הבדלים עיקריים נוספים בין שמירת שם החבילה הנוכחי לבין שימוש בשם חבילה חדש:
תכונה | שם חבילה זהה | שם החבילה החדש |
---|---|---|
רישום חנות | יחיד | יותר מאחת |
התקנה במראה | כן: התקנה מחדש מהירה של האפליקציה במהלך האשף להגדרה | לא |
תהליך הבדיקה של חנות Play | בדיקות חסימה: אם הבדיקה נכשלת לגבי קובץ APK אחד, קובצי APK אחרים שנשלחו באותה גרסה ייחסמו | ביקורות ספציפיות |
נתונים סטטיסטיים, מדדים ומדדי ביצועים | בשילוב: אפשר לסנן לפי שם המכשיר כדי לקבל נתונים ספציפיים לכלי רכב. | כן, אני רוצה להפריד |
הוספה לאינדקס ודירוג בחיפוש | התבססות על המצב הנוכחי | ללא העברה |
שילוב עם אפליקציות אחרות | סביר להניח שאין צורך בשינויים, בהנחה שקוד המדיה משותף בין שני קובצי ה-APK | יכול להיות שתצטרכו לעדכן את האפליקציה המתאימה, למשל כדי להפעיל URI באמצעות Google Assistant |
תוכן אופליין
אם רלוונטי, כדאי להטמיע תמיכה אופליין באפליקציה. במכוניות עם מערכת ההפעלה Android Automotive צפויה להיות קישוריות נתונים משלהם, כלומר חבילת הגלישה כלולה בעלות הרכב או שהמשתמש משלם עליה. עם זאת, צפויה גם קישוריות משתנה יותר ברכב מאשר במכשירים ניידים.
ריכזנו כאן כמה דברים שכדאי לזכור כשאתם בוחרים את אסטרטגיית התמיכה אופליין:
- הזמן הטוב ביותר להורדת תוכן הוא בזמן השימוש באפליקציה.
- אל תניחו שה-Wi-Fi זמין. יכול להיות שרכב אף פעם לא נכנס לטווח של Wi-Fi, או שיצרן הציוד המקורי (OEM) השבית את ה-Wi-Fi לטובת רשת סלולרית.
- מותר לשמור בזיכרון מטמון תוכן בצורה חכמה שאתם מצפים שהמשתמשים ישתמשו בו, אבל מומלץ לאפשר למשתמש לשנות את ההתנהגות הזו.
- נפח האחסון בכונן של הרכב משתנה, לכן כדאי לתת למשתמשים אפשרות למחוק תוכן אופליין.
שאלות נפוצות
בקטעים הבאים מפורטות תשובות לכמה מהשאלות הנפוצות ביותר בנושא Android Automotive OS.
האם יש הגבלות או המלצות לשימוש בספריות ובערכות SDK של צד שלישי?
אין הנחיות ספציפיות לשימוש בספריות ובערכות SDK של צד שלישי. אם בחרתם להשתמש בספריות וב-SDK של צד שלישי, עדיין באחריותכם לעמוד בכל דרישות האיכות של אפליקציות לרכב.
איך מפרסמים אפליקציה ל-Android Automotive OS באמצעות Google Play Console?
במאמר הפצה למכוניות מוסבר איך מפרסמים אפליקציות ל-Android Automotive OS באמצעות Google Play Console.
פתרון בעיות
בהמשך מפורטות כמה תרחישי פתרון בעיות נפוצים ב-Android Automotive OS.
גם אחרי הסרת אפליקציה מ'ספריית האפליקציות לרכב' מהגדרות המערכת, מופיעה הודעת שגיאה כשמנסים להתקין גרסה חדשה.
כדי לוודא שהאפליקציה הוסרה, משתמשים בפקודה
adb uninstall app.package.name
.