Управление памятью андроид: Android: управляем памятью | GeekBrains – Топ 5 Android памяти инструмент управления для получения наиболее памяти Android

Содержание

Управление RAM-памятью на Android: делать очистку нет нужды

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

Что такое RAM

В смартфоне, как и в любом ПК, есть несколько видов памяти. Они работают с разной скоростью и стоят также по-разному. К примеру, внутренняя память
относительно медлительна, недорога и может сохранять информацию даже при отключении источника питания. Именно во внутренней памяти хранятся приложения, их данные, а равно фото и видео. Оперативная память стоит дороже внутренней, но зато намного быстрее ее. При отключении питания информация в такой памяти не сохраняется. RAM-память является как бы рабочей оболочкой для ваших приложений, где хранятся временные данные, необходимые для использования вашего телефона.

Управление RAM-памятью на Android

Память заполнена: причина для паники?

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

Представление о том, что RAM-память внутри Android-девайса нужно очищать вручную, является не совсем верным. Если «оперативка» будет пустой, то вам придется постоянно перезапускать приложения, а это лишняя трата времени, ресурсов телефона и сокращение времени работы аккумулятора.

Полная RAM-память – это не слишком плохо, можно даже сказать, хорошо. Так как Android имеет свои корни в Linux и Unix, системное ядро Linux определяет правила для управления памятью. И такие правила следуют концепции, что свободная внутренняя память – это потерянная память.

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

Но если на вашем девайсе есть приложение-убийца или функция экономии памяти, которая постоянно закрывает процессы фонового режима, вам придется долго ждать, пока загрузятся такие приложения, как скажем, Facebook или Whatsapp. Подобный способ управления RAM-памятью может даже нанести вред производительным смартфонам, например, Samsung Galaxy S7.

Очистка оперативной памяти на Android-устройстве: когда ее нужно делать?

[the_ad_placement id=”web-mobile-inline”]

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

Как правило, не рекомендуется прекращать работу приложения или очищать всю память. Тем не менее, бывает ситуация, которая требует прямого действия: когда приложение дает сбой или работает некорректно. Например, это может быть браузер, который работает с подтормаживанием или в котором присутствуют ошибки отображения информации. Либо это могут быт проблемы с загрузкой Facebook или Twitter. Такие симптомы могут быть весьма разнообразными. Даже перегрев смартфона без очевидной причины может быть связан с приложением, давшем сбой.

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

Управление RAM-памятью на Android фото 2

Как отобразить использование RAM-памяти и закрыть Android-приложения

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

Итак, чтобы отобразить объем используемой «оперативки», войдите в настройки вашего телефона, найдите меню приложений и откройте вкладку «Работающие». Начиная с версии Android Marshmallow, это представление имеет собственную запись в разделе «Память» в главных настройках.

[the_ad_placement id=”web-mobile-inline”]

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

Управление RAM-памятью на Android фото 3

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

Очистка RAM-памяти: удаление приложений, «съедающих» память

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

Войдите в меню настроек приложения или менеджера приложений и найдите соответствующее приложение. Теперь просто удалите приложение, если это возможно. Если это не сработает, вам необходимо удалить «расширенные права» приложения. Обычно вы предоставляете такие права приложению во время его установки на телефон. Откройте основные настройки, выберите раздел «Безопасность», затем «Администраторы устройства» и удалите крестик рядом с приложением. Теперь вы можете удалить приложение.

Управление RAM-памятью на Android фото 4

Заключение

Итак, нужно ли вам делать чистку внутренней памяти? Ответ прост – нет! Вам нужно лишь принять меры тогда, когда ваш телефон станет работать медленнее. В целом, Android-девайсы могут самостоятельно управлять RAM-памятью на оптимальном уровне. Закрытие приложений в общем списке приложений может улучить общую функциональность устройства, но это не имеет ничего общего с оптимизацией и эффективностью оперативной памяти.

На наш взгляд, автоматическое управление RAM-памятью Android-девайса – это самая быстрая и эффективная система, которую вы могли бы пожелать. Так что оставьте управление памятью самой ОС Android, и она вас не подведет

Топ 5 Android Управления памяти Инструмент, чтобы получить максимальную Память Android

Часть 1: Различия между Android памяти, Android Storage и Android Task

Давайте посмотрим на типы Android хранения и понять различия между Android памяти, Android хранения и задачи Android.

Android хранения имеет следующие типы:

  • Read Only Memory (ROM)
  • Random Access Memory (RAM)
  • Внутреннее хранилище
  • Память телефона
  • хранения USB (карты памяти SD)

1. Android памяти или ОЗУ

Оперативная память является формой хранения данных, используемым для хранения данных. Он используется только для чтения и записи в файл хранилища. Думайте об этом как большой картотеке, который держит вещи, готовые для процессора в телефоне и представляет для глаз и ушей. Это перезаписываемые, быстрый и дешевый вид памяти, но это также не модернизированы. Обычно телефон имеет 1 или 2 ГБ оперативной памяти. Среди этого операционная система будет использовать часть этого. Таким образом, вы никогда не будете иметь полную оперативную память, доступную для использования.

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

2. Android хранения

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

  • Внутренняя память: Этот вид хранения постоянно подключена к телефону. Вы не можете удалить или обновить эту память. Внутреннее хранение особенно важно, потому что это, где ваши приложения будут сохранены.
  • Телефон Хранение: Это часть внутренней памяти, где находится все предустановленных приложений , которые поставляются вместе с устройством (приложения , которые не являются частью операционной системы)
  • накопители: Это съемный носитель , где вы можете хранить свои файлы с компьютера или любого другого мультимедийного устройства в случае , если вы бежите из внутренней памяти. Это больше похоже на расширяемой памяти , который можно удалить и поставить его в другое устройство и до сих пор увидеть содержимое.

Как и большинство пользователей Android, вы можете столкнуться с небольшими вопросами пространства, когда речь идет о доступной внутренней памяти для приложений. Сложная задача, вы сталкиваетесь, то, чтобы пройти через каждый из ваших приложений и найти основные мегабайта преступников. Одним из путей решения этого приложение называется DiskUsage. DiskUsage сканирует расположение и отображает визуальное представление Вашего использования диска.

3. Android Task

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

Задачи могут быть перечислены на три категории: активные, неактивные и внутренний.

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

Неактивный: Эти задачи хранятся в памяти , но не с помощью каких - либо системных ресурсов , таких как батареи. Там нет необходимости убивать их , как это не принесет каких - либо изменений.

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

Советы по оптимизации использования памяти приложениями Android

Выделение и освобождение памяти в Android всегда достигались высокой ценой. Китайская пословица гласит: «После бедности легко привыкнуть к роскоши, но после роскоши трудно привыкнуть к бедности». Эта фраза вполне применима и к использованию памяти приложениями.

Представим себе наихудший возможный сценарий: идет компиляция приложения с миллионами строк кода, и внезапно происходит сбой из-за нехватки памяти (ООМ). Вы начинаете отлаживать приложение и анализировать файл hprof. Если повезет, то вы сможете найти причину сбоя и устранить проблему нехватки памяти. Но иногда везение обходит вас стороной, вы обнаруживаете, что множество мелких переменных и временных объектов выделяет память таким образом, что не существует простого способа исправить эту проблему. Это означает, что придется перестраивать код, что всегда связано с потенциальным риском, и лишь ради того, чтобы сэкономить несколько килобайт, а иногда и несколько байт памяти.

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

Управление памятью в Android

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

В виртуальной машине Dalvik размер кучи для процессов приложений ограничен. Приложения начинают работу с 2МБ, а максимальный размер выделения, называемый largeHeap, составляет до 36МБ (в зависимости от конфигурации конкретного устройства). Примеры приложения с большой кучей: редакторы фото и видео, камера, галерея, домашний экран.

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

Как улучшить использование памяти

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

1. Будьте осторожны при использовании «абстракций». Впрочем, с точки зрения архитектуры абстракция может помочь в достижении более высокой гибкости. В мобильных решениях у абстракции может быть побочный эффект, который заключается в выполнении добавочного кода, из-за чего расходуется больше ресурсов ЦП и памяти. Использовать абстракцию следует лишь в том случае, если она дает вашему приложению ощутимое преимущество.

2. Не используйте enum. По сравнению с обычными статическими константами при использовании enum выделятся вдвое больше памяти.

3. Попробуйте использовать оптимизированные контейнеры SparseArray, SparseBooleanArray и LongSparseArray вместо HashMap. HashMap выделяет объект вхождения при каждом сопоставлении. Это очень неэффективно с точки зрения памяти и с точки зрения производительности, поскольку сопровождается множеством операций автоматической упаковки и распаковки. Контейнеры наподобие SparseArray сопоставляют ключи с простыми массивами. Но помните, что такие оптимизированные контейнеры непригодны для большого количества элементов; при выполнении действий добавления, удаления и поиска они медленнее, чем Hashmap, если набор данных содержит несколько тысяч записей.

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

5. Проверяйте доступность кучи вашего приложения. Вызывайте ActivityManager::getMemoryClass(), чтобы запросить, какой объем кучи (в МБ) доступен для приложения. При попытке выделить больше памяти, чем доступно, возникнет исключение OutofMemory. Если приложение объявляет largeHeap в AndroidManifest.xml, то можно вызвать ActivityManager::getLargeMemoryClass() для запроса предполагаемого размера большой кучи.

6. Скоординируйте работу с системой с помощью обратного вызова onTrimMemory(). Используйте ComponentCallbacks2::onTrimMemory(int) в Activity/Service/ContentProvider для постепенного высвобождения памяти согласно последним ограничениям системы. Благодаря onTrimMemory(int) повышается общая скорость отклика системы, но процессы дольше поддерживаются в активном состоянии.

Когда возникает событие TRIM_MEMORY_UI_HIDDEN, это означает, что весь пользовательский интерфейс вашего приложения был скрыт и нужно высвободить ресурсы пользовательского интерфейса. Когда приложение работает в режиме переднего плана, могут появиться сообщения TRIM_MEMORY_RUNNING[MODERATE/LOW/CRITICAL], а в фоновом режиме — TRIM_MEMORY_[BACKGROUND/MODERATE/COMPLETE]. Можно освободить память от второстепенных ресурсов на основе стратегии высвобождения памяти при ее нехватке.

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

Если же вы создаете приложение, которое должно быть запущено в течение длительного периода времени, например службу музыкального проигрывателя, его следует разделить на два процесса: один для пользовательского интерфейса, а другой для фоновой службы. Для этого нужно задать свойство службы android:process в файле AndroidManifest.xml. Ресурсы в процессе пользовательского интерфейса можно высвобождать после скрытия приложения, а фоновая служба воспроизведения продолжит работать. Помните, что процесс фоновой службы ни в коем случае не должен взаимодействовать с пользовательским интерфейсом. В противном случае объем потребляемой памяти может вырасти вдвое или втрое!

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

9. Используйте растровые рисунки правильного разрешения. Загружайте растровые рисунки нужного разрешения или уменьшайте разрешение, если у исходных растровых рисунков оно слишком большое.

10. Используйте Proguard* и zipalign. Средство Proguard удаляет неиспользуемый код и маскирует классы, методы и поля. При этом код становится более компактным, снижается количество требуемых распределяемых страниц оперативной памяти. Средство zipalign перестраивает APK-файл. Если средство zipalign не запущено, потребуется больше памяти, поскольку из APK невозможно распределять файлы ресурсов.

Как избежать утечек памяти

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

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

2. Не забудьте вызвать unregisterReceiver() после вызова registerReceiver().

3. Избегайте утечки контекста. Если объявить статическую переменную Drawable в Activity, а затем вызвать view.setBackground(drawable) в onCreate(), то после поворота экрана будет создан новый экземпляр Activity, а отменить выделение памяти прежнему экземпляру Activity будет невозможно, поскольку представление задано как обратный вызов и представление ссылается на Activity (Context). Утечка в экземпляре Activity означает утечку значительного объема памяти с высокой вероятностью возникновения ошибки «Недостаточно памяти».

Избежать такой утечки можно двумя способами.

  • Не храните долгосрочные ссылки на context-activity. Жизненный цикл ссылки на действие должен быть таким же, как у самого действия.
  • Попробуйте использовать context-application вместо context-activity.

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

5. Будьте осторожны при работе с потоками. Потоки в Java находятся вне сборки мусора. Другими словами, виртуальная машина Dalvik (DVM) хранит жесткие ссылки на все активные потоки в системе выполнения, поэтому все потоки, оставшиеся запущенными, не попадают под действие сборки мусора. Потоки в Java сохраняются в памяти до тех пор, пока либо они не будут закрыты явным образом, либо весь процесс не будет завершен системой Android. В среде приложений Android поддерживается множество классов, предназначенных для повышения удобства фоновой работы с потоками.

  • Используйте Loader вместо потока для выполнения краткосрочных асинхронных фоновых запросов вместе с жизненным циклом Activity.
  • Используйте Service и передавайте результаты в Activity с помощью BroadcastReceiver.
  • Используйте AsyncTask для краткосрочных операций.

Как проанализировать использование памяти

Для получения дополнительных сведений о статистике использования памяти в интерактивном и автономном режимах можно просмотреть основной журнал Android с помощью команды logcat в Android Debug Bridge (ADB), информацию дампа памяти для определенного имени пакета или с помощью других инструментов, таких как Dalvik Debug Monitor Server (DDMS) и Memory Analyzer Tool (MAT). Вот краткое описание анализа использования памяти вашим приложением.

1. Для получения дополнительных сведений о статистике использования памяти в интерактивном и автономном режимах можно просмотреть основной журнал Android с помощью команды logcat в Android Debug Bridge (ADB), информацию дампа памяти для определенного имени пакета или с помощью других инструментов, таких как Dalvik Debug Monitor Server (DDMS) и Memory Analyzer Tool (MAT). Вот краткое описание анализа использования памяти вашим приложением.

  • Причина сборщика мусора. Что запустило сборку мусора и какого типа эта сборка? Причины могут быть следующими.
    • §GC_CONCURRENT: одновременная сборка мусора, высвобождающая память по мере заполнения кучи.
    • §GC_FOR_ALLOC: сборка мусора, которая запускается из-за того, что приложение попыталось выделить память при уже полной куче, поэтому системе пришлось остановить приложение и вернуть память.
    • §GC_HPROF_DUMP_HEAP: сборка мусора, возникающая при создании файла HPROF для анализа кучи.
    • §GC_EXPLICIT: запущенная явным образом сборка мусора, например при вызове gc() (чего следует избегать; нужно полагаться на то, что сборщик мусора сам запустится в нужный момент).
  • Освобожденный объем: объем памяти, освобожденный после этой сборки мусора.
  • Статистика кучи: процент свободной памяти и (количество действующих объектов/общий размер кучи).
  • Статистика внешней памяти: внешняя выделенная память на уровне API 10 и ниже (объем выделенной памяти/предел, по достижении которого начнется сборка мусора).
  • Время приостановки: у более крупных куч время приостановки будет больше. При одновременной приостановке отображаются две приостановки: одна в начале сборки, а другая ближе к окончанию.

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

2. Используйте DDMS для просмотра обновлений кучи и отслеживания выделения памяти.

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

3. Просмотр общего выделения памяти.

С помощью команды adb — adbshelldumpsysmeminfo <имя_пакета>— можно просмотреть всю текущую выделенную память приложения (в КБ).

Как правило, следует обращать внимание только на столбцы Pss Total и Private Dirty. В столбце Pss Total включено выделение всех объектов Zygote (с установкой весового коэффициента согласно их совместному использованию процессами в соответствии с определением PSS выше). В столбце Private Dirty — объем фактической оперативной памяти, предоставленной куче приложения, выделенным областям и всем страницам Zygote, измененным с момента ответвления процесса приложения из объекта Zygote.

Кроме того, в столбце ViewRootImpl отображается количество корневых представлений, действующих в вашем процессе. Каждое корневое представление связано с окном, поэтому это поможет выявить утечки памяти, связанные с диалоговыми или другими окнами. На вкладках AppContexts и Activities отображается количество объектов Context и Activity приложения, используемых в вашем процессе. Это может пригодиться для выявления утечек объектов Activity, к которым невозможно применить сборку мусора из-за наличия в них статических ссылок, что бывает довольно часто. С такими объектами зачастую связано множество других ресурсов, и так можно удобно отслеживать крупные утечки памяти.

4. Сохраните дамп кучи и проанализируйте его в программе Eclipse Memory Analyzer Tool (MAT).

Записать дамп кучи можно непосредственно с помощью DDMS, а для более точных результатов можно вызвать Debug::dumpHprofData() в коде приложения. Затем потребуется применить программу hprof-conv для получения преобразованного файла HPROF. На следующем снимке экрана показан результат анализа памяти в МАТ.

Заключение

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

Справочные материалы

Об авторе

Бин Чжу (Bin Zhu) — инженер по разработке приложений в команде Intel® Atom™ Processor Mobile Enabling Team в подразделении Developer Relations Division отдела Software and Solutions Group (SSG). Он отвечает за поддержку приложений Android на процессорах Intel Atom, а также занимается технологиями мультимедиа на платформах Android x86.

Дополнительные сведения об оптимизации компиляторов см. в нашем уведомлении об оптимизации.

Управление использованием памяти приложениями | Фанклуб пользователей андроид

 

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

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

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

В зависимости от модели телефон может быть оснащен внутренним USB-накопителем или съемной SD-картой. Содержимое этого типа памяти может быть просмотрено при подключении телефона к компьютеру (как описано в разделе "Подключение к компьютеру через USB"). Допускается копирование данных как в эту память, так и из нее. Кроме того, некоторые приложения также могут быть установлены в этой, а не во внутренней памяти. Соответствующий параметр задается как по умолчанию, так и по выбору пользователя.

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

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

  • Установка или удаление приложений (см. разделы "Маркет" и "Удаление приложения").
  • Загрузка файлов в Браузере, в Gmail или других приложениях.
  • Создание файлов (например, съемка).
  • Удаление загруженных или созданных файлов (см. раздел "Управление загрузками" на стр. 63 и документацию по используемым приложениям).
  • Использование компьютера для копирования или удаления файлов с USB-накопителя или SD-карты (см. раздел "Подключение к компьютеру через USB").
  • Изменение места установки приложения - во внутренней памяти, на USB-накопителе или на SD-карте, если это поддерживается приложением (см. раздел "Изменение места размещения приложения").

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

Открытие экрана "Управление приложениями"

Нажмите Главная, затем Менюи Управление приложениями.

ИЛИ

Откройте приложение "Настройки", нажмите Приложения > Управление приложениями.

На экране "Управление приложениями" содержатся четыре вкладки, на каждой из которых отображается список приложений и их компонентов. В нижней части каждой вкладки располагается диаграмма памяти, используемой элементами в списке, а также объем свободной памяти.

  • Нажмите на приложение, процесс или службу в списке, чтобы открыть экран, на котором будут приведены подробные сведения об этом элементе. Кроме того, в зависимости от типа элемента можно изменить его настройки, остановить его выполнение, удалить его из операционной системы и т. п. Большинство из этих задач описаны в этом разделе.
  • Перейдите на вкладку Сторонние разработчики, чтобы просмотреть приложения, загруженные с Маркета или из других источников.
  • Перейдите на вкладку Все, чтобы просмотреть все приложения, установленные на телефоне. В этот список входят приложения, включенные в используемый вами выпуск Android, а также все приложения, загруженные из Маркета или других источников.
  • Перейдите на вкладку USB-накопитель или SD-карта (в зависимости от модели телефона), чтобы просмотреть установленные там приложения. Отмеченные флажками элементы установлены на USB-накопителе или SD-карте. Неотмеченные элементы установлены во внутренней памяти телефона, однако при необходимости они могут быть перемещены в другие места хранения. См. раздел "Изменение места размещения приложения".
  • Перейдите на вкладку Выполняемые сейчас, чтобы просмотреть выполняемые или кэшированные приложения и соответствующие процессы и службы. См. раздел "Остановка сбойного приложения".
  • Во время просмотра вкладки Выполняемые сейчас, Все, USB-накопитель или SD-карта нажмите Менюи выберите Упорядочить по размеру или Упорядочить по имени для изменения порядка элементов в списке.

Получение подробных сведений о приложении

  1. Откройте экран "Управление приложениями".
  2. Выберите приложение, процесс или службу.

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

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

  • Если вы установили приложение из Android Маркета или другого источника, можно использовать кнопку Удалить для удаления с телефона как самого приложения, так и всех его данных и настроек. Дополнительные сведения об удалении и повторной установке приложений см. в разделах "Маркет" и "Удаление приложения".
  • Память. Здесь содержатся сведения об объеме памяти на телефоне, который используется приложениями.
  • Можно удалить настройки приложения и прочие данные, нажав кнопку Стереть данные.
  • Можно использовать команды "Переместить на USB-накопитель" или "Переместить на SD-карту" (в зависимости от модели телефона) и кнопки "Переместить в" для изменения места хранения приложений (см. раздел "Изменение места размещения приложения").
  • Кэш. Здесь отображается объем хранимой информации, если приложение хранит данные во временной области памяти телефона, а также содержится кнопка для очистки этой области памяти.
  • Запускать по умолчанию. Если вы настраивали приложение для запуска определенных типов файлов по умолчанию, эти настройки можно сбросить здесь.
  • Разрешения. Здесь содержатся все типы информации о телефоне и о данных, к которым есть доступ у приложения.

Остановка сбойного приложения

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

  1. Откройте экран "Управление приложениями".
  2. Перейдите на вкладку Выполняемые сейчас.
  3. Нажмите Меню, затем Показать кэшированные процессы или Показать выполняемые процессы, чтобы переключаться между этими двумя режимами.

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

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

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

Удаление приложения

Можно удалить приложения, загруженные с Маркета или из других источников. Можно также использовать Маркет для удаления загруженных из него приложений (см. раздел "Управление загрузками").

  1. Откройте экран "Управление приложениями".
  2. Перейдите на вкладку Загрузки.
  3. Выберите приложение, которое следует удалить.
  4. Нажмите кнопку Удалить.
  5. На экране с подтверждением удаления приложения нажмите кнопку ОК.

Изменение места размещения приложения

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

  1. Откройте экран "Управление приложениями".
  2. Перейдите на вкладку USB-накопитель или SD-карта.

На вкладке приведены приложения, которые хранятся или могут храниться на USB-накопителе или SD-карте телефона. Для каждого приложения приводится объем, занимаемый этим приложением во внутренней памяти телефона (даже если приложения там не хранятся, они занимают некоторый объем внутренней памяти).

Приложения, размещенные на USB-накопителе или SD-карте телефона, отмечены флажком.

На диаграмме в нижней части экрана показан объем используемой и свободной памяти на USB-накопителе или SD-карте телефона: общее значение включает в себя объем файлов и других данных, а не только приложения, указанные в списке.

  • Выберите приложение из списка.

В разделе "Память" на экране подробных сведений о приложении приведены сведения о памяти, используемой приложением. Если приложение может быть перемещено, кнопка Переместить становится активной.

  • Выберите команду Переместить на USB-накопитель или Переместить на SD-карту, чтобы переместить приложение из внутренней памяти телефона.

Выберите команду Переместить на телефон, чтобы переместить приложение обратно во внутреннюю память телефона.

Управление памятью вашего приложения | Учебный курс по разработке Android приложений

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

Для того, чтобы сборщик мусора смог вернуть память из вашего приложения, вам нужно избегать утечек памяти (обычно вызванные удержанием ссылок на объекты в глобальных членах классов) и освободить все Reference объекты в соответствующее время (как определено жизненным циклом обратных вызовов, обсуждаемым ниже). Для большинства приложений, сборщик мусора Dalvik заботится об остальном: система освобождает выделения памяти, когда соответствующие объекты выходят за рамки активных потоков вашего приложения.

Этот документ объясняет, как Android управляет процессами приложений и выделением памяти, и как вы можете активно уменьшить использование памяти при разработке для Android. Дополнительные сведения об общей практики по очистке своих ресурсов при программировании на Java, обратитесь к другим книгам или онлайн документации об управлении ссылками на ресурсы. Если вы ищете информацию о том, как анализировать память вашего приложения, как только вы собрали его, читайте Исследование использования оперативной памяти.

Как Android управляет памятью

Android не предоставляет подкачку для памяти, но используется подкачка страниц и отображение файла в память (mmapping) для управления памятью. Это означает, что любое изменение памяти, путем выделения новых объектов, или касающиеся файлов с отображением в память — прежнему находится в оперативной памяти и не может быть выгружено. Поэтому единственным способом полностью освободить память вашего приложения является освобождение ссылок на объекты, которые вы возможно храните, позволив сборщику мусора освободить память. За одним исключением: любые файлы с отображением в память без изменений, такие как код, могут быть выгружены из памяти, если система захочет использовать эту память в другом месте.

Общая память

Чтобы вместить всё необходимое в оперативной памяти, Android пытается совместно использовать страницы оперативной памяти между процессам. Он может делать это одним из следующих способов:

  • Каждый процесс приложения является ответвлением от существующего процесса, называемого Zygote. Zygote процесс запускается при загрузке системы и нагружает общие библиотеки кода и ресурсы (например, темы). Чтобы начать новый процесс приложения, система создает ответвление от процесса Zygote, загружает и запускает код приложения в новом процессе. Это позволяет большинству страниц оперативной памяти, выделенной для библиотечного кодекса и ресурсов, быть общими для всех процессов приложений.
  • Большая часть статических данных загружается с помощью отображения файла память в процесса. Это позволяет не только распределять одни и те же данные между процессами, но и позволяет выгрузить их, когда это необходимо. Пример статические данные включают в себя: Dalvik код (помещенный в предварительно скомпонованный .odex файл для прямого отображения в память), ресурсы приложений (по дизайну таблица ресурсов является структурой, которая может быть загружена, используя выравнивание zip элементов вашего APK), и традиционные элементы проекта, такой как машинный код собранный в .so файлы.
  • Во многих местах, Android разделяет ту же динамическую память между процессами, благодаря использованию явно выделенных регионов разделяемой памяти (либо с ashmem или gralloc). Например, оконные отображения хранятся в общей памяти между приложением и композитором экрана, и буферы курсора используют общую память между контент-провайдером и клиентом.

В связи с широким использованием общей памяти, определение того, сколько памяти ваше приложение использует, требуется особого внимания. Методы для правильного определения использования памяти в вашем приложении обсуждаются в статье Исследование использования оперативной памяти.

Выделение и освобождение памяти приложения

Вот некоторые факты о том, как Android выделяет и затем освобождает память вашего приложения:

  • Dalvik "куча" каждого процесса ограничена размером виртуальной памяти. Это определяет размер логической кучи, которая может расти по необходимости (но только до предела, который система определяет для каждого приложения).
  • Логический размер кучи отличается от объема физической памяти, используемой кучей. Просматривая кучу вашего приложения, Android вычисляет значение, называемое Пропорциональный размер набора (Proportional Set Size - PSS), который вычисляется как для грязных, так и чистых страниц, которые совместно используются с другими процессами, но только в соответствии с этой пропорцией, в зависимости от того, сколько приложений использует эту память. Этот (PSS) это то, что система считает отпечатком вашей физической памяти. Дополнительные сведения о PSS см. в Исследование использования оперативной памяти.
  • Dalvik куча не сжимает логический размер кучи, что означает, что Android не дефрагментирует кучу, чтобы уменьшить пространство. Android может уменьшить логический размер кучи только, когда есть неиспользуемое пространство в конце кучи. Но это не означает, что физическая память используемая в куче, не может сокращаться. После сборки мусора, Dalvik проходит по куче и находит неиспользуемые страницы, а затем возвращает эти страницы в ядро ​​с помощью madvise. Таким образом, работая в паре выделение и освобождение больших кусков должно привести к освобождению всей (или почти всей) используемой физической памяти. Однако освобождения памяти небольших выделений может быть гораздо менее эффективным, так как страница используется для небольшого выделения, которое все еще может использоваться совместно с чем-то другим, что до сих пор не освободили.

