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, potrzebujesz najnowszej wersji składnika Templates Host, który jest aplikacją systemową.

Omówienie procesu tworzenia

Dodanie obsługi systemu operacyjnego Android Automotive wymaga tylko kilku kroków opisanych w sekcjach na tej stronie:

  1. Utwórz moduł motoryzacyjny
  2. Zadeklaruj obsługę systemu operacyjnego Android Automotive
  3. Zadeklaruj CarAppService i CarAppActivity
  4. Zaktualizuj zależności Gradle

Aby mieć pewność, że wszystkie funkcje systemu operacyjnego Automotive są włączone, użyj Android Studio Bumblebee lub nowszego.

Utwórz moduł motoryzacyjny

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

Aby dodać moduł motoryzacyjny do istniejącego projektu:

  1. W Android Studio kliknij File > New > New Module (Plik > Nowy > Nowy moduł).
  2. Kliknij kolejno Automotive Module (Moduł motoryzacyjny) i Next (Dalej).
  3. Podaj Application/Library name (Nazwę aplikacji/biblioteki). Jest to nazwa, którą użytkownicy widzą w przypadku Twojej aplikacji w systemie operacyjnym Android Automotive.
  4. Wpisz Module name (Nazwę modułu).
  5. Edytuj Package name (Nazwę pakietu), aby pasowała do nazwy istniejącej aplikacji.
  6. W polu Minimum SDK (Minimalny pakiet SDK) wybierz API 29: Android 10 (Q) (API 29: Android 10 (Q)), a potem kliknij Next (Dalej). Wszystkie samochody, które obsługują bibliotekę aplikacji samochodowych w systemie operacyjnym Android Automotive, działają na Androidzie 10 (API na poziomie 29) lub nowszym, więc wybranie tej wartości spowoduje kierowanie aplikacji na wszystkie zgodne samochody.

  7. Kliknij kolejno Add No Activity (Nie dodawaj aktywności) i Finish (Zakończ).

Jeśli zaczynasz nowy projekt:

  1. W Android Studio kliknij File > New > New Project (Plik > Nowy > Nowy projekt).
  2. W polu Project Type (Typ projektu) wybierz Automotive (Motoryzacja).
  3. Kliknij kolejno No Activity (Brak aktywności) i Next (Dalej).
  4. Podaj Name (Nazwę) projektu. Jest to nazwa, którą użytkownicy widzą w przypadku Twojej aplikacji w systemie operacyjnym Android Automotive.
  5. Wpisz Package name (Nazwę pakietu). Więcej informacji o wyborze nazwy pakietu znajdziesz w sekcji Nazwy pakietów.
  6. W polu Minimum SDK (Minimalny pakiet SDK) wybierz API 29: Android 10 (Q) (API 29: Android 10 (Q)), a potem kliknij Next (Dalej).

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

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

<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 zadeklarowanych żadnych aktywności.

Deklarowanie wymagań dotyczących funkcji

Następnie dodaj do pliku manifestu ten element uses-feature, aby wskazać, że do prawidłowego działania aplikacja wymaga hosta szablonów:

<manifest ...>
  ...
  <uses-feature
      android:name="android.software.car.templates_host"
      android:required="true" />
  ...
</manifest>

Upewnij się też, że Twoja aplikacja spełnia wymagania dotyczące funkcji w Google Play, które obowiązują wszystkie aplikacje tworzone na system operacyjny Android Automotive.

Zaktualizuj zależności Gradle

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

Jeśli tworzysz aplikację, która ma obsługiwać zarówno Androida Auto, jak i system operacyjny Android Automotive, zalecamy umieszczenie CarAppService w osobnym module, który będzie współdzielony przez moduły mobilne i motoryzacyjne. Jeśli korzystasz z tego podejścia, musisz zaktualizować moduł motoryzacyjny, aby zawierał moduł współdzielony, używając zależności projektu Gradle, jak pokazano w tym fragmencie kodu:

