เพิ่มการรองรับ 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. อัปเดตการขึ้นต่อกันของ Gradle

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

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

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

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

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

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

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

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

    รถยนต์ทุกคันที่รองรับ Car App Library ใน 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 ...>
  ...
  <uses-feature
      android:name="android.software.car.templates_host"
      android:required="true" />
  ...
</manifest>

นอกจากนี้ โปรดตรวจสอบว่าแอปของคุณเป็นไปตามข้อกำหนดของฟีเจอร์ Google Play ที่ใช้กับแอปทั้งหมดที่สร้างขึ้นสำหรับ Android Automotive OS

อัปเดตการขึ้นต่อกันของ Gradle

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

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

หากต้องการระบุว่าคุณมีแอป Car App Library ให้ เพิ่มไฟล์ 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

คุณต้องรวมคอมโพเนนต์ของแอปพลิเคชันเพิ่มเติม ซึ่งก็คือ CarAppActivity เพื่อใช้เป็นจุดแรกเข้าสำหรับแอป Android Automotive OS ของคุณ ซึ่งต่างจาก Android Auto การติดตั้งใช้งานกิจกรรมนี้จะรวมอยู่ในอาร์ติแฟกต์ androidx.car.app:app-automotive และมีหน้าที่สื่อสารกับแอปพลิเคชันโฮสต์เทมเพลตเพื่อแสดง UI ของแอป คุณควรมีอินสแตนซ์ของกิจกรรมนี้เพียงรายการเดียวในไฟล์ 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 เพื่อให้ผู้ใช้กลับไปยังอินสแตนซ์เดิมของกิจกรรมจาก Launcher ได้หากออกจากกิจกรรม
  • android:theme ตั้งค่าเป็น @android:style/Theme.DeviceDefault.NoActionBar เพื่อให้แอปใช้พื้นที่เต็มหน้าจอที่พร้อมใช้งาน
  • ตัวกรอง Intent จะระบุว่านี่คือกิจกรรมตัวเรียกใช้สำหรับแอป
  • มีองค์ประกอบ <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 หมวดหมู่เพิ่มเติมจะแจ้งให้ระบบทราบว่าแอปของคุณแสดงตำแหน่งของผู้ใช้ได้
  • androidx.car.app.action.NAVIGATE ตัวกรอง Intent ช่วยให้มั่นใจได้ว่าผู้ใช้จะมีตัวเลือกในการใช้แอปของคุณเมื่อจัดการ Intent การนำทางโดยนัยจากแอปในรถยนต์อื่น

หากต้องการปรับปรุงประสบการณ์การใช้งานแอปที่ใช้เทมเพลตในอุปกรณ์ Android Automotive OS คุณ สามารถรองรับDeep Link ใน CarAppActivity ได้ ตัวอย่างเช่น ผู้ใช้จะเปิดแอปของคุณได้โดยตรงจากเบราว์เซอร์หรือเมื่อได้รับ URL ที่แชร์จากโทรศัพท์โดยใช้ Quick Share

เพิ่มตัวกรอง Intent ของ Deep Link

หากต้องการแจ้งให้ระบบปฏิบัติการทราบว่าแอปของคุณจัดการ Deep Link ได้ คุณจะต้องเพิ่มตัวกรอง Intent ที่เหมาะสมภายในองค์ประกอบ <activity> สำหรับ CarAppActivity ของแอป ดูคำแนะนำเพิ่มเติมได้ที่เพิ่มตัวกรอง Intent สำหรับลิงก์ขาเข้า

เราขอแนะนำให้รองรับ Deep Link ทั้งหมดที่แอปบนอุปกรณ์เคลื่อนที่รองรับ ซึ่งแอปในรถยนต์ของคุณรองรับได้อย่างสมเหตุสมผล เพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ดีที่สุด

หากต้องการจัดการ Intent แอปของคุณควรอ่านข้อมูลจาก Intent ขาเข้า ทั้งเมื่อมีการสร้าง Session ของแอปในรถยนต์ระหว่างonCreateScreen() และเมื่อได้รับ Intent ใหม่ระหว่าง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 OS

ชื่อแพ็กเกจ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

การแก้ปัญหา

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

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

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