Где хранится кэш android studio

Где приложения хранят свои данные

Андрей Подкин

При использовании приложений под Android иногда появляются вопросы: «А где приложение хранит созданные файлы?», «Можно ли до них достучаться?» и «Удалятся ли файлы при удалении приложения?» Давайте попробуем посмотреть, где же приложение может хранить свои данные и какие последствия это имеет для пользователя.

Внутреннее хранилище данных

Смысл следует непосредственно из названия. Внутреннее хранилище (internal storage) располагается всегда в памяти смартфона вне зависимости от того, есть ли возможность установки карты памяти (и тем более того, вставлена ли она). Эта область памяти является защищенной. Находится в системном разделе /data. По умолчанию все файлы, которые там располагаются, доступны только тому приложению, которое их создало. Разумеется, можно сделать файлы доступными для других приложений, но это надо делать специально. Если приложение не открывает файлы для доступа извне, достучаться к ним можно будет только получив root.

Назначение хранилища понятно: внутренние защищенные данные, к которым не должно быть нерегламентированного доступа. Проблемы (с точки зрения пользователя) могут быть в следующих случаях:

  • Неоправданно большой объем данных. Хочется вынести данные на карту памяти, чтобы сэкономить внутреннее пространство для других нужд, а приложение не дает.
  • По мнению пользователя, регламент доступа к данным должен быть другим, не таким, как предлагает приложение.

Пример: приложение «Лекции по истории России». В приложении хороший контент (и по содержанию, и по качеству звука). Но сохраняется он во внутреннюю память. На бюджетных устройствах, где этой памяти мало, становится затруднительным закачать заранее много лекций, а потом, отключившись от интернета, слушать их. Второй проблемой становится собственно регламент доступа к данным. Даже если ограничиться тематикой истории, у меня есть аудиофайлы, полученные из трех источников: данное приложение, подкасты и аудиоверсии роликов с youtube. Хочется взять и объединить навек в их земной юдоли под владычеством всесильным Властелина Мордора их все в единый плейлист, и слушать его одним аудиоплеером. Но на смартфоне без root это сделать невозможно.

Внешнее хранилище «личных» данных

С точки зрения разработчика, кроме внутреннего хранилища данных, для персональных целей приложения есть еще внешнее хранилище. Оно необязательно размещается на карте памяти. Это может быть и внутренняя память смартфона, но весь раздел с такими данными размещается в общем доступе. В корне раздела есть папка Android/data, а в ней — подпапки с именами пакетов приложений.

Плюсы такого подхода очевидны: данные доступны извне для целей пользователя. А если это карта памяти, то и емкость может быть ограничена только вашими финансами (в продаже уже можно найти карты памяти на 400 гигабайт). Минусы тоже понятны: в любой момент любое приложение (конечно, имеющее разрешение на доступ к «внешним» данным) может взять и стереть чужие файлы. Также файлы будут удалены системой при удалении приложения (или при очистке его данных).

Пример приложения: подкаст-менеджер BeyondPod (более-менее свежей версии, раньше файлы хранились по-другому). Пользователь имеет доступ к скачанным подкастам и может легко удалять их (например, в целях экономии места) или слушать их во внешнем плеере.

Общее внешнее хранилище

Располагается в корне «внешнего» раздела на одном уровне с папкой «Android». Предназначается для хранения данных, разделяемых между разными приложениями. Обычно в документации Google в качестве примера приводят картинки (фото с камеры — папка DCIM). Основная проблема данных файлов: они никогда не удаляются автоматически. Даже если приложение вы удалили.

Пример: мессенджер Telegram. После того, как вы удалили приложение, загруженные файлы никуда не исчезают. Они продолжают спокойно лежать на накопителе данных, занимая драгоценное место.

Как можно удалить файлы, не удаляя приложения

Здесь важно ввести еще одну классификацию файлов приложений. Она справедлива для внутреннего хранилища и для внешнего хранилища личных данных. Все данные делятся на два типа: собственно данные и кэш.

Данные (папка data) — некие файлы, которые, по логике Google, нужны для постоянной работы с ними. Если полностью их удалить, то приложение поведет себя точно так же, как если бы его переустановили (удалили и заново установили). Частичное удаление файлов может не привести ни к каким неприятным последствиям. Но важно понимать, какие конкретно данные вы удаляете (например, очевидно, что скачанные файлы подкастов можно удалять совершенно свободно — это не повлияет на работоспособность подкаст-менеджера).

Читайте также:  Radiohead paranoid android tabs

Кэш — временные данные, которые сформированы в ходе работы приложения и нужны для ускорения этой работы. Например, данные, которые часто нужны в интернете, загружаются и в дальнейшем вместо загрузки открываются локально (разумеется, кэш может обновляться, чтобы не показывать устаревшие данные). Удалять кэш любого приложения можно совершенно спокойно, это штатная операция.

Очистка памяти и кэша вызывается из настроек приложения. Кнопка «Очистить кэш» очищает только кэш, а кнопка «Очистить данные» — и кэш, и данные приложения.

Удаление файлов приложения из общего внешнего хранилища выполняется только вручную. Более того, даже оценка того, от какого приложения эти файлы остались, тоже выполняется вручную.

Источник

Русские Блоги

Механизм кэширования Android — общая реализация хранилища

Один, механизм кеширования Android

Кэш Android разделен на кеш памяти и файловый кеш (дисковый кеш). В первые дни, до того, как стали популярными основные фреймворки кэширования изображений, наиболее часто используемыми методами кэширования памяти были SoftReference и WeakReference.Например, большинство методов использования: HashMap > imageCache; форма. Начиная с Android 2.3 (уровень 9), сборщик мусора более склонен к повторному использованию объектов SoftReference или WeakReference, что делает SoftReference и WeakReference менее практичными и эффективными. В то же время после Android 3.0 (уровень 11) Bitmap данных изображения помещается в область кучи памяти, а память в области кучи управляется сборщиком мусора, и разработчику не нужно освобождать ресурсы изображения, но это также делает Выпуск данных изображения непредсказуем, что увеличивает вероятность OOM. Поэтому после Android 3.1 в Android появился класс кэша памяти LruCache, и на объекты в LruCache имеются сильные ссылки.

Во-вторых, рабочий механизм вторичного кеша

Так называемый кеш второго уровня на самом деле не сложен.Когда стороне Android требуется получить данные, например получить изображения из сети, мы сначала ищем в памяти (поиск по ключу), а затем ищем файл на диске или sqlite, если в памяти ничего нет. Он недоступен на диске, пока не будет получен через сеть; когда данные из сети получены, они сначала кэшируются в памяти (кеш первого уровня) в виде пар ключ-значение, и в то же время кешируются в файле или sqlite (кеш второго уровня). Примечание. Кэш памяти вызовет утечку памяти в виде кучи. Все кеши уровня 1 обычно должны строго контролировать размер кеша, обычно контролируемый на 1/4 системной памяти.

Три, автономный кеш

Автономное кэширование предназначено для локального сохранения данных, полученных с сервера, когда сеть разблокирована, и прямого чтения данных из локального файла, когда сеть отключена. Суть в том, чтобы контролировать хранение и чтение файлов.

Наши приложения обычно генерируют следующие типы данных:

файл — обычное файловое хранилище
файл базы данных (файл .db)
sharedPreference- данные конфигурации (файл .xml)
файл кэша изображений

Все пути к данным в приложении:

/data/data/com.xxx.xxx/cache-in-app cache (Примечание: соответствующий метод getCacheDir ())
/data/data/com.xxx.xxx/databases-in-app база данных
/data/data/com.xxx.xxx/shared_prefs-in-app файл конфигурации
/data/data/com.xxx.xxx/files-In-app files (Примечание: соответствующий метод getFilesDir ())
Файл SD-карты (разработан индивидуально)

Независимо от того, внутренняя это или внешняя SD-карта, способ получения пути один и тот же:

Получите корневой каталог SD-карты: Environment.getExternalStorageDirectory (). GetAbsolutePath ();
Путь к внешнему кэшу: /mnt/sdcard/android/data/com.xxx.xxx/cache Общее хранилище данных кеша (Примечание: получено с помощью getExternalCacheDir ())
Путь к внешнему файлу: /mnt/sdcard/android/data/com.xxx.xxx/files Хранить долгоживущие данные (Примечание: полученные с помощью getExternalFilesDir (тип String), тип специфичен Тип, может быть любым из следующих
Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_PODCASTS, Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS, Environment.DIRECTORY_PICTURES, or Environment.DIRECTORY_MOVIES. )

В-четвертых, обычно используемое хранилище Android:

Пять основных методов хранения данных на платформе Android:

1 Используйте SharedPreferences для хранения данных

2 Данные для хранения файлов

3 База данных SQLite для хранения данных

4 Используйте ContentProvider для хранения данных

5 Данные сетевого хранилища

Следующее знакомит с использованием первых двух, база данных может использовать библиотеку более удобно, например: greenDao; другие, но не слишком много введения. В основном ввести кеш.

(1) Подробное объяснение SharedPreferences

Шаги по использованию SharedPreferences для сохранения пар ключ-значение обычно следующие:
Используйте метод getSharedPreferences класса Activity, чтобы получить объект SharedPreferences, укажите имя файла и права доступа
Получите объект SharedPreferences.Editor и используйте метод putXxx объекта для сохранения пары «ключ-значение».
Сохранение (отправка) пар «ключ-значение» с помощью метода фиксации SharedPreferences.Editor.

(1) Два способа получить SharedPreferences:

1 Вызовите метод getSharedPreferences () объекта Context
2 Вызовите метод getPreferences () объекта Activity.

(2) Разница между двумя методами:

Объект SharedPreferences, полученный путем вызова метода getSharedPreferences () объекта Context, может использоваться другими приложениями в том же приложении.Компонентыобщий.

Читайте также:  Пульт для самсунга смарт тв с андроида

Объект SharedPreferences, полученный путем вызова метода getPreferences () объекта Activity, может использоваться только в Activity.

(3) Четыре режима работы SharedPreferences:

Context.MODE_PRIVATE: это режим работы по умолчанию, что означает, что файл является личными данными и может быть доступен только самому приложению. В этом режиме записанное содержимое будет перезаписывать содержимое исходного файла.

Context.MODE_APPEND: режим проверит, существует ли файл, добавит содержимое в файл, если он существует, или создаст новый файл.

Context.MODE_WORLD_READABLE и Context.MODE_WORLD_WRITEABLE используются, чтобы контролировать, есть ли у других приложений разрешение на чтение и запись файла.

MODE_WORLD_READABLE: указывает, что текущий файл может быть прочитан другими приложениями.

MODE_WORLD_WRITEABLE: указывает, что текущий файл может быть записан другими приложениями.

(4) Сохраните данные в SharedPreferences:

Или следующее письмо также может быть

(5) Получите данные из SharedPreferences:

(2) Подробное описание хранилища файлов (Файл)

Файловое хранилище — это самый простой способ хранения данных в Android. Он не форматирует сохраненный контент, и все данные сохраняются в файле без изменений. Он больше подходит для хранения простых текстовых или двоичных данных. Если вы хотите использовать метод хранения файлов для сохранения некоторых более сложных текстовых данных, вам необходимо определить набор собственных спецификаций формата, чтобы облегчить повторный анализ файла позже.

(1) Методы хранения файлов, предоставляемые Context (openFileOutput, openFileInput)

  • Предоставляется в классе ContextopenFileOutput()Метод, который можно использовать для хранения данных в указанном файле.
  • Этот метод принимает два параметра. Первый параметр — это имя, используемое при создании файла. Обратите внимание, что указанное здесь имя файла не может включать путь, поскольку все файлы по умолчанию хранятся в / data / data / / files /. Под каталогом.
  • Второй параметр — это режим работы файла.Есть два основных режима на выбор: MODE_PRIVATE (перезапись исходного текста) и MODE_APPEND (дополнительный контент).
  • Метод openFileOutput () возвращает объект FileOutputStream.После получения этого объекта вы можете записывать данные в файл в потоке Java.

(I) Сохраните фрагмент текстового содержимого в файл:

Примечание. По умолчанию файл будет храниться в / data / data / package / files;

Подобно хранению данных в файле, класс Context также предоставляетopenFileInput()Метод чтения данных из файла.

Метод openFileInput () получает только один параметр, то есть имя файла для чтения, и система автоматически перейдет в каталог / data / data /

/ files /, чтобы загрузить этот файл и вернуть объект FileInputStream.

(II) Покажите, как читать текстовые данные из файла:

(III) Четыре режима сохранения файлов.

Context.MODE_PRIVATE — это режим работы по умолчанию, что означает, что файл является личными данными и может быть доступен только самому приложению. Содержимое, записанное в этом режиме, перезапишет содержимое исходного файла.
Context.MODE_APPEND Проверьте, существует ли файл, и добавьте содержимое в файл, если он существует, в противном случае создайте новый файл.
MODE_WORLD_READABLE означает, что текущий файл может быть прочитан другими приложениями.
MODE_WORLD_WRITEABLE означает, что текущий файл может быть записан другими приложениями.

(2) Внутренняя память: файл общих операций потока ввода-вывода

Обратите внимание, что внутренняя память — это не память. Внутреннее хранилище находится в очень особенном месте в системе. Если вы хотите хранить файлы во внутреннем хранилище, по умолчанию файлы доступны только вашему приложению, и все файлы, созданные приложением, имеют то же имя, что и пакет приложения. Под содержимым. Другими словами, файлы, созданные приложением во внутренней памяти, связаны с этим приложением. При удалении приложения эти файлы во внутренней памяти также удаляются. С технической точки зрения, если вы устанавливаете атрибут файла для чтения при создании файла внутреннего хранилища, другие приложения могут получить доступ к данным вашего собственного приложения при условии, что он знает имя пакета вашего приложения, если атрибут файла является частным (частным ), то другие приложения не смогут получить к нему доступ, даже если вы знаете имя пакета. Внутреннее пространство для хранения очень ограничено, поэтому оно очень ценно. Кроме того, оно также является основным местом хранения данных для самой системы и системных приложений. Когда внутреннее пространство для хранения исчерпано, телефоном нельзя пользоваться. Таким образом, мы должны стараться избегать использования внутренней памяти. Общие настройки и базы данных SQLite хранятся во внутренней памяти. Внутреннее хранилище обычно использует контекст для получения и работы.

getFilesDir()Получите внутреннее хранилище вашего приложения, которое эквивалентно корневому каталогу вашего приложения во внутреннем хранилище.

После установки приложения / data / data / packagename будет сгенерирован в корневом каталоге Android, и текущему приложению не требуются разрешения на чтение и запись для чтения.

нота:
Некоторые разработчики, возможно, видели корневой каталог приложения / data / user / 0 / packagename, вот объяснение, версия Android 4.2 добавляет функцию входа в систему для разных пользователей на одном устройстве. (По причинам, связанным с патентом, эта функция ограничена планшетами, мобильные телефоны не поддерживают эту функцию), поэтому, чтобы различать настройки и сохраненные данные разных пользователей в одном приложении, добавляется путь этой серии, который указывает на / data / data / packagename

  • Метод getFileDir () получает объект File папки с файлами в каталоге.
  • Метод getChacheDir () получает объект File из папки кеша в этом каталоге.
  • Вызов метода openFileOutput (String name, int mode) ContextWrapper напрямую также создаст соответствующий файл в папке файлов в этом каталоге, и он будет частным. Его можно изменить, чтобы он был доступен другим приложениям, с помощью параметра режима метода openFileOutput для завершения
Читайте также:  Android приставка что выбрать

нота:

Этот каталог можно просмотреть только с правами root и будет удален при удалении приложения.

Очистка данных в деталях приложения приведет к удалению всех данных под именем пакета и всего каталога / Android / data / packagename во внутреннем хранилище и на внешней SD-карте.

Очистка кеша в деталях приложения приведет к удалению всех данных в каталоге packagename / cache и всего каталога / Android / data / packagename / cache во внутренней памяти и на внешней памяти SD-карты.

Если вы хотите создать файл, выполните следующие действия.

Android также предоставляет нам простой способopenFileOutput()`Для чтения и записи файлов во внутренней памяти ниже приведен пример записи текста в файл: (см. Выше)

Некоторые другие операции с внутренней памятью:

A. Перечислите все созданные файлы, это может быть непросто, Context Есть такой способ.

Б. Чтобы удалить файл, если вы можете его создать, вы должны иметь возможность удалить его. Конечно, он также предоставляет интерфейс для удаления файлов. Это также очень просто. Вам нужно только указать имя файла.

C. Чтобы создать каталог, вам необходимо передать имя каталога, и он возвращает файловый объект, используя путь к операции

Обобщая файловые операции, мы можем получить следующие три характеристики:

  1. Файловым операциям нужно только предоставить функции имя файла, поэтому самой программе нужно только поддерживать имя файла;
  2. Вам не нужно самостоятельно создавать файловые объекты и потоки ввода и вывода. Вы можете возвращать объекты File или потоки ввода и вывода, указав имя файла.
  3. Все операции с путями возвращают файловые объекты.

(3) Внешнее хранилище: ввод-вывод (чтение и запись файлов на SD-карте)

Путь хранения собственного ПЗУ телефона

1. Метод getExternalCacheDir () для получения пути к каталогу / Android / data / packagename / cache на встроенной карте памяти, разрешения на чтение и запись не требуются после версии 4.4 и будут удалены по мере удаления приложения.
2. Метод getExternalFilesDir () получает путь к каталогу / Android / data / packagename / files на встроенной карте памяти. После версии 4.4 разрешения на чтение и запись не требуются и будут удалены по мере удаления приложения. Если параметр метода имеет значение «null», вложенная папка не указана. Если указано, создается вложенная папка для сохранения файла. Созданный файл может быть прочитан другими приложениями, если у него есть разрешения на чтение и запись. Если вы хотите сохранить его частным, используйте внутреннее хранилище.
3. Метод Environment.getExternalStorageDirectory () получает корневой каталог каталога встроенного хранилища. Требуются разрешения на чтение и запись, которые не будут удалены при удалении приложения.
4. Метод Environment.getExternalStoragePublicDirectory () получает общедоступный каталог с файлом определенного типа по корневому пути каталога встроенного хранилища. Требуются разрешения на чтение и запись, которые не будут удалены при удалении приложения.
5. Обратите внимание, что разрешения на чтение и запись для пути / Android / data / packagenaem / во встроенном хранилище различаются и требуют разных разрешений, поэтому при разработке всегда следует объявлять разрешения на чтение и запись.

Этапы чтения и записи выполняются следующим образом:

1. Вызовите метод getExternalStorageState () среды Environment, чтобы определить, вставлена ​​ли SD-карта в телефон и есть ли у приложения разрешение на чтение и запись на SD-карту. Следующий код вернет истину.

2. Вызовите метод Environment.getExternalStorageDirectory (), чтобы получить внешнее хранилище, которое является каталогом SD-карты, или используйте каталог «/ mnt / sdcard /».

3. Используйте поток ввода-вывода для работы с файлами на SD-карте.

Примечание. В мобильный телефон должна быть вставлена ​​SD-карта. Для симулятора вы можете создать виртуальную карту памяти с помощью команды mksdcard.
Разрешение на чтение и запись SD-карты должно быть настроено в AndroidManifest.xml.

(I) Функция операции записи файла

II) Функция чтения файла

Пять, обобщены некоторые коды использования:

Общее хранилище:
Небольшое тело данных, параметр, значение (хранится в shared_prefs)
сетевые данные json (данные такого типа обычно не большие, хранятся в файле (.txt и т. д.))
картинки, музыка, видео (рекомендуется хранить большие данные на SD-карте, изображения (кадры с кадрами))

Источник

Оцените статью