Android Automotive OS อนุญาตให้ผู้ใช้ติดตั้งแอปในรถยนต์ คุณต้องเผยแพร่แอปที่เพิ่มประสิทธิภาพให้ผู้ขับขี่ และเข้ากันได้กับ Android Automotive OS เพื่อเข้าถึงผู้ใช้ในแพลตฟอร์มนี้ คุณสามารถนําโค้ดและทรัพยากรเกือบทั้งหมดมาใช้ในแอป Android Auto ได้ แต่จะต้องสร้างบิลด์แยกต่างหากที่เป็นไปตามข้อกําหนดที่อธิบายไว้ในหน้านี้
หากต้องการเรียกใช้แอปรถยนต์ใน Android Automotive OS คุณต้องมีโฮสต์เทมเพลตเวอร์ชันล่าสุด ซึ่งมาในรูปแบบแอประบบ
ภาพรวมการพัฒนา
การเพิ่มการรองรับ Android Automotive OS นั้นทำได้ง่ายเพียงไม่กี่ขั้นตอนตามที่อธิบายไว้ในส่วนต่างๆ ของหน้านี้
- สร้างโมดูลยานยนต์
- ประกาศการรองรับ Android Automotive OS
- ประกาศ
CarAppService
และCarAppActivity
- อัปเดต Dependency ของ Gradle
ใช้ Android Studio Bumblebee ขึ้นไปเพื่อให้แน่ใจว่าเปิดใช้ฟีเจอร์ทั้งหมดของ Automotive OS แล้ว
สร้างโมดูลยานยนต์
คอมโพเนนต์บางอย่างของ Android Automotive OS เช่น ไฟล์ Manifest มีข้อกำหนดเฉพาะแพลตฟอร์ม สร้างโมดูลที่สามารถแยกโค้ดของคอมโพเนนต์เหล่านี้ออกจากโค้ดอื่นๆ ในโปรเจ็กต์ เช่น โค้ดที่ใช้สำหรับแอปโทรศัพท์
สำหรับโปรเจ็กต์ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มโมดูลยานยนต์ลงในโปรเจ็กต์
- ใน Android Studio ให้คลิกไฟล์ > ใหม่ > โมดูลใหม่
- เลือกโมดูลยานยนต์ แล้วคลิกถัดไป
- ระบุชื่อแอปพลิเคชัน/คลัง ซึ่งเป็นชื่อที่ผู้ใช้จะเห็นสำหรับแอปของคุณใน Android Automotive OS
- ป้อนชื่อข้อบังคับ
- แก้ไขชื่อแพ็กเกจให้ตรงกับแอปที่มีอยู่
เลือก API 29: Android 10 (Q) สำหรับ SDK ขั้นต่ำ แล้วคลิกถัดไป รถยนต์ทุกรุ่นที่รองรับไลบรารีแอปสำหรับรถยนต์ใน Android Automotive OS จะใช้ Android 10 API ระดับ 29 ขึ้นไป ดังนั้นการเลือกค่านี้จะกำหนดเป้าหมายไปยังรถยนต์ที่เข้ากันได้ทั้งหมด
เลือกเพิ่มไม่มีกิจกรรม แล้วคลิกเสร็จสิ้น
หากคุณกำลังเริ่มโปรเจ็กต์ใหม่ ให้ทำดังนี้
- ใน Android Studio ให้คลิกไฟล์ > ใหม่ > โปรเจ็กต์ใหม่
- เลือกยานยนต์สำหรับประเภทโปรเจ็กต์
- เลือกไม่มีกิจกรรม แล้วคลิกถัดไป
- ระบุชื่อโปรเจ็กต์ นี่คือชื่อที่ผู้ใช้จะเห็นสำหรับแอปของคุณใน Android Automotive OS
- ป้อนชื่อแพ็กเกจ ดูรายละเอียดเพิ่มเติมเกี่ยวกับการเลือกชื่อแพ็กเกจได้ในส่วนชื่อแพ็กเกจ
เลือก 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 เพื่อระบุว่าต้องใช้โฮสต์เทมเพลตเพื่อให้ทำงานได้อย่างถูกต้อง
<application ...>
...
<uses-feature
android:name="android.software.car.templates_host"
android:required="true" />
</application>
นอกจากนี้ หากแอปของคุณมีประกาศฟีเจอร์อย่างชัดเจนที่มี android:required="true"
หรือข้อกำหนดฟีเจอร์โดยนัยสำหรับฟีเจอร์ต่อไปนี้ คุณต้องอัปเดตหรือนำประกาศหรือข้อกำหนดดังกล่าวออกเพื่อให้ข้อกำหนดฟีเจอร์ของแอปไม่ขัดขวางการเผยแพร่แอปไปยังยานพาหนะที่ใช้งานร่วมกันได้
android.hardware.wifi
android.hardware.screen.portrait
android.hardware.screen.landscape
android.hardware.camera
หากมีการประกาศฟีเจอร์อย่างชัดเจนในไฟล์ Manifest คุณจะทำดังนี้ได้
- การลบองค์ประกอบ
<uses-feature>
หากฟีเจอร์นั้นไม่จำเป็นโดยนัย - การประกาศฟีเจอร์อย่างชัดแจ้งด้วย
android:required="false"
หากจำเป็นต้องใช้ฟีเจอร์โดยนัย คุณจะทำอย่างใดอย่างหนึ่งต่อไปนี้ได้
- การประกาศฟีเจอร์อย่างชัดแจ้งด้วย
android:required="false"
- นำค่าอื่นๆ ในไฟล์ Manifest ออกหรืออัปเดตค่าที่ต้องใช้ฟีเจอร์ดังกล่าวโดยนัย
การเปลี่ยนแปลงการประกาศฟีเจอร์ในไฟล์ Manifest จะไม่ส่งผลต่อการทำงานจริงของแอป ดังนั้นโปรดตรวจสอบว่าแอปยังคงทำงานได้อย่างถูกต้องแม้ไม่มีฟีเจอร์เหล่านี้
อัปเดต 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
เพื่อให้ผู้ใช้กลับไปยังอินสแตนซ์เดียวกันของกิจกรรมจาก Launcher ได้หากออกจากกิจกรรม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