Tüm Yazılar
KategoriAndroid
Okuma Süresi
15 dk okuma
Yayın Tarihi
...
Kelime Sayısı
2.500kelime

Kahveni hazırla - bu içerikli bir makale!

Android Auto ile araba dashboard'u için uygulama geliştirme — Car App Library, Template system, media/navigation/messaging kategorileri, gerçek production deploy deneyimi.

Android Auto Dashboard: Production-Ready Car App Rehberi 2026

Android Auto, akıllı telefondaki uygulamaları araç ekranına taşıyan bir projeksiyon platformudur. 2026 itibarıyla Google'ın Car App Library 1.5 sürümüyle birlikte geliştiriciler artık çok daha zengin bir template sistemi, geliştirilmiş navigation deneyimi ve AAOS (Android Automotive OS) ile tam uyumlu uygulama mimarileri oluşturabilmektedir. Bu rehber, gerçek bir production uygulamasını Android Auto'ya hazırlamanın tüm adımlarını kapsar — başlangıç kurulumundan Google Play Automotive Store submission sürecine kadar.

Android Auto geliştirme, mobil geliştirmeden temel olarak ayrılır: sürücü dikkat dağıtma validasyonu (Driver Distraction Optimization, DDO) zorunlu olup Google, uygulamanızı bu kriterlere göre test eder. Template'ler render edilen UI bileşenlerini kısıtladığı için özel View hiyerarşisi yazmak mümkün değildir; bunun yerine Google'ın sunduğu hazır template'leri kullanırsınız. Bu yaklaşım hem güvenlik açısından kritik hem de platform tutarlılığı açısından faydalıdır. 2026'da Car App Library, harita entegrasyonu için yeni PlaceListMapTemplate geliştirmeleri ve media uygulamaları için daha esnek TabTemplate desteği sunmaktadır.

Bu rehberde bir navigation & media uygulaması üzerinden giderek Car App Library'nin en önemli bileşenlerini, gerçek production sorunlarını ve Google Play Automotive Store'a yükleme sürecini ele alacağız. Kod örnekleri Kotlin ile yazılmış olup Car App Library 1.5+ sürümünü hedeflemektedir.

💡 Pro Tip: Android Auto ve Android Automotive OS (AAOS) birbirinden farklıdır. Auto = telefon projeksiyonu (USB/wireless), AAOS = araçta doğrudan çalışan bağımsız OS. Aynı Car App Library ile her ikisini de hedefleyebilirsiniz ama dağıtım kanalları farklıdır — Auto için Google Play, AAOS için OEM partnership gerekir.

İçindekiler

Car App Library 1.5 Nedir?

Car App Library, Android Jetpack'in bir parçasıdır ve hem Android Auto (projeksiyon) hem Android Automotive OS (bağımsız) hedefleri için tek bir kod tabanı sunar. Library, önceden tanımlanmış template'ler üzerinden çalışır: ListTemplate, PlaceListTemplate, PlaceListMapTemplate, RoutePreviewNavigationTemplate, RoutingTemplate, MessageTemplate, LongMessageTemplate, GridTemplate, PaneTemplate, TabTemplate ve daha fazlası.

1.5 versiyonunun öne çıkan yenilikleri şunlardır: AlertTemplate ile sürücüye sesli+görsel uyarı verme, TabTemplate ile medya uygulamaları için sekmeli navigasyon, PlaceListMapTemplate üzerinde cluster marker desteği, RoutingTemplate içinde multi-stop itinerary gösterimi ve SessionInfo API'si ile çoklu display yönetimi. Bundle size'ı küçük tutmak için Car App Library modüler yapıdadır: car-app-library, car-app-library-navigation ve car-app-library-testing ayrı bağımlılıklardır.

Car App Library'nin en kritik konsepti Screen stack yönetimidir. Her Session bir ScreenManager içerir; Screen'ler push/pop ile yönetilir ve her screen bir template döndürür. Template değiştirme ise invalidate() çağrısıyla tetiklenir. Platform, maximum stack derinliğini 5 ile sınırlar — bunu aşmak runtime exception fırlatır.

Proje Kurulumu ve Bağımlılıklar

Projeyi hazırlamak için build.gradle dosyanıza aşağıdaki bağımlılıkları eklemeniz gerekir:

kotlin
1// build.gradle.kts (app modülü)
2dependencies {
3 // Car App Library core
4 implementation("androidx.car.app:app:1.5.0-beta01")
5 
6 // Navigation extension (RoutingTemplate için)
7 implementation("androidx.car.app:app-navigation:1.5.0-beta01")
8 
9 // Test utilities
10 testImplementation("androidx.car.app:app-testing:1.5.0-beta01")
11 androidTestImplementation("androidx.car.app:app-testing:1.5.0-beta01")
12}
13 
14android {
15 defaultConfig {
16 // Min API 23 (Android Auto), AAOS için 29+
17 minSdk = 23
18 targetSdk = 34
19 }
20}

AndroidManifest.xml'de Car App Service'i tanımlamak zorunludur:

xml
1
2
3 android:name=".auto.MyCarAppService"
4 android:exported="true">
5
6
7
8
9
10
11 
12
13
14 android:name="androidx.car.app.minCarApiLevel"
15 android:value="3" />

Car App API level, Android API level'dan bağımsızdır. API level 3 = Car App Library 1.1+, level 5 = 1.3+, level 7 = 1.5+ anlamına gelir. CarContext.getCarAppApiLevel() ile runtime'da versiyonu kontrol edip feature degradation yapabilirsiniz — bu production'da kritik önem taşır çünkü farklı araç modelleri farklı API seviyeleri destekler.

CarAppService ve Session Yönetimi

CarAppService, uygulamanın Auto bağlantı noktasıdır. Her bağlantı için bir Session oluşturur:

kotlin
1class MyCarAppService : CarAppService() {
2 
3 override fun createHostValidator(): HostValidator {
4 // Production'da ALLOWED_HOSTS_SYSTEM_RELEASE kullan
5 // Debug'da ALLOW_ALL_HOSTS_VALIDATOR
6 return if (BuildConfig.DEBUG) {
7 HostValidator.ALLOW_ALL_HOSTS_VALIDATOR
8 } else {
9 HostValidator.Builder(applicationContext)
10 .addAllowedHosts(R.array.hosts_allowlist_sample)
11 .build()
12 }
13 }
14 
15 override fun onCreateSession(): Session {
16 return MySession()
17 }
18}
19 
20class MySession : Session() {
21 
22 override fun onCreateScreen(intent: Intent): Screen {
23 // İlk screen'i döndür
24 return MainMenuScreen(carContext)
25 }
26 
27 override fun onNewIntent(intent: Intent) {
28 // Deep link veya notification tap handling
29 val action = intent.action
30 if (action == "com.myapp.ACTION_NAVIGATE") {
31 val destination = intent.getStringExtra("destination")
32 screenManager.push(NavigationScreen(carContext, destination))
33 }
34 }
35 
36 override fun onCarConfigurationChanged(newConfiguration: Configuration) {
37 // Araç config değişti (gece/gündüz modu, vs.)
38 screenManager.top.invalidate()
39 }
40}
41 
42class MainMenuScreen(carContext: CarContext) : Screen(carContext) {
43 
44 override fun onGetTemplate(): Template {
45 val listBuilder = ItemList.Builder()
46 
47 listBuilder.addItem(
48 Row.Builder()
49 .setTitle("Navigasyon")
50 .setImage(
51 CarIcon.Builder(
52 IconCompat.createWithResource(carContext, R.drawable.ic_navigation)
53 ).build()
54 )
55 .setOnClickListener { screenManager.push(NavigationScreen(carContext, null)) }
56 .build()
57 )
58 
59 listBuilder.addItem(
60 Row.Builder()
61 .setTitle("Müzik")
62 .setOnClickListener { screenManager.push(MediaScreen(carContext)) }
63 .build()
64 )
65 
66 return ListTemplate.Builder()
67 .setTitle("Ana Menü")
68 .setHeaderAction(Action.APP_ICON)
69 .setSingleList(listBuilder.build())
70 .build()
71 }
72}

