إضافة إمكانية استخدام نظام التشغيل 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.

إنشاء وحدة للسيارات

تفرض بعض مكوّنات نظام التشغيل Android Automotive، مثل البيان، متطلبات خاصة بالنظام الأساسي. أنشئ وحدة يمكنها فصل الرمز البرمجي لهذه المكوّنات عن الرمز البرمجي الآخر في مشروعك، مثل الرمز البرمجي المستخدَم لتطبيق هاتفك.

بالنسبة إلى مشروع حالي، اتّبِع الخطوات التالية لإضافة وحدة سيارات إلى مشروعك:

  1. في Android Studio، انقر على ملف > جديد > وحدة جديدة.
  2. اختَر وحدة السيارات، ثم انقر على التالي.
  3. أدخِل اسم التطبيق/المكتبة. هذا هو الاسم الذي يظهر للمستخدمين عند تثبيت تطبيقك على نظام التشغيل Android Automotive.
  4. أدخِل اسم الوحدة.
  5. عدِّل اسم الحزمة ليطابق اسم تطبيقك الحالي.
  6. اختَر المستوى 29 من واجهة برمجة التطبيقات: Android 10 (Q) الحد الأدنى لحزمة تطوير البرامج (SDK)، ثم انقر على التالي. تعمل جميع السيارات المتوافقة مع Car App Library (مكتبة تطبيقات السيارة) على نظام التشغيل Android Automotive من خلال المستوى 29 من واجهة برمجة التطبيقات Android 10 أو الإصدارات الأحدث، لذا فإنّ اختيار هذه القيمة يستهدف جميع السيارات المتوافقة.

  7. اختَر إضافة "ما مِن نشاط"، ثم انقر على إنهاء.

إذا كنت بصدد بدء مشروع جديد:

  1. في Android Studio، انقر على ملف > جديد > مشروع جديد.
  2. اختَر السيارات لنوع المشروع.
  3. اختَر ما مِن نشاط، ثم انقر على التالي.
  4. أدخِل اسمًا لمشروعك. هذا هو الاسم الذي يظهر للمستخدمين عند عرض تطبيقك على نظام التشغيل Android Automotive.
  5. أدخِل اسم الحزمة. اطّلِع على قسم أسماء الحِزم لمزيد من التفاصيل حول اختيار اسم حزمة.
  6. اختَر المستوى 29 من واجهة برمجة التطبيقات: Android 10 (Q) الحد الأدنى لحزمة تطوير البرامج (SDK)، ثم انقر على التالي.

    تعمل جميع السيارات المتوافقة مع Car App Library (مكتبة تطبيقات السيارة) على نظام التشغيل Android Automotive من خلال المستوى 29 من واجهة برمجة التطبيقات Android 10 أو الإصدارات الأحدث، لذا فإنّ اختيار هذه القيمة يستهدف جميع السيارات المتوافقة.

بعد إنشاء الوحدة في 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 الأول إلى أنّ تطبيقك يستخدم "مضيف النماذج" لتشغيله. يضمن ضبط عناصر uses-feature الأربعة المتبقية على required="false" بشكل صريح عدم تعارض تطبيقك مع ميزات الأجهزة المتاحة في أجهزة Android Automotive.

تعديل متطلّبات Gradle

ضمن وحدة Automotive، يجب إضافة عنصر تابع لملف androidx.car.app:app-automotive، والذي يتضمّن تنفيذ CarAppActivity المطلوب لتشغيل تطبيقك على نظام التشغيل Android Automotive.

إذا كنت تُطوّر تطبيقك ليتوافق مع كلّ من Android Auto ونظام التشغيل Android Automotive، ننصحك بالاحتفاظ بـ CarAppService في وحدة منفصلة تشاركها بين وحدات الأجهزة الجوّالة والسيارات. إذا كنت تستخدم هذا النهج، عليك تعديل وحدة Automotive لتضمين الوحدة المشتركة باستخدام تبعيات المشروع في 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

استخدِم إدخال البيان التالي للإشارة إلى أنّ تطبيقك متوافق مع نظام التشغيل 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 وSession وتعريف 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 OS:

أسماء الحِزم

بما أنّك توزّع حزمة Android Package Kit (APK) منفصلة لنظام التشغيل Android Automotive، يمكنك مجددًا استخدام اسم الحزمة من تطبيقك المتوافق مع الأجهزة الجوّالة أو إنشاء اسم حزمة جديد. إذا كنت تستخدم اسم حزمة مختلفًا، سيتضمّن تطبيقك قائمتَين منفصلتَين في "متجر Play". في حال إعادة استخدام اسم الحزمة الحالي، سيتوفّر لتطبيقك بطاقة بيانات متجر واحدة على كلتا المنصّتَين.

يعود هذا القرار بشكل أساسي إلى النشاط التجاري. على سبيل المثال، إذا كان لديك فريق واحد يعمل على تطوير التطبيق المتوافق مع الأجهزة الجوّالة، وفريق منفصل يعمل على تطوير تطبيق نظام التشغيل Android Automotive، قد يكون من المنطقي استخدام أسماء حِزم منفصلة والسماح لكل فريق بإدارة بطاقة بياناته الخاصة على "متجر Play". ليس هناك فرق كبير في الجهد الفني المطلوب لاستخدام أي من الطريقتَين.

يلخِّص الجدول التالي بعض الاختلافات الرئيسية الأخرى بين الاحتفاظ باسم الحزمة الحالي أو استخدام اسم حزمة جديد:

الميزة اسم الحزمة نفسه اسم الحزمة الجديد
بطاقة بيانات المتجر فردية عدة تعليقات
التثبيت المطابق نعم: إعادة تثبيت التطبيق بسرعة أثناء معالج الإعداد لا
عملية المراجعة في "متجر Play" حظر المراجعات: إذا تعذّر اجتياز المراجعة لحزمة APK واحدة، سيتم حظر حِزم APK الأخرى التي تم إرسالها في الإصدار نفسه. المراجعات الفردية
الإحصاءات والمقاييس والمؤشرات الحيوية البيانات المجمّعة: يمكنك الفلترة حسب اسم الجهاز للحصول على data المتعلّقة بالسيارات. فصل
الفهرسة والترتيب في نتائج البحث الاستفادة من الترتيب الحالي لا يمكن نقل المحتوى
الدمج مع تطبيقات أخرى من المرجّح عدم الحاجة إلى إجراء أي تغييرات، بافتراض أنّ رمز الوسائط مشترَك بين حِزم APK. قد يكون عليك تحديث التطبيق المقابل، مثلاً لتشغيل محتوى باستخدام معرّف URI من خلال "مساعد Google".

المحتوى بلا إنترنت

يمكنك توفير إمكانية استخدام التطبيق بلا إنترنت، إذا كان ذلك منطبقًا. من المتوقّع أن تتضمّن السيارات المزوّدة بنظام التشغيل Android Automotive إمكانية الاتصال بالبيانات، ما يعني أنّه يتم تضمين خطة data في تكلفة المركبة أو يدفع المستخدم ثمنها. ومع ذلك، من المتوقّع أيضًا أن تكون إمكانيات الاتصال بالسيارات أكثر تنوعًا من الأجهزة الجوّالة.

في ما يلي بعض الأمور التي يجب وضعها في الاعتبار عند التفكير في استراتيجية المساعدة بلا إنترنت:

  • إنّ أفضل وقت لتنزيل المحتوى هو عندما يكون تطبيقك قيد الاستخدام.
  • لا تفترض توفّر شبكة Wi-Fi. قد لا تصل السيارة أبدًا إلى نطاق شبكة Wi-Fi، أو قد يكون المصنّع الأصلي للجهاز قد أوقف شبكة Wi-Fi لصالح شبكة الجوّال.
  • على الرغم من أنّه من المقبول تخزين المحتوى الذي تتوقّع أن يستخدمه المستخدمون في ذاكرة التخزين المؤقت بذكاء، ننصحك بالسماح للمستخدم بتغيير هذا السلوك.
  • تختلف مساحة القرص في السيارات، لذا امنح المستخدمين طريقة لحذف المحتوى الذي تم تنزيله.

الأسئلة الشائعة

اطّلِع على الأقسام التالية للحصول على إجابات عن بعض الأسئلة الشائعة حول نظام التشغيل Android Automotive.

هل هناك أي قيود أو اقتراحات لاستخدام حِزم SDK والمكتبات التابعة لجهات خارجية؟

لا تتوفّر إرشادات محدّدة حول استخدام حِزم تطوير البرامج (SDK) والمكتبات التابعة لجهات خارجية. إذا اخترت استخدام حِزم SDK والمكتبات التابعة لجهات خارجية، تظل مسؤولاً عن الامتثال لجميع متطلبات جودة تطبيقات السيارات.

كيف يمكنني نشر تطبيق Android Automotive OS باستخدام Google Play Console؟

لمعرفة تفاصيل حول كيفية نشر تطبيقك المتوافق مع نظام التشغيل Android Automotive باستخدام Google Play Console، يُرجى الاطّلاع على مقالة التوزيع على السيارات.

تحديد المشاكل وحلّها

اطّلِع على ما يلي للحصول على مساعدة بشأن بعض السيناريوهات الشائعة لتحديد المشاكل وحلّها على نظام التشغيل Android Automotive.

  • حتى بعد إلغاء تثبيت أحد تطبيقات "مكتبة تطبيقات السيارات" من إعدادات النظام، يظهر لي خطأ عند محاولة تثبيت إصدار جديد.

    للتأكّد من إلغاء تثبيت التطبيق، استخدِم الأمر adb uninstall app.package.name.