12 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Android Internal Storage: пример работы с внутренней памятью

Android Internal Storage: пример работы с внутренней памятью

Для начала приведу информацию относительно памяти телефона найденую мною на одном из сайтов.

    1. RAM (ОЗУ)

RAM (ОЗУ) — это память «с произвольным доступом», то есть т.н. оперативная память, куда программное обеспечение (ПО) записывает и считывает информацию быстро (и без эмуляции). Содержимое оперативной памяти очистится при пропадании питания, например, если телефон выключить. Объём оперативной памяти решает, сколько приложений можно запускать одновременно, или как большой файл может быть загружен в память для работы (просмотр, редактирование и т.д.). Возможна ошибка «Недостаточно памяти», если память исчерпана и не получается запустить программу. Android 2.2 знает, какие приложения можно убрать из RAM, когда необходимо. До Android 2.2, максимум 256 Мб оперативной памяти поддерживалось.

    2. ROM (ПЗУ)

ROM (ПЗУ) — это память только для чтения (Read-Only Memory). То, что в ней хранится, никогда не может быть изменено (записывается однократно на при изготовлении телефона); и ROM (ПЗУ) хранит данные даже без питания.

В Android-телефоне ROM разбита на несколько разделов. Одна часть для ОС (операционной системы). Раздел ОС защищён, и вы не сможете писать в него без прав root. Root — это получение прав супер-пользователя операционной системы, тогда будет можно читать/писать в разделе ОС, например, заменить образ ОС (что, таким образом, позволяет использовать несколько разных операционных систем).

    3. Internal phone storage («Внутренняя память телефона»)

Internal phone storage («Внутренняя память телефона») — это вторая часть памяти, предназначенная для пользовательских данных, включая загруженные приложения и их сохраненные данные (из RAM). В Android 2.2, она монтируется в /mnt/asec, и в котором — apk-файлы загруженных приложений. Поэтому этот вид памяти называют Internal phone storage («Ёмкость внутренней памяти телефона»). Этот раздел подобен компьютерному внутреннему HDD (диску «С:» у Windows или «file system» у Ubuntu/Linux). Свободного пространства в Internal phone storage («Внутренняя память телефона») становится меньше, когда вы устанавливаете больше приложений. Это место можно проверит так: «Настройки» -> «SD-карта и память телефона» -> «Внутренняя память» (Internal storage). Может наступить момент, когда уже нельзя установить приложения — когда на Internal phone storage («Внутренняя память телефона») слишком мало свободного пространства; тогда нужно удалить ненужные программы.

    4. MicroSD / SDHC / SDXC . (есть и смартфоны без слота для карты)

Это единственный тип памяти, которую пользователь может расширить. Он аналогичен внешнему жесткому диску (External HDD) для компьютера. МикроSD монтируется в /etc/SDCARD на телефоне. Эту память можно увидеть в разделе «Настройки» -> «SD-карта и память телефона» -> «SD карта».

На MicroSD-карте можно хранить любые данные в виде файлов (фильмы, музыку, фотографии и так далее). По сути, можно использовать телефон в качестве т.н. «флэшки», то есть в качестве микроSD-карты. В Android 2.2 часть установленных приложений можно перенести из «Внутренняя память» (Internal storage) сюда — на SD-карту; следовательно, это экономит драгоценное пространство «Внутренней памяти» (Internal storage). Но не все приложения могут быть перемещены из «Внутренней памяти» на карту памяти SD. Поэтому даже добавление большой SD-карты не поможет, если «Внутренняя память» близка к заполнению.

При желании заменть SD-карту (например, на другую с большей пропускной способностью), не забудьте отключить («отмонтировать») текущую SD-карту, прежде чем физически вынимать её: «Настройки» -> «SD-карта и память телефона» -> «SD карта» -> «Отключить SD-Card» (ведь Android основан на Linux-е). Вставленная новая SD-карта будет автоматически установлена («примонтирована»).

Я не являюсь специалистом ни по OS Android, ни по Linux, поэтому простите мне ошибки в названиях и неточности в тексте.
Так вот, приобрели мы моей жене замечательный телефон «Samsung Galaxy Ace» под управлением OS Android. Приобрели его под моим настоянием, т.к. я, до этого немного сталкивался с «Android, и вариант с IOS, Windows и прочими Simbian категорически отвергал. Замечательный оказался телефончик, отзывчивый экран, шустрый процессор, понятная OS, всё восторгало. И я, как «специалист», принялся его всячески улучшать, устанавливать одни программы, удалять другие, экспериментировать с настройками, играть в игрушки, лазить в интернет. Всё супер!
Прошёл месяц такого активного творчества. И вдруг, появилось сообщение «память телефона заполнена». Ну заполнена так заполнена — не придал значения я, освободим, и удалил данные у какой то программы. Помогло, и продолжилось мучение телефона.
Прошло какое-то время, сообщение появилось снова, ну я по проторенной дороге удалил данные у другой программы, затем несколько программ. Помогло.
Прошло какое то время, сообщение появилось снова! Я в настройки – «Очистить ОЗУ» — всё ОК. Ненадолго, увы.

Залез в интернет, скачал программы по очистке памяти –очищают, но сообщение остаётся. Залез в интернет, начал разбираться, выяснил, что не хватает места в Internal storage («Внутренняя память»), а все эти программы чистят RAM (ОЗУ) и для решения моей проблемы не пригодны. Сообщение «Память заполнена» вылезало при заполненности внутренней памяти телефона более 160 из 181 Мб.
Начал искать за..лей памяти Internal storage, выяснил, что это обновления Карт Google и данные Android Market. Запретил картам обновляться, перестал пользоваться Marketом. Временно помогло.

Начал удалять всё подряд, нужное, не нужное. Постепенно удалил почти всё, включая Google Maps, Android Market, Skype, и много другого, чего наустанавливал ранее (осталась только любимая игрушка жены Lines). Всё помогало временно, сообщение в конце концов вылезало снова, а удалять было больше нечего, осталось только самое необходимое.
Жена пилит – «Всё ты, со своими экспериментами»

Залез в интернет, выяснил, что доступ к Internal storage можно получить имея root права. Станцевал с бубном в течении примерно часов 10, получил на телефоне root права. Как? – не помню. В форуме всё написано, но либо у меня уже мозги не те, либо на форуме пишет народ с не теми мозгами :rolleyes:
С помощью программы Link2SD, перенёс часть программ на карту SD. Это хорошо почистило память. Хватило примерно на месяц. Через месяц СМС опять не приходят.

Начал настраивать себя на снос и переустановку системы, всё не решался >-)
Залез в интернет, выяснил, что есть такие временные файлы с расширением rm. Нашёл их в папке datalocaltmp c помощью программы RootExplorer, удалил – помогло не надолго (объём их был около 3 Мб).
Залез в папку data основательно, прошерстил её различными способами. Нашёл кучу файлов с расширением log, в названии которых присутствует слово error и название различных программ, в том числе тех, которые я удалил давно. Размер каждого из них составлял около 2 Mb, а количество – около 30 шт. Удалил их все. И, о чудо, внутренняя память заполнена 62 Мб из 181 (и телефон работает). Надолго ли? Посмотрим, такое ощущение что чистить надо постоянно.

Android Internal Storage: пример работы с внутренней памятью

Android использует файловую систему, которая аналогична дисковым файловым системам на других платформах. Эта лекция описывает, как работать с файловой системой Android для чтения и записи файлов с помощью File API (перевод документации [1]).

Объект File подходит для чтения или записи больших объемов данных в порядке от начала до конца, без пропусков. Например, это хорошо подходит для файлов картинок или для различных обменов данными через сеть. Здесь будет показано, как выполнять базовые файловые операции в Вашем приложении. Подразумевается, что Вы знакомы с файловой системой Linux и стандартной системой ввода/вывода файлов в (standard file input/output API) в java.io.

[Выбор между внутренним и внешним хранилищем (Internal Storage, External Storage)]

Все устройства Android имеют две области хранения файлов (file storage area): «internal» и «external» storage. Эти имена появились на первых стадиях развития Android, когда большинство устройств поставлялись со встроенной энергонезависимой памятью FLASH (internal storage) плюс извлекаемый носитель памяти, такой как micro SD card (external storage). Некоторые устройства делили постоянную область хранения (permanent storage space) на разделы «internal» и «external», так что даже без наличия внешнего извлекаемого хранилища (removable storage medium) всегда имеется 2 пространства хранения, и поведение API всегда одинаково — независимо от того, есть в наличии внешнее хранилище или нет. Следующие списки подводят общую черту под фактическими различиями каждого пространства хранения.

• Оно всегда доступно.
• Файлы, которые сохранены здесь, по умолчанию доступны только Вашего приложения.
• Не требуется запрашивать разрешения на доступ к internal storage для Вашего приложения.
• Когда пользователь деинсталлирует Ваше приложение, то система также удалит все файлы приложения с internal storage.

Вывод: internal storage лучше подходит, когда ни другие пользователи, ни другие приложения не могли получить доступа к Вашим файлам.

• Оно не всегда доступно, потому что пользователь может монтировать external storage как USB MSD storage (Android работает как флешка, подключенная к компьютеру), и в некоторых случаях может просто извлечь external storage из устройства.
• External storage доступно на чтение для всех, так что файлы, сохраненные туда, могут прочитаны без Вашего контроля над процессом.
• Приложению требуется получить разрешение на доступ к external storage в файле манифеста.
• Когда пользователь деинсталлирует Ваше приложение, система удалит файлы Вашего приложения из external storage только если Вы сохранили их в директории из getExternalFilesDir() .

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

Совет: несмотря на то, что приложения по умолчанию устанавливаются в internal storage, Вы можете указать атрибут android:installLocation в файле манифеста, после чего Ваше приложение может быть установлено и на external storage. Пользователи ценят эту опцию, когда размер APK очень велик, и размер external storage space больше, чем internal storage. Дополнительную информацию см. в документации App Install Location [2].

[Получение разрешения для приложения на доступ к External Storage]

Чтобы иметь возможность записи в external storage, Вы должны запросить в файле манифеста разрешение WRITE_EXTERNAL_STORAGE :

Внимание: в настоящее время приложения имеют возможность чтения external storage без специального на то разрешения. Однако это изменится в будущих релизах системы Android. Если Ваше приложение требует чтения external storage (но не записывает в него), то Вам нужно декларировать разрешение READ_EXTERNAL_STORAGE . Чтобы обеспечить будущую работу Вашего приложения так, как это ожидалось, Вы должны декларировать это разрешение уже сейчас, до того как изменения вступят в реальную силу.

Но если Ваше приложение использует разрешение WRITE_EXTERNAL_STORAGE, то это неявно дает ему также разрешение использовать и чтение external storage.

Вам не нужно получать никаких разрешений на сохранение файлов в internal storage. Ваше приложение всегда имеет разрешение на чтение и запись файлов в свой внутренний каталог на internal storage.

[Сохранение файла в Internal Storage]

Когда сохраняется файл в internal storage, Вы можете запросить подходящую директорию для объекта файла File вызовом одного из двух методов:

Читать еще:  eMMC накопитель что это

getFilesDir() возвращает объект File, представляющий внутренний каталог Вашего приложения.
getCacheDir() возвращает объект File, представляющий внутренний каталог временных файлов кэша Вашего приложения. Обязательно удаляйте оттуда каждый файл, когда он больше не нужен, и реализуйте разумный предел размера для объема памяти, который используете в любой момент времени, такой как предел в 1 мегабайт. Если система Android обнаружит, что на внутреннем хранилище недостаточно места, то она может удалить Ваши файлы кэша без предупреждения.

Чтобы создать новый файл в одной из этих директорий, Вы можете использовать конструктор File(), передав ему File, предоставленный одним из этих методов, которые укажут каталог на internal storage. Пример:

Альтернативно Вы можете вызвать openFileOutput(), чтобы получить FileOutputStream, который записывает файл в Вашей внутренней директории. Например, здесь показано, как записать некий текст в файл:

Или, если Вам нужно кэшировать некоторые файлы, Вы должны вместо этого использовать createTempFile() . Например, следующий метод вытаскивает имя файла из URL и создает файл с таким именем во внутренней директории для кэша Вашего приложения:

Примечание: каталог internal storage Вашего приложения указывается на основе имени пакета приложения в специальном месте файловой системы Android. Технически другое приложение может прочитать Ваши внутренние файлы, если Вы установите файловый режим с разрешенным чтением. Однако для этого другое приложение должно также знать имя пакета Вашего приложения и имена используемых Вашим приложением файлов. Другие приложения не могут просматривать Ваши внутренние директории, и не могут получить доступ на чтение или запись, за исключением случая, когда Вы явно установите файл как читаемый и/или записываемый. Таким образом, пока Вы используете MODE_PRIVATE для Ваших файлов на internal storage, то они никогда не будут доступны для других приложений.

[Сохранение файла в External Storage]

Поскольку external storage иногда может быть недоступно (когда пользователь смонтировал его как внешний USB-носитель на PC, или когда вытащил карту SD из телефона), то перед доступом к тому Вы должны всегда проверить, что он есть в наличии. Вы можете запросить состояние external storage вызовом getExternalStorageState() . Если возвращенное состояние External Storage равно MEDIA_MOUNTED , то Вы можете читать и записывать на него свои файлы. Например, следующие методы полезны для определения доступности устройства хранения:

Несмотря на то, что external storage может быть модифицировано пользователем и другими приложениями, есть две категории файлов, которые могут быть сохранены здесь:

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

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

Если Вы хотите сохранить public-файлы на external storage, используйте метод getExternalStoragePublicDirectory() для получения экземпляра File , предоставляющего подходящую директорию на external storage. Метод принимает аргумент, указывающий тип файла, который Вы хотите сохранить, так чтобы типы файла были логически организованы с другими public-файлами, такими как DIRECTORY_MUSIC или DIRECTORY_PICTURES . Пример:

Если Вы хотите сохранить файлы, которые являются частными (private) для Вашего приложения, Вы можете получить подходящую директорию вызовом метода getExternalFilesDir() и передачей ему имени, указывающего тип директории, который Вам нужен. Каждая директория, созданная таким способом, будет добавлена к родительской директории, в которой инкапсулированы все файлы внешнего хранилища Вашего приложения, которые система удалит, когда пользователь деинсталлирует Ваше приложение. Например, вот метод, которым Вы можете создать директорию индивидуального фотоальбома:

Если ни одно из предварительно определенных имен поддиректорий не подходит для Ваших файлов, то Вы можете вместо этого вызвать getExternalFilesDir() и передать null. Это возвратит корневую частную директорию для Вашего приложения на external storage.

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

Независимо от того, используете ли Вы для публичных файлов getExternalStoragePublicDirectory() или getExternalFilesDir() для частных файлов приложения, важно иметь в виду, что Вы используете имена директорий, предоставленные константами API наподобие DIRECTORY_PICTURES . Эти имена директорий гарантируют, что система будет правильно рассматривать эти файлы. Например файлы, сохраненные в DIRECTORY_RINGTONES , будут рассортированы медиасканером системы как рингтоны вместо музыки.

[Опрос количества свободного места]

Если Вы знаете заранее, сколько файлов сохраняете, то можете без получения ошибок IOException узнать, сколько места осталось путем вызова getFreeSpace() или getTotalSpace() . Эти методы предоставляют соответственно текущее доступное пространство и общее пространство на томе хранения. Эта информация также полезна, чтобы избежать переполнения тома хранения свыше определенного порога.

Однако система не гарантирует, что Вы можете записать столько байт, сколько показывает вызов getFreeSpace(). Если возвращенное количество всего на несколько мегабайт больше, чем Вам нужно сохранить, или если файловая система уже заполнена меньше, чем на 90%, то вероятно сохранение будет безопасным. Иначе возможно, что записать данные в хранилище не получится.

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

[Удаление файла]

Вы всегда должны удалять файлы, которые Вам больше не нужны. Самый прямой способ удаления файла состоит в том, чтобы иметь этот файл открытым и вызвать delete() для самого себя.

Если файл сохранен на internal storage, Вы можете также запросить Context, чтобы найти и удалить файл вызовом deleteFile():

Внимание: когда пользователь деинсталлирует Ваше приложение, система Android удалит следующее:

• Все файлы, сохраненные Вашим приложением на internal storage.
• Все файлы, сохраненные Вашим приложением с использованием getExternalFilesDir().

