הוספת תמיכה ב-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

יש להשתמש ב-Android Studio Bumblebee ואילך כדי לוודא שכל התכונות של Automotive OS מופעלות.

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

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

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

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

  7. בוחרים באפשרות הוספת ללא פעילות ולוחצים על סיום.

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

  1. ב-Android Studio, לוחצים על קובץ > חדש > פרויקט חדש.
  2. בוחרים באפשרות Automotive בשדה Project Type.
  3. בוחרים באפשרות ללא פעילות ולוחצים על הבא.
  4. נותנים Name לפרויקט. זה השם שהמשתמשים יראו ב-Android Automotive OS.
  5. מזינים שם חבילה. מידע נוסף זמין בקטע שמות של חבילות לקבלת פרטים נוספים על בחירת שם חבילה.
  6. בוחרים באפשרות API 29: Android 10 (Q) בשביל Minimum SDK, ואז לוחצים על הבא.

    כל המכוניות שתומכות בספריית האפליקציות לרכב ב-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 הראשון מצהיר שהאפליקציה שלך משתמשת במארח התבניות להפעיל. הגדרה מפורשת של ארבעת רכיבי uses-feature הנותרים בתור השירות required="false" מבטיח שאין התנגשות בין האפליקציה לבין תכונות החומרה הזמינות במכשירי Android Automotive OS.

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

במודול כלי הרכב, יש להוסיף תלות ארטיפקט אחד (androidx.car.app:app-automotive), התוכנית כוללת את ההטמעה של CarAppActivity שנדרשת כדי שהאפליקציה תפעל ב-Android Automotive OS.

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

מגניב

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:

<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 וסשן וכן להצהיר על 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 מתוך פריט המידע שנוצר בתהליך הפיתוח (Artifact) מסוג app-automotive.
  • הערך android:exported מוגדר ל-true כי צריך לאפשר את הפעלת הפעילות באמצעות מלבד האפליקציה עצמה (כלומר מרכז האפליקציות).
  • הערך android:launchMode מוגדר ל-singleTask כך שהמשתמש יכול לחזור מופע של הפעילות במרכז האפליקציות, אם הם מנווטים למקום אחר.
  • הערך של android:theme מוגדר ל-@android:style/Theme.DeviceDefault.NoActionBar, כך שהאפליקציה תופסת את כל השטח שזמין לה במסך.
  • מסנן Intent מציין שזו הפעילות במרכז האפליקציות עבור האפליקציה.
  • יש רכיב <meta-data> שמציין למערכת ההפעלה שהאפליקציה יכולה כשקיימות הגבלות על חוויית המשתמש, למשל כשהרכב נמצא בפנים. תנועה.

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

<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 הנוספת לפי הקטגוריה, המערכת מודיעה למערכת שהאפליקציה יכולה להציג את מיקום המשתמש.
  • מסנן Intent מסוג androidx.car.app.action.NAVIGATE מבטיח שלמשתמשים יש האפשרות להשתמש באפליקציה בזמן טיפול בכוונת ניווט מרומזת מתוך אפליקציה אחרת לרכב.

שיקולים אחרים

חשוב לזכור את השיקולים הבאים בזמן הפיתוח של Android Automotive אפליקציה לניהול מערכת ההפעלה:

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

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

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

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

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

תוכן במצב אופליין

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

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

  • הזמן הכי טוב להוריד תוכן הוא בזמן שהאפליקציה בשימוש.
  • אל תניח שה-Wi-Fi זמין. יכול להיות שמכונית אף פעם לא תגיע לטווח Wi-Fi, או יצרן הציוד המקורי (OEM) עשוי להשבית את ה-Wi-Fi לטובת רשת סלולרית.
  • זה בסדר לשמור בצורה חכמה במטמון תוכן שאתם מצפים מהמשתמשים לשמור שבו נעשה שימוש, מומלץ לאפשר למשתמש לשנות את ההתנהגות הזו.
  • נפח האחסון במכוניות משתנה, לכן צריך לתת למשתמשים אפשרות למחוק תוכן אופליין.

שאלות נפוצות

בקטעים הבאים ריכזנו תשובות לכמה שאלות נפוצות בנושא מערכת ההפעלה Android Automotive.

האם יש הגבלות או המלצות לגבי השימוש בספריות ובערכות SDK של צד שלישי?

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

איך מפרסמים את האפליקציה ל-Android Automotive OS באמצעות Google Play Console?

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

  1. פותחים את Play Console.
  2. בוחרים את האפליקציה הרצויה.
  3. בתפריט הימני, לוחצים על פרסום > הגדרה > הגדרות מתקדמות > צורה גורמים.
  4. בוחרים באפשרות הוספת גורם צורה > Android Automotive OS, ואז פועלים לפי ב-Play Console.

פתרון בעיות

ריכזנו כאן כמה עזרה בתרחישים נפוצים לפתרון בעיות ב-Android Automotive OS.

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

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