Dynamiczny

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

Zadeklaruj obsługę systemu operacyjnego Android Automotive

Aby zadeklarować, że Twoja 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 możliwości motoryzacyjne obsługiwane przez Twoją aplikację.

Aby wskazać, że masz aplikację korzystającą 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 treści:

<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. Instrukcje dotyczące implementowania i deklarowania CarAppService znajdziesz w artykułach Tworzenie CarAppService i sesji oraz Deklarowanie CarAppService.

W przeciwieństwie do Androida Auto musisz dodać dodatkowy komponent aplikacji, CarAppActivity, który będzie służył jako punkt wejścia do aplikacji na system operacyjny Android Automotive. Implementacja tej aktywności jest zawarta w artefakcie androidx.car.app:app-automotive i odpowiada za komunikację z aplikacją hosta szablonów w celu renderowania interfejsu aplikacji. W pliku manifestu powinna znajdować się tylko jedna instancja tej aktywności, 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 ustawiona na pełną i jednoznaczną nazwę klasy CarAppActivity z artefaktu app-automotive.
  • android:exported jest ustawiona na true, ponieważ aktywność musi być uruchamiana przez inną aplikację (czyli program uruchamiający).
  • android:launchMode jest ustawiona na singleTask, aby użytkownik mógł wrócić do tej samej instancji aktywności z programu uruchamiającego, jeśli z niej wyjdzie.
  • android:theme jest ustawiona na @android:style/Theme.DeviceDefault.NoActionBar, aby aplikacja zajmowała całą dostępną przestrzeń ekranu.
  • Filtr intencji wskazuje, że jest to aktywność programu uruchamiającego dla aplikacji.
  • Jest element <meta-data>, który informuje system operacyjny, że aplikacja może być używana, gdy obowiązują ograniczenia dotyczące interfejsu, np. gdy pojazd jest w ruchu.

W przypadku aplikacji do nawigacji wymagane są jeszcze dodatkowe wpisy w pliku manifestu dla 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 android.intent.category.APP_MAPS kategoria 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 niejawnej intencji nawigacji z innej aplikacji samochodowej.

Aby poprawić komfort korzystania z aplikacji opartej na szablonach na urządzeniach z systemem operacyjnym Android Automotive, możesz dodać obsługę precyzyjnych linków do CarAppActivity. Dzięki temu użytkownicy mogą np. otwierać Twoją aplikację bezpośrednio z przeglądarki lub po otrzymaniu adresu URL udostępnionego z telefonu za pomocą funkcji Szybkie udostępnianie.

Dodawanie filtrów intencji precyzyjnych linków

Aby poinformować system operacyjny, że Twoja aplikacja może obsługiwać precyzyjne linki, musisz dodać odpowiednie filtry intencji w elemencie <activity> dla CarAppActivity aplikacji. Dodatkowe wskazówki znajdziesz w artykule Dodawanie filtrów intencji dla linków przychodzących.

Aby zapewnić użytkownikom jak najlepsze wrażenia, zalecamy obsługę wszystkich precyzyjnych linków obsługiwanych przez aplikację mobilną, które mogą być rozsądnie obsługiwane przez aplikację samochodową.

Aby obsługiwać intencje, aplikacja powinna odczytywać dane z intencji przychodzących zarówno podczas tworzenia Session aplikacji samochodowej w onCreateScreen(), jak i wtedy, gdy otrzyma nową intencję w 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
    }
}

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

Podczas tworzenia aplikacji na system operacyjny Android Automotive pamiętaj o tych kwestiach:

Nazwy pakietów

Ponieważ rozpowszechniasz osobny pakiet aplikacji na Androida (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 Sklepie Play. Jeśli ponownie użyjesz bieżącej nazwy pakietu, Twoja aplikacja będzie miała jedną stronę na obu platformach.

Jest to przede wszystkim decyzja biznesowa. Jeśli na przykład masz jeden zespół pracujący nad aplikacją mobilną, a drugi nad aplikacją na system operacyjny Android Automotive, warto użyć osobnych nazw pakietów i pozwolić każdemu zespołowi zarządzać własną stroną w Sklepie Play. Wymagania techniczne w przypadku obu podejść nie różnią się znacząco.

W poniższej tabeli zestawiono inne najważniejsze różnice między zachowaniem bieżącej nazwy pakietu a użyciem nowej nazwy pakietu:

Funkcja Ta sama nazwa pakietu Nowa nazwa pakietu
Informacje o aplikacji Pojedyncza Wiele
Dublowana instalacja Tak: szybka ponowna instalacja aplikacji podczas działania kreatora konfiguracji Nie
Proces sprawdzania w Sklepie Play Blokowanie opinii: jeśli opinia nie przejdzie weryfikacji w przypadku jednego pliku APK, inne pliki APK przesłane w tej samej wersji są blokowane Indywidualne opinie
Statystyki, dane i najważniejsze informacje Łączne: możesz filtrować według nazwy urządzenia, aby uzyskać dane dotyczące motoryzacji danych. Podziel
Indeksowanie i ranking w wyszukiwarce Budowanie na podstawie bieżącej pozycji Brak przenoszenia
Integracja z innymi aplikacjami Najprawdopodobniej nie trzeba wprowadzać żadnych zmian, jeśli kod multimediów jest współdzielony przez oba pliki APK Może być konieczne zaktualizowanie odpowiedniej aplikacji, np. w przypadku odtwarzania URI za pomocą Asystenta Google

Treść offline

W razie potrzeby zaimplementuj w aplikacji obsługę trybu offline. Samochody z systemem operacyjnym Android Automotive powinny mieć własne połączenie z internetem, co oznacza, że pakiet danych jest wliczony w cenę pojazdu lub opłacany przez użytkownika. Oczekuje się jednak, że samochody będą miały bardziej zmienne połączenie niż urządzenia mobilne.

Oto kilka kwestii, o których warto pamiętać podczas planowania strategii obsługi trybu offline:

  • Najlepszy czas na pobieranie treści to czas, gdy aplikacja jest używana.
  • Nie zakładaj, że Wi-Fi jest dostępne. Samochód może nigdy nie znaleźć się w zasięgu Wi-Fi lub producent oryginalnego sprzętu (OEM) mógł wyłączyć Wi-Fi na rzecz sieci komórkowej.
  • Chociaż można inteligentnie buforować treści, których użytkownicy będą prawdopodobnie używać, zalecamy, aby użytkownik mógł zmienić to zachowanie.
  • Ilość miejsca na dysku w samochodach jest różna, dlatego daj użytkownikom możliwość usuwania treści offline.

Najczęstsze pytania

W odpowiedzi na niektóre najczęstsze pytania dotyczące systemu operacyjnego Android Automotive zapoznaj się z tymi sekcjami.

Czy istnieją jakieś ograniczenia lub zalecenia dotyczące korzystania z bibliotek i pakietów SDK innych firm?

Nie ma konkretnych wytycznych dotyczących korzystania z bibliotek i pakietów SDK innych firm. Jeśli zdecydujesz się na korzystanie z bibliotek i pakietów SDK innych firm, nadal musisz przestrzegać wszystkich wymagań dotyczących jakości aplikacji samochodowych.

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

Szczegółowe informacje o tym, jak opublikować aplikację na system operacyjny Android Automotive za pomocą Konsoli Google Play, znajdziesz w artykule Rozpowszechnianie aplikacji na samochody.

Rozwiązywanie problemów

Poniżej znajdziesz pomoc w rozwiązywaniu typowych problemów w systemie operacyjnym Android Automotive.

  • Nawet po odinstalowaniu aplikacji korzystającej z biblioteki aplikacji samochodowych w ustawieniach 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.