Однако Вы должны регулярно удалять все кэшируемые файлы, создаваемые с getCacheDir(), и также регулярно удалять файлы, которые Вам больше не нужны.

[Пример записи файла на sdcard0]

Предположим, что необходимо записать какой-нибудь тестовый файл (с именем myFile.txt) в папку myFolder на внешний носитель, который виден в системе Android как sdcard0. Т. е. полный путь должен выглядеть примерно так:

Базовый путь до External Storage

Проблема тут состоит в том, чтобы узнать часть пути basePath, поскольку на разных системах Android этот путь будет разным, в зависимости от версии и внутреннего аппаратного устройства. В моем телефоне Samsung Galaxy Note этот basePath = /storage/sdcard0 , но это еще не значит, что на Вашем телефона этот путь будет именно таким. Чтобы получить basePath, используйте вызов функции getExternalStorageDirectory :

Проверка доступности носителя данных в External Storage

Вторая проблема состоит в доступности на запись носителя данных. Дело в том, что записать на носитель можно не всегда, например если он смонтирован как флешка USB (когда Ваш телефон подключен к компьютеру в режиме Mass Storage Device, USB MSD). Проверить доступность носителя можно следующей функцией:

Разрешение доступа к носителю данных в файле манифеста

Как уже упоминалось, необходимо в файле манифеста запросить разрешение WRITE_EXTERNAL_STORAGE . Вот пример такого файла манифеста:

Функция, которая сохраняет файл, принимая полный путь до файла filePath и сохраняемый текст FileContent:

Вызов функции SaveFile, который выполняет задачу сохранения файла в External-носителе:

[Пример записи файла на extSdCard]

Получение полного корневого пути до извлекаемой карты SD не так прост, как до External Storage, поскольку в API Android для этого почему-то не предусмотрены специальные простые функции. Приходится получать путь окольными путями, через имена системных папок. Вот код функции, которая получает путь до извлекаемой карты SD:

Вызов функции SaveFile, который выполняет задачу сохранения файла на извлекаемой карте SD:

[Сохранение бинарного файла (массива byte[])]

В предыдущих примерах мы рассматривали класс OutputStreamWriter , который позволяет записать строку String или массив символов char[]. Но как быть, если нужно записать массив байт byte[]? Для этого подойдет класс DataOutputStream . Пример:

Папки Internal Storage и External Storage на Android

ОС Android на данный момент самая гибкая и функциональная из мобильных операционных систем, что обеспечивает ей высокую популярность. Внутренне устройство Android предполагает наличие собственной файловой системы, структура которой задана древовидной архитектурой, что отличается от организации информации в Windows и для многих пользователей имеет непривычный вид.

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

Объём памяти на современных устройствах позволяет записывать внушительное количество информации, при этом в зависимости от характера данных можно выбрать, куда именно сохранять создаваемые файлы. Что касается модели хранилища Android, то здесь стоит внести немного ясности, для чего обратимся к таким понятиям как Internal Storage и External Storage и рассмотрим каждое в отдельности (если перевести термины с английского, то первое – это внутреннее место хранения, а второе – внешнее).

Что такое Internal Storage и где находится

Internal Storage в Android, как и следует из названия, – это внутренняя память устройства. Она есть у каждого девайса независимо от того, поддерживаются ли карты памяти. Внутреннее хранилище является защищённой областью встроенной памяти, где может безопасно храниться пользовательская информация. Папка Internal Storage в Android находится в системном разделе /data.

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

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

Объем памяти в настройках смартфона

Обычно найти папку можно в папке data/data/your.application.package.appname/someDirectory/

Пространство внутренней памяти устройства ограничено, и если требуется сохранить большой объём данных, лучше использовать другой тип хранения.

Что такое External Storage и где находится

Теперь рассмотрим, что такое External Storage в Android. Это внешнее хранилище, куда сохраняются пользовательские данные, найти которые на телефоне несложно. Папка Storage будет располагаться в Android/data, а в данном каталоге многочисленные подпапки с именами приложений (расположение внешней памяти определяет ОС, но не пользователь).

Очистка кэша и освобождение места в хранилище ОС Android

Здесь могут находиться различные файлы, например, музыка, фото, видео и другой контент, доступный пользователю и приложениям. То есть расположение External Storage может быть в любом месте в памяти телефона или на съёмном носителе, а под внешним хранилищем подразумевается не только SD-карта, а и часть встроенной памяти Android-устройства (отличие от внутренней – в защищённости).

Читать еще:  Как поставить пароль на телефон Андроид

Таким образом, есть два типа внешних накопителей:

  • Primary External Storage. Встроенное хранилище общего доступа, работать с которым можно при осуществлении USB-подключения смартфона к компьютеру или ноутбуку.
  • Secondary External Storage. Съёмная память, например, SD-карта.

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

Общее внешнее хранилище для сохранения данных, общих для разных приложений лежит в корне внешнего раздела (рядом с папкой Android), например, папка DCIM для фотоснимков с камеры смартфона. Эти файлы останутся на месте, если вы удалили приложение, но при необходимости можно выполнить действия по их удалению вручную.

Внешнее вместилище, используемое для сохранения файлов, поддерживается каждым Android-устройством, его объём отличается в зависимости от модели девайса, а эта информация указывается в характеристиках.

И внутреннее, и внешнее хранилища выполняют задачу хранения временных или постоянных данных, при этом разделы отличаются уровнем доступа к информации.

Android Android: внутреннее и внешнее хранилище — уточнение терминологии

пример

Разработчики Android (в основном новички) путались относительно терминологии внутреннего и внешнего хранилищ. Есть много вопросов по Stackoverflow относительно того же. Это в основном из-за того, что терминология в соответствии с официальной документацией Google / официального Android совсем отличается от терминологии обычного пользователя ОС Android. Поэтому я думал, что документальное подтверждение поможет.

Что мы думаем — терминология пользователя (UT)

Но, согласно Android Documentation / Guide — терминология Google (GT)

Внутреннее хранилище (GT):

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

Внешнее хранилище (GT):

Это может быть съемный носитель (например, SD-карта) или внутреннее (несъемное) хранилище.

Внешнее хранилище (GT) можно разделить на два типа:

Внешнее хранилище (GT) = Внутреннее хранилище (UT) и внешнее хранилище (UT)

Съемное хранилище (GT) = Внешнее хранилище (UT)

Внутреннее хранилище (GT) не имеет термина в UT.

Позвольте мне объяснить,

Внутреннее хранилище (GT): по умолчанию файлы, сохраненные во внутреннем хранилище, являются приватными для вашего приложения, а другие приложения не могут получить к ним доступ. Пользователь вашего приложения также не может получить к ним доступ с помощью диспетчера файлов; даже после включения опции «показать скрытые файлы» в диспетчере файлов. Чтобы получить доступ к файлам во внутреннем хранилище (GT), вам необходимо укрепить свой телефон Android. Более того, когда пользователь удаляет ваше приложение, эти файлы удаляются / удаляются.

Так Internal Storage (GT) является не то , что мы думаем , как внутренняя память 32/64 Гб Nexus 6P в

Как правило, местоположение внутреннего хранилища (GT) будет: /data/data/your.application.package.appname/someDirectory/

Внешнее хранилище (GT):

Каждое Android-совместимое устройство поддерживает общую «внешнюю память», которую вы можете использовать для сохранения файлов. Файлы, сохраненные во внешнем хранилище, читаются в мире и могут быть изменены пользователем при включении массовой памяти USB для передачи файлов на компьютер.

Расположение внешнего хранилища (GT): оно может быть в любом месте вашего внутреннего хранилища (UT) или на съемном носителе (GT), то есть на карте micro SD. Это зависит от OEM вашего телефона, а также от версии ОС Android.

Чтобы читать или записывать файлы на внешнем хранилище (GT), ваше приложение должно получить системные разрешения READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE .

Если вам нужно как читать, так и записывать файлы, вам необходимо запросить только разрешение WRITE_EXTERNAL_STORAGE , так как оно также требует доступа к чтению.

В External Storage (GT) вы также можете сохранять файлы, закрытые для приложения

Когда пользователь удаляет ваше приложение, этот каталог и все его содержимое удаляются.

Когда вам нужно сохранять файлы, закрытые для приложения, в External Storage (GT) ?

Если вы обрабатываете файлы, которые не предназначены для использования другими приложениями (например, графические текстуры или звуковые эффекты, используемые только вашим приложением), вы должны использовать личный каталог хранилища на внешнем хранилище

Начиная с Android 4.4, чтение или запись файлов в личных каталогах вашего приложения не требует READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE . Таким образом, вы можете заявить, что разрешение должно запрашиваться только в более низких версиях Android, добавив атрибут maxSdkVersion :

Способы хранения во внутреннем хранилище (GT):

Оба эти метода присутствуют в классе Context

Способы хранения в основном внешнем хранилище, т.е. внутреннем хранилище (UT):

В начале все использовали Environment.getExternalStorageDirectory () , который указывал на корень Первичного внешнего хранилища . В результате первичное внешнее хранилище было заполнено случайным контентом.

Позже эти два метода были добавлены:

В классе Context они добавили getExternalFilesDir () , указав на каталог приложения для первичного внешнего хранилища. Этот каталог и его содержимое будут удалены, когда приложение будет удалено .

Environment.getExternalStoragePublicDirectory () для централизованных мест для хранения известных типов файлов, таких как фотографии и фильмы. Этот каталог и его содержимое НЕ удаляются при удалении приложения.

Способы хранения в съемном хранилище (GT), то есть карта micro SD

До уровня API 19 не было официального способа хранения на SD-карте. Но многие могли сделать это с помощью неофициальных библиотек или API.

Официально один метод был введен в классе Context в API 19 (Android версии 4.4 — Kitkat).

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

Это означает, что он вернет пути к обоим типам внешнего хранилища (GT) — Внутренняя память и карта Micro SD. Обычно второй путь — это путь хранения микро SD-карты (но не всегда). Поэтому вам нужно проверить это, выполнив код с помощью этого метода.

Пример с фрагментом кода:

Я создал новый проект андроида с пустой активностью, написал следующий код внутри

protected void onCreate(Bundle savedInstanceState) метод MainActivity.java

После выполнения выше кода,

Выход:

Примечание. Я подключил свой телефон к ПК с ОС Windows; включил обе опции разработчика, отладку USB и затем запустил этот код. Если вы не подключите свой телефон ; но вместо этого запускайте это на эмуляторе Android , ваш выход может отличаться. Моя модель телефона — Coolpad Note 3 — работает на Android 5.1

Место хранения на моем телефоне:

Место хранения микро SD : /storage/sdcard1

Внутреннее хранилище (UT) : /storage/sdcard0 .

Обратите внимание, что /sdcard & /storage/emulated/0 /sdcard /storage/emulated/0 также указывают на внутреннее хранилище (UT). Но это символические /storage/sdcard0 на /storage/sdcard0 .

Чтобы четко понимать разные пути хранения в Android, пройдите этот ответ

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

Память на Android. Все разделы памяти Андроид устройств

Многим пользователям, впервые получившим во владение устройство на Android OS, бывает трудно разобраться во всех тонкостях этой системы . Более того, не все опытные юзеры могут похвастаться, что досконально изучили платформу, на которой базируется больше 86%* всех продаваемых мобильных устройств в мире.

*по данным на декабрь 2016 года

А так как одним из важных и популярных вопросов для рядовых пользователей продуктов IT-индустрии был и остаётся вопрос памяти устройства, то данная тема не обошла стороной и операционную систему от компании G o o g l e .
Ниже мы разберём эту тему и ответим на вопрос, какие бывают виды памяти в системе Android OS.

Содержание статьи:

Группировка типов памяти устройств

Сперва рассмотрим, какие виды памяти существуют в принципе. Данная группировка не зависит от используемой на устройстве операционной системы, будь то Android , Windows , MacOS , iOS , Linux или другие, менее распространённые платформы.

Все запоминающие устройства в электронике можно разделить на две основные группы:

  • Энергозависимая память. RAM
  • Энергонезависимая память. ROM

С энергонезависимой памятью понятно, мы обозначили её как RAM (Random Access Memory — Запоминающее устройство с произвольной выборкой).
А вот обозвать всю энергонезависимую память как ROM — это грубое допущение, так как ROMRead-Only Memory, то есть допускает лишь чтение, но в группу энергонезависимой памяти входят и устройства, позволяющие пользователя перезаписывать данные. Однако, мы позволим себе это обобщение, а позже вскользь отметим особенности различных групп ROM-памяти.

Если из типа энергозависимой памяти в Андроид устройствах можно выделить только оперативную память , то энергонезависимая память, в свою очередь, разбивается на различные разделы: системный раздел (который сам ещё делится на разделы), внутренняя память устройства (Internal storage), флеш-память (карта памяти). Об этом мы и поговорим ниже.
А пока приведём таблицу, отображающую, к какой группе относится каждый из типов памяти, встречающийся на современных Андроид смартфонах, с приведением наиболее часто используемых обозначений.

В конце статьи мы приведём ещё одну таблицу, в которой весьма условно попробуем сопоставить рассмотренные разделы системы Андроид и разделы/каталоги Windows OS.

Энергозависимая память. RAM

Что же такое энергозависимая память, и почему она так называется?

Это определение достаточно грубое, но прекрасно отражает принцип работы устройства.

В процессе работы системы в энергозависимую память загружаются необходимые данные. Информация хранится и изменятся в соответствующем модуле ровно до тех пор, пока на него подаётся питание (электричество).
Как только подача энергии прекращается , вся информация из энергозависимой памяти утрачивается . Собственно, поэтому данный тип памяти называется энергозависимой .

В качестве лучшего примера, понятного для большинства читателей, можно привести Оперативную память.

Оперативная память

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

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

  • RAMRandom Access Memory , что в переводе с английского языка означает » память с произвольным доступом «;
  • ОЗУ — что расшифровывается как » оперативное запоминающее устройство «.

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

Узнать размер оперативной памяти аппарата и объём свободной памяти можно не только при помощи сторонних программ, отображающих подобную информацию, но и стандартными средствами. Например, на некоторых устройствах искомые цифры можно увидеть, открыв меню Приложения в настройках телефона и перейдя на вкладку Запущенные

Здесь мы видим, какой объём ОЗУ занят системой, запущенными на данный момент приложениями и сколько Мегабайт (в нашем случае) ещё свободны для использования.
Также сведения об общем размере доступной памяти публикуются в технической информации устройства.

В системе Андроид размер оперативной памяти играет важную роль . Кроме того, что некоторые программы сами по себе достаточно требовательны к железу устройства, важность размера и производительности RAM раздела усугубляется наличием многозадачности в Android OS.

Андроид система самостоятельно управляет оперативной памятью устройства. В ОЗУ постоянно держатся запущенными нужные в данный момент системе и пользователю программы и службы. При запуске новых приложений софт, имеющий наименьший приоритет по отношению к другим программам, будет выгружен из оперативной памяти .

Однако, если пользователя не устраивает то, каким образом система распоряжается имеющимся объёмом раздела RAM, он может самостоятельно влиять на список программ, находящихся в памяти .
Управлять запущенными приложениями и службами , выгружать их, автоматически завершать или полностью запрещать запуск можно с помощью многочисленных программ Таск киллеров (Task killer) и менеджеров автозагрузки.

Читать еще:  Технология активной защиты Protect, как отключить в Яндекс Браузере?

Энергонезависимая память. ROM

Этот тип памяти используется в разных целях: хранение файлов прошивки (операционной системы устройства), размещение разделов восстановления , размещение системных разделов , запись и хранение пользовательских данных и так далее.

В ходе использования энергонезависимой памяти системой и пользователем на устройство записывается любая информация , соответствующая разделу памяти, которая может считываться оттуда при необходимости. При отключении оборудования и прекращении подачи питания на устройство информация с него не пропадает , после повторного запуска системы все данные вновь будут доступны . То есть данный тип памяти не зависит от наличия питания и потому зовётся энергонезависимым .

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

Прошиваемый раздел в Android. PROM

Аббревиатура PROM расшифровывается как Programmable Read-Only Memory, что в переводе с английского означает «Программируемая память только для чтения«, говоря более грамотным языком — Программируемое постоянное запоминающее устройство, сокращённо ППЗУ. Отсюда можно вывести определение:

Рассмотрим основные разделы операционной системы Андроид , относящиеся к PROM, в порядке обращения к ним:

  1. Bootloader (HBOOT) — загрузчик операционной системы. Это сектор памяти, который первым реагирует на включение аппарата. Пользователю интересен тем, что анализирует, нажаты ли в момент включения дополнительные кнопки, и определяет, в каком режиме необходимо запускать устройство . Используется для прошивки смартфона.
  2. Recovery — раздел, содержащий системное программное обеспечение, предназначенное для диагностики аппарата, восстановления системы и создания её резервных копий.
    Современные кастомные рекавери (custom recovery) имеют более широкий функционал, позволяют устанавливать сторонние прошивки , имеют встроенный менеджер файлов и так далее.
  3. Boot — раздел памяти в системе Android, содержащий ядро ОС , драйвера и файлы, необходимые для управления устройство на низком уровне (команды процессора и памяти). Возможна перезапись этого раздела без замены основной прошивки.
  4. System — системный раздел, содержащий файлы прошивки , стандартных программ и библиотеки операционной системы. Содержимое раздела System возможно изменять при наличии у пользователя прав суперпользователя root. К примеру, отредактировав должным образом файл hosts, находящийся по пути /system/etc/hosts , можно избавить от рекламы на телефоне Андроид (подробнее об этом в соответствующей статье: Убираем рекламу на Android. Файл hosts)

Все четыре раздела памяти Андроид, описанные выше, являются системными и условно нередактируемыми.
С этим связана ещё одна особенность данных разделов: если вы делаете возврат к стандартным настройкам аппарата ( полный сброс ) из меню устройства или Wipe data/factory reset из Recoery, то вышеперечисленные разделы форматированию НЕ ПОДВЕРГАЮТСЯ.
Если в одной из этих областей произошёл сбой или возникли какие-то другие проблемы, то для их исправления необходимо будет прошивать устройство полностью или соответствующую часть памяти.

Теперь рассмотрим ту часть памяти, которая может изменяться пользователем самостоятельно и без root прав .

Перезаписываемый раздел в Android. EEPROM

EEPROM расшифровывается как Electrically Erasable Programmable Read-Only Memory, что с английского переводится следующим образом: Электрически стираемое перепрограммируемое постоянное запоминающее устройство.
По сути это означает, что устройство способно хранить записанные на него данные, но позволяет многократно редактировать информацию без наличия особых прав (прав суперпользователя).

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

К перезаписываем разделам системы относится как внутренняя память Андроид, доступная пользователю, так и карта памяти на Андроид, если таковая имеется.

  1. Внутренняя память устройства (Internal phone storage) — та часть модуля памяти смартфона, которая не занята системными разделами и доступна пользователю для размещения приложений, медиа-контента и документов. Часть памяти, на которую устанавливается софт , определяется как раздел Data, а часть, занятая пользовательскими файлами — как User.
    Зачастую реальной границы между этими областями нет, и тогда распределение памяти зависит только от нужд владельца устройства.
  2. SD-карта (SDHC) — флеш-память, доступная пользователю в полном объёме. Всё пространство флешки может использоваться для хранения личных файлов. Кроме того, может быть произведена как установка приложений на карту памяти Андроид, так и перенос программ и игр Андроид на карту памяти (если данная возможность реализована в установленной версии операционной системы). SDHC-память может быть не только внешней, но и внутренней, распаяной на плате аппарата. В статье Разрешение на запись в корень sd-карты на Android 4.4+рассмотрен способ обхода ограничения, введённого Google, для новых версий своей системы.

Internal phone storage и SD-карта напрямую не оказывают влияние на работу системы Андроид, однако,в случае неполадок и неисправностей, могут вызывать существенные сбои в работе всей ОС.

Теперь, как и обещали в начале записи, сопоставим память Андроид ОС и память системы Windows . Сопоставление приводим лишь для ознакомления, на самом деле, конечно, данные приведены с грубыми допущениями.

Android Internal Storage: пример работы с внутренней памятью

Для начала приведу информацию относительно памяти телефона найденую мною на одном из сайтов.

    1. RAM (ОЗУ)

RAM (ОЗУ) — это память «с произвольным доступом», то есть т.н. оперативная память, куда программное обеспечение (ПО) записывает и считывает информацию быстро (и без эмуляции). Содержимое оперативной памяти очистится при пропадании питания, например, если телефон выключить. Объём оперативной памяти решает, сколько приложений можно запускать одновременно, или как большой файл может быть загружен в память для работы (просмотр, редактирование и т.д.). Возможна ошибка «Недостаточно памяти», если память исчерпана и не получается запустить программу. Android 2.2 знает, какие приложения можно убрать из RAM, когда необходимо. До Android 2.2, максимум 256 Мб оперативной памяти поддерживалось.

    2. ROM (ПЗУ)

ROM (ПЗУ) — это память только для чтения (Read-Only Memory). То, что в ней хранится, никогда не может быть изменено (записывается однократно на при изготовлении телефона); и ROM (ПЗУ) хранит данные даже без питания.

В Android-телефоне ROM разбита на несколько разделов. Одна часть для ОС (операционной системы). Раздел ОС защищён, и вы не сможете писать в него без прав root. Root — это получение прав супер-пользователя операционной системы, тогда будет можно читать/писать в разделе ОС, например, заменить образ ОС (что, таким образом, позволяет использовать несколько разных операционных систем).

    3. Internal phone storage («Внутренняя память телефона»)

Internal phone storage («Внутренняя память телефона») — это вторая часть памяти, предназначенная для пользовательских данных, включая загруженные приложения и их сохраненные данные (из RAM). В Android 2.2, она монтируется в /mnt/asec, и в котором — apk-файлы загруженных приложений. Поэтому этот вид памяти называют Internal phone storage («Ёмкость внутренней памяти телефона»). Этот раздел подобен компьютерному внутреннему HDD (диску «С:» у Windows или «file system» у Ubuntu/Linux). Свободного пространства в Internal phone storage («Внутренняя память телефона») становится меньше, когда вы устанавливаете больше приложений. Это место можно проверит так: «Настройки» -> «SD-карта и память телефона» -> «Внутренняя память» (Internal storage). Может наступить момент, когда уже нельзя установить приложения — когда на Internal phone storage («Внутренняя память телефона») слишком мало свободного пространства; тогда нужно удалить ненужные программы.

    4. MicroSD / SDHC / SDXC . (есть и смартфоны без слота для карты)

Это единственный тип памяти, которую пользователь может расширить. Он аналогичен внешнему жесткому диску (External HDD) для компьютера. МикроSD монтируется в /etc/SDCARD на телефоне. Эту память можно увидеть в разделе «Настройки» -> «SD-карта и память телефона» -> «SD карта».

На MicroSD-карте можно хранить любые данные в виде файлов (фильмы, музыку, фотографии и так далее). По сути, можно использовать телефон в качестве т.н. «флэшки», то есть в качестве микроSD-карты. В Android 2.2 часть установленных приложений можно перенести из «Внутренняя память» (Internal storage) сюда — на SD-карту; следовательно, это экономит драгоценное пространство «Внутренней памяти» (Internal storage). Но не все приложения могут быть перемещены из «Внутренней памяти» на карту памяти SD. Поэтому даже добавление большой SD-карты не поможет, если «Внутренняя память» близка к заполнению.

При желании заменть SD-карту (например, на другую с большей пропускной способностью), не забудьте отключить («отмонтировать») текущую SD-карту, прежде чем физически вынимать её: «Настройки» -> «SD-карта и память телефона» -> «SD карта» -> «Отключить SD-Card» (ведь Android основан на Linux-е). Вставленная новая SD-карта будет автоматически установлена («примонтирована»).

Я не являюсь специалистом ни по OS Android, ни по Linux, поэтому простите мне ошибки в названиях и неточности в тексте.
Так вот, приобрели мы моей жене замечательный телефон «Samsung Galaxy Ace» под управлением OS Android. Приобрели его под моим настоянием, т.к. я, до этого немного сталкивался с «Android, и вариант с IOS, Windows и прочими Simbian категорически отвергал. Замечательный оказался телефончик, отзывчивый экран, шустрый процессор, понятная OS, всё восторгало. И я, как «специалист», принялся его всячески улучшать, устанавливать одни программы, удалять другие, экспериментировать с настройками, играть в игрушки, лазить в интернет. Всё супер!
Прошёл месяц такого активного творчества. И вдруг, появилось сообщение «память телефона заполнена». Ну заполнена так заполнена — не придал значения я, освободим, и удалил данные у какой то программы. Помогло, и продолжилось мучение телефона.
Прошло какое-то время, сообщение появилось снова, ну я по проторенной дороге удалил данные у другой программы, затем несколько программ. Помогло.
Прошло какое то время, сообщение появилось снова! Я в настройки – «Очистить ОЗУ» — всё ОК. Ненадолго, увы.

Залез в интернет, скачал программы по очистке памяти –очищают, но сообщение остаётся. Залез в интернет, начал разбираться, выяснил, что не хватает места в Internal storage («Внутренняя память»), а все эти программы чистят RAM (ОЗУ) и для решения моей проблемы не пригодны. Сообщение «Память заполнена» вылезало при заполненности внутренней памяти телефона более 160 из 181 Мб.
Начал искать за..лей памяти Internal storage, выяснил, что это обновления Карт Google и данные Android Market. Запретил картам обновляться, перестал пользоваться Marketом. Временно помогло.

Начал удалять всё подряд, нужное, не нужное. Постепенно удалил почти всё, включая Google Maps, Android Market, Skype, и много другого, чего наустанавливал ранее (осталась только любимая игрушка жены Lines). Всё помогало временно, сообщение в конце концов вылезало снова, а удалять было больше нечего, осталось только самое необходимое.
Жена пилит – «Всё ты, со своими экспериментами»

Залез в интернет, выяснил, что доступ к Internal storage можно получить имея root права. Станцевал с бубном в течении примерно часов 10, получил на телефоне root права. Как? – не помню. В форуме всё написано, но либо у меня уже мозги не те, либо на форуме пишет народ с не теми мозгами :rolleyes:
С помощью программы Link2SD, перенёс часть программ на карту SD. Это хорошо почистило память. Хватило примерно на месяц. Через месяц СМС опять не приходят.

Начал настраивать себя на снос и переустановку системы, всё не решался >-)
Залез в интернет, выяснил, что есть такие временные файлы с расширением rm. Нашёл их в папке datalocaltmp c помощью программы RootExplorer, удалил – помогло не надолго (объём их был около 3 Мб).
Залез в папку data основательно, прошерстил её различными способами. Нашёл кучу файлов с расширением log, в названии которых присутствует слово error и название различных программ, в том числе тех, которые я удалил давно. Размер каждого из них составлял около 2 Mb, а количество – около 30 шт. Удалил их все. И, о чудо, внутренняя память заполнена 62 Мб из 181 (и телефон работает). Надолго ли? Посмотрим, такое ощущение что чистить надо постоянно.

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector