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

Вместо введения

Эту статью я адресую всем тем, кто до сих пор пользуется смартфонами, вышедшими до появления версии Android 4.0, всем тем, кому «посчастливилось» купить девайс с 512 Мб оперативной памяти, а через месяц вышел Ice Cream Sandwich, и пришлось остаться на 2.3 или мириться с тормозами. В общем, для обладателей доисторических, но любимых HTC Desire, Motorola Defy и Samsung Galaxy S.

Обладателем одного из таких девайсов являюсь и я сам. Около трех лет назад за сегодняшнюю цену Nexus 4 я приобрел смартфон Motorola Defy. Это такой кирпич с экраном на 3,7 дюйма, 1 ГГц процессором, 512 Мб оперативной памяти и защитой от грязи и воды. С ним я проходил около года и впоследствии заменил на Galaxy Nexus, однако отдать или продать побитую, несколько раз тонувшую и прошедшую со мной через все, что только можно, моторолу не решился. Смартфон действительно был хорош, удобен, легко помещался в кармане и выдерживал любые испытания.

Проблема была только в том, что по умолчанию на Defy ставили Android 2.2, который впоследствии можно было обновить только до 2.3. Жадная и ленивая моторола оборвала все надежды владельцев, сказав, что 4.0 на смартфоне не будет — маловато памяти в зверьке.

К счастью, портировать Android 4.0 на Defy начали почти сразу после открытия исходников, и ко времени, когда необходимость в 4.X назрела, разработчики выкатили хороший полноценный порт (рассказ о том, через что они прошли, чтобы сделать это в условиях неломаемого залоченного загрузчика, достоин отдельной статьи). Но даже уже вылизанный Android 4.X (в лице CyanogenMod 10.2) работал на старом девайсе из рук вон плохо. Мизерный по нынешним временам объем памяти просто душил систему, и она постоянно держалась на пределе возможностей. В сравнении с 2.3, новая версия была просто невероятным тормозом, пользоваться которым не было никакого желания. Начались поиски любых путей оптимизации.

В сущности, все последующее повествование и есть рассказ о том, как заставить работать Android 4.3 (CyanogenMod 10.2) на Motorola Defy или любом другом устаревшем устройстве похожей конфигурации (в частности, точно такая же начинка была у Motorola Droid и похожая у Samsung Galaxy S). Впрочем, все сказанное будет справедливо вообще для любого девайса на Android 4.X, начиная от Samsung Galaxy Nexus и заканчивая HTC One.

Что, почему и зачем

Итак, у нас есть смартфон под управлением Android 4.X, и он безбожно тормозит. Приложения запускаются долго, промотка происходит с задержками, общий FPS около 5–10 кадров. Проблемы здесь, как и положено, две: процессор и память.

Официальные системные требования Android 4.X — это процессор на 1 ГГц и 1 Гб оперативной памяти. Только такой смартфон может пройти сертификацию и получить возможность продажи с предустановленным Google Play. Все, что ниже, — нет. И никакого запаса по памяти или частотам здесь нет, это край, ниже которого начинаются тормоза. Не из-за кривости чьих бы то ни было рук, а по причине функциональности ОС, которая с выходом Ice Cream Sandwitch действительно серьезно возросла (ну или можно все свалить на Java).

Сколько памяти потребляет Android 4.X? Много. Только что загруженная операционная система занимает около 350 Мб, за вычетом кода ядра и невыгружаемых компонентов на девайсе с 512 Мб памяти свободными остаются около 120 Мб. Среднее современное приложение вроде Twitter или Instagram во время своей работы может сожрать до 50 Мб. То есть оперативная память будет исчерпана уже после включения аппарата и запуска пары-тройки приложений.

Да, тебе не нужна одновременная работа нескольких программ, однако Android — это не Windows, он не завершает работу приложения при его закрытии, а всего лишь сворачивает, в результате чего софт продолжает жрать память, даже когда ты им не пользуешься. Чтобы ось не сдохла от нехватки памяти, в критические моменты просыпается процесс, названный Low Memory Killer, и беспощадно убивает фоновые приложения.

Современный Android-софт очень прожорлив
Современный Android-софт очень прожорлив

Автоматическое освобождение памяти

Для нас Low Memory Killer очень важный инструмент. Это не просто топорная прибивалка софта, а интеллектуальный механизм, который можно перенастроить под любые нужды. Алгоритм работы этого внутриядерного процесса основан на значениях «важности», которые присваиваются каждому работающему в системе приложению и могут изменяться во времени. Всего таких значений шесть:

  • FOREGROUND_APP — видимое на экране приложение, его убивать нельзя ни в коем случае;
  • VISIBLE_APP — работающий в фоне процесс, отвечающий за вывод той или иной информации на экран (иконка в строке состояния, выдвижная панель, виджет и так далее), его лучше тоже не убивать;
  • SECONDARY_SERVER — фоновый сервис, такой как музыкальный проигрыватель, будильник, синхронизация данных, обычно может быть убит без серьезных последствий для системы в целом, но с потерей функциональности;
  • HIDDEN_APP — работающее в фоне приложение, может быть убито в любой момент, но это скажется на его функциональности;
  • CONTENT_PROVIDER — фоновый сервис, отвечающий за хранение и предоставление какой-либо информации (настройки, фотографии, что угодно), но в данный момент простаивающий (клиентов нет), может быть безболезненно убит;
  • EMPTY_APP — любой фоновый процесс (приложение), который ничего не делает, первый кандидат на убийство.

Важность приложений каждой группы растет снизу вверх. То есть при нехватке памяти Low Memory Killer начнет убийство с последней группы и, если памяти снова будет не хватать, будет продвигаться выше. Само понятие «дефицит памяти» у Low Memory Killer определяется шестью порогами, по одному на каждую группу процессов. На всех смартфонах (и прошивках) значения этих порогов разные, например, на Motorola Defy с CM-10.2 на борту они такие:

FOREGROUND_APP: 25 Мб
VISIBLE_APP: 30 Мб
SECONDARY_SERVER: 40 Мб
HIDDEN_APP: 50 Мб
CONTENT_PROVIDER: 55 Мб
EMPTY_APP: 70 Мб

Свободной памяти меньше 70 Мб — убиваются безработные фоновые приложения, меньше 55 Мб — в расход пойдут Content Porovider’ы и так далее. Когда памяти останется всего 25 Мб, будет убито используемое в данный момент приложение, но вероятность такого исхода крайне мала; после убийства всех остальных приложений память занимать будет просто некому.

Красота всего этого механизма в том, что он может быть перенастроен в любой момент. В Android есть файл /sys/module/lowmemorykiller/parameters/minfree, который можно прочитать, чтобы получить текущие значения порогов или записать в него новые значения (через запятую в 4-килобайтных блоках), которые вступят в силу сразу после записи. То же самое можно сделать, используя приложение Auto Memory Manager, MinFree и аналоги.

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

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

Еще один радикальный вариант — это повысить лимиты двух последних групп до максимума, в результате чего Android фактически превратится в однозадачную систему, каковой до недавнего времени была iOS и до сих пор остается Windows Phone (условно, конечно). Другими словами, система будет автоматически убивать приложения сразу после их закрытия, но только в том случае, если софтина не будет в этот момент ничего делать. Системные компоненты при этом останутся висеть в памяти.

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

Очищаем смартфон от мусора

Все наши манипуляции с Low Memory Killer не принесут особого прироста производительности, если память системы будет забита разными клиентами Facebook, VKontakte, Hangouts Google+ и прочими. Обычно такой софт стартует сразу после загрузки системы и попадает либо в группу SECONDARYSERVER, либо в HIDDENAPP (иногда в CONTENT_PROVIDER), так что до него механизм очищения памяти добирается только в последнюю очередь, а даже если добирается, через некоторое время софтина перезапускается (обычно это связано с каким-либо системным событием).

Поэтому вторым пунктом в нашем плане улучшения скорости работы будет избавление от всех подобных приложений. Нет, реально нужные, конечно, лучше оставить, а те, которые стоят для галочки, — удалить. Если ты используешь стороннюю прошивку, типа CyanogenMod, стандартный архив Gapps (тот, который прошивается после самой прошивки) лучше заменить на минимальный (goo.im/gapps/minimal). Из гугловских приложений в нем только сам маркет и Gmail, а Hangouts, карты и куча других сервисов вырезаны, поэтому они тоже не будут стартовать во время загрузки и жрать память (любой из них можно установить из маркета).

Кроме Google-сервисов, довольно много памяти могут отъесть сервисы и автоматически запускаемые приложения самого Android. Удивительно, но в памяти работающей Android-системы можно легко обнаружить кучу софта, которым ты вообще не пользуешься. Это может быть диктофон, калькулятор, «Черная дыра» (к сожалению, это всего лишь живые обои), а также сервисы голосового набора (набора номера, не поиска), календаря и синтезатора речи. Причем если первые просто были запущены во время загрузки и довольно быстро вытесняются Low Memory Killer, то вторые — это полноценные сервисы, которые висят в памяти на протяжении всей жизни смартфона.

Многие из этих сервисов можно отключить через стандартный диспетчер приложений, даже не имея root. Достаточно перейти в «Настройки -> Приложения -> Все», тапнуть по нужной софтине и нажать кнопку «Отключить» (ну или «Удалить», а затем «Отключить», если были установлены обновления). Вот список приложений, которые, с точки зрения инженеров Google, можно безболезненно отключать:

  • Голосовой набор (com.android.voicedialer)
  • Диктофон (com.android.soundrecorder)
  • Календарь (com.android.calendar)
  • Калькулятор (com.android.calculator)
  • Обновление CyanogenMod (com.cyanogenmod.updater)
  • Память календаря (com.android.providers.calendar)
  • Синхронизация закладок (com.google.android.syncupdaters.bookmarks)
  • Синхронизация календаря (com.google.android.syncupdaters.calendar)
  • Стандартные заставки (com.android.dreams.basic)
  • Фоновые рисунки (com.android.musicvis и com.android.magicsmoke)
  • Черная дыра (com.android.galaxy4)
  • com.android.wallpaper.holospiral
  • Email (com.android.email)
  • Picasa Uploader (com.google.android.apps.uploader)
  • Pico TTS (com.svox.pico)

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

По умолчанию система не позволит отключить некоторые весьма прожорливые, но тем не менее важные сервисы. К таким относятся, к примеру, «Телефон» (это приложение входит в группу FOREGROUND_APP и поэтому всегда висит в памяти), «Эквалайзер» (только в CyanogenMod и производных), Google Backup Transport (~45 Мб), ответственный за бэкап установленного софта в облаке Google (восстанавливается после переустановки прошивки, например), «Меню SIM-карты» и Fused Location (~45 Мб), сервис, который собирает данные о местоположении со всех возможных источников (сотовая сеть, IP-адрес, барометр, GPS, компас) и на их основе вычисляет точное положение смартфона на карте. Приложения типа навигаторов будут работать и без него, но с меньшей точностью.

Избавиться от всех этих процессов поможет root-приложение Bloat Freezer. Оно позволяет отключить не только приложения, дозволенные к отключению самой системой, но и вообще любые, в том числе главный системный процесс android.process.acore. Кроме приведенных выше пожирателей памяти, безболезненно можно прибить еще такое количество системных приложений, что мне будет проще привести список тех, которые отключать нельзя. Вот они:

  • Apollo (CyanogenMod)
  • cLock (CyanogenMod)
  • Google Services Framework
  • Launcher (Trebuchet в CyanogenMod)
  • Аккаунты Google
  • Браузер
  • Галерея
  • Графический интерфейс системы
  • Диспетчер загрузки
  • Загрузки
  • Клавиатура Google
  • Контакты
  • Мастер доступа к пакетам
  • Местоположение сети
  • Настройки
  • Память номеров/SMS/MMS
  • Параметры раскладки
  • Программа установки пакета
  • Программа установки сертификата
  • Синхронизация контактов Google
  • Сообщения
  • Средство просмотра HTML
  • Телефон
  • Файлы (CyanogenMod)
  • Фонарик (CyanogenMod)
  • Хранилище контактов
  • Хранилище мультимедиа
  • Хранилище настроек
  • Часы

Все остальное можно безболезненно выключить (ну или оставить те, которые еще могут пригодиться, например FM-радио). Когда все будет сделано, открываем любой менеджер процессов, прибиваем все пользовательские процессы и смотрим, сколько памяти занято. В моем случае 200 Мб. Очень даже недурно в сравнении с изначальными 350 Мб.

Отключаем бесполезный голосовой набор
Отключаем бесполезный голосовой набор
Отключив Fused Location и Google Backup Transport, мы освободим 90 Мб памяти
Отключив Fused Location и Google Backup Transport, мы освободим 90 Мб памяти
Отключаем системные сервисы с помощью Bloat Freezer
Отключаем системные сервисы с помощью Bloat Freezer

bloatware2

После чистки система занимает меньше 200 Мб!
После чистки система занимает меньше 200 Мб!

Боремся с жадным софтом

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

Что мы можем сделать? Конечно же, удалить подобный софт, ну или как минимум заменить его аналогом. Если сделать это невозможно, можно прибегнуть еще к двум хитростям. Первое — это принудительное убийство приложения. Обычно программа начинает толстеть во время работы, а сразу после запуска занимает не слишком много памяти. Убивать софт не слишком правильная идея, но если уж ты собрался это делать, то лучше воспользоваться для этого встроенной функцией CyanogenMod и производных: убийство долгим удержанием кнопки «Назад» («Настройки -> Для разработчиков -> Закрытие приложения»).

Второе, что мы можем, — это отучить прожорливые приложения что-либо делать в фоне. Для этого есть замечательное приложение Greenify (требует root), которое позволяет заморозить выбранные приложения так, чтобы они вообще не могли работать, пока не видны на экране. Запускаем Greenify, нажимаем «+» и видим список работающего софта, рассортированный по степени прожорливости, тапаем по нужному приложению и все, отныне в фоне оно всегда будет спать.

Некоторым приложениям незачем работать в фоне
Некоторым приложениям незачем работать в фоне

Другие советы

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

Тем не менее есть еще два действенных совета. Первый — это активация технологии zRam, которая позволяет выделить небольшой фрагмент оперативной памяти и создать из него виртуальный своп-раздел со сжатием данных. В результате общий объем оперативной памяти виртуально увеличится, высвободив лишних 50–100 Мб.

Проблема с активацией zRam только в том, что сама технология есть далеко не в каждом ядре. Большинство кастомных ядер, а также ядра прошивок CyanogenMod, Paranoid Android и AOKP обычно включает поддержку zRam, но это не всегда верно. Стоковые прошивки обычно поставляются с ядрами без zRam. В CyanogenMod и производных активировать Z-RAM можно через меню «Настройки -> Производительность -> Управление памятью -> Использовать zRam». По умолчанию система выделяет под сжатый своп 18% памяти, но при необходимости значение можно увеличить до 26%. В других прошивках zRam активируется с помощью приложения Trickster Mod (вкладка «Специфичные функции»), однако так можно выделить только 10% памяти.

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

Перенеся все приложения во внутреннюю память, мы добьемся ускорения их запуска. Уже установленный на карту памяти софт можно легко вернуть назад через настройки: «Приложения -> Сторонние -> Выбор приложения -> Перенести на смартфон». Чтобы вообще отключить функцию установки новых приложений на карту памяти, нужны права root и эмулятор терминала. Запускаем терминал и набираем две команды:

$ su
# pm setInstallLocation 1

Теперь по умолчанию весь софт будет устанавливаться во внутреннюю память. Чтобы настройка сохранялась между перезагрузками, берем любой файловый менеджер с поддержкой root, переходим в каталог /system/etc/init.d/ и создаем такой файл99disable-app2sd.sh:

#!/system/bin/sh
/system/bin/pm setInstallLocation 1

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

Активируем zRam в CyanogenMod
Активируем zRam в CyanogenMod
Активируем zRam с помощью TricksterMod
Активируем zRam с помощью TricksterMod
По умолчанию Android предпочитает устанавливать софт на SD-карту
По умолчанию Android предпочитает устанавливать софт на SD-карту

Выводы

Применяя все описанные в статье приемы, мне удалось существенно поднять скорость работы при использовании Motorola Defy с CyanogenMod 10.2 на борту. Смартфон, конечно, не приблизился к скорости Nexus 4 и других современных девайсов, но в сравнении с настройками по умолчанию комфорт от использования повысился в разы и приблизился к таковому при использовании стокового Android 2.3.

INFO


Выявить приложения, которые просыпаются во время сна смартфона и садят его батарею, можно с помощью приложения Wakelock Detector.

INFO


Если ты не пользуешься поиском Google на домашнем экране, то рекомендую удалить/отключить приложение «Google поиск». Экономия: 10–15 Мб и место на рабочем столе (строка поиска исчезнет).

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    11 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии