پشتیبانی از سیستم عامل Android Automotive را به برنامه قالب خود اضافه کنید

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

برای اجرای برنامه ماشین خود در سیستم عامل اندروید اتوموتیو، به جدیدترین Templates Host نیاز دارید که به عنوان یک برنامه سیستمی ارائه می‌شود.

مرور کلی توسعه

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

  1. ایجاد ماژول خودرو
  2. اعلام پشتیبانی از سیستم عامل اندروید اتوموبیل
  3. CarAppService و CarAppActivity خود را تعریف کنید
  4. وابستگی‌های Gradle خود را به‌روزرسانی کنید

برای اطمینان از فعال بودن تمام ویژگی‌های سیستم عامل خودرو، از اندروید استودیو Bumblebee یا جدیدتر استفاده کنید.

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

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

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

  1. در اندروید استودیو، روی File > New > New Module کلیک کنید.
  2. ماژول خودرو را انتخاب کنید، سپس روی بعدی کلیک کنید.
  3. یک نام برای برنامه/کتابخانه وارد کنید. این نامی است که کاربران برای برنامه شما در سیستم عامل اندروید اتوموبیل مشاهده می‌کنند.
  4. نام ماژول را وارد کنید.
  5. نام بسته را مطابق با برنامه موجود خود ویرایش کنید.
  6. برای Minimum SDK، API 29: Android 10 (Q) را انتخاب کنید، سپس روی Next کلیک کنید. تمام خودروهایی که از Car App Library در Android Automotive OS پشتیبانی می‌کنند، روی Android 10 API سطح 29 یا بالاتر اجرا می‌شوند، بنابراین انتخاب این مقدار، همه خودروهای سازگار را هدف قرار می‌دهد.

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

اگر در حال شروع یک پروژه جدید هستید:

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

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

بعد از اینکه ماژول خود را در اندروید استودیو ایجاد کردید، فایل AndroidManifest.xml را در ماژول جدید Automotive خود باز کنید:

<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>

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

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

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

اگر در حال توسعه برنامه خود برای پشتیبانی از Android Auto و Android Automotive OS هستید، توصیه می‌کنیم 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 پشتیبانی می‌کند، از ورودی مانیفست زیر استفاده کنید:

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

این ورودی مانیفست به یک فایل XML اشاره دارد که قابلیت‌های خودرویی پشتیبانی‌شده توسط برنامه شما را اعلام می‌کند.

برای نشان دادن اینکه یک برنامه Car App Library دارید، یک فایل XML با نام automotive_app_desc.xml به دایرکتوری res/xml/ در ماژول Android Automotive OS خود اضافه کنید. این فایل باید شامل محتوای زیر باشد:

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

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

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

برخلاف اندروید اتو، شما باید یک کامپوننت برنامه اضافی، CarAppActivity ، را به عنوان نقطه ورود برای برنامه سیستم عامل اندروید اتو خود در نظر بگیرید. پیاده‌سازی این اکتیویتی در فایل androidx.car.app:app-automotive artifact گنجانده شده است و مسئول ارتباط با برنامه میزبان قالب برای رندر رابط کاربری برنامه شما است. شما فقط باید یک نمونه از این اکتیویتی را در مانیفست خود داشته باشید و باید به صورت زیر تعریف شود:

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

برای برنامه‌های ناوبری ، همانطور که در قطعه کد زیر نشان داده شده است، چند ورودی مانیفست مورد نیاز دیگر برای 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 تضمین می‌کند که کاربران هنگام مدیریت یک اینتنت ناوبری ضمنی از یک برنامه ماشین دیگر، می‌توانند از برنامه شما استفاده کنند.

برای بهبود تجربه برنامه قالب‌بندی شده خود در دستگاه‌های دارای سیستم عامل اندروید اتوموبیل، می‌توانید پشتیبانی از لینک‌های عمیق (deep links) را به CarAppActivity خود اضافه کنید. به عنوان مثال، این به کاربران اجازه می‌دهد تا برنامه شما را مستقیماً از یک مرورگر یا هنگام دریافت URL به اشتراک گذاشته شده از تلفن با استفاده از Quick Share باز کنند.

فیلترهای هدف لینک عمیق را اضافه کنید

برای اینکه به سیستم عامل اطلاع دهید که برنامه شما قادر به مدیریت لینک‌های عمیق است، باید فیلترهای هدف مناسب را در عنصر <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
    }
}

ملاحظات دیگر

هنگام توسعه برنامه سیستم عامل اندروید خودرو خود، این ملاحظات دیگر را نیز در نظر داشته باشید:

نام بسته‌ها

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

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

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

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

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

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

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

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

سوالات متداول

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

آیا محدودیت یا توصیه‌ای برای استفاده از SDKها و کتابخانه‌های شخص ثالث وجود دارد؟

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

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

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

عیب‌یابی

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

  • حتی بعد از حذف نصب برنامه Car App Library از تنظیمات سیستم، هنگام تلاش برای نصب نسخه جدید، با خطا مواجه می‌شوم.

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