افزودن پشتیبانی از «سیستم‌عامل Android Automotive» به برنامه الگودار

سیستم عامل Android Automotive به کاربران امکان می‌دهد برنامه در خودرو نصب کنند. برای جذب کاربران در این پلاتفرم، باید برنامه‌ای بهینه‌سازی‌شده برای راننده توزیع کنید که با سیستم عامل Android Automotive سازگار باشد. می‌توانید تقریباً از همه کدها و منابع دوباره در برنامه Android Auto استفاده کنید، اما باید ساخت جداگانه‌ای ایجاد کنید که الزامات شرح‌داده‌شده در این صفحه را برآورده کند.

برای اجرای برنامه خودرو در «سیستم عامل Android Automotive»، به جدیدترین «میزبان الگوها» نیاز دارید که به‌عنوان برنامه سیستم ارائه می‌شود.

نمای کلی توسعه

افزودن پشتیبانی از «سیستم‌عامل Android Automotive» فقط به چند مرحله نیاز دارد، همان‌طور که در بخش‌های این صفحه توضیح داده شده است:

  1. ایجاد واحد خودرو
  2. اعلام پشتیبانی از «سیستم‌عامل Android Automotive»
  3. اعلام CarAppService و CarAppActivity
  4. به‌روزرسانی وابستگی‌های Gradle

از Android Studio Bumblebee یا نسخه‌های جدیدتر استفاده کنید تا مطمئن شوید همه ویژگی‌های Automotive OS فعال هستند.

ایجاد ماژول خودرویی

برخی‌از عناصر سیستم عامل Android Automotive، مثل مانیفست، الزامات خاص پلاتفرم دارند. واحدی بسازید که بتواند کد این عناصر را از کد دیگر در پروژه‌تان جدا نگه دارد، مثل کدی که برای برنامه تلفن استفاده می‌شود.

برای پروژه موجود، این مراحل را دنبال کنید تا واحد خودرو را به پروژه‌تان اضافه کنید:

  1. در «استودیو Android»، روی فایل > جدید > واحد جدید کلیک کنید.
  2. واحد خودرو را انتخاب کنید، سپس روی بعدی کلیک کنید.
  3. نام برنامه/کتابخانه را ارائه دهید. این نامی است که کاربران برای برنامه شما در «سیستم عامل Android Automotive» می‌بینند.
  4. نام واحد را وارد کنید.
  5. نام بسته را ویرایش کنید تا با برنامه موجودتان مطابقت داشته باشد.
  6. برای حداقل کیت توسعه نرم‌افزار، API 29: Android 10 (Q)‎ را انتخاب کنید، سپس روی بعدی کلیک کنید. همه خودروهایی که از «کتابخانه برنامه خودرو» در «سیستم عامل Android Automotive» پشتیبانی می‌کنند در Android 10 API سطح ۲۹ یا بالاتر اجرا می‌شوند، بنابراین با انتخاب این مقدار، همه خودروهای سازگار هدف‌یابی می‌شوند.

  7. افزودن بدون فعالیت را انتخاب کنید، سپس روی پایان کلیک کنید.

اگر پروژه جدیدی را شروع می‌کنید:

  1. در «استودیو Android»، روی فایل > جدید > پروژه جدید کلیک کنید.
  2. خودرو را برای نوع پروژه انتخاب کنید.
  3. بدون فعالیت را انتخاب کنید، سپس روی بعدی کلیک کنید.
  4. نامی برای پروژه خود ارائه دهید. این نامی است که کاربران برای برنامه شما در سیستم عامل Android Automotive می‌بینند.
  5. نام بسته را وارد کنید. برای جزئیات بیشتر درباره انتخاب نام بسته، بخش نام بسته‌ها را ببینید.
  6. برای حداقل کیت توسعه نرم‌افزار، API 29: Android 10 (Q)‎ را انتخاب کنید، سپس روی بعدی کلیک کنید.

    همه خودروهایی که از «کتابخانه برنامه خودرو» در «سیستم عامل Android Automotive» پشتیبانی می‌کنند در Android 10 API سطح ۲۹ یا بالاتر اجرا می‌شوند، بنابراین با انتخاب این مقدار، همه خودروهای سازگار هدف‌یابی می‌شوند.

پس‌از ایجاد واحد در 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» را اعلام می‌کند. توجه داشته باشید که هیچ فعالیتی در مانیفست اعلام نشده است.

اعلام الزامات ویژگی

سپس عنصر uses-feature زیر را به مانیفست خود اضافه کنید تا نشان دهید برای عملکرد صحیح به میزبان الگو نیاز دارد:

<manifest ...>
  ...
  <uses-feature
      android:name="android.software.car.templates_host"
      android:required="true" />
  ...
</manifest>

علاوه‌براین، مطمئن شوید که برنامه‌تان الزامات ویژگی Google Play را که برای همه برنامه‌های ساخته‌شده برای سیستم‌عامل Android Automotive اعمال می‌شود برآورده می‌کند.

به‌روزرسانی وابستگی‌های Gradle

در واحد خودرو خود، باید وابستگی به androidx.car.app:app-automotive آرتیفکت اضافه کنید، که شامل پیاده‌سازی CarAppActivity موردنیاز برای اجرای برنامه شما در سیستم عامل Android Automotive است.

اگر برنامه‌تان را برای پشتیبانی از هر دو Android Auto و «سیستم عامل Android Automotive» توسعه می‌دهید، توصیه می‌کنیم CarAppService را در واحد جداگانه‌ای نگه دارید که بین واحدهای تلفن همراه و خودرویی‌تان هم‌رسانی می‌کنید. اگر از این رویکرد استفاده می‌کنید، باید واحد خودرو خود را به‌روزرسانی کنید تا واحد مشترک را بااستفاده از وابستگی‌های پروژه Gradle ، همان‌طور که در تکه‌کد زیر نشان داده شده است، اضافه کنید:

شیک

buildscript {
    ...
    dependencies {
        ...
        implementation "androidx.car.app:app-automotive:car_app_library_version"
        implementation project(':shared_module_name')
    }
}

کاتلین

buildscript {
    ...
    dependencies {
        ...
        implementation("androidx.car.app:app-automotive:car_app_library_version")
        implementation(project(":shared_module_name"))
    }
}

اعلام پشتیبانی از «سیستم عامل Android Automotive»

از ورودی مانیفست زیر برای اعلام اینکه برنامه‌تان از «سیستم عامل 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» اضافه کنید. این فایل باید شامل محتوای زیر باشد:

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

تعریف کردن CarAppService و CarAppActivity

همانند Android Auto، سیستم‌عامل Android Automotive از CarAppService پیاده‌سازی شما برای اجرای برنامه‌تان استفاده می‌کند. برای دریافت دستورالعمل‌های پیاده‌سازی و تعریف CarAppService، به ایجاد CarAppService و «جلسه» و تعریف کردن CarAppService مراجعه کنید.

برخلاف Android Auto، باید جزء برنامه اضافی، CarAppActivity، را اضافه کنید تا به‌عنوان نقطه ورود برنامه سیستم عامل Android Automotive شما عمل کند. پیاده‌سازی این فعالیت در آرتیفکت 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 تنظیم شده است تا برنامه فضای تمام‌صفحه دردسترس را اشغال کند.
  • فیلتر هدف نشان می‌دهد که این فعالیت راه‌انداز برنامه است.
  • عنصر <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»، می‌توانید از پیوندهای عمیق در CarAppActivity پشتیبانی کنید. برای مثال، این کار به کاربران امکان می‌دهد برنامه شما را مستقیماً از مرورگر یا هنگام دریافت نشانی وب هم‌رسانی‌شده از تلفن بااستفاده از هم‌رسانی سریع باز کنند.

افزودن فیلترهای هدف پیوند عمیق

برای اینکه سیستم‌عامل را مطلع کنید که برنامه شما می‌تواند پیوندهای عمیق را مدیریت کند، باید فیلترهای هدف مناسب را در عنصر <activity> برای CarAppActivity برنامه خود اضافه کنید. برای راهنمایی بیشتر، افزودن فیلترهای هدف برای پیوندهای ورودی را ببینید.

برای ارائه بهترین تجربه کاربری، توصیه می‌کنیم از همه پیوندهای عمیقی که برنامه تلفن همراهتان پشتیبانی می‌کند و برنامه داخل خودروتان می‌تواند به‌طور منطقی از آن‌ها پشتیبانی کند پشتیبانی کنید.

برای مدیریت هدف‌ها، برنامه شما باید داده‌های هدف‌های ورودی را بخواند هم زمانی که Session برنامه خودرو شما درطول onCreateScreen() ایجاد می‌شود و هم زمانی که درطول 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» خود، این ملاحظات دیگر را درنظر داشته باشید:

نام بسته‌ها

ازآنجایی‌که «کیت بسته Android» (APK) جداگانه‌ای برای سیستم عامل Android Automotive توزیع می‌کنید، می‌توانید از نام بسته برنامه تلفن همراهتان دوباره استفاده کنید یا نام بسته جدیدی ایجاد کنید. اگر از نام بسته دیگری استفاده کنید، برنامه شما دو فهرستگان جداگانه در «فروشگاه Play» خواهد داشت. اگر از نام بسته فعلی‌تان مجدداً استفاده کنید، برنامه شما در هر دو پلاتفرم یک فهرستگان دارد.

این عمدتاً یک تصمیم تجاری است. برای مثال، اگر یک تیم روی برنامه تلفن همراه کار می‌کند و تیم دیگری روی برنامه Android Automotive OS کار می‌کند، منطقی است که نام‌های بسته جداگانه داشته باشید و به هر تیم اجازه دهید فهرستگان «فروشگاه Play» خود را مدیریت کند. تفاوت زیادی در تلاش فنی موردنیاز برای استفاده از هریک از این رویکردها وجود ندارد.

جدول زیر برخی‌از تفاوت‌های کلیدی دیگر بین حفظ نام بسته فعلی یا استفاده از نام بسته جدید را خلاصه می‌کند:

ویژگی نام بسته یکسان نام بسته جدید
فهرست فروشگاه تکی چندگانه
نصب آینه‌ای بله: نصب مجدد سریع برنامه درطول دستیار راه‌اندازی نه
فرایند مرور «فروشگاه Play» مسدود کردن مرورها: اگر مرور یکی از فایل‌های APK ناموفق باشد، سایر فایل‌های APK ارسال‌شده در همان نسخه پخش مسدود می‌شوند مرورهای فردی
آمار، سنجه‌ها، و سنجه‌های کلیدی ترکیبی: می‌توانید داده‌های خاص خودرو را براساس نام دستگاه فیلتر کنید. تفکیک
نمایه کردن و رتبه‌بندی جستجو ساختن براساس وضعیت فعلی بدون انتقال
ادغام با برنامه‌های دیگر به‌احتمال زیاد نیازی به تغییر نیست، به شرطی که کد رسانه بین هر دو APK هم‌رسانی شده باشد ممکن است لازم باشد برنامه مربوطه را به‌روز کنید، مثلاً برای بازپخش نشانی وب با «دستیار Google»

محتوای آفلاین

درصورت لزوم، پشتیبانی آفلاین را در برنامه‌تان پیاده‌سازی کنید. انتظار می‌رود خودروهای دارای «سیستم عامل Android Automotive» اتصال داده خودشان را داشته باشند، یعنی طرح داده در هزینه خودرو گنجانده شده است یا کاربر آن را پرداخت می‌کند. بااین‌حال، انتظار می‌رود خودروها در مقایسه با دستگاه‌های همراه اتصال‌پذیری متغیرتری داشته باشند.

در اینجا چند نکته وجود دارد که باید هنگام درنظر گرفتن استراتژی پشتیبانی آفلاین خود به آن‌ها توجه کنید:

  • بهترین زمان برای بارگیری محتوا زمانی است که برنامه درحال استفاده است.
  • فرض نکنید که Wi-Fi دردسترس است. ممکن است خودرو هرگز در محدوده Wi-Fi قرار نگیرد، یا ممکن است «سازنده تجهیزات اصلی» (OEM) Wi-Fi را به نفع شبکه تلفن همراه غیرفعال کرده باشد.
  • اگرچه ذخیره هوشمند محتوایی که انتظار دارید کاربران از آن استفاده کنند مشکلی ندارد، توصیه می‌کنیم به کاربر اجازه دهید این رفتار را تغییر دهد.
  • فضای دیسک در خودروها متفاوت است، بنابراین به کاربران راهی برای حذف محتوای آفلاین ارائه دهید.

پرسشگان

برای دریافت پاسخ برخی‌از پرسش‌های متداول درباره سیستم‌عامل Android Automotive، بخش‌های زیر را ببینید.

آیا محدودیت یا توصیه‌ای برای استفاده از کیت‌های توسعه نرم‌افزار و کتابخانه‌های طرف سوم وجود دارد؟

دستورالعمل‌های خاصی درباره استفاده از کیت‌های توسعه نرم‌افزار و کتابخانه‌های طرف سوم وجود ندارد. اگر انتخاب کنید از کیت‌های توسعه نرم‌افزار و کتابخانه‌های طرف سوم استفاده کنید، همچنان مسئولیت رعایت همه الزامات کیفیت برنامه خودرو برعهده شما است.

چگونه برنامه «سیستم عامل Android Automotive» خود را بااستفاده از «کنسول Google Play» منتشر کنم؟

برای جزئیات مربوط به نحوه انتشار برنامه سیستم عامل Android Automotive بااستفاده از «کنسول Google Play»، به توزیع برای خودروها مراجعه کنید.

عیب‌یابی

برای کمک در برخی‌از سناریوهای رایج عیب‌یابی در «سیستم‌عامل Android Automotive»، به موارد زیر مراجعه کنید.

  • حتی پس‌از حذف نصب برنامه «کتابخانه برنامه خودرو» از تنظیمات سیستم، هنگام نصب نسخه جدید خطا دریافت می‌کنم.

    برای اطمینان از اینکه برنامه حذف نصب شده است، از فرمان adb uninstall app.package.name استفاده کنید.