Uygulama dahili depolaması, cihazda yalnızca belirli bir uygulamanın izole depolama aracılığıyla erişebildiği özel bir alandır. Android Developers, 2026'ya göre, her uygulama diğer uygulamaların doğrudan erişemediği kendi sanal alan dizinini alır. Bu yaklaşım, verileri yetkisiz okumalara karşı korur ve mobil cihazların çoklu görev ortamında kararlı çalışmayı sağlar.
Önemli Noktalar
Context.getFilesDir(), getCacheDir() ve getDataDir() sağlarNSDocumentDirectory ve NSCachesDirectory kullanırUygulama dahili depolaması, işletim sisteminin kurulum sırasında her uygulamaya tahsis ettiği izole bir dizindir. Diğer uygulamalar ve kullanıcı, standart dosya yöneticileri aracılığıyla bu dizine erişemez. Sistem, uygulama kaldırıldığında bu dizin içindeki tüm verilerin tamamen silineceğini garanti eder. Bu yaklaşım, mobil işletim sistemleri güvenlik modelinin temelini oluşturur ve programlar arasında gizli bilgi sızıntısını önler.
Harici depolamadan (SD kart) farklı olarak, dahili depolama her zaman kullanılabilir ve ortam varlığını kontrol etme gerektirmez. Modern cihazlardaki NAND flaş bellek okuma ve yazma hızları, sıralı okumada 800–900 MB/s ve sıralı yazmada 200–300 MB/s'ye ulaşır ve SATA SSD'lerle karşılaştırılabilir. Ayrılan alanın boyutu, cihazın toplam kapasitesine ve üretici politikasına bağlıdır: 64 GB flaş belleğe sahip cihazlarda, uygulama gerektiğinde genişletilebilen 16 ila 64 MB başlangıç alanı alır.
Dahili depolama mimarisi Android ve iOS arasında farklılık gösterir. Android'te, her uygulama bir /data/data/<package_name>/ dizini alır ve sistem bunun içinde files/, cache/ ve databases/ alt dizinlerini oluşturur. iOS'te, uygulama Documents/, Library/ ve tmp/ dizinlerine sahip bir Sandbox kapsayıcısında çalışır ve her birinin kendi amacı ve yedekleme politikası vardır.
Geliştiriciler, uygulama dahili depolamasında veri kaydetmek için birkaç yönteme erişebilir. Her yöntem belirli bir görevi çözer ve belirli bir veri türü için uygundur. Doğru yöntemi seçmek, uygulama performansını, geliştirme kolaylığını ve kullanıcı veri güvenliğini doğrudan etkiler.
En düşük seviyeli yöntem, dosya dizinine doğrudan dosya yazmaktır. Bir uygulama, sanal alanı içinde herhangi bir dosya ve dizin oluşturabilir. Bu yöntem, medya dosyalarını, kullanıcı belgelerini ve yapılandırılmış organizasyon gerektirmeyen herhangi bir ikili veriyi depolamak için uygundur. Android'te, dizine Context.getFilesDir() çağrısıyla erişilir ve bu, uygulamanın dosya dizininin mutlak yolunu döndürür. iOS'te, NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) işlevi benzer bir amaca hizmet eder.
Anahtar-değer çiftlerini depolamak için Android, SharedPreferences ve Kotlin eşyordamları ve protobuf protokolüne dayalı daha modern DataStore sunar. SharedPreferences, verileri /data/data/<package>/shared_prefs/ dizini içindeki bir XML dosyasında depolar. Kullanım kolaylığına rağmen, SharedPreferences'ın dezavantajları vardır: senkron yazma UI iş parçacığında gecikmelere neden olabilir ve tür güvenliği eksikliği hata riskini artırır. DataStore, Flow tabanlı asenkron API ve protobuf şemaları aracılığıyla tam tür desteği sağlayarak bu sorunları çözer.
İlişkisel bağlantılara sahip yapılandırılmış veriler için SQLite veya Room sarmalayıcısı en uygun seçimdir. Veritabanı, databases/ dizini içinde tek bir dosyada depolanır ve tam SQL sözdizimini destekler. Room, tür güvenli API, otomatik şema geçişi ve eşyordam desteği sağlayan resmi bir Jetpack kütüphanesidir. Doğru indeksleme ile veritabanı boyutu, önemli performans kaybı olmadan birkaç gigabayta ulaşabilir. Mobil cihazlarda SQLite, modern bir amiral gemisi işlemcide saniyede 50.000 yazma işlemi gerçekleştirebilir.
Kimlik doğrulama belirteçleri ve şifreleme anahtarları gibi gizli verileri depolamak için Android, EncryptedSharedPreferences sağlar. Standart SharedPreferences üzerindeki bu sarmalayıcı, AES256-GCM-None kullanarak anahtarları ve değerleri otomatik olarak şifreler. Şifreleme, diske yazılmadan önce dosya düzeyinde gerçekleştirilir, bu nedenle cihaza fiziksel erişim olsa bile bir saldırgan içeriği okuyamaz. EncryptedSharedPreferences, tüm dosyaları şifrelemek için EncryptedFile'ı da içeren AndroidX Security kütüphanesinin bir parçasıdır.
Android SDK, Context sınıfı aracılığıyla dahili depolama ile çalışmak için bir dizi yöntem sağlar. Her yöntem, uygulama sanal alanı içinde belirli bir sistem dizinine bir yol döndürür. Kotlin örneğini kullanarak temel dosya yazma ve okuma işlemlerini inceleyelim.
Dahili dosya dizinine giden yolu almanın ana yöntemi context.filesDir'dir. /data/data/<package>/files/ dizinini gösteren bir File nesnesi döndürür. İlk erişimde, sistem gerekli tüm üst dizinleri otomatik olarak oluşturur. Dahili depolamadaki dosya boyutları açıkça sınırlandırılmamıştır, ancak toplam veri hacmi, genellikle toplam flaş bellek kapasitesinin %60–80'ini oluşturan /data bölümündeki kullanılabilir alanı aşmamalıdır.
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("Not içeriği")
val content = file.readText()
println("Okundu: $content")
writeText ve readText yöntemleri, Kotlin standart kütüphanesinin genişletme işlevleridir. Akışların açılmasını ve kapatılmasını otomatik olarak yöneterek bellek sızıntılarını önlerler. İkili veriler için, kodlama gerektirmeyen ve ByteArray dizileriyle çalışan writeBytes ve readBytes'i kullanın. Büyük dosyalarla çalışırken, arabelleğe alınmış akışların kullanılması önerilir: metin için BufferedReader ve BufferedWriter, ikili veriler için BufferedInputStream ve BufferedOutputStream.
Dosyaları bir hiyerarşi halinde düzenlemek için filesDir içinde alt dizinler oluşturun. Bu, verileri türe göre yapılandırmaya yardımcı olur: resimler, belgeler, dışa aktarma dosyaları. mkdirs() yöntemi, iç içe geçmiş olanlar da dahil olmak üzere yoldaki tüm eksik dizinleri oluşturur. Oluşturma işleminin başarılı olduğundan emin olun — yöntem yalnızca yeni dizinler oluşturulduğunda true döndürür. Oluşturma hataları çoğunlukla /data bölümünde yetersiz alan veya dosya sistemi düğümlerinin tükenmesiyle ilgilidir.
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("Dizin oluşturuldu")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
Büyük dosyaları yazmadan önce kullanılabilir alanı kontrol etmek için File.getFreeSpace() veya File.getUsableSpace() kullanın. İkinci yöntem, güvenlik kotalarını dikkate alarak geçerli uygulama için kullanılabilir bayt sayısını döndürür — çok kullanıcılı cihazlar bağlamında daha doğrudur. Kullanılabilir alan beklenen dosya boyutundan küçükse, kullanıcıya bir mesaj gösterin ve cihaz ayarlarında alan boşaltmayı önerin.
iOS'te, her uygulama izole bir Sandbox kapsayıcısında çalışır. Sistem, özel yetkiler olmadan sınırlarının dışına çıkmak için bir API sağlamaz. Dosya sistemiyle çalışmak için ana araç, Foundation framework'ünün FileManager sınıfıdır. Sandbox kapsayıcısı, her biri kendi yedekleme politikasına sahip birkaç standart dizin içerir.
Documents dizini, uygulama başlatmaları arasında kalıcı olması ve yedekten geri yüklenmesi gereken kullanıcı verileri içindir. iOS, bu dizini otomatik olarak iCloud ve iTunes yedeklerine dahil eder. urls(for:in:) yöntemi, istenen dizinin URL'lerinden oluşan bir dizi döndürür — dizideki ilk öğe birincil olandır.
let fm = FileManager.default
let docs = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = docs.appendingPathComponent("data.plist")
try data.write(to: fileURL)
FileManager, tam bir dosya işlemleri setini destekler: dosya oluşturma, kopyalama, taşıma, silme ve yeniden adlandırma. Her işlem hata fırlatabilir, bu nedenle tüm çağrılar do-catch yapısına sarılmalıdır. Dosya silmeye özellikle dikkat edin — işlem geri alınamaz ve removeItem(at:) sonrası veri kurtarma önceden yedek alınmadan imkansızdır.
Sandbox kapsayıcısındaki tüm veriler iCloud yedeklemesine dahil edilmemelidir. Örneğin, önbelleğe alınmış indirilen resimler veya geçici işleme dosyalarının geri yüklenmesi gerekmez — bir sonraki kullanımda yeniden oluşturulurlar. Bir dizini veya dosyayı yedeklemeden hariç tutmak için isExcludedFromBackup özniteliğini true olarak ayarlayın. Apple, iCloud depolama kullanımını en aza indirmek ve kurtarma süresini kısaltmak için uzaktan geri yüklenebilen verilerin her zaman yedeklemeden hariç tutulmasını önerir.
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
Mobil cihazdaki her depolama türünün kendi amacı ve kullanım kuralları vardır. Bu farklılıkları anlamak, geliştiricinin her veri türü için doğru yeri seçmesine yardımcı olur. Aşağıda, bir uygulama için mevcut olan üç ana depolama türünün bir karşılaştırması bulunmaktadır.
| Özellik | Internal Storage | Önbellek Dizini | External Storage |
|---|---|---|---|
| Diğer uygulamalara görünürlük | Gizli | Gizli | Erişilebilir |
| Uygulama kaldırıldığında silme | Tam | Tam | Konuma bağlı |
| Yedekleme | Android — hayır, iOS — evet (Documents) | Hayır | Sadece senkronizasyonda |
| Ortam olmadan kullanılabilirlik | Her zaman | Her zaman | SD kart gerekli |
| Veri kaybı riski | Minimum | Yüksek | Orta |
| Önerilen dosya boyutu | 100 MB'a kadar | 50 MB'a kadar | Herhangi |
Dahili depolama, diğer programlar tarafından erişilememesi gereken uygulama yapılandırmalarını, veritabanı dosyalarını ve kullanıcı belgelerini depolamak için idealdir. Önbellek dizini, bir sonraki kullanımda yeniden oluşturulabilen geçici dosyalar içindir: indirilen resimler, API yanıtları, ara işleme verileri. Harici depolama, büyük medya dosyaları (fotoğraf, video, müzik) ve kullanıcının diğer uygulamalarla paylaşılan erişim yoluyla paylaşmak istediği veriler için en uygundur.
Depolama türü seçimi, Google Play ve App Store'daki uygulama puanını da etkiler. Temizlik yapmadan dahili depolamada büyük miktarda veri depolayan uygulamalar olumsuz yorumlar alır: kullanıcılar yer olmamasından şikayet eder. App Annie araştırmasına göre, kullanıcıların %62'si, temizleme seçeneği olmadan cihazın dahili depolamasının 500 MB'ından fazlasını kaplayan bir uygulamayı siler.
Uygulama dahili depolamasının doğru yönetimi, performansı, güvenliği ve kullanıcı deneyimini iyileştirir. Aşağıdaki öneriler, resmi Android ve iOS dokümantasyonunun yanı sıra milyonlarca kuruluma sahip uygulamalar geliştirme konusundaki pratik deneyime dayanmaktadır.
Uç durum testlerine özellikle dikkat edilmelidir. Dahili depolama dolduğunda, yazma işlemi beklenmedik şekilde kesintiye uğradığında (uygulama çökmesi, gelen çağrı) ve iOS yedekten geri yüklenirken uygulama davranışını kontrol edin. Bu senaryoların her birinde, veriler tutarlı kalmalı veya son kararlı duruma geri yüklenmelidir. İşlem dosyaları kullanın: verileri geçici bir dosyaya yazın, ardından atomik olarak hedefe yeniden adlandırın. Bu, yazma hatası durumunda bozuk verilerin okunmasını önler.
Kullanıcı kontrolünü unutmayın. Uygulama ayarlarında geçici verileri temizleme ve kullanılan dahili depolama hacmini görüntüleme seçeneği sağlayın. Google Play Console'a göre, bu özelliğe sahip uygulamalar “Performans” kategorisinde %18 daha fazla olumlu yorum alır.
Sıkça Sorulan Sorular
Uygulamanın dahili depolamasındaki tüm veriler tamamen silinir. İşletim sistemi, veritabanları, ayarlar ve geçici dosyalar dahil hiçbir kalıntı dosya kalmamasını garanti eder. Harici depolamadaki veriler kalabilir.
Cihaza root erişimi olmadan, diğer uygulamalar başka bir uygulamanın Internal Storage'ındaki dosyaları okuyamaz. Android'te bunun için süper kullanıcı ayrıcalıkları gerekirken, iOS'te Sandbox aracılığıyla çekirdek düzeyinde yalıtım sağlanır.
Açık bir sınır yoktur, ancak toplam hacim /data bölümündeki kullanılabilir alanla sınırlıdır. Uygulama başına 100 MB'ı aşmamanız önerilir — daha büyük hacimler harici depolamaya veya buluta yerleştirilmelidir.
filesDir, kalıcı uygulama verileri içindir ve sistem tarafından yalnızca gerekli olduğunda silinir. cacheDir, belleğin azalması durumunda sistemin silebileceği geçici dosyalar içindir. Sistem, cacheDir'in kalıcılığını garanti etmez.
Internal Storage'tan SD karta doğrudan kopyalama, güvenlik politikası tarafından yasaktır. Kullanıcının onayıyla paylaşılan depolamada veri kopyaları oluşturmak için Android 10+ üzerinde MediaStore API veya SAF (Storage Access Framework) kullanın.
Ö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