---
title: 'Android Mimari Katmanları'
source: 'https://academia.sh/tr/kurslar/android-platformu/android-mimari-katmanlari'
course: 'Android Platformu ve Araçlar'
language: tr
updated: '2026-10-21T05:02:35+00:00'
license: 'CC BY-SA 4.0'
objectives:
    - 'İsteğin dört karşılamadan birine düştüğünü sekiz istek üzerinde ölçer'
    - "Android'in mimari katmanlarını Linux çekirdeğinden sistem uygulamalarına sıralar"
    - "Aygıtın API düzeyinin bir çerçeve API'sini tam, ikame ya da karşılıksız bıraktığını gösterir"
    - 'Karşılama kuralının sonucu gördüğünü, nedeni görmediğini sınırlayıcı ölçümle doğrular'
---

# Android Mimari Katmanları

Bir uygulamanın platformdan istediği şeyin tam, ikame, bekleyen ya da karşılıksız karşılandığının ve isteğin Linux çekirdeğinden uygulama çerçevesine uzanan katmanlardan geçişinin ölçümü.

Önceki kurs, Kotlin'de iki değeri eşit yapan şeyin ne olduğunu ölçtü ve `==` ile `===` arasındaki ayrımı dil düzeyinde kurdu. Bu kurs aynı dille platformun kendisine geçer. Bir Android uygulaması platformdan sürekli bir şey ister: bir activity'yi başlatmak, bir izin almak, aygıtın diline uyan metni bulmak, bir işi uygun bir anda koşturmak. Platform her isteğe bir yanıt verir, ama her zaman istenen yanıtı vermez. Bildirim dosyasında adı geçen activity istendiği gibi açılır, adı geçmeyen hiç açılmaz. Kesin konum istenen yerde kullanıcı yaklaşık konumu verebilir. Aygıtın diline uyan metin yoksa varsayılan metin gelir. Koşulu sağlanmamış bir iş o koşulu bekler.

Kursun sorusu bu yüzden tek bir cümledir: **bu isteği platform nasıl karşılıyor?** Dört yanıt vardır ve kurs boyunca adları değişmez. Kategorinin üst adı **karşılama**dır.

- **tam**: platform bir değer verir ve verilen, istenenin kendisidir.
- **ikame**: platform bir değer verir ama verilen, istenenden başkadır.
- **bekleyen**: platform henüz değer vermez; istek bir koşulu bekler.
- **karşılıksız**: platform isteği reddeder; değer gelmez ve beklenecek bir koşul da yoktur.

Önceki kursun `==`'sı burada tek bir iş görür: verilen değerin istenene eşit olup olmadığını söyler, yani tam ile ikameyi ayırır. Eşitliğin ölçütü bu kursta bir kategori değildir; çekirdek iki dizgiyi karşılaştırır ve dizgilerin eşitliği içeriktir.

## Karşılama Kuralı

Karşılamayı etiket değil kural verir. Aşağıdaki yardımcı dosya kuralı kurar ve kursun her dersinde ilk Kotlin bloğu olarak aynen yinelenir. `Ask` sınıfı üç şey taşır: isteğin etiketi, istenen değer ve platform modelinin döndürdüğü sonuç. Sonuç, mühürlü `Outcome` arayüzünün üç alt tipinden biridir: `Given` bir değer verildiğini, `Waiting` bir koşulun beklendiğini, `Refused` isteğin reddedildiğini söyler.

```kotlin
// Fulfillment.kt — bir istegin platformca nasil karsilandigini siniflandirir
sealed interface Outcome {
    data class Given(val value: String) : Outcome
    data class Waiting(val on: String) : Outcome
    data class Refused(val reason: String) : Outcome
}

class Ask(val label: String, val wanted: String, val outcome: Outcome) {
    val fulfillment: String = when (outcome) {
        is Outcome.Waiting -> "bekleyen"
        is Outcome.Refused -> "karsiliksiz"
        is Outcome.Given -> if (outcome.value == wanted) "tam" else "ikame"
    }

    fun report() {
        val detail = when (outcome) {
            is Outcome.Given -> "verilen=${outcome.value}"
            is Outcome.Waiting -> "bekledigi=${outcome.on}"
            is Outcome.Refused -> "neden=${outcome.reason}"
        }
        println("$label: istenen=$wanted | $detail -> $fulfillment")
    }
}

fun tally(asks: List<Ask>) {
    for (name in listOf("tam", "ikame", "bekleyen", "karsiliksiz")) {
        println("$name: ${asks.count { it.fulfillment == name }}")
    }
}
```

`fulfillment` soruyu sırayla sorar. Sonuç `Waiting` ise karşılama bekleyendir. `Refused` ise karşılıksızdır. `Given` ise verilen değer istenene eşitse tamdır, değilse ikamedir. `tally` dört kategoriyi sabit sırayla sayar ve sıfır olan kategoriyi de basar.

Ölçümün bir koşulu vardır: her istek tek bir istenen değer taşır ve sonuç elle yazılmaz. `Ask("...", "X", Outcome.Given("X"))` biçiminde sonucu doğrudan yazan bir satır ölçüm değildir, kuralın kendisini göstermekten öteye gitmez. İstenen değer isteğin kendi sözcüğüyle yazılır, sonuç ise platformun o düzeneği nasıl karşıladığını kuran küçük bir Kotlin fonksiyonundan gelir.

## Sekiz İstek, Dört Karşılama

Aşağıdaki ölçüm kursun dört konusundan sekiz istek kurar: uygulama bileşenlerinden iki, izin modelinden üç, kaynak sisteminden iki ve platform servislerinden bir. Dört fonksiyon, platformun dört düzeneğini taklit eder. `startExplicit` bildirim dosyasında bildirilen activity'leri açar. `grant` izni önce normal ya da tehlikeli diye ayırır, tehlikeli izinde kullanıcının seçimini bekler. `pickResource` aygıtın diline uyan kaynak dizinini arar, yoksa varsayılan dizine düşer. `schedule` bir işi koşullar sağlanınca verir, sağlanmayan koşulları sıralı toplar.

```kotlin
// Main.kt — sekiz istek, dort karsilama
fun startExplicit(target: String, declared: Set<String>): Outcome =
    if (target in declared) Outcome.Given(target) else Outcome.Refused("bildirimde-yok")

fun grant(permission: String, dangerous: Boolean, choice: String?): Outcome = when {
    !dangerous -> Outcome.Given(permission)
    choice == null -> Outcome.Waiting("kullanici")
    choice == "reddet" -> Outcome.Refused("kullanici-reddetti")
    else -> Outcome.Given(choice)
}

fun pickResource(qualifier: String, available: List<String>): Outcome = when {
    "values-$qualifier" in available -> Outcome.Given("values-$qualifier")
    "values" in available -> Outcome.Given("values")
    else -> Outcome.Refused("kaynak-yok")
}

fun schedule(work: String, needs: Set<String>, met: Set<String>): Outcome {
    val missing = (needs - met).sorted()
    return if (missing.isEmpty()) Outcome.Given(work) else Outcome.Waiting(missing.joinToString(","))
}

fun main() {
    val declared = setOf("MainActivity", "ProfileActivity")
    val folders = listOf("values", "values-de")
    val asks = listOf(
        Ask("acik-baslatma", "ProfileActivity", startExplicit("ProfileActivity", declared)),
        Ask("bildirilmemis", "SettingsActivity", startExplicit("SettingsActivity", declared)),
        Ask("normal-izin", "INTERNET", grant("INTERNET", dangerous = false, choice = null)),
        Ask("tehlikeli-izin", "CAMERA", grant("CAMERA", dangerous = true, choice = null)),
        Ask("kesin-konum", "ACCESS_FINE_LOCATION",
            grant("ACCESS_FINE_LOCATION", dangerous = true, choice = "ACCESS_COARSE_LOCATION")),
        Ask("almanca-metin", "values-de", pickResource("de", folders)),
        Ask("turkce-metin", "values-tr", pickResource("tr", folders)),
        Ask("zamanli-is", "senkron", schedule("senkron", setOf("ag", "sarj"), setOf("sarj"))),
    )
    for (ask in asks) {
        ask.report()
    }
    tally(asks)
}
```

```
acik-baslatma: istenen=ProfileActivity | verilen=ProfileActivity -> tam
bildirilmemis: istenen=SettingsActivity | neden=bildirimde-yok -> karsiliksiz
normal-izin: istenen=INTERNET | verilen=INTERNET -> tam
tehlikeli-izin: istenen=CAMERA | bekledigi=kullanici -> bekleyen
kesin-konum: istenen=ACCESS_FINE_LOCATION | verilen=ACCESS_COARSE_LOCATION -> ikame
almanca-metin: istenen=values-de | verilen=values-de -> tam
turkce-metin: istenen=values-tr | verilen=values -> ikame
zamanli-is: istenen=senkron | bekledigi=ag -> bekleyen
tam: 3
ikame: 2
bekleyen: 2
karsiliksiz: 1
```

Sekiz isteğin üçü tam, ikisi ikame, ikisi bekleyen, biri karşılıksız çıktı. Bu dağılım kursun bağlayıcı sayısıdır ve sonraki derslerde atıfla anılır, değiştirilmez. Her satırın hangi sorudan geçtiğini okumak kolaydır. `acik-baslatma` bildirilen bir activity'yi istedi ve aynısını aldı, tam. `bildirilmemis` bildirilmeyen bir activity'yi istedi ve reddedildi; beklenecek bir koşul olmadığı için karşılıksız. `tehlikeli-izin` kullanıcının henüz seçmediği bir izni istedi ve `kullanici`yı bekliyor, bekleyen. `kesin-konum` kesin konumu istedi, kullanıcı yaklaşık konumu seçti; bir değer verildi ama başka bir değer, ikame. `turkce-metin` Türkçe kaynak dizinini istedi ve aygıt, yalnız `values` ile `values-de` taşıdığı için varsayılan dizini verdi, yine ikame. `zamanli-is` iki koşul ister, ikisinden biri sağlanmıştır; model eksik koşulları sıralı toplar ve ilkini, `ag`'ı basar.

**UB1.** Dört fonksiyon platformun kurallarını sadeleştirir: gerçek bir iznin normal ya da tehlikeli sayılması izin tanımına, kaynak seçiminin sırası aygıt yapılandırmasının tüm niteleyicilerine bağlıdır. Model, platformun bu kurallarını kurar; platformun kendisi ölçülmedi.

## Mimari Katmanlar

İstek nereye gider? Uygulamanın yazdığı `startActivity` ya da bir izin sorgusu yalnız uygulama kodunda kalmaz, bir katman zincirinden geçer. Android'in mimarisi aşağıdan yukarıya şöyle sıralanır.

- **Linux çekirdeği.** Süreçleri, belleği, aygıt sürücülerini ve güvenlik düzeneğinin temelini yönetir. Her uygulama ayrı bir süreçte, ayrı bir kullanıcı kimliğiyle çalışır; bu ayrım üstteki izin düzeneğinin dayanağıdır. Linux müfredatında anlatılan çekirdek budur.
- **Donanım soyutlama katmanı (HAL).** Kamera, algılayıcılar, ses gibi donanımı üst katmanlara standart arayüzlerle açar. Üstteki kod belirli bir donanımı bilmez, arayüzü bilir.
- **Android çalışma zamanı (ART).** Uygulamanın derlenmiş kodunu çalıştırır. Her uygulama kendi çalışma zamanı örneğinde koşar.
- **Yerel kitaplıklar.** C ve C++ ile yazılmış, grafik, ortam ve veritabanı gibi işleri yapan kitaplıklardır; çerçeve çoğu zaman bunları kullanır.
- **Uygulama çerçevesi.** Uygulamanın doğrudan çağırdığı katmandır: activity'ler, servisler, yayın alıcıları, içerik sağlayıcılar ve kaynaklar bu katmanın sunduğu uygulama bileşenleridir. Bu kursun konuları buradadır.
- **Sistem uygulamaları.** Telefon, mesajlaşma, kişiler, ayarlar gibi aygıtla gelen uygulamalardır. Bir uygulamanın kullanıcıya gösterdiği ilk yüz çoğu zaman bunlardır.

Uygulama isteği çerçeveye bırakır, çerçeve gerekirse yerel kitaplıklara iner, çalışma zamanı kodu koşturur, donanıma değen her şey HAL'den ve çekirdekten geçer. Bu zincir bir karşılamanın neden her zaman uygulamanın elinde olmadığını da açıklar: bir istek katmanlardan birinde reddedilebilir, bekletilebilir ya da başka bir değere çevrilebilir. İstenen izin çerçevede kullanıcıya sorulur, istenen donanım HAL'in sunduğu arayüze bağlıdır, istenen API de aygıttaki çerçevenin sürümüne bağlıdır.

## Çerçeve API'si ve Aygıtın API Düzeyi

Çerçeve, aygıtın sistem sürümüyle birlikte gelir. Her sürüm bir **API düzeyi** taşır ve bir API'nin hangi düzeyde eklendiği bellidir. Uygulama, eklendiği düzeyden eski bir aygıtta o API'yi çağırırsa çağrı karşılanmaz. Bu sorunun bir çözümü uyumluluk kitaplığıdır: çerçeve API'sinin karşılığını uygulamayla birlikte taşır ve eski aygıtta o karşılık çalışır. Karşılık çoğu zaman isteneni birebir vermez, ona benzer bir davranış verir.

Platformda bu karar uygulama kodunda sürüm denetimiyle verilir. Aşağıdaki parça sadeleştirilmiş bir örnektir. Platform sınıfı içe aldığı için derlenmez ve çıktısı iddia edilmez.

```kotlin
// Platform kodu: aygit API duzeyine gore cerceve cagrisi ya da uyumluluk karsiligi
import android.os.Build

fun applyFeature() {
    if (Build.VERSION.SDK_INT >= 33) {
        // cerceve API'si dogrudan cagrilir
    } else {
        // uyumluluk kitapligindaki karsilik cagrilir
    }
}
```

Model, platformun bu kuralını kurar. Aşağıdaki yardımcı dosya üç girdi alır: API'nin eklendiği düzey, aygıtın düzeyi ve uyumluluk kitaplığının karşılık sunduğu API'ler. Aygıtın düzeyi eşit ya da yüksekse çerçeve API'si istenen biçimde verilir. Düşükse ve karşılık varsa verilen karşılıktır. İkisi de yoksa istek reddedilir. Dosya çıktısızdır ve sonraki ölçülen bloklarla birlikte derlenir.

```kotlin
// Levels.kt — aygit API duzeyine gore cerceve cagrisini kurar
fun callFramework(name: String, since: Int, level: Int, compat: Set<String>): Outcome = when {
    level >= since -> Outcome.Given(name)
    name in compat -> Outcome.Given("$name-uyumluluk")
    else -> Outcome.Refused("api-yok")
}
```

Üç API istenir ve aygıtın düzeyi 31'dir. İlk API 26'da eklenmiştir, ikincisi 33'te eklenmiştir ve uyumluluk karşılığı vardır, üçüncüsü 34'te eklenmiştir ve karşılığı yoktur.

```kotlin
// Main.kt — cerceve API'si ve aygit API duzeyi
fun main() {
    val level = 31
    val compat = setOf("ApiB")
    val asks = listOf(
        Ask("dusuk-duzey-api", "ApiA", callFramework("ApiA", since = 26, level = level, compat = compat)),
        Ask("uyumlu-api", "ApiB", callFramework("ApiB", since = 33, level = level, compat = compat)),
        Ask("eksik-api", "ApiC", callFramework("ApiC", since = 34, level = level, compat = compat)),
    )
    for (ask in asks) {
        ask.report()
    }
    tally(asks)
}
```

```
dusuk-duzey-api: istenen=ApiA | verilen=ApiA -> tam
uyumlu-api: istenen=ApiB | verilen=ApiB-uyumluluk -> ikame
eksik-api: istenen=ApiC | neden=api-yok -> karsiliksiz
tam: 1
ikame: 1
bekleyen: 0
karsiliksiz: 1
```

Aynı aygıt, aynı kural, üç farklı karşılama. İlk API aygıtta vardır ve istendiği gibi verildi. İkinci API aygıtta yoktur, ama uyumluluk kitaplığı onun karşılığını taşıdığı için verilen `ApiB-uyumluluk` oldu; değer istenenden başkadır, bu yüzden ikame. Üçüncü API hem aygıtta hem uyumluluk kitaplığında yoktur ve istek karşılıksız kaldı. Bu dersin ölçütü olan karşılamayı, aygıtın düzeyi ve uyumluluk kitaplığının varlığı birlikte belirledi.

**UB2.** `ApiA`, `ApiB` ve `ApiC` örnek adlardır; düzeyleri model girdisidir. Gerçek bir API'nin hangi düzeyde eklendiği bu ölçümden çıkmaz.

## Sınırlayıcı Ölçüm

Karşılama kuralı sonucu ve eşitliği görür, nedeni görmez. Bu cümlenin iki yüzü vardır ve aşağıdaki ölçüm ikisini birlikte kurar. İlk yüzü, aynı karşılamanın iki ayrı nedenden gelmesidir: bildirim dosyasında bildirilen bir activity ve normal bir izin ikisi de tamdır, ama birincisi activity'nin bildirilmiş olmasından, ikincisi iznin normal olmasından gelir. İkinci yüzü, farklı iki karşılamanın aynı eksik API'den çıkabilmesidir: aynı API aynı düzeyde yoktur, birinde uyumluluk karşılığı vardır, ötekinde yoktur.

```kotlin
// Main.kt — kural nedeni gormez
fun openDeclared(name: String, declared: Set<String>): Outcome =
    if (name in declared) Outcome.Given(name) else Outcome.Refused("bildirimde-yok")

fun usePermission(name: String, normal: Set<String>): Outcome =
    if (name in normal) Outcome.Given(name) else Outcome.Waiting("kullanici")

fun main() {
    val asks = listOf(
        Ask("bildirilen-activity", "ProfileActivity", openDeclared("ProfileActivity", setOf("ProfileActivity"))),
        Ask("normal-izin", "INTERNET", usePermission("INTERNET", setOf("INTERNET"))),
        Ask("uyumluluk-var", "ApiD", callFramework("ApiD", since = 34, level = 31, compat = setOf("ApiD"))),
        Ask("uyumluluk-yok", "ApiD", callFramework("ApiD", since = 34, level = 31, compat = emptySet())),
    )
    for (ask in asks) {
        ask.report()
    }
    println(asks.filter { it.fulfillment == "tam" }.map { it.label })
}
```

```
bildirilen-activity: istenen=ProfileActivity | verilen=ProfileActivity -> tam
normal-izin: istenen=INTERNET | verilen=INTERNET -> tam
uyumluluk-var: istenen=ApiD | verilen=ApiD-uyumluluk -> ikame
uyumluluk-yok: istenen=ApiD | neden=api-yok -> karsiliksiz
[bildirilen-activity, normal-izin]
```

Son satır kuralın görüşünü gösterir: iki tam isteği tek listede toplar ve hangisinin hangi nedenden tam olduğunu söylemez. Aynı biçimde `uyumluluk-var` ile `uyumluluk-yok` aynı `ApiD` için aynı düzeyde başarısız olur; aralarındaki tek fark uyumluluk kitaplığının karşılığı taşıyıp taşımamasıdır, ve kural yalnız verilen değerin var olup olmadığını ve istenene eşit olup olmadığını görür. Neden, `neden=` ve `bekledigi=` alanında yazılıdır; kategori onu kullanmaz. Bu sınırı bilmek ölçümü okurken yardımcı olur: iki satırın karşılaması aynıysa nedenlerinin de aynı olduğu sonucu çıkmaz.

**UB3.** Bu ölçüm iki tam, bir ikame ve bir karşılıksız isteği içindir. Aynı nedenden gelen iki bekleyen ya da farklı nedenden gelen iki karşılıksız istek ölçülmedi.

## Özet

- Bu dersin ölçütü: **karşılama**. Platform her isteğe tam, ikame, bekleyen ya da karşılıksız bir yanıt verir ve kural bunu verilen değerden okur. Bu dersin karşılaması: **tam**; dersin odak istekleri olan bildirilen activity ve normal izin tam karşılandı; uyumluluk karşılığı ikamedir ve odak isteğe girmez.
- Sekiz isteğin dağılımı 3/2/2/1 çıktı: üç tam, iki ikame, iki bekleyen, bir karşılıksız. Kursun sonraki dersleri bu sayıyı atıfla anar.
- Mimari katmanlar aşağıdan yukarıya Linux çekirdeği, donanım soyutlama katmanı, Android çalışma zamanı ile yerel kitaplıklar, uygulama çerçevesi ve sistem uygulamalarıdır.
- Aygıtın API düzeyi bir çerçeve API'sini tam, uyumluluk kitaplığı varsa ikame, o da yoksa karşılıksız bırakır.
- Karşılama kuralı sonucu ve eşitliği görür, nedeni görmez: aynı karşılama iki nedenden, farklı iki karşılama aynı eksik API'den gelebilir.

## Sonraki Adım

Sekiz isteğin biri karşılıksız kaldı: bildirilmeyen bir activity hiç açılmadı. Sıradaki ders, `Activity'ler`, bu isteği yakından okur. Activity'nin ne olduğunu, bildirim dosyasında nasıl bildirildiğini ve başka bir uygulamanın onu açıp açamayacağını aynı kuralla ölçer.
