เพิ่มการรองรับ Android Automotive OS ในแอปที่มีเทมเพลต

Android Automotive OS อนุญาตให้ผู้ใช้ติดตั้งแอปในรถยนต์ คุณต้องเผยแพร่แอปที่เพิ่มประสิทธิภาพให้ผู้ขับขี่ และเข้ากันได้กับ Android Automotive OS เพื่อเข้าถึงผู้ใช้ในแพลตฟอร์มนี้ คุณสามารถนําโค้ดและทรัพยากรเกือบทั้งหมดมาใช้ในแอป Android Auto ได้ แต่จะต้องสร้างบิลด์แยกต่างหากที่เป็นไปตามข้อกําหนดที่อธิบายไว้ในหน้านี้

หากต้องการเรียกใช้แอปรถยนต์ใน Android Automotive OS คุณต้องมีโฮสต์เทมเพลตเวอร์ชันล่าสุด ซึ่งมาในรูปแบบแอประบบ

ภาพรวมการพัฒนา

การเพิ่มการรองรับ Android Automotive OS นั้นทำได้ง่ายเพียงไม่กี่ขั้นตอนตามที่อธิบายไว้ในส่วนต่างๆ ของหน้านี้

  1. สร้างโมดูลยานยนต์
  2. ประกาศการรองรับ Android Automotive OS
  3. ประกาศ CarAppService และ CarAppActivity
  4. อัปเดต Dependency ของ Gradle

ใช้ Android Studio Bumblebee ขึ้นไปเพื่อให้แน่ใจว่าเปิดใช้ฟีเจอร์ทั้งหมดของ Automotive OS แล้ว

สร้างโมดูลยานยนต์

คอมโพเนนต์บางอย่างของ Android Automotive OS เช่น ไฟล์ Manifest มีข้อกำหนดเฉพาะแพลตฟอร์ม สร้างโมดูลที่สามารถแยกโค้ดของคอมโพเนนต์เหล่านี้ออกจากโค้ดอื่นๆ ในโปรเจ็กต์ เช่น โค้ดที่ใช้สำหรับแอปโทรศัพท์

สำหรับโปรเจ็กต์ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มโมดูลยานยนต์ลงในโปรเจ็กต์

  1. ใน Android Studio ให้คลิกไฟล์ > ใหม่ > โมดูลใหม่
  2. เลือกโมดูลยานยนต์ แล้วคลิกถัดไป
  3. ระบุชื่อแอปพลิเคชัน/คลัง ชื่อนี้คือชื่อที่ผู้ใช้จะเห็นสำหรับแอปของคุณใน Android Automotive OS
  4. ป้อนชื่อข้อบังคับ
  5. แก้ไขชื่อแพ็กเกจให้ตรงกับแอปที่มีอยู่
  6. เลือก API 29: Android 10 (Q) สำหรับ SDK ขั้นต่ำ แล้วคลิกถัดไป รถยนต์ทุกรุ่นที่รองรับไลบรารีแอปสำหรับรถยนต์ใน Android Automotive OS ทำงานบน Android 10 API ระดับ 29 ขึ้นไป ดังนั้นการเลือกค่านี้จะกำหนดเป้าหมายไปยังรถยนต์ที่เข้ากันได้ทั้งหมด

  7. เลือกเพิ่มไม่มีกิจกรรม แล้วคลิกเสร็จสิ้น

หากคุณกำลังเริ่มโปรเจ็กต์ใหม่ ให้ทำดังนี้

  1. ใน Android Studio ให้คลิกไฟล์ > ใหม่ > โปรเจ็กต์ใหม่
  2. เลือกยานยนต์สำหรับประเภทโปรเจ็กต์
  3. เลือกไม่มีกิจกรรม แล้วคลิกถัดไป
  4. ระบุชื่อโปรเจ็กต์ นี่คือชื่อที่ผู้ใช้จะเห็นสำหรับแอปของคุณใน Android Automotive OS
  5. ป้อนชื่อแพ็กเกจ ดูรายละเอียดเพิ่มเติมเกี่ยวกับการเลือกชื่อแพ็กเกจได้ในส่วนชื่อแพ็กเกจ
  6. เลือก API 29: Android 10 (Q) สำหรับ SDK ขั้นต่ำ แล้วคลิกถัดไป

    รถยนต์ทุกรุ่นที่รองรับไลบรารีแอปสำหรับรถยนต์ใน Android Automotive OS ทำงานบน 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 OS โปรดทราบว่าไม่มีกิจกรรมที่ประกาศในไฟล์ Manifest

ถัดไป ให้เพิ่มองค์ประกอบ uses-feature ต่อไปนี้ลงในไฟล์ Manifest

<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 ที่เหลือ 4 รายการเป็น required="false" อย่างชัดแจ้งจะช่วยให้มั่นใจได้ว่าแอปจะไม่ขัดแย้งกับฟีเจอร์ฮาร์ดแวร์ที่มีในอุปกรณ์ Android Automotive OS

อัปเดต Dependency ของ Gradle

ในโมดูลยานยนต์ คุณต้องเพิ่มการพึ่งพาอาร์ติแฟกต์ androidx.car.app:app-automotive ซึ่งรวมถึงการใช้งาน CarAppActivity ที่จําเป็นสําหรับให้แอปทํางานใน Android Automotive OS

หากคุณกำลังพัฒนาแอปให้รองรับทั้ง Android Auto และ Android Automotive OS เราขอแนะนำให้คุณเก็บ CarAppService ไว้ในโมดูลแยกต่างหากซึ่งคุณแชร์ระหว่างโมดูลอุปกรณ์เคลื่อนที่และโมดูลยานยนต์ หากใช้แนวทางนี้ คุณต้องอัปเดตโมดูลยานยนต์ให้รวมโมดูลที่แชร์โดยใช้ project dependencies ของ 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 OS

ใช้รายการไฟล์ Manifest ต่อไปนี้เพื่อประกาศว่าแอปของคุณรองรับ Android Automotive OS

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

รายการไฟล์ Manifest นี้หมายถึงไฟล์ XML ที่ประกาศความสามารถด้านยานยนต์ที่แอปของคุณรองรับ

หากต้องการระบุว่าคุณมีแอปไลบรารีแอปสำหรับรถยนต์ ให้เพิ่มไฟล์ XML ชื่อ automotive_app_desc.xml ลงในไดเรกทอรี res/xml/ ในโมดูล Android Automotive OS ไฟล์นี้ควรมีเนื้อหาต่อไปนี้

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

ประกาศ CarAppService และ CarAppActivity

Android Automotive OS จะใช้การติดตั้งใช้งาน CarAppService ของคุณเพื่อเรียกใช้แอปเช่นเดียวกับ Android Auto โปรดดูวิธีการติดตั้งใช้งานและประกาศ CarAppService ได้ที่หัวข้อสร้าง CarAppService และเซสชัน และประกาศ CarAppService

ซึ่งแตกต่างจาก Android Auto ตรงที่คุณต้องใส่คอมโพเนนต์แอปพลิเคชันเพิ่มเติม ซึ่งก็คือ CarAppActivity เพื่อใช้เป็นจุดแรกเข้าสําหรับแอป Android Automotive OS การใช้งานกิจกรรมนี้จะรวมอยู่ในอาร์ติแฟกต์ androidx.car.app:app-automotive และมีหน้าที่สื่อสารกับแอปพลิเคชันโฮสต์เทมเพลตเพื่อแสดงผล UI ของแอป คุณควรมีกิจกรรมนี้เพียง 1 อินสแตนซ์ในไฟล์ Manifest และต้องประกาศดังนี้

<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 ระบุว่านี่เป็นกิจกรรมของ Launcher สําหรับแอป
  • มีองค์ประกอบ <meta-data> ที่บ่งบอกให้ระบบปฏิบัติการทราบว่าแอปสามารถใช้งานได้ขณะมีข้อจำกัดด้าน UX เช่น เมื่อยานพาหนะกำลังเคลื่อนที่

สําหรับแอปการนําทาง จะมีรายการไฟล์ Manifest ที่จําเป็นอีก 2-3 รายการสําหรับ 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 เพิ่มเติมจะแจ้งให้ระบบทราบว่าแอปของคุณแสดงตำแหน่งของผู้ใช้ได้
  • ตัวกรอง Intent androidx.car.app.action.NAVIGATE ช่วยให้ผู้ใช้มีตัวเลือกในการใช้แอปของคุณเมื่อจัดการ Intent การนำทางโดยนัยจากแอปรถยนต์อื่น

ปัจจัยอื่นๆ ที่ควรพิจารณา

โปรดคำนึงถึงข้อควรพิจารณาอื่นๆ ต่อไปนี้เมื่อพัฒนาแอป Android AutomotiveOS

ชื่อแพ็กเกจ

เนื่องจากคุณจัดจำหน่ายชุดแพ็กเกจ Android (APK) แยกต่างหากสำหรับ Android Automotive OS คุณจึงใช้ชื่อแพ็กเกจจากแอปบนอุปกรณ์เคลื่อนที่ซ้ำหรือสร้างชื่อแพ็กเกจใหม่ได้ หากใช้ชื่อแพ็กเกจอื่น แอปของคุณจะมีข้อมูลผลิตภัณฑ์ 2 รายการแยกกันใน Play Store หากใช้ชื่อแพ็กเกจปัจจุบันซ้ำ แอปของคุณจะมีข้อมูลเพียงรายการเดียวในทั้ง 2 แพลตฟอร์ม

นี่เป็นการตัดสินใจทางธุรกิจเป็นหลัก ตัวอย่างเช่น หากคุณมีทีมหนึ่งพัฒนาแอปบนอุปกรณ์เคลื่อนที่ และอีกทีมหนึ่งพัฒนาแอป Android AutomotiveOS ก็อาจใช้ชื่อแพ็กเกจแยกกันและให้แต่ละทีมจัดการข้อมูลผลิตภัณฑ์ใน Play Store ของตนเอง ความพยายามทางเทคนิคในการใช้แนวทางใดแนวทางหนึ่งนั้นไม่แตกต่างกันมากนัก

ตารางต่อไปนี้จะสรุปความแตกต่างที่สำคัญอื่นๆ ระหว่างการคงชื่อแพ็กเกจปัจจุบันไว้หรือใช้ชื่อแพ็กเกจใหม่

ฟีเจอร์ ชื่อแพ็กเกจเดียวกัน ชื่อแพ็กเกจใหม่
ข้อมูลผลิตภัณฑ์ใน Store ซิงเกิล หลายรายการ
การติดตั้งแบบมิเรอร์ ใช่: ติดตั้งแอปอีกครั้งอย่างรวดเร็วระหว่างวิซาร์ดการตั้งค่า ไม่
กระบวนการตรวจสอบของ Play Store การบล็อกการตรวจสอบ: หาก APK รายการหนึ่งไม่ผ่านการตรวจสอบ ระบบจะบล็อก APK อื่นๆ ที่ส่งในรุ่นเดียวกัน รีวิวแต่ละรายการ
สถิติ เมตริก และข้อมูลประสิทธิภาพที่สำคัญ รวม: คุณสามารถกรองตามชื่ออุปกรณ์เพื่อดูข้อมูลเฉพาะยานยนต์ได้ แยก
การจัดทำดัชนีและการจัดอันดับการค้นหา สร้างจากอันดับปัจจุบัน ไม่มีการนำยอดคงเหลือไปรวม
การผสานรวมกับแอปอื่นๆ ส่วนใหญ่แล้วไม่จําเป็นต้องเปลี่ยนแปลงใดๆ โดยสมมติว่าทั้ง 2 APK ใช้รหัสสื่อร่วมกัน อาจต้องอัปเดตแอปที่เกี่ยวข้อง เช่น สำหรับการเล่น URI ด้วย Google Assistant

เนื้อหาแบบออฟไลน์

ใช้การรองรับแบบออฟไลน์ในแอป (หากมี) รถยนต์ที่ใช้ระบบปฏิบัติการ Android Automotive คาดว่าจะมีการเชื่อมต่ออินเทอร์เน็ตของตัวเอง ซึ่งหมายความว่าแพ็กเกจอินเทอร์เน็ตจะรวมอยู่ในค่ารถหรือผู้ใช้เป็นผู้จ่าย อย่างไรก็ตาม รถยนต์ก็คาดว่าจะมีการเชื่อมต่อที่ผันผวนมากกว่าอุปกรณ์เคลื่อนที่ด้วย

สิ่งที่ควรคำนึงถึงเมื่อพิจารณากลยุทธ์การสนับสนุนแบบออฟไลน์มีดังนี้

  • เวลาที่ดีที่สุดในการดาวน์โหลดเนื้อหาคือขณะที่มีการใช้แอป
  • อย่าคิดว่ามี Wi-Fi ให้บริการ รถอาจไม่เคยอยู่ในระยะสัญญาณ Wi-Fi หรือผู้ผลิตอุปกรณ์ดั้งเดิม (OEM) อาจปิดใช้ Wi-Fi และใช้เครือข่ายมือถือแทน
  • แม้ว่าการแคชเนื้อหาที่คุณคาดหวังว่าผู้ใช้จะใช้อย่างชาญฉลาดจะเป็นสิ่งที่ทำได้ แต่เราขอแนะนำให้คุณอนุญาตให้ผู้ใช้เปลี่ยนลักษณะการทำงานนี้
  • พื้นที่ในดิสก์ของรถยนต์จะแตกต่างกันไป ดังนั้นให้ผู้ใช้มีวิธีลบเนื้อหาที่ดาวน์โหลดไว้

คำถามที่พบบ่อย

ดูคำตอบสำหรับคำถามที่พบบ่อยเกี่ยวกับระบบปฏิบัติการ Android Automotive ได้ที่ส่วนต่อไปนี้

มีข้อจำกัดหรือคําแนะนําในการใช้ SDK และไลบรารีของบุคคลที่สามไหม

ไม่มีหลักเกณฑ์ที่เฉพาะเจาะจงเกี่ยวกับการใช้ SDK และไลบรารีของบุคคลที่สาม หากเลือกใช้ SDK และไลบรารีของบุคคลที่สาม คุณยังคงมีหน้าที่รับผิดชอบในการปฏิบัติตามข้อกำหนดด้านคุณภาพของแอปรถยนต์ทั้งหมด

ฉันจะเผยแพร่แอป Android Automotive OS โดยใช้ Google Play Console ได้อย่างไร

ดูรายละเอียดเกี่ยวกับวิธีเผยแพร่แอป Android Automotive OS โดยใช้ Google Play Console ได้ที่เผยแพร่ไปยังรถยนต์

การแก้ปัญหา

ดูความช่วยเหลือเกี่ยวกับสถานการณ์การแก้ปัญหาที่พบบ่อยใน Android Automotive OS ได้ที่หัวข้อต่อไปนี้

  • ฉันได้รับข้อผิดพลาดเมื่อพยายามติดตั้งเวอร์ชันใหม่แม้ว่าจะถอนการติดตั้งแอปคลังแอปรถยนต์ออกจากการตั้งค่าระบบแล้วก็ตาม

    หากต้องการตรวจสอบว่าถอนการติดตั้งแอปแล้ว ให้ใช้คำสั่ง adb uninstall app.package.name