Session lifecycle'ı onCreateScreenonStartonResumeonPauseonStoponDestroy şeklinde işler. Araç bağlantısı kesildiğinde onStop tetiklenir; yeniden bağlandığında onStart ile devam eder. onCarConfigurationChanged ise gece modu geçişlerinde veya locale değişiminde çağrılır.

Template Sistemi: Temel Bileşenler

Car App Library'nin template kataloğu 2026'da oldukça zenginleşmiştir. En sık kullanılan template'leri inceleyelim:

ListTemplate: Kaydırılabilir liste gösterimi. Her Row en fazla 2 satır metin ve 1 ikon içerebilir. setOnContentRefreshListener ile pull-to-refresh desteği eklenebilir. Production'da dikkat edilmesi gereken nokta: liste item sayısı API level'a bağlıdır; level 2'de max 6 item görünür, level 6+ için max 9 item desteklenir.

GridTemplate: 4-8 arası grid item içeren kare kart düzeni. Medya uygulamalarında kategori seçimi için idealdir. Her GridItem bir CarIcon ve başlık içerebilir. Disabled state için setEnabled(false) kullanılır.

TabTemplate: Car App Library 1.3+ ile gelen bu template, birden fazla içerik sekmesi sunar. Max 4 sekme desteklenir; her sekme ayrı bir content template içerebilir. Aktif sekme değişiminde onTabSelected callback'i tetiklenir.

PaneTemplate: İki bölümden oluşur: üstte action butonları (max 4), altta row listesi. Detay sayfaları için idealdir. Pane.Builder().addAction().addRow().build() ile inşa edilir.

SearchTemplate: Araç ekranına optimize edilmiş arama kutucuğu. Klavye araç ekranında görüntülenir ve SearchCallback ile gerçek zamanlı öneriler sunulur. Her arama sonucu update için invalidate() çağrısı yapılır.

Media Uygulaması: MediaBrowserServiceCompat Entegrasyonu

Android Auto media uygulamaları MediaBrowserServiceCompat üzerine kuruludur. Bu servis, araç başlık birimi veya Android Auto host'unun içerik ağacını browse etmesine olanak tanır:

kotlin
1class MusicService : MediaBrowserServiceCompat() {
2 
3 private lateinit var mediaSession: MediaSessionCompat
4 private lateinit var notificationManager: MediaNotificationManager
5 
6 companion object {
7 const val ROOT_ID = "root"
8 const val CATEGORY_SONGS = "songs"
9 const val CATEGORY_ALBUMS = "albums"
10 const val CATEGORY_PLAYLISTS = "playlists"
11 }
12 
13 override fun onCreate() {
14 super.onCreate()
15 
16 mediaSession = MediaSessionCompat(this, "MusicService").apply {
17 setCallback(MediaSessionCallback())
18 isActive = true
19 }
20 sessionToken = mediaSession.sessionToken
21 }
22 
23 override fun onGetRoot(
24 clientPackageName: String,
25 clientUid: Int,
26 rootHints: Bundle?
27 ): BrowserRoot? {
28 // Android Auto host'unu doğrula
29 val isAndroidAuto = rootHints
30 ?.getBoolean(MediaConstants.BROWSER_ROOT_HINTS_KEY_MEDIA_ART_SIZE_PIXELS) != null
31 
32 return if (isAndroidAuto || isValidCaller(clientPackageName, clientUid)) {
33 BrowserRoot(ROOT_ID, null)
34 } else {
35 // Bilinmeyen client → sadece root ver
36 BrowserRoot(ROOT_ID, Bundle().apply {
37 putBoolean(MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, false)
38 })
39 }
40 }
41 
42 override fun onLoadChildren(
43 parentId: String,
44 result: Result>
45 ) {
46 result.detach() // Async yükleme için
47 
48 when (parentId) {
49 ROOT_ID -> loadRootItems(result)
50 CATEGORY_SONGS -> loadSongs(result)
51 CATEGORY_ALBUMS -> loadAlbums(result)
52 CATEGORY_PLAYLISTS -> loadPlaylists(result)
53 else -> result.sendResult(emptyList())
54 }
55 }
56 
57 private inner class MediaSessionCallback : MediaSessionCompat.Callback() {
58 override fun onPlay() {
59 // Playback başlat
60 mediaSession.isActive = true
61 startForeground()
62 }
63 
64 override fun onSkipToNext() { /* Sonraki şarkı */ }
65 override fun onSkipToPrevious() { /* Önceki şarkı */ }
66 override fun onSeekTo(pos: Long) { /* Seek */ }
67 
68 override fun onPlayFromMediaId(mediaId: String?, extras: Bundle?) {
69 // Belirli bir şarkıyı oynat
70 val track = repository.getTrack(mediaId ?: return)
71 playTrack(track)
72 }
73 }
74}

Android Auto, media uygulamasını otomatik olarak kendi media template'inde gösterir. Ancak MediaConstants key'lerini doğru set etmek kritiktir: PLAYBACK_STATE_EXTRAS_KEY_MEDIA_SESSION_IS_IN_FOREGROUND, DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE, DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE gibi constant'lar görsel sunumu belirler.

Offline-first tasarım için MediaBrowserServiceCompat, önce cache'den veri sunmalı, arka planda sync yapmalıdır. Room database ile NetworkBoundResource pattern'i bu bağlamda mükemmel çalışır. Araç bağlantısı sırasında internet olmayabilir; servisin bu durumu graceful handle etmesi gerekir.

Navigation kategorisi en karmaşık Car App categorisidir. PlaceListMapTemplate, noktaları harita üzerinde gösterirken liste formunu da korur; RoutingTemplate aktif navigasyon sırasında adım adım yönlendirme sunar:

kotlin
1class NavigationScreen(
2 carContext: CarContext,
3 private val destination: String?
4) : Screen(carContext) {
5 
6 private var isNavigating = false
7 private var places: List = emptyList()
8 
9 override fun onGetTemplate(): Template {
10 return if (isNavigating) {
11 buildRoutingTemplate()
12 } else {
13 buildPlaceListMapTemplate()
14 }
15 }
16 
17 private fun buildPlaceListMapTemplate(): Template {
18 val itemListBuilder = ItemList.Builder()
19 
20 places.forEach { place ->
21 itemListBuilder.addItem(
22 Row.Builder()
23 .setTitle(place.name)
24 .addText(place.address)
25 .addText("${place.distanceKm} km")
26 .setMetadata(
27 Metadata.Builder()
28 .setPlace(
29 Place.Builder(
30 CarLocation.create(place.lat, place.lng)
31 )
32 .setMarker(
33 PlaceMarker.Builder()
34 .setColor(CarColor.PRIMARY)
35 .build()
36 )
37 .build()
38 )
39 .build()
40 )
41 .setOnClickListener { startNavigation(place) }
42 .build()
43 )
44 }
45 
46 return PlaceListMapTemplate.Builder()
47 .setTitle("Yakındaki Yerler")
48 .setItemList(itemListBuilder.build())
49 .setHeaderAction(Action.BACK)
50 .setCurrentLocationEnabled(true)
51 .build()
52 }
53 
54 private fun buildRoutingTemplate(): Template {
55 val navigationInfo = NavigationTemplate.NavigationInfo.Builder()
56 .setCurrentStep(
57 Step.Builder("500m sonra sağa dönün")
58 .setManeuver(
59 Maneuver.Builder(Maneuver.TYPE_TURN_RIGHT).build()
60 )
61 .setStepIconType(Step.MANEUVER_ICON_TYPE_TURN_NORMAL)
62 .build()
63 )
64 .setDistanceToStep(
65 Distance.create(500.0, Distance.UNIT_METERS)
66 )
67 .build()
68 
69 return NavigationTemplate.Builder()
70 .setNavigationInfo(navigationInfo)
71 .setActionStrip(
72 ActionStrip.Builder()
73 .addAction(
74 Action.Builder()
75 .setTitle("Bitir")
76 .setOnClickListener { stopNavigation() }
77 .build()
78 )
79 .build()
80 )
81 .build()
82 }
83 
84 private fun startNavigation(place: Place) {
85 isNavigating = true
86 // Navigasyon servisini başlat
87 invalidate()
88 }
89 
90 private fun stopNavigation() {
91 isNavigating = false
92 invalidate()
93 }
94}

Real-time routing için CarContext.startCarApp() ile external navigation uygulamasına deep link atabilir ya da kendi yönlendirme motorunuzu entegre edebilirsiniz. Production'da Google Maps SDK for Android veya HERE SDK kullanımı yaygındır.

Driver Distraction Optimization (DDO)

DDO, Android Auto'nun en kritik gereksinimidir. Google, uygulamanızı otomatik DDO testi ile değerlendirir; bu testleri geçemeyen uygulamalar Play Store'a kabul edilmez. Temel kurallar şunlardır:

Hareket halinde kısıtlamalar: Araç hareket halindeyken gösterilen template'ler "driving" moduna geçer. Bu modda: liste item sayısı azalır (max 4-6), metin giriş alanları devre dışı kalır, bazı action'lar gizlenir. ParkedOnlyOnClickListener wrapper'ı kullanarak bazı aksiyonları yalnızca park halinde etkinleştirebilirsiniz.

kotlin
1// Yalnızca araç park halindeyken çalışacak listener
2Row.Builder()
3 .setTitle("Detaylı Ayarlar")
4 .setOnClickListener(
5 ParkedOnlyOnClickListener.create {
6 screenManager.push(SettingsScreen(carContext))
7 }
8 )
9 .build()
10 
11// Araç hız durumunu kontrol etme
12val carHardwareManager = carContext.getCarService(CarHardwareManager::class.java)
13carHardwareManager.carSensors.addCarSpeedListener(
14 CarExecutor.create(mainExecutor)
15) { speed ->
16 val isParked = speed.speed.value?.let { it < 0.5f } ?: true
17 updateUIForDrivingState(!isParked)
18}

DDO test araçları: Android Auto Desktop Head Unit (DHU), fiziksel araç olmadan Auto bağlantısını simüle eder. desktop-head-unit komutuyla çalıştırılır ve DDO validasyonunu tam olarak yansıtır. Production submission öncesi DHU'da kapsamlı test zorunludur.

Sık yapılan DDO hataları: Çok fazla metin içeren Row'lar (addText() max 2 satır), hareket halinde gösterilen LongMessageTemplate, input alanlarının yanlış disable edilmesi, animasyonların DDO modunda devam etmesi. Google'ın DDO checker tool'u bu hataların büyük kısmını otomatik tespit eder.

Hardware Button Mapping ve Custom Theming

Araç fiziksel kontrolleri (direksiyon üzerindeki butonlar, rotary knob) CarHardwareManager üzerinden yönetilir:

kotlin
1class HardwareButtonHandler(private val carContext: CarContext) {
2 
3 private val carHardwareManager =
4 carContext.getCarService(CarHardwareManager::class.java)
5 
6 fun registerButtonCallbacks() {
7 // Ses kontrol butonları
8 carHardwareManager.carAudioCallback.addVolumeChangeCallback(
9 CarExecutor.create(mainExecutor)
10 ) { volumeState ->
11 handleVolumeChange(volumeState)
12 }
13 
14 // Merkez buton (rotary knob tıklama)
15 // Bu işlem template action'ları üzerinden dolaylı yönetilir
16 // Direkt hardware button mapping sadece AAOS'ta desteklenir
17 }
18 
19 private fun handleVolumeChange(state: CarVolume) {
20 // Volume bar update
21 currentVolume = state.muted?.value?.let {
22 if (it) 0f else (state.volumePercentage?.value ?: 50f)
23 } ?: 50f
24 }
25}
26 
27// Theming: CarColor system
28object AppCarColors {
29 val primaryColor = CarColor.createCustom(
30 Color.parseColor("#6200EE"), // Light mode
31 Color.parseColor("#BB86FC") // Dark mode (araç gece modu)
32 )
33 
34 val accentColor = CarColor.createCustom(
35 Color.parseColor("#03DAC6"),
36 Color.parseColor("#018786")
37 )
38}

Custom theming için CarColor.createCustom(lightColor, darkColor) kullanılır. Araç gece moduna geçtiğinde sistem otomatik olarak dark rengi seçer. Arka plan renkleri template bazında setBackgroundColor() ile ayarlanabilir; ancak bazı OEM'ler kendi brand renk kısıtlamalarını uygulayabilir.

Icon'lar için CarIcon.Builder(IconCompat) ile oluşturulan ikonlar hem light hem dark mode'u desteklemelidir. Bitmap icon boyutu minimum 88x88dp önerilir; vektör drawable tercih edilmelidir.

AAOS vs Android Auto Projection: Farklar ve Strateji

Android Auto ve AAOS aynı Car App Library ile geliştirilebilir ancak deployment ve capability farklılıkları vardır:

Android Auto (Projeksiyon): Telefon bağlantısına bağımlıdır (USB veya Wireless). Uygulama telefonda çalışır, araç ekranına yansıtılır. Google Play üzerinden dağıtılır. API level kısıtlamaları daha sıkıdır. Tüm araç markalarında çalışır (Auto destekleyen).

Android Automotive OS (AAOS): Araçta bağımsız çalışır, telefon gerekmez. Uygulama araç işlemcisinde çalışır. Google Play Automotive Store'dan dağıtılır (OEM onayı gerekir). Daha geniş API erişimi (kamera, araç sensorleri, klimatronik vs.). Hedeflenen araç modellerine göre farklı test gerektirir.

Tek kod tabanı stratejisi: CarContext.hostInfo ile runtime'da host'un Auto mu AAOS mi olduğunu öğrenip feature flag açabilirsiniz:

kotlin
1fun isAndroidAutomotiveOS(carContext: CarContext): Boolean {
2 return carContext.packageManager.hasSystemFeature(
3 PackageManager.FEATURE_AUTOMOTIVE
4 )
5}
6 
7// Veya API level kontrolü ile
8fun supportsAdvancedFeatures(carContext: CarContext): Boolean {
9 return carContext.carAppApiLevel >= 7 // Car App 1.5+
10}
11 
12// AAOS'a özel: araç sensörleri
13fun readFuelLevel(carContext: CarContext): Flow = flow {
14 if (!isAndroidAutomotiveOS(carContext)) return@flow
15 
16 val carHardwareManager = carContext.getCarService(CarHardwareManager::class.java)
17 carHardwareManager.carInfo.addFuelLevelListener(
18 CarExecutor.create(Dispatchers.IO.asExecutor())
19 ) { fuelLevel ->
20 fuelLevel.percent.value?.let { trySend(it) }
21 }
22 awaitClose()
23}

Google Play Automotive Store: Submission Süreci

Production'a yükleme süreci standart Play Store'dan farklıdır. Gereksinimler:

1. Uygulama kategorisi bildirimi: Manifest'te category attribute doğru set edilmeli (NAVIGATION, MEDIA, MESSAGING, IOT). Yanlış kategori reddedilme nedenidir.

2. DDO review: Google otomatik + manuel DDO review yapar. DHU üzerinde tüm flow'ları test edin. Hareket halinde gösterilen her ekranı ayrıca belgelendirin.

3. Drive review: Bazı uygulamalar fiziksel araç testi gerektirir. Google bu aşamada ek bilgi talep edebilir.

4. Sertifika gereksinimleri: Release APK/AAB imzalaması, targetCarApiLevel meta-data, uses-feature android:name="android.hardware.type.automotive" (AAOS için).

5. İçerik politikaları: Navigasyon uygulamaları gerçek yol verisi sunmalıdır (sahte/test verisi reddedilir). Media uygulamaları içerik lisanslamasını belgelemek zorundadır.

Submission checklist:

  • DHU testleri geçiyor mu?
  • Tüm DDO kurallarına uyuldu mu?
  • minCarApiLevel ve targetCarApiLevel doğru set edildi mi?
  • Dark mode (gece modu) test edildi mi?
  • Offline state gracefully handle ediliyor mu?
  • Accessibility (TalkBack equivalent) test edildi mi?

ALTIN İPUCU

Bu yazının en değerli bilgisi

Bu ipucu, yazının en önemli çıkarımını içeriyor.

Easter Egg

Gizli bir bilgi buldun!

Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?

Okuyucu Ödülü

Android Auto geliştirme için faydalı kaynaklar: **Android for Cars App Library** resmi GitHub reposu (`android/car-samples`) production kalitesinde 15+ örnek içerir. **DHU (Desktop Head Unit)** Android SDK Manager'dan indirilebilir — kurulum sonrası `$ANDROID_HOME/extras/google/auto/desktop-head-unit` konumunda bulunur. **Automotive OS Emulator** Android Studio'nun son sürümünde doğrudan AVD Manager üzerinden oluşturulabilir. **CarUI Library** (AAOS için) araç başlık birimi UI component'lerini sağlar: `CarUiRecyclerView`, `CarUiToolbar`, `CarUiPreferenceFragment`.

Sonuç

Android Auto ile production-ready uygulama geliştirme, mobil geliştirmeden farklı bir paradigma gerektirir. Template sistemi, DDO kısıtlamaları ve AAOS/Auto ayrımı başlangıçta kafa karıştırıcı görünse de Car App Library'nin sağladığı soyutlama katmanı tek bir kod tabanıyla her iki platformu hedeflemeyi mümkün kılar. 2026 itibarıyla Car App Library 1.5 ile template zenginliği ve API kapsamı önemli ölçüde genişlemiştir.

Production'a çıkmadan önce: DHU testlerini CI/CD pipeline'ınıza ekleyin, DDO kurallarını birebir uygulayın ve offline state'i her zaman birinci sınıf vatandaş olarak ele alın. Araç ekranı, kullanıcının hayatının en kritik anlarından birinde uygulamanızla etkileştiği yerdir — kalite ve güvenilirlik her şeyin önünde gelir.

Daha fazla Android derinlemesine konu için Android 15 Privacy Sandbox ve Edge-to-Edge, Kotlin 2.1 K2 Compiler ve Context Parameters, Material 3 Expressive Design System ve Gemini Nano ile On-Device AI yazılarına göz atabilirsiniz.

Resmi kaynaklar: Android for Cars geliştirici kılavuzu, Car App Library API referansı, DHU kurulum rehberi, Google Play Automotive Store politikaları.

Etiketler

#Android Auto#Automotive#Car App Library#Android#Templates#Production#Dashboard#2026
Muhittin Çamdalı

Muhittin Çamdalı

Senior iOS Developer

12+ yıllık deneyime sahip iOS Developer. Swift, SwiftUI ve modern iOS mimarileri konusunda uzman. Apple platformlarında performanslı ve kullanıcı dostu uygulamalar geliştiriyorum.

iOS Geliştirme Haberleri

Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.

Paylaş

Bunu da begenebilirsiniz