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ę samochodu w systemie operacyjnym Android Automotive, potrzebujesz najnowszego hosta szablonów, który jest dostępny jako aplikacja systemowa.

Omówienie programowania

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

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

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

Tworzenie modułu motoryzacyjnego

Niektóre komponenty systemu operacyjnego Android Automotive, np. plik manifestu, mają wymagania typowe dla danej platformy. Utwórz moduł, który oddziela kody tych komponentów od innych kodów w projekcie, np. kodu używanego w aplikacji na telefon.

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

  1. W Android Studio kliknij File > New > New Module (Plik > Nowy > Nowy moduł).
  2. Wybierz Automotive Module (Moduł motoryzacyjny) i kliknij Next (Dalej).
  3. Podaj nazwę aplikacji/biblioteki. Taką nazwę zobaczą użytkownicy Twojej aplikacji w systemie operacyjnym Android Automotive.
  4. Wypełnij pole Nazwa modułu.
  5. Zmień wartość w polu Nazwa pakietu, aby pasowała do nazwy istniejącej aplikacji.
  6. Wybierz API 29: Android 10 (Q) jako Minimalny pakiet SDK i kliknij Dalej. Wszystkie samochody obsługujące bibliotekę aplikacji samochodowych w systemie operacyjnym Android Automotive działają na Androidzie 10 API na poziomie 29 lub wyższym, więc wybranie tej wartości powoduje kierowanie reklam na wszystkie zgodne samochody.

  7. Wybierz Dodaj brak aktywności, a następnie kliknij Zakończ.

Jeśli zaczynasz 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. Taką nazwę zobaczą użytkownicy Twojej aplikacji w systemie operacyjnym Android Automotive.
  5. Wypełnij pole Nazwa pakietu. Więcej informacji o wybieraniu nazwy pakietu znajdziesz w sekcji Nazwy pakietów.
  6. Wybierz API 29: Android 10 (Q) jako Minimalny pakiet SDK i kliknij Dalej.

    Wszystkie samochody obsługujące bibliotekę aplikacji samochodowych w systemie operacyjnym Android Automotive działają na Androidzie 10 API na poziomie 29 lub wyższym, więc wybranie tej wartości powoduje kierowanie reklam na wszystkie zgodne samochody.

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

<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 deklarujący obsługę systemu operacyjnego Android Automotive. Zwróć uwagę, że w pliku manifestu nie ma zadeklarowanych 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 hosta szablonów do działania. Wyraźne ustawienie pozostałych 4 elementów uses-feature na required="false" sprawia, że aplikacja nie koliduje z dostępnymi funkcjami sprzętowymi na urządzeniach z systemem operacyjnym Android Automotive.

Zaktualizuj zależności Gradle

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

Jeśli tworzysz aplikację do obsługi zarówno Androida Auto, jak i systemu operacyjnego Android Automotive, zalecamy umieścić CarAppService w osobnym module współużytkowanym przez moduły mobilne i samochodowe. Jeśli korzystasz z tego podejścia, musisz zaktualizować moduł motoryzacyjny, aby zawierał moduł udostępniony za pomocą zależności projektu Gradle, jak pokazano w tym fragmencie:

Odlotowy

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 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 funkcje motoryzacyjne obsługiwane przez Twoją 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ć następujące treści:

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

Deklarowanie CarAppService i CarAppActivity

Tak jak w przypadku Androida Auto, system operacyjny Android Automotive do uruchamiania Twojej aplikacji używa implementacji CarAppService. Instrukcje dotyczące wdrażania i deklarowania CarAppService znajdziesz w artykułach Tworzenie usługi CarAppService i Session oraz Deklarowanie CarAppService.

W przeciwieństwie do Androida Auto musisz dodać dodatkowy komponent aplikacji – CarAppActivity, który będzie punktem wejścia aplikacji systemu operacyjnego Android Automotive. Implementacja tego działania jest zawarta w artefakcie androidx.car.app:app-automotive i odpowiada za komunikację z aplikacją hostującą szablon w celu wyrenderowania interfejsu aplikacji. Powinieneś mieć w pliku manifestu tylko jedno wystąpienie tej aktywności, które musi być zadeklarowane 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 ma wartość true, ponieważ aktywność musi być uruchamiana przez inną aplikację (czyli program uruchamiający).
  • android:launchMode jest ustawiony na singleTask, więc użytkownik może wrócić do tego samego wystąpienia aktywności z programu uruchamiającego, jeśli przejdzie na inną stronę.
  • Ustawiono android:theme na @android:style/Theme.DeviceDefault.NoActionBar, aby aplikacja zajmowała całe dostępne miejsce na ekranie.
  • Filtr intencji wskazuje, że jest to działanie programu uruchamiającego dla aplikacji.
  • Występuje element <meta-data>, który wskazuje systemowi operacyjnemu, że aplikacji można używać, gdy obowiązują ograniczenia UX, np. gdy pojazd jest w ruchu.

W przypadku aplikacji umożliwiających nawigację jest kilka dodatkowych wymaganych wpisów w pliku manifestu elementu CarAppActivity, jak widać w tym fragmencie:

<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 aplikacja może pokazywać lokalizację użytkownika.
  • Filtr intencji androidx.car.app.action.NAVIGATE daje użytkownikom możliwość korzystania z Twojej aplikacji podczas obsługi niejawnej intencji nawigacji z innej aplikacji samochodowej.

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

Podczas tworzenia aplikacji na system operacyjny Android Automotive weź pod uwagę te kwestie:

Nazwy pakietów

Ponieważ rozpowszechniasz oddzielny pakiet Android Package Kit (APK) na system operacyjny Android Automotive, możesz użyć nazwy pakietu z aplikacji mobilnej lub utworzyć nową. Jeśli użyjesz innej nazwy pakietu, aplikacja ma 2 osobne informacje o niej w Sklepie Play. Jeśli ponownie użyjesz obecnej nazwy pakietu, aplikacja będzie miała jedną stronę na obu platformach.

Jest to głównie decyzja biznesowa. Jeśli na przykład masz jeden zespół, który pracuje nad aplikacją mobilną, a drugi nad Twoją aplikacją na system operacyjny Android Automotive, warto nadać im osobne nazwy pakietów i pozwolić każdemu zespołowi na zarządzanie własnymi informacjami o aplikacji w Sklepie Play. Nie ma znacznego wysiłku technicznego wymaganego przy zastosowaniu obu metod.

W tabeli poniżej znajdziesz podsumowanie niektórych kluczowych różnic między zachowywaniem obecnej nazwy pakietu a używaniem nowej nazwy pakietu:

Cecha Ta sama nazwa pakietu Nazwa nowego pakietu
Informacje o aplikacji Single Wiele
Instalacja lustrzana Tak: szybka instalacja aplikacji podczas konfiguracji w kreatorze konfiguracji Nie
Proces sprawdzania w Sklepie Play Blokowanie sprawdzania: jeśli sprawdzanie jednego pliku APK się nie powiedzie, pozostałe pliki APK przesłane w tej samej wersji zostaną zablokowane. Pojedyncze opinie
Statystyki, dane i wizytówki Łącznie: możesz filtrować według nazwy urządzenia, aby wyświetlić dane specyficzne dla branży motoryzacyjnej. Rozdziel
Indeksowanie i ranking wyszukiwania Popraw obecną pozycję Bez przenoszenia
Integracja z innymi aplikacjami Najczęściej nie są wymagane żadne zmiany, zakładając, że kod multimediów jest wspólny dla obu plików APK. Może być konieczna aktualizacja odpowiedniej aplikacji, na przykład aby umożliwić odtwarzanie identyfikatora URI za pomocą Asystenta Google

Treści offline

W razie potrzeby zaimplementuj obsługę offline w swojej aplikacji. Samochody z systemem operacyjnym Android Automotive powinny mieć własne połączenie danych, co oznacza, że abonament jest wliczony w cenę pojazdu lub opłacany przez użytkownika. Najczęściej samochody muszą jednak mieć bardziej zróżnicowaną łączność niż urządzenia mobilne.

Oto kilka kwestii, o których warto pamiętać, rozważając strategię wspierania offline:

  • Najlepiej jest pobierać treści, gdy aplikacja jest używana.
  • Nie zakładaj, że dostępna jest sieć Wi-Fi. Samochód nigdy nie znajdzie się w zasięgu Wi-Fi. Mogą też zostać wyłączone przez producenta oryginalnego sprzętu (OEM) na rzecz sieci komórkowej.
  • Inteligentne zapisywanie w pamięci podręcznej treści, których oczekujesz od użytkowników, jest dopuszczalne, ale zalecamy pozwolić im zmienić to zachowanie.
  • Miejsce na dysku w samochodach ma różne miejsce, więc daj użytkownikom możliwość usuwania treści offline.

Najczęstsze pytania

Poniżej znajdziesz odpowiedzi na najczęstsze pytania o system operacyjny Android Automotive.

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

Nie ma żadnych wytycznych dotyczących korzystania z bibliotek i pakietów SDK innych firm. Jeśli zdecydujesz się korzystać z pakietów SDK i bibliotek innych firm, nadal musisz spełniać wszystkie wymagania dotyczące jakości aplikacji samochodowych.

Jak opublikować aplikację na system operacyjny Android Automotive przy użyciu Konsoli Google Play?

Proces publikowania aplikacji jest podobny do publikowania aplikacji na telefon, ale używasz innego formatu. Aby włączyć w aplikacji typ wersji systemu operacyjnego Android Automotive, wykonaj te czynności:

  1. Otwórz Konsolę Play.
  2. Wybierz swoją aplikację.
  3. W menu po lewej stronie wybierz Wersja > Konfiguracja > Ustawienia zaawansowane > Format.
  4. Kliknij Dodaj format > System operacyjny Android Automotive, a potem postępuj zgodnie z instrukcjami w Konsoli Play.

Rozwiązywanie problemów

Poniżej znajdziesz rozwiązania typowych problemów z systemem operacyjnym Android Automotive.

  • Nawet po odinstalowaniu aplikacji Car App Library z poziomu ustawień systemowych pojawia się komunikat o błędzie podczas próby zainstalowania nowej wersji.

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