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

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

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

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

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

  7. انقر على إضافة "لا يوجد نشاط"، ثم انقر على إنهاء.

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

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

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

بعد إنشاء الوحدة في "استوديو Android"، افتح ملف 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

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

إذا كنت بصدد تطوير تطبيقك ليتوافق مع كل من Android Auto وAndroid Automotive OS، ننصحك بإبقاء CarAppService في وحدة منفصلة يمكنك مشاركتها بين وحدات الأجهزة الجوّالة ووحدات السيارات. إذا كنت تستخدم هذا الأسلوب، عليك تعديل وحدة Android Automotive لتضمين الوحدة المشترَكة باستخدام اعتماديات المشروع في Gradle، كما هو موضّح في المقتطف التالي:

Groovy

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 OS. يتم تضمين تنفيذ هذا النشاط في العنصر 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 كي يشغل التطبيق مساحة الشاشة الكاملة المتاحة له.
  • يشير intent filter إلى أنّ هذا هو نشاط مشغّل التطبيقات.
  • يتوفّر العنصر <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. على سبيل المثال، يتيح ذلك للمستخدمين فتح تطبيقك مباشرةً من متصفّح أو عند تلقّي عنوان URL تمت مشاركته من هاتف باستخدام ميزة المشاركة السريعة.

إضافة فلاتر أهداف الروابط لصفحات في التطبيق

لإعلام نظام التشغيل بأنّ تطبيقك يمكنه التعامل مع الروابط لصفحات معيّنة، عليك إضافة فلاتر الأهداف المناسبة ضِمن العنصر <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، يمكنك إعادة استخدام اسم الحزمة من تطبيقك على الأجهزة الجوّالة أو إنشاء اسم حزمة جديد. إذا كنت تستخدم اسم حزمة مختلفًا، سيتضمّن تطبيقك بطاقتَي بيانات منفصلتَين على &quot;متجر Play&quot;. في حال إعادة استخدام اسم الحزمة الحالي، سيظهر تطبيقك في بطاقة بيانات واحدة على كلتا المنصّتين.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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