Şablonlu uygulamanıza Android Automotive OS için destek ekleyin

Android Automotive OS, kullanıcıların arabaya uygulama yüklemesine olanak tanır. Bu platformda kullanıcılara ulaşabilmek için Android Automotive OS ile uyumlu ve sürücüye göre optimize edilmiş uygulamalar dağıtmanız gerekir. Android Auto uygulamanızda hemen hemen tüm kod ve kaynakları yeniden kullanabilirsiniz. Ancak bu sayfada açıklanan şartları karşılayan ayrı bir derleme oluşturmanız gerekir.

Araba uygulamanızı Android Automotive OS'te çalıştırmak için sistem uygulaması olarak gelen en yeni Templates Host'a ihtiyacınız vardır.

Geliştirmeye genel bakış

Android Automotive OS desteği eklemek için bu sayfadaki bölümlerde açıklandığı gibi yalnızca birkaç adım gerekir:

  1. Otomotiv modülü oluşturma
  2. Android Automotive OS desteğini beyan etme
  3. CarAppService ve CarAppActivity tanımlayın
  4. Gradle bağımlılıklarınızı güncelleyin

Tüm Automotive OS özelliklerinin etkinleştirildiğinden emin olmak için Android Studio Bumblebee veya daha yeni bir sürümü kullanın.

Otomotiv modülü oluşturma

Android Automotive OS'in bazı bileşenleri (ör. manifest) platforma özel şartlara tabidir. Bu bileşenlerin kodunu projenizdeki diğer kodlardan (ör. telefon uygulamanız için kullanılan kod) ayrı tutabilecek bir modül oluşturun.

Mevcut bir projeye otomotiv modülü eklemek için aşağıdaki adımları uygulayın:

  1. Android Studio'da File > New > New Module'u (Dosya > Yeni > Yeni Modül) tıklayın.
  2. Otomotiv Modülü'nü seçin ve Sonraki'yi tıklayın.
  3. Uygulama/Kitaplık adı girin. Bu, kullanıcıların Android Automotive OS'te uygulamanız için gördüğü addır.
  4. Bir Modül adı girin.
  5. Paket adını mevcut uygulamanızla eşleşecek şekilde düzenleyin.
  6. Minimum SDK için API 29: Android 10 (Q)'yu seçin ve İleri'yi tıklayın. Android Automotive OS'te Car App Library'yi destekleyen tüm arabalar Android 10 API düzeyi 29 veya sonraki sürümlerde çalışır. Bu nedenle, bu değeri seçtiğinizde tüm uyumlu arabalar hedeflenir.

  7. Etkinlik Yok Ekle'yi seçin ve Son'u tıklayın.

Yeni bir proje başlatıyorsanız:

  1. Android Studio'da File > New > New Project'i (Dosya > Yeni > Yeni Proje) tıklayın.
  2. Proje Türü için Otomotiv'i seçin.
  3. Etkinlik Yok'u seçip Sonraki'yi tıklayın.
  4. Projeniz için bir ad girin. Bu, kullanıcıların Android Automotive OS'de uygulamanız için gördüğü addır.
  5. Paket adı girin. Paket adı seçme hakkında daha fazla bilgi için Paket adları bölümüne bakın.
  6. Minimum SDK için API 29: Android 10 (Q)'yu seçin ve İleri'yi tıklayın.

    Android Automotive OS'te Car App Library'yi destekleyen tüm arabalar Android 10 API düzeyi 29 veya sonraki sürümlerde çalışır. Bu nedenle, bu değeri seçtiğinizde tüm uyumlu arabalar hedeflenir.

Android Studio'da modülünüzü oluşturduktan sonra yeni otomotiv modülünüzdeki AndroidManifest.xmldosyayı açın:

<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> öğesinde bazı standart uygulama bilgilerinin yanı sıra Android Automotive OS desteğini bildiren bir <uses-feature> öğesi bulunur. Manifest'te herhangi bir etkinlik tanımlanmadığını unutmayın.

Özellik şartlarını beyan etme

Ardından, düzgün çalışması için şablon ana makinesi gerektiğini belirtmek üzere manifest dosyanıza aşağıdaki uses-feature öğesini ekleyin:

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

Ayrıca, uygulamanızın Android Automotive OS için geliştirilen tüm uygulamalar için geçerli olan Google Play özelliği şartlarını karşıladığından emin olun.

Gradle bağımlılıklarınızı güncelleme

Otomotiv modülünüze, uygulamanızın Android Automotive OS'te çalışması için gereken CarAppActivity uygulamasını içeren androidx.car.app:app-automotive yapısına bağımlılık eklemeniz gerekir.

Uygulamanızı hem Android Auto'yu hem de Android Automotive OS'i destekleyecek şekilde geliştiriyorsanız CarAppService öğenizi, mobil ve otomotiv modülleriniz arasında paylaştığınız ayrı bir modülde tutmanızı öneririz. Bu yaklaşımı kullanıyorsanız aşağıdaki snippet'te gösterildiği gibi, Gradle'ın proje bağımlılıklarını kullanarak paylaşılan modülü içerecek şekilde otomotiv modülünüzü güncellemeniz gerekir:

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 desteğini beyan etme

Uygulamanızın Android Automotive OS'i desteklediğini belirtmek için aşağıdaki manifest girişini kullanın:

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

Bu manifest girişi, uygulamanızın desteklediği otomotiv özelliklerini bildiren bir XML dosyasını ifade eder.

Araba Uygulaması Kitaplığı uygulamanız olduğunu belirtmek için Android Automotive OS modülünüzdeki res/xml/ dizinine automotive_app_desc.xml adlı bir XML dosyası ekleyin. Bu dosya aşağıdaki içerikleri içermelidir:

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

CarAppService ve CarAppActivity'nizi tanımlayın

Android Auto'da olduğu gibi Android Automotive OS de uygulamanızı çalıştırmak için CarAppService uygulamanızı kullanır. CarAppService uygulamanızı uygulama ve tanımlama talimatları için CarAppService ve Session'ınızı oluşturma ve CarAppService'inizi tanımlama başlıklı makaleleri inceleyin.

Android Auto'nun aksine, Android Automotive OS uygulamanızın giriş noktası olarak hizmet verecek ek bir uygulama bileşeni olan CarAppActivity'yı eklemeniz gerekir. Bu etkinliğin uygulanması androidx.car.app:app-automotive yapısına dahil edilmiştir ve uygulamanızın kullanıcı arayüzünü oluşturmak için şablon ana makine uygulamasıyla iletişim kurmaktan sorumludur. Manifest dosyanızda bu etkinliğin yalnızca bir örneği olmalı ve aşağıdaki gibi bildirilmelidir:

<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, app-automotive yapıtındaki CarAppActivity sınıfının tam nitelikli sınıf adı olarak ayarlanır.
  • Etkinliğin kendisi dışında bir uygulama (yani başlatıcı) tarafından başlatılması gerektiğinden android:exported, true olarak ayarlanır.
  • android:launchMode, singleTask olarak ayarlanır. Böylece kullanıcı, sayfadan ayrılırsa başlatıcıdan etkinliğin aynı örneğine dönebilir.
  • android:theme, @android:style/Theme.DeviceDefault.NoActionBar olarak ayarlanır. Böylece uygulama, kendisine ayrılan ekran alanının tamamını kaplar.
  • Intent filtresi, bunun uygulama için başlatıcı etkinliği olduğunu gösterir.
  • <meta-data> öğesi, işletim sistemine uygulamanın, araç hareket halindeyken olduğu gibi kullanıcı deneyimi kısıtlamaları varken kullanılabileceğini belirtir.

Navigasyon uygulamaları için aşağıdaki snippet'te gösterildiği gibi CarAppActivity ile ilgili birkaç zorunlu manifest girişi daha vardır:

<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>
  • Ek android.intent.category.APP_MAPS kategorisi, sistemin uygulamanızın kullanıcının konumunu gösterebileceğini anlamasını sağlar.
  • androidx.car.app.action.NAVIGATE intent filtresi, kullanıcıların başka bir araba uygulamasından gelen dolaylı gezinme intentini işlerken uygulamanızı kullanma seçeneğine sahip olmasını sağlar.

Şablonlu uygulamanızın Android Automotive OS cihazlarındaki deneyimini iyileştirmek için CarAppActivity'nize derin bağlantı desteği ekleyebilirsiniz. Örneğin, bu özellik sayesinde kullanıcılar uygulamanızı doğrudan bir tarayıcıdan veya Quick Share kullanılarak telefondan paylaşılan bir URL'yi aldıklarında açabilir.

Derin bağlantı intent filtreleri ekleme

İşletim sistemine uygulamanızın derin bağlantıları işleyebildiğini bildirmek için uygulamanızın <activity> öğesine uygun intent filtreleri eklemeniz gerekir.CarAppActivity Ek bilgiler için Gelen bağlantılar için intent filtreleri ekleme başlıklı makaleyi inceleyin.

En iyi kullanıcı deneyimi için, mobil uygulamanız tarafından desteklenen ve araç içi uygulamanız tarafından makul ölçüde desteklenebilen tüm derin bağlantıları desteklemenizi öneririz.

Uygulamanızın intent'leri işlemesi için hem onCreateScreen() sırasında araba uygulamanızın Session oluşturulurken hem de onNewIntent() sırasında yeni bir intent aldığında gelen intent'lerdeki verileri okuması gerekir:

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

Dikkat edilmesi gereken diğer noktalar

Android Automotive OS uygulamanızı geliştirirken aşağıdaki diğer hususları da göz önünde bulundurun:

Paket adları

Android Automotive OS için ayrı bir Android Paket Kiti (APK) dağıttığınızdan mobil uygulamanızdaki paket adını yeniden kullanabilir veya yeni bir paket adı oluşturabilirsiniz. Farklı bir paket adı kullanırsanız uygulamanızın iki ayrı Play Store girişi olur. Mevcut paket adınızı yeniden kullanırsanız uygulamanızın her iki platformda da tek bir girişi olur.

Bu karar, büyük ölçüde işletmeyle ilgilidir. Örneğin, mobil uygulama üzerinde çalışan bir ekibiniz ve Android Automotive OS uygulamanız üzerinde çalışan ayrı bir ekibiniz varsa ayrı paket adları kullanmak ve her ekibin kendi Play Store mağaza girişini yönetmesine izin vermek mantıklı olabilir. Her iki yaklaşımı kullanmak için gereken teknik çaba arasında büyük bir fark yoktur.

Aşağıdaki tabloda, mevcut paket adınızı koruma veya yeni bir paket adı kullanma arasındaki diğer bazı temel farklar özetlenmektedir:

Özellik Aynı paket adı Yeni paket adı
Mağaza girişi Tek Birden çok
Yansıtılmış yükleme Evet: Kurulum sihirbazı sırasında uygulamaları hızlı bir şekilde yeniden yükleme Hayır
Play Store inceleme süreci Yorumların engellenmesi: Bir APK için yorum başarısız olursa aynı sürümde gönderilen diğer APK'lar engellenir. Bireysel incelemeler
İstatistikler, metrikler ve vitals Birleştirilmiş: Otomotivle ilgili veriler için cihaz adına göre filtreleme yapabilirsiniz. Ayır
Dizine ekleme ve arama sıralaması Mevcut durumdan yararlanma Devretme yok
Diğer uygulamalarla entegrasyon Medya kodu her iki APK arasında paylaşıldığı sürece büyük olasılıkla herhangi bir değişiklik yapılması gerekmez. Google Asistan ile URI oynatma gibi durumlarda ilgili uygulamayı güncellemeniz gerekebilir.

Çevrimdışı içerik

Gerekirse uygulamanızda çevrimdışı desteği uygulayın. Android Automotive OS'li araçların kendi veri bağlantıları olması beklenir. Bu nedenle, araç maliyetine bir veri planı dahildir veya kullanıcı tarafından ödenir. Ancak arabaların, mobil cihazlara kıyasla daha değişken bir bağlantıya sahip olması da bekleniyor.

Çevrimdışı destek stratejinizi belirlerken göz önünde bulundurmanız gereken birkaç nokta:

  • İçerik indirmek için en uygun zaman, uygulamanızın kullanıldığı zamandır.
  • Kablosuz bağlantının mevcut olduğunu varsaymayın. Araba hiçbir zaman kablosuz bağlantı aralığına girmeyebilir veya özgün donanım üreticisi (OEM), mobil ağ lehine kablosuz bağlantıyı devre dışı bırakmış olabilir.
  • Kullanıcıların kullanacağını düşündüğünüz içerikleri akıllıca önbelleğe almanızda sorun olmasa da, kullanıcının bu davranışı değiştirmesine izin vermenizi öneririz.
  • Arabaların disk alanı değiştiği için kullanıcılara çevrimdışı içeriği silme olanağı tanıyın.

Sık sorulan sorular

Android Automotive OS hakkında sık sorulan bazı soruların yanıtlarını aşağıdaki bölümlerde bulabilirsiniz.

Üçüncü taraf SDK'ları ve kitaplıklarının kullanımıyla ilgili herhangi bir kısıtlama veya öneri var mı?

Üçüncü taraf SDK'larının ve kitaplıklarının kullanımıyla ilgili belirli yönergeler yoktur. Üçüncü taraf SDK'ları ve kitaplıklarını kullanmayı tercih ederseniz tüm araba uygulaması kalite şartlarına uymak sizin sorumluluğunuzdadır.

Google Play Console'u kullanarak Android Automotive OS uygulamamı nasıl yayınlayabilirim?

Android Automotive OS uygulamanızı Google Play Console'u kullanarak nasıl yayınlayacağınız hakkında ayrıntılı bilgi için Arabalara dağıtma başlıklı makaleyi inceleyin.

Sorun giderme

Android Automotive OS'te sık karşılaşılan bazı sorun giderme senaryolarıyla ilgili yardım için aşağıdakilere bakın.

  • Car App Library uygulamasını sistem ayarlarından kaldırdıktan sonra bile yeni bir sürümü yüklemeye çalışırken hata alıyorum.

    Uygulamanın kaldırıldığından emin olmak için adb uninstall app.package.name komutunu kullanın.