Android'de uygulama dosya yapısı — her şey nerede saklanır
Kısa bilgi: Kullanıcı APK'ları /data/app/ içinde, sistem APK'ları /system/app veya /system/priv-app içinde, uygulamanın özel verileri /data/user/0/
APK'lar ve sistem uygulamaları nerede bulunur
- Kullanıcı tarafından yüklenen APK'lar: /data/app/
-*/base.apk (AAB durumunda ek olarak split-APK'lar). /data/app dizinine genellikle root yetkisi olmadan erişim kapalıdır, ancak yol öğrenilip APK ADB üzerinden çıkarılabilir. - Sistem APK'ları: /system/app/ ve /system/priv-app/ — sistem bölümünde bulunur (root olmadan salt okunur), ayrıcalıklı uygulamalar priv-app içindedir. Sistem uygulamalarının güncellemeleri genellikle /data/app içine overlay olarak kurulur. ADB örnekleri:
- APK yolunu öğrenme: adb shell pm path com.example.app
- Kopyalama: adb shell cp /data/app/.../base.apk /sdcard/; adb pull /sdcard/base.apk
Uygulama Android App Bundle (AAB) üzerinden kurulduysa, cihazda tek bir .apk yerine birden fazla APK (base + split) bulunacaktır.
Önbellek ve optimize edilmiş kod (ART, odex, vdex)
- Çalışma zamanı optimize edilmiş ikili dosyalar (oat/odex/vdex) /data/app/.../oat/
/ içinde APK'nın yanında veya genel önbellek /data/dalvik-cache/ içinde bulunabilir. Bu dosyalar ART tarafından başlatma hızını artırmak için oluşturulur. - Uygulamanın dahili önbelleği vardır: /data/user/0/
/cache (veya /data/data/ /cache). Kod için API'de getCodeCacheDir() mevcuttur.
oat/odex/vdex dosyalarını elle düzenlemek uygulamayı çalışmaz hale getirebilir. Bu dosyaları tam bir anlayışa sahip olmadan silmeyin veya düzenlemeyin.
Uygulama verileri: internal (özel) ve external (Android/data, OBB)
- Özel veriler (sandbox): /data/user/0/
/ — alt dizinler files/, databases/, shared_prefs/, cache/, no_backup/. Erişime yalnızca uygulama süreci, root veya debuggable uygulamalar için run-as sahiptir. - Harici uygulamaya özgü: /storage/emulated/0/Android/data/
/ ve /storage/emulated/0/Android/obb/ /. Bu dizinlere uygulama erişebilir ve genellikle uygulama silindiğinde bunlar da silinir, ancak Android 10+ itibarıyla diğer uygulamaların bu dizinlere erişimi kısıtlanmıştır (Kapsamlı Depolama). Temel yollar ve erişim tablosu
| Yol | İçerik | Root olmadan erişim |
|---|---|---|
| /system/app, /system/priv-app | Önceden yüklenmiş APK'lar | Hayır (root olmadan salt okunur) |
| /data/app/.../base.apk (+ split) | Yüklenmiş APK'lar | Evet — pm path + adb pull ile |
| /data/user/0/<pkg>/ | files, databases, shared_prefs, cache | Yalnızca uygulama / run-as (debuggable ise) |
| /storage/emulated/0/Android/data/<pkg>/ | Uygulamaya özgü harici dosyalar | Kapsamlı Depolama ile sınırlı erişim |
Dosyalara erişim: root olmadan neler yapılabilir, root ile neler, alternatifler
- Root olmadan:
- adb shell pm path
— APK yolunu öğrenip ardından /sdcard üzerinden kopyalama. - adb shell run-as
— uygulama kimliğiyle çalışma (yalnızca debuggable derlemeler için): /data/data/ içindeki dosyaları ls/cp ile listeleme/kopyalama. - Verileri yasal şekilde dışa aktarmak için Backup API, FileProvider, MediaStore veya Storage Access Framework kullanma.
- adb shell pm path
- Root ile: Tüm bölümlere (/data, /system vb.) tam erişim, özel dosyalar kopyalanabilir ancak bu güvenli değildir ve garantiyi bozabilir.
Uygulama dosyalarını analiz etmek için AVD emülatörünü güvenle kullanın — çoğu zaman root ve /data erişimi sunar, ana cihazınıza zarar verme riski yoktur.
Sık yapılan hatalar
- Root olmadan /data dizininde ls çalıştırmaya çalışmak — Permission denied hatası alırsınız. pm path veya run-as (debuggable için) kullanın.
- Ana cihazda /system veya /data içindeki dosyaları elle değiştirmek — önyükleme veya veri kaybına neden olabilir.
- AAB durumunda tek bir base.apk beklemek — aslında birkaç split-apk bulunur.
SSS
- Root olmadan APK nasıl çıkarılır? — adb shell pm path
; ardından /sdcard/base.apk içine kopyalanan dosyayı adb pull ile çekin. - SharedPreferences nerede? — /data/user/0/
/shared_prefs/*.xml (erişim yalnızca uygulama/root/run-as ile). - OBB nerede? — /storage/emulated/0/Android/obb/
/main.<sürüm>. .obb; uygulama içinde Context.getObbDir() ile elde edilebilir.
Gerekirse, paketiniz ve Android sürümünüz için belirli bir ADB komut seti (APK çıkarma, veritabanı yedekleme, shared_prefs görüntüleme) hazırlayabilirim — paket adını ve root/root olmayan durumunu belirtin.