Ограничение памяти приложения

Для поддержания функциональной среды многозадачности, Android устанавливает жесткий лимит на размер кучи для каждого приложения. Точный предельный размер кучи колеблется для устройств, в зависимости от размера оперативной памяти устройства в наличии в целом. Если ваше приложение достигло максимально допустимого размера кучи, и пытается выделить больше памяти, оно получит OutOfMemoryError.

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

Переключение приложений

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

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

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

Как ваше приложение должно управлять памятью

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

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

Используйте службы экономно

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

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

Лучший способ ограничить продолжительность жизни вашей службы является использование IntentService, который заканчивается себя, как только будет выполнена обработка намерения, которое его запустило. Для получения дополнительной информации, читайте Выполнение в фоновом сервисе .

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

Освободите память, когда ваш пользовательский интерфейс становится невидимым

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

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

Обратите внимание, что ваше приложение получает onTrimMemory() обратный вызов с TRIM_MEMORY_UI_HIDDEN только тогда, когда все компоненты пользовательского интерфейса вашего процесса приложения становятся скрытыми от пользователя. Этим он отличается от onStop() обратного вызова, который вызывается когда Activity становится скрытой, даже в случае когда пользователь перемещается на другую деятельность в вашем приложении. Таким образом, хотя вы должны реализовать onStop() для освобождения ресурсов деятельности, таких как подключение к сети или для отмены регистрации широковещательных приемников, вы, как правило, не должны освобождать свои ресурсы пользовательского интерфейса, пока вы не получите onTrimMemory(TRIM_MEMORY_UI_HIDDEN). Это гарантирует, что если пользователь переходит назад из другой деятельности в вашем приложении, ваши ресурсы пользовательского интерфейса по-прежнему доступны для быстрого возобновления деятельности.

Освободите память, когда памяти становится недостаточно

Во время любой стадии жизненного цикла вашего приложения, onTrimMemory() метод обратного вызова также сообщает вам, когда общая память устройства становится низкой. Вы должны реагировать путем дальнейшего высвобождения ресурсов на основе следующих уровней памяти, передаваемых в onTrimMemory():

  • TRIM_MEMORY_RUNNING_MODERATE

    Ваше приложение работает и не подлежит завершению, но устройство работает в условиях нехватки памяти и система активно убивать процессы в LRU кэше.

  • TRIM_MEMORY_RUNNING_LOW

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

  • TRIM_MEMORY_RUNNING_CRITICAL

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

Кроме того, когда ваш процесс приложение в настоящее время в кэше, вы может получить один из следующих уровней в onTrimMemory():

  • TRIM_MEMORY_BACKGROUND

    Система работает в условиях нехватки памяти, и процесс практически в самом начале LRU списка. Хотя ваш процесс приложение с не высоким риском быть завершенным, система может быть уже начать завершать процессы в LRU кэше. Вам следует освободить ресурсы, которые легко восстановить, так что ваш процесс останется в списке и возобновится быстро, когда пользователь вернется к вашему приложению.

  • TRIM_MEMORY_MODERATE

    Система работает в условиях нехватки памяти, и процесс ближе к середине LRU списка. Если в системе продолжит увеличиваться нехватка памяти, есть шанс, что ваш процесс будет завершет.

  • TRIM_MEMORY_COMPLETE

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

Поскольку onTrimMemory() метод обратного вызова был добавлен в уровне API 14, вы можете использовать onLowMemory() метод обратного вызова в качестве запасного варианта для более старых версий, который примерно эквивалентен TRIM_MEMORY_COMPLETE событию.

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

Проверьте, сколько памяти вы должны использовать

Как упоминалось ранее, каждое Android-устройство имеет различное количество доступной оперативной памяти в системе, и, таким образом, предоставляет разные ограничения кучи для каждого приложения. Вы можете вызвать getMemoryClass() чтобы получить оценку имеющейся кучи вашего приложения в мегабайтах. Если ваше приложение пытается выделить больше памяти, чем доступно здесь, оно будет получать OutOfMemoryError.

В особых ситуациях, вы можете запросить больший размер кучи, установив largeHeap атрибут в "true" в манифесте <application> тег. Если вы это сделаете, вы можете вызвать getLargeMemoryClass() для получения оценки кучи большого размера.

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

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

Избегайте загрязнения памяти растровыми изображениями

При загрузке растрового изображения, держите его в памяти только в том разрешении, которое необходимо для экрана текущего устройства, масштабируйте его вниз, если исходное растровое изображение большего разрешения. Имейте в виду, что увеличение разрешения растровых изображений, приводит к соответствующему (увеличению2) необходимой памяти, потому что увеличиваются оба размера X и Y.

Примечание: На Android 2.3.x (API Уровень 10) и ниже, объекты растровых изображений всегда одного и того же размера в вашей куче приложения независимо от разрешения изображения (фактические данные пикселей хранится отдельно в аппаратной памяти). Это делает более трудной отладку памяти растровых изображений, потому что большинство инструментов анализа кучи не видит распределения аппаратной памяти. Однако, начиная с Android 3.0 (API Уровень 11), данные точек растрового изображения выделяются в Dalvik куче вашего приложения, улучшая сборку мусора и способность отладки. Так что если ваше приложение использует растровые изображения, и у вас возникли проблемы обнаружения почему ваше приложение использует некоторое количество памяти на старом устройстве, переключитесь на устройства под управлением Android 3.0 или выше, чтобы ее отладить.

Дополнительных советы по работе с растровыми изображениями можно найти в разделе Управление памятью растровых изображений.

Используйте оптимизированные контейнеры данных

Воспользуйтесь оптимизированными контейнерами для Android, такими как SparseArray, SparseBooleanArray, и LongSparseArray. В шаблонной реализации HashMap память может использоваться довольно неэффективно, потому что ей необходим отдельный объект для хранения для каждого элемента. Кроме того, SparseArray классы являются более эффективными, поскольку они исключают необходимость системы к преобразованию типов (называемых autobox ) для ключей и иногда значений (что создает еще один или два объекта для каждого элемента). И не бойтесь прибегать к обычным массивам, когда в этом есть смысл.

Будьте в курсе накладных расходов памяти

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

  • Перечисления часто требуют более чем в два раза больше памяти, чем статические константы. Вы должны строго избегать использования перечислений в Android.
  • Каждый класс в Java (в том числе анонимные внутренние классы) использует около 500 байт кода.
  • Каждый экземпляр класса имеет 12-16 байт накладных расходов памяти.
  • Хранение единственного элемента в HashMap требует выделения дополнительного объекта записи, который берет 32 байта (см. предыдущий раздел оптимизированные контейнеры данных).

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

Будьте осторожны с абстрактным кодом

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

Используйте nano protobufs для сериализации данных

Protocol buffers это нейтральный от языка и от платформы, расширяемый механизм разработанный Google для сериализации структурированных данных — думайте о XML, но меньше, быстрее, и проще. Если вы решите использовать protobufs для ваших данных, вы всегда должны использовать nano protobufs в вашем клиентского коде. Обычные protobufs генерируют чрезвычайно подробный код, который будет вызывать много разных проблем в вашем приложении: дополнительное использование оперативной памяти, значительное увеличение размера APK, более медленное выполнения, и быстро достижение ограничения символов DEX.

Для получения дополнительной информации см. в разделе "Nano version" в protobuf readme.

Избегайте библиотек внедрения зависимостей

Использование библиотек внедрения зависимостей, таких как Guice или RoboGuice может быть привлекательными, потому что они могут упростить код, который вы пишете, и обеспечить адаптивную среду, которая полезна для тестирования и других изменений конфигурации. Тем не менее, эти библиотеки, как правило, выполняют выполняют инициализацию процесса путем сканирования кода для аннотаций, которая может требовать значительных объемов кода, который будет загружен в память, даже если вы в нем не нуждаетесь. Эти страницы отображений классов загружаются в чистую память, поэтому Android может выгрузить их, но этого не произойдет, пока страницы не останутся в памяти в течение длительного периода времени.

Будьте осторожны при использовании внешних библиотек

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

Даже библиотеки якобы предназначенные для использования на Android являются потенциально опасными, потому что каждая библиотека может действовать по-другому. Например, одна библиотека может использовать nano protobufs, а другая использует micro protobufs. Теперь у вас есть две различные реализации protobuf в своем приложении. Это может и даже будет происходить с различными реализациями записи в журналы, аналитикой, библиотеками загрузка изображений, кэшированием, и всех других вещей, которые вы не ожидаете. ProGuard не спасет вас здесь, потому что они все будут иметь зависимости более низкого уровня, которые требуются функциональности для которой вы используете библиотеку. Это становится особенно проблематичным, когда вы используете Activity подкласс из библиотеки (которая, как правило, имеет широкий ряд зависимостей), когда библиотеки используют reflection (который является общим и означает, что вы должны тратить много времени вручную для настройки ProGuard, чтобы заставить его работать), и так далее.

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

Оптимизация общей производительности

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

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

Используйте ProGuard для удаления ненужного кода

ProGuard сжимает, оптимизирует и запутывает код путем удаления неиспользуемого кода и переименовывания классов, полей и методов на семантически непонятные названия. Использование ProGuard может сделать ваш код более компактным, требуя меньшего количества страниц памяти для отображения.

Используйте zipalign для заключительного APK

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

Примечание: Google Play не принимает APK файлы, которые не выровнены.

Проанализируйте свое использование оперативной памяти

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

Использование нескольких процессов

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

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

Вы можете задать отдельный процесс для каждого компонента приложения, объявив android:process атрибут для каждого компонента в файле манифеста. Например, можно указать, что ваша служба должна работать в процессе, отдельном от основного процесса вашего приложения, объявив новый процесс с именем "background" (но вы можете назвать процесс как угодно):

<service android:name=".PlaybackService"
         android:process=":background" />

Ваше имя процесса должно начинаться с двоеточия (':'), чтобы гарантировать, что процесс остается приватным для вашего приложения.

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

adb shell dumpsys meminfo com.example.android.apis:empty

** MEMINFO in pid 10172 [com.example.android.apis:empty] **
                Pss     Pss  Shared Private  Shared Private    Heap    Heap    Heap
              Total   Clean   Dirty   Dirty   Clean   Clean    Size   Alloc    Free
             ------  ------  ------  ------  ------  ------  ------  ------  ------
  Native Heap     0       0       0       0       0       0    1864    1800      63
  Dalvik Heap   764       0    5228     316       0       0    5584    5499      85
 Dalvik Other   619       0    3784     448       0       0
        Stack    28       0       8      28       0       0
    Other dev     4       0      12       0       0       4
     .so mmap   287       0    2840     212     972       0
    .apk mmap    54       0       0       0     136       0
    .dex mmap   250     148       0       0    3704     148
   Other mmap     8       0       8       8      20       0
      Unknown   403       0     600     380       0       0
        TOTAL  2417     148   12480    1392    4832     152    7448    7299     148

Примечание: Более подробная информация о том, как читать такие таблицы, предоставлена в разделе Исследование использования оперативной памяти. Ключевыми данными здесь являются Private Dirty и Private Clean память, которые показывают, что этот процесс, использует практически 1.4Мб невыгружаемой памяти (распределенной по куче Dalvik, аппаратные выделения, загрузки библиотек), и еще 150Кб оперативной памяти для кода, который был отображен в память для выполнения.

Этот объем памяти для пустого процесса довольно значительный, и он может быстро расти, как только вы начинаете делать работу в этом процессе. Например, здесь представлено использование памяти процесса, который создается только показать деятельность с каким-нибудь текстом внутри:

** MEMINFO in pid 10226 [com.example.android.helloactivity] **
                Pss     Pss  Shared Private  Shared Private    Heap    Heap    Heap
              Total   Clean   Dirty   Dirty   Clean   Clean    Size   Alloc    Free
             ------  ------  ------  ------  ------  ------  ------  ------  ------
  Native Heap     0       0       0       0       0       0    3000    2951      48
  Dalvik Heap  1074       0    4928     776       0       0    5744    5658      86
 Dalvik Other   802       0    3612     664       0       0
        Stack    28       0       8      28       0       0
       Ashmem     6       0      16       0       0       0
    Other dev   108       0      24     104       0       4
     .so mmap  2166       0    2824    1828    3756       0
    .apk mmap    48       0       0       0     632       0
    .ttf mmap     3       0       0       0      24       0
    .dex mmap   292       4       0       0    5672       4
   Other mmap    10       0       8       8      68       0
      Unknown   632       0     412     624       0       0
        TOTAL  5169       4   11832    4032   10152       8    8744    8609     134

Процесс в настоящее время почти в три раза больше, до 4 Мб, просто показав текст в пользовательском интерфейсе. Это приводит к важному выводу: если вы собираетесь разделить ваше приложение на несколько процессов, только один процесс должен нести ответственность за пользовательский интерфейс. Другие процессы должны избегать любого пользовательского интерфейса, так как это быстро увеличит объем оперативной памяти, необходимый для процесса (особенно как только вы начинаете загружать растровые изображения и другие ресурсы). Затем, может быть трудно или невозможно уменьшить использование памяти после того, как пользовательский интерфейс был отрисован.

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

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

