Mobil cihaz dosya sistemi, flash bellek üzerindeki verileri düzenleme, depolama ve adlandırma yöntemidir. Android Developers, 2026'ya göre, mobil işletim sistemleri, her uygulamanın izole bir sandbox içinde çalıştığı hiyerarşik bir dizin yapısı kullanır. Bu mimari, yetkisiz veri erişimini önler ve birden fazla uygulama aynı anda çalışırken sistemin kararlı şekilde çalışmasını sağlar.
Önemli Noktalar
Dosya sistemi, fiziksel ortamda verilerin nasıl yazıldığını, okunduğunu ve düzenlendiğini yöneten işletim sisteminin bir yazılım bileşenidir. Mobil cihazlarda dosya sistemi kritik öneme sahip işlevleri yerine getirir: flash bellek alanı yönetimi, izinlere dayalı dosya erişim kontrolü, çökmelerden sonra kurtarma için değişikliklerin günlüğe kaydedilmesi ve NAND flash belleğin özelliklerini dikkate alarak yazma optimizasyonu.
Masaüstü işletim sistemlerinin aksine, mobil dosya sistemleri flash belleğin sınırlı yeniden yazma döngüsü sayısı dikkate alınarak tasarlanır. NAND hücreleri sınırlı sayıda silme işlemine dayanabilir — TLC ve MLC bellek için sırasıyla 3.000 ila 10.000 döngü. Depolama ömrünü uzatmak için dosya sistemleri aşınma dengeleme mekanizmaları ve TRIM komutları kullanır. Samsung tarafından özellikle flash bellek için geliştirilen F2FS, NAND dizisi geometrisini dikkate alır ve parçalanmayı ve blok silme işlemi sayısını en aza indirecek şekilde verileri yerleştirir.
Modern mobil cihazlar birden çok dosya sisteminin bir kombinasyonunu kullanır. Dahili bellek (/data bölümü) Android'de EXT4 veya F2FS, iOS'ta APFS olarak biçimlendirilir. SD kartlar geleneksel olarak 4 GB'tan büyük dosyalar için exFAT veya maksimum uyumluluk için FAT32 kullanır. Android'de /system bölümü genellikle salt okunur olarak bağlanır ve EXT4 veya EROFS (Enhanced Read-Only File System) — Huawei tarafından sistem bölümü boyutunu küçültmek için geliştirilmiş sıkıştırılmış bir dosya sistemi kullanır.
Android'in dizin hiyerarşisi, / köküyle Linux yapısına dayanır. Her bölümün kendi dosya sistemi, erişim izinleri ve amacı vardır. Bir uygulama yalnızca sınırlı bir dizi dizine erişebilir — geri kalanı root izinleriyle korunur.
| Yol | Bölüm | Dosya Sistemi | Uygulama Erişimi |
|---|---|---|---|
| /data | Kullanıcı Verisi | F2FS / EXT4 | Yalnızca kendi sandbox'ı |
| /system | Sistem | EROFS / EXT4 | Salt okunur (root) |
| /sdcard | Harici | exFAT / FAT32 | İzinle |
| /cache | Önbellek | EXT4 | Yalnızca root |
| /vendor | Satıcı | EROFS / EXT4 | Salt okunur (root) |
/data bölümü, kullanıcı verilerini, yüklenen uygulamaları ve ayarlarını depolamak için ana bölümdür. Her uygulama /data/data/<package_name>/ yolunda kendi dizinini alır. Bu dizinin içinde sistem otomatik olarak alt dizinler oluşturur: uygulama dosyaları için files/, geçici dosyalar için cache/, SQLite veritabanları için databases/, SharedPreferences için shared_prefs/. Bu dizine erişim izinleri uygulama yüklenirken ayarlanır ve root erişimi olmadan değiştirilemez. /data bölümü çoğu modern cihazda F2FS olarak biçimlendirilir ve EXT4'e kıyasla %40'a kadar daha yüksek rastgele yazma hızı sağlar.
/system bölümü, işletim sistemini, sistem uygulamalarını ve kütüphanelerini içerir. Bu bölüm, sistem dosyalarının kazara veya kötü niyetli değiştirilmesini önlemek için salt okunur olarak bağlanır. Android 10+ ve Project Treble destekli cihazlarda /system bölümü dinamiktir ve tam bir yeniden flaşlama gerektirmeden OTA paketleri aracılığıyla güncellenebilir. Uygulamalar için /system bölümüne erişilemez — yazma girişimi bir SecurityException oluşturur. Ancak uygulamalar, uygun izinlere sahiplerse sistem yazı tipleri ve yapılandırma dosyaları gibi /system'den bazı dosyaları okuyabilir.
/sdcard bağlama noktası, öykünülmüş veya fiziksel harici depolama bölümüne sembolik bir bağlantıdır. SD kartı olmayan cihazlarda /sdcard, paylaşımlı erişim için belirlenmiş /data içindeki bir alt bölümü gösterir. Bu bölüm, cihaz MTP protokolü aracılığıyla bir bilgisayara bağlandığında kullanıcı tarafından görülebilir. Uygulamalar /sdcard'a READ_EXTERNAL_STORAGE ve WRITE_EXTERNAL_STORAGE izinleri aracılığıyla ve Android 10'dan itibaren MediaStore API'sini kullanan Scoped Storage aracılığıyla erişir. /sdcard'ın boyutu tipik olarak toplam flash belleğin %60–80'idir ve geri kalanı /data bölümü için ayrılmıştır.
iOS'ta dosya sistemi, uygulamaların Sandbox konteynerleri aracılığıyla düzenlenir. Her uygulama, XNU çekirdek seviyesinde erişimi kısıtlanmış izole bir dizin alır. Kullanıcı bölümü, iOS 10.3'te tanıtılan APFS'yi (Apple File System) kullanır. APFS, anlık görüntüleri, dosya klonlamayı ve dosya düzeyinde şifrelemeyi destekler ve bu da onu mobil cihazlar için optimal hale getirir.
Bir iOS Sandbox konteyneri dört ana dizin içerir: Documents, Library, tmp ve SystemData. Her dizinin kendi yedekleme politikası, veri saklama süresi ve erişim seviyesi vardır. Documents otomatik olarak iCloud ve iTunes yedeklemelerine dahil edilir. Library, Caches (yedeklenmez), Preferences (yedeklenir) ve Application Support (yedeklenir) alt dizinlerini içerir. tmp dizini, depolama azaldığında iOS'un silebileceği geçici dosyalar içindir — yedeklemelere dahil edilmez. SystemData sistemin kendisi tarafından kullanılır ve standart API'ler aracılığıyla uygulamalar tarafından erişilemez.
let fm = FileManager.default
let documents = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let caches = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
let appSupport = fm.urls(
for: .applicationSupportDirectory,
in: .userDomainMask
).first!
Her Sandbox konteyner dizininin kendi koruma sınıfı vardır. iOS dört sınıfı destekler: Tam Koruma (cihaz kilitliyken dosyaya erişilemez), Açık Değilse Korumalı (önceden açılmış dosyalara kilitliyken erişilebilir), İlk Kullanıcı Kimlik Doğrulamasına Kadar Korumalı (ilk kilit açma işleminden sonra dosyalara erişilebilir) ve Koruma Yok (cihaz başlatıldıktan sonra dosyalara her zaman erişilebilir). Varsayılan olarak, Documents ve Library'deki tüm dosyalar Tam Koruma sınıfını alır ve kullanıcı verilerinin maksimum düzeyde korunmasını sağlar. Bir dosya oluştururken, bir arka plan uygulamasının cihaz kilitliyken verilere erişmesi gerekiyorsa farklı bir koruma sınıfı açıkça belirtilebilir.
Mobil cihazlarda dosyalara erişim kontrolü, Android ve iOS arasındaki temel bir farktır. Android, uygulama izolasyonu için uzantılarla birlikte klasik Linux izin modelini (okuma, yazma, çalıştırma) kullanır. iOS, her uygulamanın izole bir konteynerde çalıştığı ve özel mekanizmalar olmadan diğer uygulamaların dosyalarına erişemediği daha katı bir Sandbox modeli kullanır.
Android'de her uygulama ayrı bir UID (Kullanıcı Kimliği) ile çalıştırılır. Bir uygulamanın sandbox'ında oluşturduğu tüm dosyalar bu UID'ye aittir ve diğer uygulamalar tarafından görülmez. Paylaşılan dizinlere (harici depolama) erişmek için uygulamanın READ_EXTERNAL_STORAGE ve WRITE_EXTERNAL_STORAGE izinlerini talep etmesi gerekir. Android 11'den itibaren izinler çalışma zamanında talep edilmelidir ve targetSdkVersion 30+ olan bir uygulama, diğer uygulamaların dosyalarına erişmek için SAF kullanmalıdır. İzin modelinin ihlali, standart bir try-catch bloğu tarafından işlenen bir SecurityException'a neden olur. Google Play, yayınlamadan önce uygulamanın izin politikasına uygunluğunu otomatik olarak kontrol eder.
if (ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
REQUEST_CODE
)
}
iOS Sandbox, XNU çekirdek seviyesinde uygulanır ve uygulamanın konteynerini terk etmesine izin vermez. Uygulama, Document Picker aracılığıyla harici bir dosya URI'sine erişim elde etse bile, işletim sistemi orijinaline doğrudan erişim sağlamak yerine uygulamanın konteynerinde geçici bir kopya oluşturur. Uygulamalar arasında dosya paylaşımı için iOS, bir uygulamanın konteynerinden diğerine dosya kopyalayan Share Sheet ve UIActivityViewController mekanizmalarını kullanır. Kimlik bilgilerinin (token, parola, anahtar) güvenli bir şekilde saklanması için iOS, Anahtar Zinciri'ni sağlar — çekirdek seviyesinde sistem tarafından erişilebilen şifrelenmiş bir depolama alanı. Anahtar Zinciri, Sandbox konteynerinin bir parçası değildir ve ayrı bir securityd arka plan programı tarafından yönetilir, bu da uygulamanın güvenliği ihlal edilse bile ek bir koruma katmanı sağlar.
Dosya sistemi seçimi, depolama performansını ve güvenilirliğini doğrudan etkiler. Her dosya sisteminin kendi mimarisi, optimizasyonları ve sınırlamaları vardır. Bir geliştiricinin bu farklılıkları anlaması, uygulamanın farklı cihazlardaki davranışını tahmin etmek için faydalıdır.
Uygulama geliştirirken, farklı dosya sistemlerinin farklı dosya adı uzunluğu sınırlamaları (EXT4 ve F2FS için 255 bayt, APFS için 255 Unicode karakter), maksimum dosya boyutu ve özel karakter desteği olduğunu unutmayın. Örneğin APFS, emojiler dahil Unicode karakterlerine dosya adlarında izin verirken EXT4 ASCII ile sınırlıdır. Uygulamanız farklı dillerde adlara sahip dosyalar oluşturuyorsa, tüm hedef cihazlarda test edin — APFS'de doğru oluşturulan bir dosya adı EXT4'te kesilebilir.
Mobil cihaz dosya sistemiyle güvenilir çalışma için birkaç temel kurala uyulması gerekir. Bunlar, geliştiricilerin tipik hatalarının ve resmi dokümantasyon önerilerinin analizine dayanır.
context.filesDir, iOS'ta NSSearchPathForDirectoriesInDomains. Sabit kodlanmış yollar işletim sistemi sürümleri ve cihazlar arasında değişirFile.getUsableSpace() ve iOS'ta URLResourceValues.volumeAvailableCapacityKey kullanın. Boş alan yetersizse kullanıcıyı uyarınisExcludedFromBackup ile önbelleği yedeklemeden hariç tutun. Android'de geçici dosyalar için cacheDir'i tercih edinPlatformlar arası farklılıklara özellikle dikkat edin. Android'de dosya yolları eğik çizgi kullanır (/data/data/.../files/), iOS'ta — URL şeması (file:///var/mobile/.../Documents/). Uygulamanız çapraz platform bir framework (Flutter, React Native, Kotlin Multiplatform) kullanıyorsa, dosya işlemlerini platform adaptörleri aracılığıyla birleştirin. Örneğin Flutter, platforma özgü kod yazmadan her iki platformda da Documents veya filesDir yolunu döndüren path_provider paketini sağlar. Yolları asla dize işlemleriyle birleştirmeyin — farklı platformlarda ayırıcıları doğru şekilde işleyen File.join() veya URL.appendingPathComponent() kullanın.
Sıkça Sorulan Sorular
Modern Android cihazlarda (11+) /data bölümü için F2FS kullanılır. Eski cihazlarda — EXT4. /system bölümü EROFS veya EXT4 kullanır. SD kartlar kapasiteye bağlı olarak exFAT veya FAT32 olarak biçimlendirilir.
APFS anlık görüntüleri, dosya klonlamayı, dosya düzeyinde şifrelemeyi ve sağlama toplamlarını destekler. EXT4 günlük kaydına ve daha geniş uyumluluğa sahiptir. APFS SSD'ler için optimize edilmiştir, EXT4 ise evrensel bir dosya sistemidir.
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) kullanın. Bu yöntem, ilk öğesi uygulamanın Sandbox konteynerinin ana Documents dizini olan bir URL dizisi döndürür.
Scoped Storage, Android 10'da tanıtılan ve doğrudan dosya sistemi erişimini kısıtlayan bir erişim modelidir. Uygulamalar izin olmadan yalnızca kendi dosyalarını okuyabilir. Paylaşılan medya dosyalarına erişmek için MediaStore API'si kullanılır.
exFAT, 4 GB'tan büyük dosyaları desteklediği için 32 GB'tan büyük SD kartlar için tercih edilir. FAT32, eski cihazlarla maksimum uyumluluk sağlar ancak dosya boyutunu 4 GB ile sınırlar.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun