Структура файлов приложений на Android — где что хранится
Коротко: пользовательские APK лежат в /data/app/, системные — в /system/app или /system/priv-app, приватные данные приложения — в /data/user/0/
Где лежат 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 для легального экспорта данных.
- adb shell pm path
- С 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.