Как решить проблемы с памятью смартфона на Android

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

8 ГБ в спецификации выглядит не плохо, однако, нужно иметь в виду, что примерно половина этого пространства займёт операционная система и предустановленные приложения, от которых очень сложно избавиться. В вашем распоряжении останется около 4 ГБ памяти, – это в лучшем случае. В некоторых моделях это место сокращается до 3 ГБ, и это только в самом начале использования смартфона.

Загрузка слабой памяти Android устройства

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

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

Обязательная карта памяти

Первый способ увеличить объем памяти в смартфоне или в планшете – это покупка и установка на карты памяти microSD. В случае устройств с 8 ГБ встроенной памяти, это процедура совершенно необходима, если мы хотим в полной мере использовать устройство. Когда у нас нет такой карты, все данные, такие как фильмы и фотографии с камеры, хранятся во встроенной памяти, если их качество является хорошим, оно быстро заполнят память. К сожалению, недостатком этого решения является то, что не всё может быть сохранено или перенесено на карту. Многие приложения просто должны быть установлены во внутренней памяти, чтобы они могли работать должным образом. В некоторых моделях телефонов мы найдём функцию, которая позволяет отформатировать карту таким образом, чтобы она была видна системе как внутренняя память.

В этой ситуации рекомендуется использование высокоскоростную карту microSD, чтобы не замедлять работу вашего телефона. Стоит рассмотреть относительно новый класс карт памяти, предназначенных для использования в смартфонах. Такие носители обозначаются символом A1, что гарантирует производительность, необходимую для запуска и работы приложения (случайное чтение 1500 IOPS и случайная запись 500 IOPS при последовательной передаче не меньше 10 МБ/сек).

Стоит также иметь в виду, что не все телефоны и планшеты поддерживают карты объемом 64, 128 ГБ и больше. Никаких проблем не должно быть с картами на 32 гигабайта и меньше, которые должны работать с практически любым устройством.

Поддержка карт памяти SD

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

Первое – это разъем гибридный dual SIM, используемый некоторыми производителями. Это довольно «проблемное изобретение» для людей, которым нужно использовать одновременно два номера. Слот для второй SIM-карты, одновременно, служит в качестве ридера карт microSD, приходится выбирать – либо расширение памяти, либо второй номер телефона.

Если карта уже в ридере, то нам остается её только отформатировать. Переходим к Настройкам системы и из списка выбираем Память, а затем нажмите Карта памяти. Теперь, в зависимости от модели телефона и операционной системы, выбираем пункт Форматировать как внутреннюю память. Последний пункт был введен в Android 6.0 (Зефир), что позволяет «связать» SD-карту с внутренней памятью смартфона.

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

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

Если в нашем телефоне нет функции объединения SD карт с внутренней памятью, нам остается перенос данных на внешний носитель. Чтобы это сделать, необходимо зайти в список установленных приложений. Внизу открываем Диспетчер приложений и находим программу для переноса. После её выбора нажмите Память, а затем кнопку Изменить.

В это время на экране появится меню изменения памяти, из которого мы выбираем Карту памяти. Нажмите кнопку Переместить. Через несколько десятков секунд перенос будет завершён.

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

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

Хранение файлов на внешней карте облегчит их перенос на пк, а также защитит их в случае поломки смартфона. Функцию автоматической записи фотографий на карту памяти в системном приложении «Камера» можно найти в настройках – Место хранения.

Полезные приложения для очистки памяти

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

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

Программа позволяет оптимизировать работу как внутренней памяти, так и оперативной памяти устройства. После запуска CCleaner отображает уровень использования памяти устройства. Перед началом работы с программой, стоит зайти в её Настройки и активировать Углубленную очистку, которая позволяет удалять также скрытую кэш-память.

Затем в главном меню нажмите на кнопку Анализ и дождитесь результатов сканирования. В конце приложение выдаст отчет. Мы можем выбрать элементы, которые будут удалены, например, кэш-память, миниатюры изображений или данные приложения.

CCleaner автоматически выбирает те из них, которые могут быть безопасно удалены (без потери данных), а такие разделы как Данные приложений или Загрузки вы должны выбрать сами, потому что их удаление связано с потерей данных, настроек или скачанных из интернета файлов.

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

Что «съедает» внутреннюю память смартфона:

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

Очистка системы Android

С помощью инструментов системы Android мы можем легко и быстро освободить ресурсы памяти нашего смартфона. Первый и самый простой способ – обзор установленных приложений и удаление ненужных и неиспользуемых.

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

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

Чтобы проверить, какие программы мы используем реже всего, достаточно зайти в Магазин Play, выбрать Мои игры и приложения и перейти на вкладку на Установленные.

Затем просто отсортировать их по ключу Использовались в последнее время. В самом конце списка, мы найдем те, которые мы совсем не пользуемся. Затем найдите в Диспетчере приложений устройства соответствующую программу и нажмите кнопку Удалить.

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

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

Стоит нажать также кнопку Остановить принудительно, это приведёт к тому, что приложение не будет работать в фоновом режиме и освободит ресурсы. Не будет также генерировать дополнительные файлы, в том числе временные.

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

Внутренняя память Android устройства – как освободить место

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

Субботник в памяти

Активно используя телефон, мы собираем свой «урожай» на диске. Файлы с музыкой, смешные видео, PDF-документы и т.п. всё чаще оказываются в папке загрузки (Download), или, когда мы обмениваемся с другими пользователями, в папке Bluetooth.

Для просмотра содержимого памяти мы можем использовать любой файловый менеджер с Play Store (например, Total Commander или родной Solid Explorer) или встроенный инструмент – Мои Файлы.

В Моих Файлах мы найдём Историю загрузок и функцию хранения данных в облаке. Данные мы можем удалить или переместить на карту памяти, освободив место для новых данных.

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

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

Резюме

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

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

[Конкурс] Android изнутри или просто о сложном — android.mobile-review.com

18 декабря 2012

Dreamer...

Facebook

Twitter

Вконтакте

Google+

Введение

Общаясь на форумах и являясь куратором нескольких тем, часто сталкиваюсь с полным непониманием новичков об устройстве андроида. «Ну, а зачем обычному пользователю знать это?» — скажете вы. И тут я с вами соглашусь, задав встречный вопрос: «А зачем тогда обычный пользователь лезет в дебри прошивок, root доступа и твиков системы, не понимая в этом ничего?». Именно это и натолкнуло меня на написание данной статьи, в которой я попытаюсь, обычным и понятным языком, донести сложные вещи.

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

Содержание:

  1. Разделы внутренней памяти.
  2. Bootloader, recovery, adb и fastboot
  3. Внутренности системы.
  4. Root.

1. Разделы внутренней памяти

Внутренняя память устройства на андроиде разбита на несколько логических дисков (разделов).

Приведу только основные:

Рис.1

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

Recovery – как видно из названия, тут установлено инженерное меню восстановления или просто Рекавери.

Boot – сердце Андроид ОС, тут находится ядро, драйвера и настройки управления процессором и памятью.

System – системный раздел, в котором находятся все, необходимые для работы Android ОС, файлы, это как папка Windows на вашем диске С:\ (здесь и далее буду проводить ассоциацию с ОС Windows)

Data – раздел для установки приложений и хранения их данных. (Program files)

User – это всем известная sdcard или, проще говоря, место под пользовательские файлы (Мои документы). Здесь я вынужден сделать отступление, т.к. размещение данного раздела имеет несколько вариантов:

  • Раздел отсутствует во внутренней памяти, а вместо него используется внешний накопитель — самый популярный вариант. (рис.1)
  • В устройствах со встроенной памятью большого размера, данный раздел видится как sdcard, а внешняя карта памяти видится как sdcard2 или extsd (могут быть и другие варианты названия). Обычно, встречается на устройствах с Android 3.2. (Рис.2 Вариант 1)
  • Данный вариант пришел на смену предыдущему варианту, вместе с Андроид 4.0. Раздел User заменили папкой media на разделе Data, что позволило использовать всю доступную пользователю память для установки программ и хранения данных, а не то количество, что выделил нам производитель. Иными словами sdcard и data являются одним целым.  (Рис.2 Вариант 2)


Рис.2

2. Bootloader, Recovery, adb и fastboot

Теперь, когда мы знаем, что и где находится, давайте разберемся для чего оно там.

Начнем с Bootloader. Это загрузчик, который запускает Андроид, рекавери и т.п. Когда мы нажимаем кнопку включения, запускается загрузчик и, если нет дополнительных команд (зажатых клавиш), запускает загрузку boot. Если же была зажата комбинация клавиш (у каждого устройства она своя) то запускает, в зависимости от команды, recovery, fastboot или apx. На рисунке ниже наглядно показано, что запускает Bootloader и как взаимосвязаны разделы.

Рис.3

Как видно из рисунка №3, раздел Recovery не влияет на загрузку Андроид ОС, но зачем же он тогда нужен? Давайте попробуем разобраться.

Recovery (рекавери) по сути является маленькой утилитой на ядре Linux и загружается не зависимо от Андроид. Его штатный функционал не богат: можно сбросить аппарат до заводских настроек или же обновить прошивку (заранее скачанную на sdcard). Но, благодаря народным умельцам, у нас есть модифицированные рекавери, через которые можно устанавливать модифицированные (кастомные) прошивки, настраивать андроид, создавать резервные копии и многое другое. Наличие или отсутствие рекавери, а также его версия не влияют на работоспособность Андроид ОС (очень частый вопрос на форумах).

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

Раз уж зашла речь об интерфейсах, хочу рассказать о еще одном, довольно известном,- adb (android debug bridge). Это, так называемый, режим отладки и назван он так неспроста – через него можно отслеживать работу, как системы в целом, так и отдельных приложений. Но это еще не все, при помощи adb можно получить полный доступ к файловой системе устройства и изменять системные файлы или же вытянуть важную информацию, когда ваш девайс завис на загрузке. Все функции режима отладки описывать не буду т.к. моя цель донести общую информацию, а не подробный обзор о функциях того или иного режима.

3. Внутренности системы

Разобравшись с теорией, давайте запустим Андроид ОС.

Нажимаем кнопку питания — запускается Bootloader, который загружает Ядро (boot), оно, в свою очередь, запускает систему (System), ну, а она уже подгружает программы (data) и пользовательское пространство (user). (Рис.3)

А теперь перейдем в корневой каталог и посмотрим на внутренности самой Android OS:

(Рис.4)

В этой схеме я привел, только необходимые для ознакомления, директории. На самом деле их гораздо больше и на обзор только одной папки System понадобится целая статья.

И так, папка data. Как можно догадаться из названия, она как-то связана с данными, но с какими? Да практически со всеми, это и данные о синхронизации и аккаунтах, пароли к точкам доступа wifi и настройки vpn, и так далее. Среди всего прочего тут можно обнаружить папки app, data и dalvikcache – рассмотрим их назначение:

  • app – сюда устанавливаются программы и игры.
  • data – здесь хранятся данные приложений, их настройки, сэйвы игр и прочая информация.
  • dalvikcache — программная область кэш-памяти для программы Dalvik. Dalvik это Java-виртуальная машина, которая является основой для работы программ, имеющих *.apk расширение. Для того, чтобы сделать запуск программ быстрее — создается их кэш.

Папка System хранит в себе системные данные и все необходимое для работы ОС. Давайте рассмотрим некоторые из этих папок:

  • app – здесь находятся системные приложения (смс, телефон, календарь, настройки и т.п.), а так же приложения установленные производителем устройства (фирменные виджеты, живые обои и т.д.).
  • fonts – системные шрифты
  • media – содержит стандартные мелодии звонков, уведомлений, будильников и звуков интерфейса, а так же загрузочную анимацию (bootanimation)
  • build.prop – Этот файл упоминается, чуть ли не первым, в разговорах и статьях о тонкой настройке системы. В нем содержится огромное количество настроек, таких как плотность экрана, время задержки сенсора приближения, управление wifi, имя и производитель устройства и многие другие параметры.

4. Root

Знать что в какой папке это хорошо, но можно ли что-то с этим сделать?

— Да! Но нужны права суперпользователя (root) или, если проводить аналогию с Windows, права Администратора. Изначально все устройства на Андроид идут без root прав для конечного пользователя, т.е. покупая девайс, мы не являемся в нем полноценными хозяевами. Это сделано как для защиты от вредоносных программ, так и от самого пользователя – ведь, в неумелых руках, полный доступ к системе может привести к «смерти» операционной системы и последующей необходимости в перепрошивке устройства.

«Ну и в чем польза такой опасной штуки?» — спросите Вы.

Сейчас расскажу:

  • Возможность делать резервные копии данных и восстанавливать их после прошивки или случайного удаления.
  • Тонкая настройка системы вручную или при помощи специальных программ.
  • Удаление системных приложений, мелодий, обоев и т.п.
  • Изменение внешнего вида ОС (например, отображение заряда батареи в процентах)
  • Добавление функционала (поддержка adhoc сетей, к примеру)

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

— Это все здорово, но теперь любая программа сможет получить доступ к «сердцу» операционки и моим данным?

— Нет. Вы сами решаете разрешить, тому или иному приложению, получить root доступ, или нет. Для этого существует программа Superuser или ее продвинутая сестра SuperSU. Без этой или подобной программы воспользоваться root не возможно.

Эпилог

Как видите, Андроид не такая уж и сложная штука. Надеюсь, после прочтения статьи, вы узнали что-то новое или получили ответ на давно интересовавший вопрос.

Засим откланиваюсь, до встречи в комментариях. 😉

Dreamer…

Отправить ответ

avatar
  Подписаться  
Уведомление о