Структура файлов приложений на Android — где что хранится

Коротко: пользовательские APK лежат в /data/app/, системные — в /system/app или /system/priv-app, приватные данные приложения — в /data/user/0/ (или /data/data/), а внешние app‑specific файлы — в /storage/emulated/0/Android/data// и /Android/obb//. Ниже — практические команды и правила доступа.

Где лежат APK и системные приложения

  • Пользовательские установленные APK: /data/app/-*/base.apk (плюс split‑APK при AAB). Доступ к /data/app обычно закрыт без root, но путь можно получить и APK извлечь через ADB.
  • Системные APK: /system/app/ и /system/priv-app/ — находятся в системном разделе (read‑only без root), привилегированные приложения в priv-app. Обновления системных приложений часто ставятся в /data/app как overlay. Примеры ADB:
  • Узнать путь APK: adb shell pm path com.example.app
  • Скопировать: adb shell cp /data/app/.../base.apk /sdcard/; adb pull /sdcard/base.apk

Если приложение установлено из Android App Bundle (AAB), на устройстве будет несколько APK (base + split), а не один единый .apk.

Кэш и оптимизированный код (ART, odex, vdex)

  • Оптимизированные бинарные файлы рантайма (oat/odex/vdex) могут лежать рядом с APK в /data/app/.../oat// или в общем кэше /data/dalvik-cache/. Эти файлы генерирует ART для ускорения запуска.
  • Приложение имеет внутренний кэш: /data/user/0//cache (или /data/data//cache). Для кода есть getCodeCacheDir() в API.

Редактирование oat/odex/vdex вручную может сделать приложение неработоспособным. Не удаляйте и не редактируйте эти файлы без полной понимания.

Данные приложений: internal (приватные) и external (Android/data, OBB)

  • Приватные данные (sandbox): /data/user/0// — подкаталоги files/, databases/, shared_prefs/, cache/, no_backup/. Доступ имеет только сам процесс приложения, root или run-as для debuggable.
  • External app‑specific: /storage/emulated/0/Android/data// и /storage/emulated/0/Android/obb//. Эти каталоги доступны приложению и обычно удаляются при удалении приложения, но начиная с Android 10+ доступ к ним для других приложений ограничен (Scoped Storage). Таблица основных путей и доступа
ПутьСодержимоеДоступ без root
/system/app, /system/priv-appПредустановленные APKНет (read‑only без root)
/data/app/.../base.apk (+ split)Установленные APKДа — через pm path + adb pull
/data/user/0/<pkg>/files, databases, shared_prefs, cacheТолько app / run-as (если debuggable)
/storage/emulated/0/Android/data/<pkg>/App‑specific external filesДоступ ограничен Scoped Storage

Доступ к файлам: что можно без root, что — с root, альтернативы

  • Без root:
    • adb shell pm path — узнать путь APK и затем скопировать через /sdcard.
    • adb shell run-as — работать от имени приложения (только для debuggable builds): ls/cp файлов внутри /data/data/.
    • Использовать Backup API, FileProvider, MediaStore или Storage Access Framework для легального экспорта данных.
  • С root: полный доступ ко всем разделам (/data, /system и т.д.), можно копировать приватные файлы, но это небезопасно и может нарушать гарантию.

Для анализа файлов приложений безопасно используйте эмулятор AVD — в нём часто есть root и доступ к /data без риска повредить основное устройство.

Частые ошибки

  • Пытаются ls /data без root — получат Permission denied. Используйте pm path или run-as (для debuggable).
  • Меняют файлы в /system или /data вручную на основном устройстве — могут потерять загрузку или данные.
  • Ожидают единый base.apk при AAB — на деле несколько split‑apk.

FAQ

  • Как извлечь APK без root? — adb shell pm path ; затем adb pull на скопированный в /sdcard/base.apk.
  • Где SharedPreferences? — /data/user/0//shared_prefs/*.xml (доступ только приложению/root/run-as).
  • Где OBB? — /storage/emulated/0/Android/obb//main...obb; можно получить через Context.getObbDir() внутри приложения.

Если нужно, подготовлю конкретный набор команд ADB (экстракт APK, бэкап БД, просмотр shared_prefs) под ваш пакет и версию Android — укажите package name и статус root/non‑root.