Где хранятся данные приложений андроид
В прошлом своем посте я писал о создании всплывающих менюшек, сегодня же мы поговорим о более важной теме такой, как хранение данных. В android есть несколько способов хранения данных: общие настройки, бд и тд. В этом посте я расскажу о том как хранить данные в БД.
В качестве БД android использует встраиваемую SQLite. SQLite очень быстрая база, поэтому ее использование на мобильной платформе не приводит к резкому уменьшению производительности. Перейдем к описанию кода. Гугл позаботился о наших нервах и написал небольшой класс утилиту SQLiteOpenHelper.
public class DbOpenHelper extends SQLiteOpenHelper
private static final int DB_VERSION = 1;
private static final String DB_NAME = "test" ;
public static final String TABLE_NAME = "users" ;
public static final String LOGIN = "login" ;
public static final String PASSW = "passw" ;
private static final String CREATE_TABLE = "create table " + TABLE_NAME + " ( _id integer primary key autoincrement, "
+ LOGIN + " TEXT, " + PASSW + " TEXT)" ;
public DbOpenHelper(Context context) super(context, DB_NAME, null ,DB_VERSION);
>
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) sqLiteDatabase.execSQL(CREATE_TABLE);
>
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) >
>
* This source code was highlighted with Source Code Highlighter .
При создании экземпляра класса DbOpenHelper будет проверено, существует ли база с именем test, если существует, то будет вызван метод onUpgrade, если нет то onCreate в котором мы создаем таблицу users(обычно в этом методе создают таблицы и инициализируют их значениями по умолчанию). У класса SQLiteOpenHelper есть методы getReadableDatabase и getWritableDatabase, которые возвращают экземпляр класса SQLiteDatabase. С помощью этого экземпляра мы и будет работать с БД. У него есть все нужные нам методы: insert, update, query, delete и тд.
Напишем небольшое приложение сохраняющее логин и пароль в базу
public class TestActivity extends Activity
EditText loginEditText = null ;
EditText passEditText = null ;
Button saveButton = null ;
@Override
public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);
setContentView(R.layout.main);
loginEditText = (EditText) findViewById(R.id.login);
passEditText = (EditText) findViewById(R.id.passw);
saveButton = (Button) findViewById(R.id.btn1);
saveButton.setOnClickListener( new View.OnClickListener() public void onClick(View view) DbOpenHelper dbOpenHelper = new DbOpenHelper(TestActivity. this );
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(DbOpenHelper.LOGIN,loginEditText.getText().toString());
cv.put(DbOpenHelper.PASSW,passEditText.getText().toString());
db.insert(DbOpenHelper.TABLE_NAME, null ,cv);
db.close();
loginEditText.setText( "" );
passEditText.setText( "" );
>
>);
>
>
* This source code was highlighted with Source Code Highlighter .
При использовании приложений под Android иногда появляются вопросы: «А где приложение хранит созданные файлы?», «Можно ли до них достучаться?» и «Удалятся ли файлы при удалении приложения?» Давайте попробуем посмотреть, где же приложение может хранить свои данные и какие последствия это имеет для пользователя.
Внутреннее хранилище данных
Смысл следует непосредственно из названия. Внутреннее хранилище (internal storage) располагается всегда в памяти смартфона вне зависимости от того, есть ли возможность установки карты памяти (и тем более того, вставлена ли она). Эта область памяти является защищенной. Находится в системном разделе /data. По умолчанию все файлы, которые там располагаются, доступны только тому приложению, которое их создало. Разумеется, можно сделать файлы доступными для других приложений, но это надо делать специально. Если приложение не открывает файлы для доступа извне, достучаться к ним можно будет только получив root.
Назначение хранилища понятно: внутренние защищенные данные, к которым не должно быть нерегламентированного доступа. Проблемы (с точки зрения пользователя) могут быть в следующих случаях:
- Неоправданно большой объем данных. Хочется вынести данные на карту памяти, чтобы сэкономить внутреннее пространство для других нужд, а приложение не дает.
- По мнению пользователя, регламент доступа к данным должен быть другим, не таким, как предлагает приложение.
Пример: приложение «Лекции по истории России». В приложении хороший контент (и по содержанию, и по качеству звука). Но сохраняется он во внутреннюю память. На бюджетных устройствах, где этой памяти мало, становится затруднительным закачать заранее много лекций, а потом, отключившись от интернета, слушать их. Второй проблемой становится собственно регламент доступа к данным. Даже если ограничиться тематикой истории, у меня есть аудиофайлы, полученные из трех источников: данное приложение, подкасты и аудиоверсии роликов с youtube. Хочется взять и объединить навек в их земной юдоли под владычеством всесильным Властелина Мордора их все в единый плейлист, и слушать его одним аудиоплеером. Но на смартфоне без root это сделать невозможно.
Внешнее хранилище «личных» данных
С точки зрения разработчика, кроме внутреннего хранилища данных, для персональных целей приложения есть еще внешнее хранилище. Оно необязательно размещается на карте памяти. Это может быть и внутренняя память смартфона, но весь раздел с такими данными размещается в общем доступе. В корне раздела есть папка Android/data, а в ней — подпапки с именами пакетов приложений.
Плюсы такого подхода очевидны: данные доступны извне для целей пользователя. А если это карта памяти, то и емкость может быть ограничена только вашими финансами (в продаже уже можно найти карты памяти на 400 гигабайт). Минусы тоже понятны: в любой момент любое приложение (конечно, имеющее разрешение на доступ к «внешним» данным) может взять и стереть чужие файлы. Также файлы будут удалены системой при удалении приложения (или при очистке его данных).
Пример приложения: подкаст-менеджер BeyondPod (более-менее свежей версии, раньше файлы хранились по-другому). Пользователь имеет доступ к скачанным подкастам и может легко удалять их (например, в целях экономии места) или слушать их во внешнем плеере.
Общее внешнее хранилище
Располагается в корне «внешнего» раздела на одном уровне с папкой «Android». Предназначается для хранения данных, разделяемых между разными приложениями. Обычно в документации Google в качестве примера приводят картинки (фото с камеры — папка DCIM). Основная проблема данных файлов: они никогда не удаляются автоматически. Даже если приложение вы удалили.
Пример: мессенджер Telegram. После того, как вы удалили приложение, загруженные файлы никуда не исчезают. Они продолжают спокойно лежать на накопителе данных, занимая драгоценное место.
Как можно удалить файлы, не удаляя приложения
Здесь важно ввести еще одну классификацию файлов приложений. Она справедлива для внутреннего хранилища и для внешнего хранилища личных данных. Все данные делятся на два типа: собственно данные и кэш.
Данные (папка data) — некие файлы, которые, по логике Google, нужны для постоянной работы с ними. Если полностью их удалить, то приложение поведет себя точно так же, как если бы его переустановили (удалили и заново установили). Частичное удаление файлов может не привести ни к каким неприятным последствиям. Но важно понимать, какие конкретно данные вы удаляете (например, очевидно, что скачанные файлы подкастов можно удалять совершенно свободно — это не повлияет на работоспособность подкаст-менеджера).
Кэш — временные данные, которые сформированы в ходе работы приложения и нужны для ускорения этой работы. Например, данные, которые часто нужны в интернете, загружаются и в дальнейшем вместо загрузки открываются локально (разумеется, кэш может обновляться, чтобы не показывать устаревшие данные). Удалять кэш любого приложения можно совершенно спокойно, это штатная операция.
Очистка памяти и кэша вызывается из настроек приложения. Кнопка «Очистить кэш» очищает только кэш, а кнопка «Очистить данные» — и кэш, и данные приложения.
Удаление файлов приложения из общего внешнего хранилища выполняется только вручную. Более того, даже оценка того, от какого приложения эти файлы остались, тоже выполняется вручную.
Тема поможет вам найти ответы на такие вопросы как:
В теме нет куратора, поэтому чтобы добавить что то в шапку, пользуйтесь кнопкой жалоба.
Насколько я понимаю, расположение универсальное для разных версий андроид 4 5 6 7 8 9 10 и скорее всего, даже андроид 11, с той разницей что там появляются изолированные индивидуальные хранилища scoped storage для каждого приложения - чтобы не подглядывали)Начну с тех директорий, которые доступны без Рута (сохранения игр зачастую там не хранятся):
А именно это флешка, и внутреннее хранилище, в которое обычно сохраняются фотографии (папка DCIM).
Разные приложения могут создавать свою папку в корне,
И наконец, то, что нас может заинтересовать, папка Android, в которой может храниться информация и кеш с игр (внутри папки obb). Но опять же, важные данные они тут обычно не хранят.
Самое интересное (нужное) хранится в разделе data, получить доступ туда можно при помощи Рут привилегий для root файлового менеджера, например total commander.
Зайдя с его помощью в корневую папку вы увидите разделы устройства и символические ссылки.
Раздел data.
Итак, из чего он состоит?
А состоит он, из двух отделений, из самого раздела data, где и находится почти вся инфа на телефоне и из внутренней папки media, которую вы знаете как "внутренняя память", к которой у вас есть доступ и без Рута.
/storage/emulated/<0> ведет к вышеописанной /data/media
Хорошо,зашли мы в /data и там куча других папок, что в них?
А из них нам могут быть интересны такие:
/data/user/0 это символическая ссылка 0 профиля, то есть профиля владельца устройства ведущая на самом деле к настоящей папке /data/data
Есть в прошивках MIUI такая функция как второе пространство.
Это типа когда ты можешь дать другу телефон, и не боятся что он будет играть в твои игры или смотреть твои фотки.
Так вот, где хранятся данные второго пользователя?
Как раз таки тут в том числе, в
/data/user/и номер отличный от 0, (в папке user_de системные приложения)
Кстати, там же хранятся данные клонированного приложения первого пользователя.
Так вот тут в этой дата/дата и будут сейвы и прочее,
но как теперь найти приложение которое я ищу?
Вам нужно узнать имя установленного пакета приложения:
На моей прошивке, имя пакета можно узнать в свойствах приложения (настройки телефона, приложения, о приложении)
Например Вацап будет хранить свои данные в папке com.whatsapp
Эту то папку вы и захотите сохранить.
Еще вам может понадобиться само приложение, .APK оно находится в /data/app
Кроме этого, еще может понадобиться obb кеш, который игра часто докачивает сама из интернета. Об том где его достать я писал в начале - внутренняя память ,андроид, затем папка обб /storage/emulated/<user_id>/Android/obb
В тотал коммандере, если нажать кнопку поиска, в строке поиска будет звездочка - это регулярное выражение, использовать так:Допустим надо вам найти папку содержащую слово kiwi, и не важно что еще спереди и сзади, поэтому пишите так
*kiwi*
И найдутся папки содержащие это слово где угодно.
На практике это полезно чтобы находить имя пакета приложения в папке app, так как там оно обычно с добавочной вставкой сбоку, для уникальности, а не для того, чтобы поиск ее не нашел.
Бэкап программ без root
Программ не требующих рут доступа не так уж и много, одна из них Helium, которая впрочем, требует для работы компьютер. Helium
В качестве альтернативы, можно синхронизировать часть данных: Сначала сохранить все что нужно, например, в облако через синхронизацию с - гугл аккаунтом и гугл диском. Таким образом можно сохранить лишь часть информации, например телефонные номера, фотографии, приложения и игры, в которых есть функция синхронизации с "Google play игры", подробней тут.
Если же вам требуется полный бекап лишь некоторых игр или приложений, которые не сохраняются в облаке или если вам нужен lucky patcher чтобы взламывать игры, но рут получать не хочется, подойдёт виртуальная среда с рутом - это как андроид в Андроиде)
VMOS Virtual Android on Android - Double Your System
Поэтому, когда все нужное сохранено, можете установить кастом Рекавери, например:
TWRP или CWM.
Обычно для этого требуется разблокировать загрузчик устройства, после чего вся информация которая не была сохранена будет утеряна. Подробнее вы можете найти в теме вашего устройства на 4pda.
В той же теме, наверняка будет инструкция, как получить Рут доступ, например через Magisk.
Однако, после этого возможно придется установить фикс, чтобы работал гугл пей и NFC оплата.
Если вы забрались так далеко, можете в теме вашего устройства посмотреть другие прошивки, на случай, если ваше устройства давно не обновлялось, и у него старые патчи безопасности. Обновление системы безопасности Android
C помощью этого кастом Рекавери забекапить нужную инфу. (Надо иметь ввиду, что там не всегда будут доступны для бэкапа абсолютно все разделы, но нужные, с прошивкой и данными должны быть).
Обычно бэкапят Data, System, Boot и Vendor (если есть). Есть и другие разделы, содержащие например IMEI, об этом ниже:
Так же может присутствовать "внутренний накопитель" или internal storage (user data), это все эти файлы и папки которые вы видите в памяти телефона без Рут доступа, но кастом рекавери разделил таким образом Data и Data/media.
Не много подробнее о назначении разделов:
Boot - Загрузка андроида начинается с раздела boot - там хранится в том числе ядро системы.
System - Затем загружается прошивка - system. Часто ее можно скачать отдельно, так что потерять в принципе не жалко.
Vendor раздел отвечает за правильную работу устройства, он тоже часто идет вместе с прошивкой, так что его можно достать из официальной прошивки с сайта производителя или на странице вашего устройства на 4пда
Ну и Data это конкретно ваша инфа, приложения настройки и сохранения игр все тут) Как я уже писал, бывает Рекавери разделяет дату и внутренний накопитель (Data/media), так вот, на внутреннем накопителе хранится то, что вы и сами могли видеть в памяти телефона фотки и тд.
Еще тут описывал, что там хранится.
Надо учитывать, что data раздел обычно зашифрован, в заводском состоянии, поэтому с помощью кастом Рекавери его форматируют и потом уже загружают прошивку.
Часто не лишним будет сохранить и другие важные разделы, на всякий случай:
EFS - Тут хранятся WiFi/BlueTooth MAC’s, IMEI, в общем все то, что вы не хотели бы потерять) (Схема с восстановлением, (MODEMST1, MODEMST2, FSG, BACKUP) где fsg или backup соответственно хранят инфу модемов на случай утери)
Persist - Этот раздел содержит данные калибровки сенсоров wifi, bluetooth, camera, DRM , sns.reg, и тд, тоже
Например у меня после смены прошивок поменялся Persist раздел, и при перезагрузке телефона писалось "Хранилище повреждено, устройство под угрозой (в опасности)"
Восстановление раздела из бэкапа помогло.
Ну и всякое прочее, вроде
CUST (так же CUSTOM или PRELOAD в некоторых случаях) - Предзагруженные приложения и региональные настройки, устанавливаемые при первом запуске. Иногда при смене прошивки на кастом нужно очистить этот раздел.
MISC (FOTA на старых устройствах) - Раздел на котором хранится информация для bootloader, что за чем загружать, или запустить рекавери, если OTA обновление не удалось. Если удалить, система будет грузится как обычно, то есть boot затем system.
Есть такие приложения для бэкапа данных с использованием Рут прав, например ® Titanium Backup
Однако, стоит учесть, что он не бэкапит папки приложения размещенные в общедоступной памяти телефона, т.е. (data/media)
Отдельно хочу отметить молодое (могут присутствовать баги) приложение, которое может создавать резервные копии пригодные для восстановления через кастом Рекавери, TWRP:
®Migrate
Удобно, когда нужно перенести данные на другую прошивку.
Когда Рут есть, можно так же с помощью ADB пробовать. (Или Adb Run)
Для аппаратов на базе SoC Qualcomm HDDRawCopy eMMC RAW Tool
Владельцам устройств с процессорами МТК при наличии пк можно скопировать полный образ всех данных (вообще всех) через flashtool
Готовый raw образ можно разбить на разделы и сконвертировать в пригодный для последующей прошивки вид с помощью этой утилиты
WwR MTK
Но чтобы прошить через ADB надо будет различить бутлоадер, или загрузчик, по нашему)
Надо учитывать что без форматирования через кастом Рекавери data раздел будет зашифрован, а пароля вы конечно не знаете)
Поэтому такой бэкап можно использовать (восстанавливать) в исходном виде, или использовать не зашифрованные разделы.
А так, кастом Рекавери может все стереть, а заодно и шифрование, чтобы в будущем бэкап был читаемым.
И вот для устройств с процессором Qualcomm и emmc памятью.
Работа с программой:https://freeandroidroo…download-emmc-dl-tool/
Проверено на RN3P, но может быть использован с другими компании Qualcomm-устройств.
emmcdl использует "знакомый" модуль для взаимодействия с внутренней памяти устройства в режим 9008/edl. С prog_emmc_firehose_8976_ddr.mbn от "быстрой загрузки" прошивки, считывание/запись Таблица разделов и разделов (в том числе энергонезависимой, как modemst1/2,fsg etc.).
В этом списке раздела, успешно восстанавливаются IMEI телефона, MАС-адреса и статус загрузчика разблокировки после случайного повреждения памяти.
Может быть использован для создания файлов rawprogram0.xml прошивки с помощью MiFlash (рекомендуется) или другая утилита от Qualcomm.
qcpartsbackup11.7z (73.11 КБ)
. Не для новичков! Взято отсюда.
Как сохранить резервную копию сразу на компьютер.
Очень полезно в тех случаях, когда под рукой нет подходящего размера флешки.
Можно конечно в кастом Рекавери смонтировать OTG накопитель, типа внешнего жесткого диска, но это такое.
При помощи ADB:
ADB и все, что с помощью него можно сделать
Или утилита в которой не надо вручную вводить команды
® Adb Run
Через кастом Рекавери:
Смонтируйте разделы, и скопируйте с помощью ADB.
Для удобства, на пк я использую файловый менеджер total Commander с плагином adb.
Разделы видятся как папки, соответственно скопировать можно файлы внутри.
Адб работает и без кастомного Рекавери с включенной отладкой по USB, но в этом случае может не хватить прав, чтобы работать с системными файлами.
Хотелось бы больше и лучше, поэтому если есть желание - делитесь.
Кому не понятно, напишите понятно и добавьте в шапку)
Да я упомянул не все способы, но вы можете упомянуть их сами, поделившись с другими полезной информацией.
PS
Передавать данные на пк в режиме "передача данных" (MTP) может быть небезопасно если кабель не качественный, поэтому лучше пользуйтесь ADB (я например, активирую режим отладки в телефоне, подключаю к пк, и в качестве файлового менеджера использую Total Commander с плагином ADB, режим Native 8.1. При этом, при первом подключении нужно на телефоне нажать разрешить этому компьютеру отладку, если спросит.
Пс
Что делать, если раздел system только для чтения? Ответ
Доброго времени суток.
Добавлено 18.06.2020, 14:56:
Не могли бы вы перечислить все возможные каталоги, где приложения Android могут хранить данные, предоставив описание, какие данные хранятся в каждом каталоге?
Все приложения (корневые или нет) имеют каталог данных по умолчанию, который является /data/data/<package_name> . По умолчанию базы данных приложений, настройки и все остальные данные находятся здесь. Если приложение ожидает, что будут храниться огромные объемы данных, или по другим причинам хочет «быть хорошо со встроенным хранилищем», на SDCard ( Android/data/<package_name> ) имеется соответствующий каталог .
Кроме того, все приложения могут хранить данные в любом месте на SDCard, поскольку нет никаких ограничений - и многие приложения делают это. Они могут свободно использовать имена каталогов (и они снова используют), что часто затрудняет решение, для чего предназначен весь этот «мусор» на карте, и что из него можно удалить.
Хотя, как отметил Том , root-приложения могут хранить свои данные практически везде на вашем устройстве, они обычно следуют тем же правилам, что и другие приложения.
Вы можете найти общее объяснение иерархии каталогов Android в моем ответе здесь . Для вашего конкретного вопроса я мог бы добавить более подробную информацию о /data/data/<package_name> (и соответствующей SD-части):
- databases/ : здесь идут базы данных приложения
- lib/ : библиотеки и помощники для приложения
- files/ : другие связанные файлы
- shared_prefs/ : настройки и настройки
- cache/ : ну кеширует
В этом месте может быть еще несколько каталогов или меньше - все зависит от приложения. В своем собственном «домашнем каталоге» (и это то, чем он в основном является, говоря по Linux), они могут размещать файлы там, где они хотят. Обычно эти файлы и каталоги доступны только для самого приложения (и, конечно, для пользователя root) - кроме тех, которые хранятся на SDCard и доступны всем приложениям.
Читайте также: