Dodaj obsługę systemu operacyjnego Android Automotive do swojej aplikacji na podstawie szablonu

System operacyjny Android Automotive umożliwia użytkownikom instalowanie aplikacji w samochodzie. Aby dotrzeć do użytkowników tej platformy, musisz rozpowszechniać aplikację zoptymalizowaną pod kątem kierowcy, zgodną z systemem operacyjnym Android Automotive. Możesz ponownie wykorzystać prawie cały kod i zasoby w aplikacji Android Auto, ale musisz utworzyć oddzielną kompilację, która spełnia wymagania opisane na tej stronie.

Aby uruchomić aplikację samochodową w systemie operacyjnym Android Automotive, musisz mieć najnowszą wersję komponentu Templates Host, który jest aplikacją systemową.

Omówienie procesu tworzenia

Dodanie obsługi systemu operacyjnego Android Automotive wymaga wykonania kilku czynności opisanych w odpowiednich sekcjach na tej stronie:

  1. Tworzenie modułu samochodowego
  2. Deklarowanie obsługi systemu operacyjnego Android Automotive
  3. Deklarowanie CarAppService i CarAppActivity
  4. Aktualizowanie zależności Gradle

Użyj wersji Android Studio Bumblebee lub nowszej, aby mieć pewność, że wszystkie funkcje systemu operacyjnego Automotive są włączone.

Tworzenie modułu samochodowego

Niektóre komponenty systemu operacyjnego Android Automotive, takie jak plik manifestu, mają wymagania specyficzne dla platformy. Utwórz moduł, który pozwoli oddzielić kod tych komponentów od innego kodu w projekcie, np. kodu używanego w aplikacji na telefon.

Aby dodać moduł samochodowy do istniejącego projektu, wykonaj te czynności:

  1. W Android Studio kliknij Plik > Nowy > Nowy moduł.
  2. Kliknij kolejno Moduł motoryzacyjnyDalej.
  3. Podaj nazwę aplikacji lub biblioteki. To nazwa, którą użytkownicy widzą w aplikacji w systemie operacyjnym Android Automotive.
  4. Wpisz nazwę modułu.
  5. Zmień nazwę pakietu tak, aby była zgodna z nazwą Twojej dotychczasowej aplikacji.
  6. W sekcji Minimalna wersja pakietu SDK wybierz API 29: Android 10 (Q), a potem kliknij Dalej. Wszystkie samochody, które obsługują bibliotekę aplikacji samochodowych w systemie operacyjnym Android Automotive, działają na Androidzie 10 na poziomie interfejsu API 29 lub nowszym, więc wybranie tej wartości spowoduje ukierunkowanie na wszystkie zgodne samochody.

  7. Kliknij Dodaj brak aktywności, a potem Zakończ.

Jeśli rozpoczynasz nowy projekt:

  1. W Android Studio kliknij Plik > Nowy > Nowy projekt.
  2. W polu Typ projektu wybierz Motoryzacja.
  3. Wybierz Brak aktywności i kliknij Dalej.
  4. Podaj nazwę projektu. Jest to nazwa, którą użytkownicy widzą w Twojej aplikacji w systemie operacyjnym Android Automotive.
  5. Wpisz nazwę pakietu. Więcej informacji o wybieraniu nazwy pakietu znajdziesz w sekcji Nazwy pakietów.
  6. W sekcji Minimalna wersja pakietu SDK wybierz API 29: Android 10 (Q), a potem kliknij Dalej.

    Wszystkie samochody, które obsługują bibliotekę aplikacji samochodowych w systemie operacyjnym Android Automotive, działają na Androidzie 10 na poziomie interfejsu API 29 lub nowszym, więc wybranie tej wartości spowoduje ukierunkowanie na wszystkie zgodne samochody.

Po utworzeniu modułu w Android Studio otwórz plik AndroidManifest.xml w nowym module samochodowym:

<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>

Element application zawiera standardowe informacje o aplikacji oraz element uses-feature, który deklaruje obsługę systemu operacyjnego Android Automotive. Pamiętaj, że w pliku manifestu nie ma deklarowanych aktywności.

Następnie dodaj do pliku manifestu te elementy uses-feature:

<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>

Pierwszy element uses-feature deklaruje, że aplikacja korzysta z usługi hosta szablonów. Wyraźne ustawienie pozostałych 4 elementów uses-feature na required="false" zapewnia, że aplikacja nie będzie wchodzić w konflikt z dostępnymi funkcjami sprzętowymi na urządzeniach z systemem operacyjnym Android Automotive.

Aktualizowanie zależności Gradle

W module samochodowym musisz dodać zależność od artefaktu androidx.car.app:app-automotive, który zawiera implementację CarAppActivity wymaganą do działania aplikacji w systemie operacyjnym Android Automotive.

Jeśli aplikacja ma obsługiwać zarówno Androida Auto, jak i system operacyjny Android Automotive, zalecamy przechowywanie CarAppService w oddzielnym module, który będzie używany zarówno w przypadku modułu mobilnego, jak i samochodowego. Jeśli używasz tego podejścia, musisz zaktualizować moduł samochodowy, aby uwzględniał moduł współdzielony za pomocą zależności projektu w Gradle, jak pokazano w tym fragmencie kodu:

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"))
    }
}

Deklarowanie obsługi systemu operacyjnego Android Automotive

Aby zadeklarować, że aplikacja obsługuje system operacyjny Android Automotive, użyj tego wpisu w pliku manifestu:

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

Ten wpis w pliku manifestu odnosi się do pliku XML, który deklaruje funkcje samochodowe obsługiwane przez aplikację.

Aby wskazać, że masz aplikację z biblioteki aplikacji samochodowych, dodaj plik XML o nazwie automotive_app_desc.xml do katalogu res/xml/ w module systemu operacyjnego Android Automotive. Ten plik powinien zawierać te informacje:

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

Zadeklaruj CarAppService i CarAppActivity

Podobnie jak w przypadku Androida Auto, system operacyjny Android Automotive używa implementacji CarAppService do uruchamiania aplikacji. Aby dowiedzieć się, jak zaimplementować i zadeklarować CarAppService, zapoznaj się z artykułami Tworzenie usługi CarAppService i sesji oraz Deklarowanie usługi CarAppService.

W przeciwieństwie do Androida Auto musisz uwzględnić dodatkowy komponent aplikacji, CarAppActivity, który będzie punktem wejścia aplikacji na system operacyjny Android Automotive. Implementacja tego działania jest zawarta w artefakcie androidx.car.app:app-automotive i odpowiada za komunikację z aplikacją hosta szablonów w celu renderowania interfejsu użytkownika aplikacji. W pliku manifestu powinna być tylko jedna instancja tego działania, która musi być zadeklarowana w ten sposób:

<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 jest ustawiony na pełną nazwę klasy CarAppActivity z artefaktu app-automotive.
  • Wartość android:exported to true, ponieważ aktywność musi być uruchamiana przez aplikację inną niż ona sama (czyli przez program uruchamiający).
  • android:launchMode ma wartość singleTask, więc użytkownik może wrócić do tej samej instancji aktywności z poziomu programu uruchamiającego, jeśli z niej wyjdzie.
  • android:theme ma wartość @android:style/Theme.DeviceDefault.NoActionBar, dzięki czemu aplikacja zajmuje cały dostępny obszar ekranu.
  • Filtr intencji wskazuje, że jest to aktywność menu aplikacji.
  • Element <meta-data> informuje system operacyjny, że aplikacja może być używana, gdy obowiązują ograniczenia dotyczące UX, np. gdy pojazd jest w ruchu.

W przypadku aplikacji do nawigacji jest kilka dodatkowych wymaganych wpisów w pliku manifestu CarAppActivity, jak pokazano w tym fragmencie kodu:

<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>
  • Dodatkowa kategoria android.intent.category.APP_MAPS informuje system, że Twoja aplikacja może wyświetlać lokalizację użytkownika.
  • Filtr intencji androidx.car.app.action.NAVIGATE zapewnia, że użytkownicy mają możliwość korzystania z Twojej aplikacji podczas obsługi ukrytej intencji nawigacji z innej aplikacji samochodowej.

Inne rzeczy, które warto wziąć pod uwagę

Podczas tworzenia aplikacji na Androida Automotive weź pod uwagę te kwestie:

nazwy pakietów,

Ponieważ dystrybuujesz osobny pakiet Android Application Package Kit (APK) dla systemu operacyjnego Android Automotive, możesz ponownie użyć nazwy pakietu z aplikacji mobilnej lub utworzyć nową nazwę pakietu. Jeśli używasz innej nazwy pakietu, Twoja aplikacja ma 2 osobne strony w Google Play. Jeśli ponownie użyjesz obecnej nazwy pakietu, Twoja aplikacja będzie mieć jedną stronę na obu platformach.

Jest to przede wszystkim decyzja biznesowa. Jeśli na przykład jeden zespół pracuje nad aplikacją mobilną, a inny nad aplikacją na system Android Automotive, warto użyć oddzielnych nazw pakietów i zezwolić każdemu zespołowi na zarządzanie własną stroną w Sklepie Play. Nie ma dużej różnicy w nakładzie pracy technicznej wymaganej do zastosowania obu tych metod.

W tej tabeli zestawiono inne kluczowe różnice między zachowaniem obecnej nazwy pakietu a użyciem nowej nazwy pakietu:

Funkcja ta sama nazwa pakietu, Nazwa nowego pakietu
Informacje o aplikacji Pojedynczy Wiele
Instalacja lustrzana Tak: szybkie ponowne instalowanie aplikacji podczas konfiguracji Nie
Proces sprawdzania w Sklepie Play Blokowanie weryfikacji: jeśli weryfikacja jednego pliku APK zakończy się niepowodzeniem, inne pliki APK przesłane w ramach tej samej wersji zostaną zablokowane. Indywidualne opinie
Statystyki, dane i wskaźniki W połączeniu: możesz filtrować według nazwy urządzenia, aby uzyskać dane dotyczące pojazdów. Rozdziel
Indeksowanie i ranking wyszukiwania Budowanie na podstawie obecnej pozycji Brak przeniesienia
Integracja z innymi aplikacjami Najprawdopodobniej nie trzeba wprowadzać żadnych zmian, o ile kod multimediów jest wspólny dla obu plików APK. Może być konieczne zaktualizowanie odpowiedniej aplikacji, na przykład w przypadku odtwarzania URI za pomocą Asystenta Google

Treści offline

W stosownych przypadkach wprowadź w aplikacji obsługę trybu offline. Samochody z systemem Android Automotive powinny mieć własne połączenie z internetem, co oznacza, że abonament danych jest uwzględniony w cenie pojazdu lub płatny przez użytkownika. Samochody mają jednak zapewniać bardziej zmienną łączność niż urządzenia mobilne.

Oto kilka kwestii, o których warto pamiętać, gdy rozważasz strategię pomocy offline:

  • Najlepszym momentem na pobranie treści jest czas, gdy aplikacja jest używana.
  • Nie zakładaj, że sieć Wi-Fi jest dostępna. Samochód może nigdy nie znaleźć się w zasięgu sieci Wi-Fi, a producent oryginalnego sprzętu (OEM) może wyłączyć Wi-Fi na rzecz sieci komórkowej.
  • Chociaż możesz inteligentnie przechowywać w pamięci podręcznej treści, z których użytkownicy będą korzystać, zalecamy, aby użytkownik mógł zmienić to zachowanie.
  • Miejsce na dysku w samochodach jest różne, dlatego daj użytkownikom możliwość usuwania treści offline.

Najczęstsze pytania

W następnych sekcjach znajdziesz odpowiedzi na niektóre z najczęstszych pytań dotyczących systemu operacyjnego Android Automotive.

Czy istnieją jakieś ograniczenia lub zalecenia dotyczące używania zewnętrznych pakietów SDK i bibliotek?

Nie ma żadnych konkretnych wytycznych dotyczących używania pakietów SDK i bibliotek innych firm. Jeśli zdecydujesz się używać pakietów SDK i bibliotek innych firm, nadal będziesz odpowiadać za zgodność z wymaganiami dotyczącymi jakości aplikacji samochodowych.

Jak opublikować aplikację na system operacyjny Android Automotive za pomocą Konsoli Google Play?

Szczegółowe informacje o publikowaniu aplikacji na system operacyjny Android Automotive za pomocą Konsoli Play znajdziesz w artykule Rozpowszechnianie aplikacji na samochody.

Rozwiązywanie problemów

Poniżej znajdziesz wskazówki dotyczące rozwiązywania typowych problemów w systemie operacyjnym Android Automotive.

  • Nawet po odinstalowaniu aplikacji z biblioteki aplikacji samochodowych z ustawień systemu podczas próby zainstalowania nowej wersji pojawia się błąd.

    Aby mieć pewność, że aplikacja została odinstalowana, użyj polecenia adb uninstall app.package.name.