הוספת תמיכה ב-Android Automotive OS לאפליקציה בתבנית

מערכת ההפעלה Android Automotive OS מאפשרת למשתמשים להתקין אפליקציות במכונית. כדי להגיע למשתמשים בפלטפורמה הזו, צריך להפיץ אפליקציה מותאמת לנהגים שתואמת ל-Android Automotive OS. אפשר להשתמש כמעט בכל הקוד והמשאבים מאפליקציית Android Auto, אבל צריך ליצור גרסת build נפרדת שעומדת בדרישות שמתוארות בדף הזה.

כדי להפעיל את אפליקציית הרכב ב-Android Automotive OS, צריך את הגרסה העדכנית של Templates Host, שמגיעה כאפליקציית מערכת.

סקירה כללית על פיתוח

כדי להוסיף תמיכה ב-Android Automotive OS, צריך לבצע רק כמה שלבים, כמו שמתואר בקטעים בדף הזה:

  1. יצירת מודול לרכב
  2. הצהרה על תמיכה ב-Android Automotive OS
  3. הצהרה על CarAppService ו-CarAppActivity
  4. עדכון יחסי התלות ב-Gradle

כדי לוודא שכל התכונות של Automotive OS מופעלות, צריך להשתמש ב-Android Studio Bumblebee או בגרסה חדשה יותר.

יצירת מודול לרכב

לחלק מהרכיבים של מערכת ההפעלה Android Automotive, כמו קובץ המניפסט, יש דרישות ספציפיות לפלטפורמה. יוצרים מודול שיכול להפריד את הקוד של הרכיבים האלה מקוד אחר בפרויקט, כמו הקוד שמשמש את אפליקציית הטלפון.

כדי להוסיף מודול לרכב לפרויקט קיים, פועלים לפי השלבים הבאים:

  1. ב-Android Studio, לוחצים על File > New > New Module (קובץ > חדש > מודול חדש).
  2. בוחרים באפשרות Automotive Module (מודול לרכב) ולוחצים על Next (הבא).
  3. מזינים שם של אפליקציה או ספרייה. זה השם שהמשתמשים רואים לאפליקציה שלכם ב-Android Automotive OS.
  4. מזינים שם מודול.
  5. עורכים את שם החבילה כך שיתאים לאפליקציה הקיימת.
  6. בוחרים באפשרות API 29: Android 10 (Q) בשדה Minimum SDK (גרסת ה-SDK המינימלית), ואז לוחצים על Next (הבא). כל המכוניות שתומכות בספריית האפליקציות לרכב ב-Android Automotive OS פועלות ב-Android 10 ברמת API‏ 29 ומעלה, ולכן בחירה בערך הזה תטרגט את כל המכוניות התואמות.

  7. בוחרים באפשרות Add No Activity (לא להוסיף פעילות) ואז לוחצים על Finish (סיום).

אם מתחילים פרויקט חדש:

  1. ב-Android Studio, לוחצים על File > ‏New > ‏New Project (קובץ > חדש > פרויקט חדש).
  2. בוחרים באפשרות רכב בסוג הפרויקט.
  3. בוחרים באפשרות לא להוסיף פעילות ולוחצים על הבא.
  4. מזינים שם לפרויקט. זה השם שיוצג למשתמשים של האפליקציה במערכת ההפעלה Android Automotive OS.
  5. מזינים שם חבילה. מידע נוסף על בחירת שם חבילה זמין בקטע שמות של חבילות.
  6. בוחרים באפשרות 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 ...>
  ...
  <uses-feature
      android:name="android.software.car.templates_host"
      android:required="true" />
  ...
</manifest>

בנוסף, חשוב לוודא שהאפליקציה עומדת בדרישות התכונות של Google Play שחלות על כל האפליקציות שנוצרו עבור Android Automotive OS.

עדכון יחסי התלות של Gradle

במודול Automotive, צריך להוסיף תלות בארטיפקט 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 שבו מוצהרות היכולות של האפליקציה בתחום הרכב.

כדי לציין שיש לכם אפליקציה של ספריית האפליקציות לרכב, צריך להוסיף קובץ XML בשם automotive_app_desc.xml לספרייה res/xml/ במודול Android Automotive OS. הקובץ הזה צריך לכלול את התוכן הבא:

<automotiveApp>
    <uses name="template"/>
</automotiveApp>

הצהרה על CarAppService ו-CarAppActivity

בדומה ל-Android Auto, מערכת Android Automotive OS משתמשת בהטמעה שלכם כדי להריץ את האפליקציה. הוראות להטמעה ולהצהרה על CarAppService זמינות במאמרים יצירת CarAppService ו-Session והצהרה על CarAppService.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 מסנן Intent מבטיח שלמשתמשים תהיה אפשרות להשתמש באפליקציה שלכם כשמטפלים בכוונת ניווט מרומזת מאפליקציית רכב אחרת.

כדי לשפר את חוויית השימוש באפליקציה מבוססת-תבנית במכשירי Android Automotive OS, אפשר להוסיף תמיכה בקישורי עומק ל-CarAppActivity. לדוגמה, זה מאפשר למשתמשים לפתוח את האפליקציה ישירות מדפדפן או כשמתקבלת כתובת URL ששותפה מטלפון באמצעות שיתוף מהיר.

הוספה של מסנני Intent לקישורי עומק

כדי להודיע למערכת ההפעלה שהאפליקציה שלכם יכולה לטפל בקישורי עומק, צריך להוסיף את מסנני ה-Intent המתאימים לרכיב <activity> של CarAppActivity האפליקציה. הנחיות נוספות זמינות במאמר הוספת מסנני Intent לקישורים נכנסים.

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

כדי לטפל ב-Intents, האפליקציה צריכה לקרוא את הנתונים מ-Intents נכנסים, גם כש-Session של אפליקציית הרכב נוצר במהלך onCreateScreen() וגם כשהיא מקבלת Intent חדש במהלך onNewIntent():

class MySession : Session() {
    // ...
    override fun onCreateScreen(intent: Intent): Screen {
        // Handle the intent when the app is being started for the first time
        return MyStartScreen(carContext)
    }

    override fun onNewIntent(intent: Intent) {
        // Handle the intent when the app is already running
    }
}

שיקולים נוספים

כשמפתחים אפליקציה ל-Android Automotive OS, חשוב לזכור את השיקולים הבאים:

שמות של חבילות

מכיוון שאתם מפיצים חבילת Android Package Kit (APK) נפרדת ל-Android Automotive OS, אתם יכולים להשתמש מחדש בשם החבילה מהאפליקציה לנייד או ליצור שם חבילה חדש. אם משתמשים בשם חבילה אחר, לאפליקציה יש שני דפי מוצר נפרדים ב-חנות Play. אם תשתמשו שוב בשם החבילה הנוכחי, לאפליקציה שלכם יהיה רישום אחד בשתי הפלטפורמות.

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

בטבלה הבאה מפורטים כמה הבדלים חשובים נוספים בין שמירה על שם החבילה הנוכחי לבין שימוש בשם חבילה חדש:

תכונה שם חבילה זהה שם חבילה חדש
רישום חנות יחיד יותר מאחת
התקנה משוכפלת כן: התקנה מהירה של האפליקציה במהלך אשף ההגדרה לא
תהליך הביקורת בחנות Play חסימת ביקורות: אם ביקורת נכשלת עבור קובץ APK אחד, קובצי APK אחרים שנשלחו באותה גרסה נחסמים ביקורות ספציפיות
נתונים סטטיסטיים, מדדים ונתונים חיוניים משולב: אפשר לסנן לפי שם המכשיר כדי לראות נתונים ספציפיים לרכב. הפרדה
הוספה לאינדקס ודירוג בחיפוש התבססות על המיקום הנוכחי ללא העברה
שילוב עם אפליקציות אחרות ככל הנראה לא צריך לבצע שינויים, בהנחה שקוד המדיה משותף לשני קובצי ה-APK יכול להיות שיהיה צורך לעדכן את האפליקציה המתאימה, למשל כדי להפעיל URI באמצעות Google Assistant

תוכן אופליין

אם רלוונטי, כדאי להטמיע תמיכה באופליין באפליקציה. במכוניות עם Android Automotive OS אמורה להיות קישוריות נתונים משלהן, כלומר חבילת גלישה כלולה בעלות הרכב או שהמשתמש משלם עליה. עם זאת, צפוי שלמכוניות יהיה גם קישוריות משתנה יותר מאשר למכשירים ניידים.

כמה דברים שכדאי לזכור כשחושבים על אסטרטגיית התמיכה אופליין:

  • הזמן הכי טוב להוריד תוכן הוא בזמן השימוש באפליקציה.
  • אל תניחו שרשת 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.

  • גם אחרי שמסירים אפליקציה של Car App Library מהגדרות המערכת, מופיעה שגיאה כשמנסים להתקין גרסה חדשה.

    כדי לוודא שהאפליקציה הוסרה, משתמשים בפקודה adb uninstall app.package.name.