เพิ่มการรองรับ 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 ให้คลิกไฟล์ > ใหม่ > โมดูลใหม่
  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 ...>
  ...
  <uses-feature
      android:name="android.software.car.templates_host"
      android:required="true" />
  ...
</manifest>

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

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

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

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

คุณต้องรวมคอมโพเนนต์ของแอปพลิเคชันเพิ่มเติม ซึ่งก็คือ 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 เพื่อให้ผู้ใช้กลับไปยังอินสแตนซ์เดียวกันของกิจกรรมจากตัวเรียกใช้ได้หากออกจากกิจกรรม
  • android:theme ตั้งค่าเป็น @android:style/Theme.DeviceDefault.NoActionBar เพื่อให้แอปใช้พื้นที่หน้าจอทั้งหมดที่พร้อมใช้งาน
  • ตัวกรอง Intent บ่งบอกว่านี่คือกิจกรรมตัวเรียกใช้สำหรับแอป
  • มีองค์ประกอบ <meta-data> ที่บ่งบอกให้ระบบปฏิบัติการทราบว่าสามารถใช้แอปได้ ในขณะที่มีข้อจำกัดด้าน UX เช่น เมื่อยานพาหนะกำลังเคลื่อนที่

สำหรับแอปนำทาง จะมีรายการไฟล์ Manifest ที่จำเป็นเพิ่มเติม สำหรับ 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 การนำทางโดยนัยจากแอปในรถยนต์อื่น

คุณสามารถเพิ่มการรองรับ Deep Link ลงใน CarAppActivity เพื่อปรับปรุงประสบการณ์การใช้งานแอปที่ใช้เทมเพลตในอุปกรณ์ Android Automotive OS เช่น การดำเนินการนี้จะช่วยให้ผู้ใช้เปิดแอปได้โดยตรงจากเบราว์เซอร์หรือเมื่อ ได้รับ 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 Package Kit (APK) แยกต่างหากสำหรับ Android Automotive OS คุณจึงใช้ชื่อแพ็กเกจจากแอปบนอุปกรณ์เคลื่อนที่ซ้ำหรือสร้างชื่อแพ็กเกจใหม่ได้ หากใช้ชื่อแพ็กเกจอื่น แอปของคุณจะมีข้อมูลสินค้าใน Play Store แยกกัน 2 รายการ หากใช้ชื่อแพ็กเกจปัจจุบันซ้ำ แอปของคุณจะมีข้อมูลสินค้าเพียงรายการเดียวในทั้ง 2 แพลตฟอร์ม

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

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

ฟีเจอร์ ชื่อแพ็กเกจเดียวกัน ชื่อแพ็กเกจใหม่
ข้อมูลสินค้าใน Store รายการเดียว หลายรายการ
การติดตั้งแบบมิเรอร์ ใช่: ติดตั้งแอปใหม่ได้อย่างรวดเร็วระหว่างวิซาร์ดการตั้งค่า ไม่
กระบวนการตรวจสอบของ Play Store การบล็อกรีวิว: หากรีวิวไม่ผ่านสำหรับ APK รายการหนึ่ง ระบบจะบล็อก APK อื่นๆ ที่ส่งในรุ่นเดียวกัน รีวิวแต่ละรายการ
สถิติ เมตริก และข้อมูลสำคัญ รวมกัน: คุณสามารถกรองตามชื่ออุปกรณ์เพื่อดูข้อมูลเฉพาะของยานยนต์ ข้อมูล แยกกัน
การจัดทำดัชนีและการจัดอันดับการค้นหา อิงตามสถานะปัจจุบัน ไม่มีการโอน
การผสานรวมกับแอปอื่นๆ ไม่จำเป็นต้องเปลี่ยนแปลงใดๆ ในกรณีส่วนใหญ่ โดยถือว่ามีการแชร์โค้ดสื่อระหว่าง 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 ได้ที่หัวข้อต่อไปนี้

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

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