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

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

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

مروری بر توسعه

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

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

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

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

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

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

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

  7. Add No Activity را انتخاب کنید، سپس روی Finish کلیک کنید.

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

  1. در Android Studio، روی File > New > New Project کلیک کنید.
  2. Automotive را برای نوع پروژه انتخاب کنید.
  3. No Activity را انتخاب کنید، سپس روی Next کلیک کنید.
  4. یک نام برای پروژه خود ارائه دهید. این نامی است که کاربران برای برنامه شما در سیستم عامل Android Automotive می بینند.
  5. نام بسته را وارد کنید. برای جزئیات بیشتر در مورد انتخاب نام بسته به بخش نام های بسته مراجعه کنید.
  6. API 29: Android 10 (Q) را برای Minimum SDK انتخاب کنید، سپس روی Next کلیک کنید.

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

سپس عناصر 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 در تضاد نیست.

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

در ماژول خودرو، باید یک وابستگی به 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 را اعلام کنید

از ورودی مانیفست زیر برای اعلام اینکه برنامه شما از سیستم عامل 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 خود، به Create your CarAppService و Session مراجعه کنید و CarAppService خود را اعلام کنید .

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

ملاحظات دیگر

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

نام بسته ها

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

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

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

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

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

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

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

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

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

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

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

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

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

فرآیند انتشار برنامه مشابه انتشار یک برنامه تلفنی است، اما شما از فاکتور فرم متفاوتی استفاده می کنید. برای انتخاب برنامه خود برای استفاده از نوع انتشار سیستم عامل Android Automotive، این مراحل را دنبال کنید:

  1. کنسول Play را باز کنید.
  2. برنامه خود را انتخاب کنید.
  3. از منوی سمت چپ، Release > Setup > Advanced settings > Form factor را انتخاب کنید.
  4. افزودن عامل فرم > سیستم عامل Android Automotive را انتخاب کنید، سپس دستورالعمل‌های موجود در Play Console را دنبال کنید.

عیب یابی

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

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

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