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?
- Proje Kurulumu ve Bağımlılıklar
- CarAppService ve Session Yönetimi
- Template Sistemi: Temel Bileşenler
- Media Uygulaması: MediaBrowserServiceCompat Entegrasyonu
- Navigation: RoutingTemplate ve PlaceListMapTemplate
- Driver Distraction Optimization (DDO)
- Hardware Button Mapping ve Custom Theming
- AAOS vs Android Auto Projection: Farklar ve Strateji
- Google Play Automotive Store: Submission Süreci
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 core4 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 utilities10 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 = 2318 targetSdk = 3419 }20}AndroidManifest.xml'de Car App Service'i tanımlamak zorunludur:
xml
12 3 android:name=".auto.MyCarAppService"4 android:exported="true">5 6 7 8 9 1011 1213 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 kullan5 // Debug'da ALLOW_ALL_HOSTS_VALIDATOR6 return if (BuildConfig.DEBUG) {7 HostValidator.ALLOW_ALL_HOSTS_VALIDATOR8 } 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ür24 return MainMenuScreen(carContext)25 }26 27 override fun onNewIntent(intent: Intent) {28 // Deep link veya notification tap handling29 val action = intent.action30 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'ı onCreateScreen → onStart → onResume → onPause → onStop → onDestroy ş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: MediaSessionCompat4 private lateinit var notificationManager: MediaNotificationManager5 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 = true19 }20 sessionToken = mediaSession.sessionToken21 }22 23 override fun onGetRoot(24 clientPackageName: String,25 clientUid: Int,26 rootHints: Bundle?27 ): BrowserRoot? {28 // Android Auto host'unu doğrula29 val isAndroidAuto = rootHints30 ?.getBoolean(MediaConstants.BROWSER_ROOT_HINTS_KEY_MEDIA_ART_SIZE_PIXELS) != null31 32 return if (isAndroidAuto || isValidCaller(clientPackageName, clientUid)) {33 BrowserRoot(ROOT_ID, null)34 } else {35 // Bilinmeyen client → sadece root ver36 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çin47 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şlat60 mediaSession.isActive = true61 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ı oynat70 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: RoutingTemplate ve PlaceListMapTemplate
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 = false7 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 = true86 // Navigasyon servisini başlat87 invalidate()88 }89 90 private fun stopNavigation() {91 isNavigating = false92 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 listener2Row.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 etme12val 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 } ?: true17 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önetilir16 // Direkt hardware button mapping sadece AAOS'ta desteklenir17 }18 19 private fun handleVolumeChange(state: CarVolume) {20 // Volume bar update21 currentVolume = state.muted?.value?.let {22 if (it) 0f else (state.volumePercentage?.value ?: 50f)23 } ?: 50f24 }25}26 27// Theming: CarColor system28object AppCarColors {29 val primaryColor = CarColor.createCustom(30 Color.parseColor("#6200EE"), // Light mode31 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_AUTOMOTIVE4 )5}6 7// Veya API level kontrolü ile8fun supportsAdvancedFeatures(carContext: CarContext): Boolean {9 return carContext.carAppApiLevel >= 7 // Car App 1.5+10}11 12// AAOS'a özel: araç sensörleri13fun readFuelLevel(carContext: CarContext): Flow = flow { 14 if (!isAndroidAutomotiveOS(carContext)) return@flow15 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?
minCarApiLevelvetargetCarApiLeveldoğ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ı.

