Статьи‎ > ‎

Нужен ли тасккиллер в Android


Время от времени на различных форумах появляются сообщения о том, как здорово и быстро начинает работать система, если поставить автоматический тасккиллер, который будет "убивать" все и вся без разбору.... Или с разбором.... Или не все...
Или вот еще: "установил прошивку XXX от NNN - свободной оперативки стало MMM мБ...".
У меня сразу возникает встречный вопрос: уважаемый, а зачем она Вам нужна эта свободная оперативка в таких количествах? Ведь имея, например, 1024 мБ оперативной памяти на борту Вашего устройства, Вы радуетесь, как ребенок новой игрушке, но потом, практически сразу, собственноручно лишаете себя этой радости, стремясь, во что бы то ни стало, освободить побольше. 
Для чего в телефоне память как не для того, чтобы она работала? И, чем больше оперативной памяти задействовано, тем больший эффект от использования аппарата. Кроме того, существует заблуждение, якобы, чем больше памяти задействовано, тем больше она потребляет энергии. Нет, же! Память потребляет энергию аккумулятора только в момент чтения или записи (прошу заметить, что стирание - это тоже запись).
Чтобы развеять все мифы и заблуждения, для начала давайте рассмотрим, как Android управляет оперативной памятью.

OOM Killer

Да-да, тут прозвучало слово киллер. У Android`а есть свой киллер. А точнее, не у Android`а, а у Linux`а, ядро которого является основой системы Android. Все пользовательские приложения Android работают в отдельных копиях виртуальной машины Dalvik (Дальвик). Это переделанная Google`ом (а точнее командой разработчиков Android) виртуальная машина Java. Таким образом, с точки зрения ядра Linux, каждое пользовательское приложение - это отдельный процесс. И каждый процесс потребляет какое-то количество оперативной памяти. Мало того, если Вы закрываете приложение, нажимая кнопку "назад", система не торопится сразу выгрузить его процесс из памяти, оставляя его в своеобразном "кэше". Дело в том, что исходя из принципа локальности ссылок (принцип Деннинга), если в течение некоторого времени, система работала с некоторой частью оперативной памяти (например, принадлежащей какому-то процессу), то в ближайшем будущем, с большой вероятностью, она вернется к этому участку памяти, а следовательно, не стоит торопиться ее освобождать. Другими словами, пользователь, закрывший какую-либо программу, с большой вероятностью вернется к ней в ближайшее время.
О чем это я?... Ах да, о киллере... Именно OOM Killer (out of memory - недостаток памяти) занимается освобождением оперативной памяти. Но делает он это не в тот момент, когда пользователь закрыл приложение, а только в том случае, когда какой-либо из процессов начнет сигнализировать системе о нехватке оперативки. И удаляет он из памяти не тот процесс, который "жалуется" на недостаток памяти (если, конечно, не заставить его это сделать специальными настройками). OOM Killer пользуется специальным эвристическим алгоритмом, чтобы определить, какой процесс можно в данный момент "убить", чтобы это минимальным образом сказалось на работоспособности системы в целом и нанесло наименьший "вред" пользователю.
OOM Killer классифицирует все процессы по шести категориям. В соответствии с этими категориями, каждый процесс наделяется параметром, который означает вероятность, с которой данный процесс будет закрыт. Другими словами, определяется важность каждого процесса для системы и пользователя.
Что это за категории? Перечислю их в порядке убывания приоритета.

Foreground applications.

Это приложения переднего плана. Т.е. те, которые Вы видите в данный момент на экране. И не только: к этим приложениям, также, относятся некоторые системные службы (например "Телефон"), а также службы, запущенные в режиме foreground и выводящие уведомления в строке состояния. К последним могут относиться, например, аудио-проигрыватели, онлайн-мессенджеры, и пр. 
Приложения этой категории имеют самый высокий приоритет и закрываются киллером в самый последний момент. Я бы даже сказал, что этого почти никогда не случается, поскольку всегда есть менее приоритетные процессы.

Visible applications

Видимые приложения. Эти приложения уже не находятся на переднем плане, но все еще работают, и даже что-то отображают на экране. Например, если Вы работали в браузере, но получили всплывающее сообщение об СМС поверх него, браузер временно перейдет из категории Foreground в категорию Visible, что немного снизит его приоритет. 
Обычно, при стандартных или общепринятых настройках, эта категория не далеко уходит по приоритетности от предыдущей.

Secondary Server

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

Hidden applications

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

Content Providers

Это даже не приложения, а части приложений, предоставляющие какую-нибудь информацию другим процессам по их запросу. 
В любом Adroid-смартфоне есть программа "Контакты". Эта программа имеет в своем составе content provider, поставляющий данные о контактах не только программе "Телефон", но и другим программам, например "SMS/MMS", почтовой программе, всевозможным мессенджерам и др.
Как правило, такие приложения становятся ненужными сразу после того, как вызывающая программа получила от них всю необходимую информацию. Поэтому и приоритет у них достаточно низкий.

Empty Applications (Cached Applications)

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

Оправдано ли применение сторонних киллеров в Android

Зачастую, пользователи, не информированные о структуре системы управления памятью в Android, устанавливают тасккиллеры и подвергают неоправданному "убиению" все процессы подряд, без разбора их назначения.
В лучшем случае, этому процессу подвергаются программы самой "нижней" категории. При этом, тасккиллер можно считать просто бесполезным, т.к. он выполняет ту функцию, которую и без него выполнит системный OOM Killer. Хотя и здесь есть определенный антиэффект, т.к., в случае возврата к закрытому приложению, пользователь заставит систему снова его загрузить.
Хуже дело обстоит с фоновыми службами. Ведь неспроста разработчик предусмотрел наличие этой службы в своем приложении, значит эта служба призвана выполнять какие-то, возможно, неосновные, но важные функции. 
В качестве примера можно привести приложение "Галерея" или другие приложения, отображающие медийный контент. У пользователя может возникнуть вопрос, зачем это приложение "висит" у меня в памяти, если я уже давно им не пользуюсь? Пользователь помещает такое приложение в черный список своего любимого тасккиллера, а через несколько дней возмущается и отправляет проклятия в адрес программистов, когда обнаруживает, что в "Галерее" не отображаются фотографии, только что закачанные с компьютера в режиме USB-накопителя. А все дело в том, что служба, входящая в состав данного приложения, была призвана сканировать карту памяти при ее монтировании, но была безжалостно "убита" таккиллером.
Существует еще одна категория утилит, к работе которых нужно относиться с большой осторожностью и полным пониманием происходящего: это утилиты для настройки автозапуска.
Большинство пользователей ошибочно полагают, что программы, загружающиеся автоматически при запуске системы, останутся в памяти устройства навечно и поэтому, им нужно непременно запретить загружаться. В то же время, большинство программ относятся к событию загрузки системы также, как и к любым другим событиям. При этом, запустившись после загрузки системы, они выполняют незначительные подготовительные действия и переходят в категорию Empty Applications.
Мало того, на событии загрузки системы дело не заканчивается. Дело в том, что в системе Android существует множество событий и для обработки некоторых из них совершенно не обязательно держать в памяти службу. Многие события позволяют системе запустить приложение, которое должно их обработать, только по факту самого события, после чего это приложение может отправляться в категорию empty.
Бездумный запрет автозапуска всех подряд приложений соответствующими утилитами ничуть не лучше такого же бездумного использования тасккиллеров.
И всетаки, прочитав мою статью, пользователь решит, что такие утилиты, как тасккиллеры и диспетчеры автозапуска не имеют права на существование. И я скажу, что они не правы. Как и любые другие утилиты, эти программы являются всего лишь инструментом и их применение, как и любого другого инструмента, должно быть оправданным и обоснованным.

Как же заставить систему наиболее эффективно использовать оперативную память

Конечно же, возможны ситуации, когда некоторые приложения проявляют неоправданную, с точки зрения конкретного пользователя, активность, заставляя систему выполнять какие-то перестроения в памяти. Чаще всего это происходит, когда многофункциональное приложение не позволяет пользователю отключать некоторые, не нужные ему, функции, перегружая ими систему. 
Иногда лишняя активность приложений происходит из за ошибок разработчиков. Ну, нет в мире совершенства.
В первую очередь, необходимо точно определить, какие приложения постоянно висят в памяти и к каким категориям, с точки зрения OOM Killer`а, они относятся. Для этого существует ряд полезных утилит. Например, для слежения за состоянием памяти и запущенных процессов можно использовать программу System Panel. Наряду с тем, что она позволяет просмотреть запущенные процессы по категориям, эта утилита поможет "поймать" процесс, который повинен в излишней "прожорливости" устройства.
Следует учесть, что имеет смысл использовать тасккиллер только с приложениями, имеющими службы, т.к. остальные приложения рано или поздно перейдут в состояние Empty.
Классифицировав процессы по категориям, необходимо постараться установить, с какой целью работает та или иная служба. Зачастую это не так просто сделать не будучи программистом. Но попытаться все же стоит. Иногда назначение службы можно понять интуитивно, исходя из назначения приложения. В некоторых случаях, можно установить назначение службы экспериментальным путем, отключая или включая службу тасккиллером или менеджером автозапуска.
И только получив всю необходимую информацию о каждом приложении, можно принимать решение о использовании той или иной утилиты для корректировки его работы. Приведу пример. В более ранних версиях клиента DropBox для Android в памяти постоянно "висела" служба. При этом, принудительное удаление этой службы и даже запрет ее запуска никак не сказывались на работоспособности приложения в целом. В последствии выяснилось, что эта служба обеспечивала функцию Camera Upload, которой я не пользовался, а в следствие ошибки в программе, служба работала даже при выключенной функции. Благо, в последствии этот недостаток был устранен разработчиками. 
Порой, может выясниться, что то или иное приложение вообще лишнее в системе и не приносит пользователю никакой пользы. Чаще всего, это происходит со встроенными в прошивку приложениями. Самый лучший способ избавиться от назойливого влияния таких приложений на память устройства, это заблокировать (например, с помощью Titanium Backup) или деинсталлировать их. Конечно же, такое действие возможно только при наличии root-прав.
Ну и наконец еще один инструмент, позволяющий добиться эффективной работы памяти - это сам OOM Killer. При наличии root-прав, пользователь может получить контроль над его работой. В Вашем распоряжении есть ряд параметров, позволяющих контролировать работу системы управления памятью Android. И я уверен, что в большинстве случаев, этот инструмент самый эффективный, т.к. позволяет добиться результата, не загромождая систему сторонними приложениями, потребляющими процессорное время и память.
Изменять параметры OOM Killer`а можно с помощью некоторых утилит, к числу которых относится и mcTweaker. Это те самые 6 уровней минимальной свободной памяти для различных категорий процессов.
Как правильно подобрать их сочетание?
Прежде всего стоит отметить, что заметное влияние оказывают только три нижних уровня (с наибольшими значениями). Установить оптимальное значение можно только экспериментально, для разных устройств и прошивок эти значения могут сильно отличаться. Кроме того, каждый пользователь эксплуатирует свое устройство по-разному. Можно лишь дать общие рекомендации, которые будут отправной точкой в Ваших исследованиях. 
Итак.
  1. Значения OOM Levels должны следовать по возрастанию от Foreground к Empty.
  2. Увеличение значений OOM Levels до определенного уровня приводит к улучшению "отзывчивости" системы. Это происходит потому, что некоторые приложения (включая лончер) периодически запрашивают у системы большие объемы оперативной памяти на короткое время для выполнения каких-то функций. Если объем свободной памяти в данный момент не велик, то в дело вступает OOM Killer (в данном случае не вовремя), приводя к заметным задержкам.

    Здесь можно сделать некоторое отступление и объяснить, почему такое поведение системы влияет на "плавность" работы интерфейса. Дело в том, что в отличие от конкурентных платформ, таких как iOS (iPhone) и WP7, где поток пользовательского интерфейса является самым приоритетным и вытесняет, при необходимости, фоновые процессы, в Android весь пользовательский интерфейс работает в основном потоке приложения, что приводит к, порой, заметным "рывкам" в работе системы. Эта ситуация не исправлена и в последних версиях Android и врядли когда-нибудь будет исправлена, т.к. это приведет к полной переработке всей структуры системы и несовместимости со старыми приложениями.
  3. Уменьшение значений OOM Levels приведет к улучшению уровня многозадачности. Т.е., чем больше памяти задействовано в каждый момент времени, тем больше процессов туда помещается.
Следует подбирать наиболее приемлемые значения, исходя из Ваших потребностей. А если Вы любитель менять прошивки, то для каждой прошивки, возможно, потребуются разные значения.
В версии 3.0.0 Pro программы mcTweaker реализована поддержка шаблонов уровней OOM, переключаемых с помощью виджетов главного экрана. Это позволит настроить несколько наборов параметров для различных режимов использования устройства.

Успехов!
© McLaught, 2012



Comments