Руководства Руководства Android

Как исправить вылеты приложений на Android

Как исправить вылеты приложений на Android

Разбираемся в механизме взаимодействия с памятью и в причинах вылетов приложений на Android. Лечим эту проблему множеством способов.

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

Словом «вылет» принято называть вынужденное прекращение работы запущенной программы (или игры) на смартфоне/планшете под управлением операционной системы Android. В подавляющем большинстве случаев это связано с нехваткой оперативной памяти (также, ОЗУ или RAM), в которую и загружаются все данные приложений, запущенных на устройстве в данный момент времени. Когда оперативной памяти не хватает для записи новой информации, система Android в принудительном порядке закрывает запущенные процессы для ее освобождения.

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

Что такое ОЗУ в Android и как влияет на вылеты

Стоит отметить, что операционная система Android построена на базе ядра Linux. Каждый раз, когда мы запускаем ту или иную программу (или игру) на нашем устройстве, создается специальный процесс этого приложения внутри ядра. Он необходим для того, чтобы определить, какое количество ресурсов будет «передано» запущенному приложению: сколько оперативной памяти нужно выделить, какая процессорная мощность требуется, какие сетевые запросы нужно сделать, операции I/O (что нужно записать в постоянную память или «достать» оттуда) и прочее.

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

А что произойдет, если процесс потребует количество оперативной памяти, которое система не сможет ему предоставить? Ведь в случае с процессорной мощностью, если программе потребуется то или иное количество ресурсов CPU, она получит их в 100% случаев, так как ресурс процессора – это, условно говоря, бесконечная величина. Любая задача будет выполнена процессором, вопрос заключается только во времени.

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

Если еще проще, то каждое нажатие на иконку приложения запускает его процесс, который обращается к ядру примерно с таким вопросом: “Мне нужно вот столько … ОЗУ, чтобы я хотя бы смог загрузиться и показать пользователю главное меню”. И впоследствии, если нужно больше ОЗУ, процесс снова обращается к ядру: “Мне нужно еще столько … памяти для загрузки этих файлов, этих и …”.

 

Оперативная и внутренняя память Android, какой тип выбрать

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

Благо в нашей системе есть специальные службы, которые занимаются очисткой оперативной памяти, то есть, ее освобождением. Когда мы закрываем программу, происходит «убийство» ее процесса – он просто выгружается из памяти и освобождает ту ее часть, которая ранее была занята. Освободившаяся память попадает в так называемый пул «Free Memory», откуда ядро и будет черпать заветные мегабайты для других запускаемых приложений. В переводе это означает “Свободная память”.

Но у системы есть и другой пул, который имеет название «Available Memory», что в переводе – “Доступная память”. Казалось бы, одно и то же. В чем разница?

Что такое доступная и свободная память

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

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

Встроенные методы высвобождения ОЗУ

Как на Android проверить расход оперативной памяти - AndroidInsider.ru

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

  1. Прекратить работу какого-либо процесса (приложения).
  2. Применить технологию ZRAM.
  3. Использовать файл подкачки – SWAP (память, которая «преобразуется» из постоянного хранилища, например, на карте памяти и используется как оперативная).

О файле подкачки, кстати, мы еще будем говорить далее, когда дойдет дело до рекомендаций.

Первый вариант означает то, что ядро просто «убивает» процесс программы, которая была запущена ранее, чтобы освободить место в ОЗУ под данные для новой программы. Например, мы запустили 5 приложений в таком порядке (важно запомнить): WhatsApp, Viber, Facebook, Gmail, Subway Surfers и хотим открыть YouTube, но ресурсов больше нет. Что произойдет? Система посмотрит на процессы, которые уже запущены и завершит работу WhatsApp, так как он запускался раньше всех (использовался нами давно, в сравнении с Gmail и остальными). Причем ядру абсолютно безразлично то, нужен ли нам еще WhatsApp или нет. Такова цена вопроса.

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

  1. Определение как «жертвы» программы WhatsApp, которая запускалась давно.
  2. Поиск фрагментов памяти, выделенных под «WhatsApp», которые используются редко.
  3. Архивирование (сжатие) этих фрагментов и запись их на жесткий накопитель (ROM).

Таким образом память высвобождается под новое приложение. Но, чтобы получить доступ к «WhatsApp» вновь, системе уже нужно считать записанный в накопителе архив и разархивировать его. Все это требует времени (в эти моменты, кстати, и случаются различные подтормаживания системы при переключении между программами), поэтому ZRAM тоже не самая идеальная технология.

Ручные методы освобождения ОЗУ

На самом деле то большое количество программ для очистки ОЗУ, которое есть в магазине Google Play практически бесполезно. И это несмотря на то, как порой усердно разработчики этих утилит пытаются убедить нас в том, что именно их утилита решит все наши проблемы с нехваткой оперативки. Данный софт не то чтобы сложно назвать эффективным, его даже тяжело назвать безопасным для системы, так как появляются вопросы лишь о его вреде.

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

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

Отключение синхронизации

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

Шаг 1. Открываем системные настройки.

Шаг 2. Находим пункт «Пользователи и аккаунты» (может иметь название «Учетные записи» или «Аккаунты»). В зависимости от производителя устройства и оболочки названия у пунктов могут сильно отличаться. Ищем что-то похожее.

Шаг 3. Находим настройку «Автосинхронизация данных» (или опять же, похожее) и отключаем ее.

Теперь, это ненамного, но все же сократит расход ОЗУ и даже поможет экономить заряд аккумулятора, так как теперь в системе будет меньше действий и «жизни», которая требует ресурсов процессора и оперативной памяти.

Смена приоритетов у приложений

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

Чтобы установить приоритеты, делаем следующее:

Шаг 1. Переходим в настройки устройства.

Шаг 2. Ищем пункт «О системе» или «Система», или «О телефоне» и открываем его.

Шаг 3. Находим строку «Номер сборки» и кликаем по ней 5-10 раз подряд, пока не появится всплывающее окно «Не нужно, вы уже разработчик».

Шаг 4. Возвращаемся на шаг назад и в этом же разделе находим появившееся меню «Для разработчиков». Включаем его.

Шаг 5. Находим строку «Приложения в режиме ожидания» и кликаем на нее.

Шаг 6. В списке находим программы, которыми пользуемся редко и выставляем им одно из двух значений (лучше – второе): «FREQUENT», «RARE».

Что обозначают эти приоритеты? Каждой программе можно присвоить всего 4 значения. Эту систему можно представить как 4 урны, каждая из которых имеет свои особенности. Урна «ACTIVE» означает, что приложения из данного сегмента не будут никак ограничиваться и могут потреблять сколь угодно ресурсов. Далее по убыванию «свободы» идут урны «WORKING_SET», «FREQUENT» и «RARE».

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

Стоит отметить, что процесс разблокировки меню «Для разработчиков» может отличаться в зависимости от установленной версии Android и оболочки (MIUI, One OS, AOSP и пр.).

Установка Greenify

Да, выше мы уже оспаривали эффективность различных приложений, заточенных под освобождение оперативной памяти, повышение быстродействия системы и улучшения многозадачности буквально в 2 щелчка. Но стоит обозначить сразу, что программа Greenify – не примитивный таск-киллер, который обещает нам гигабайты свободной ОЗУ и потрясающую многозадачность.

Теория, о которой мы говорили в самом начале статьи, немного помогла нам понять суть всего механизма взаимодействия ОЗУ и Android. Исходя из этого можно сделать вывод: чтобы свободной памяти было больше, нужно ограничить количество приложений, которые могут попытаться получить к ней доступ. Мы не будем устраивать «геноцид» запущенных программ и убивать процессы без суда и следствия, что нам так предлагают различные менеджеры задач. Мы пойдем другим способом – предотвратим фоновую активность. Сделать это можно с помощью программы Greenify.

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

Шаг 1. Скачиваем утилиту из официального магазина Google Play.

Шаг 2. Запускаем и следуем действиям на скриншотах – пропускаем настройку умной гибернации и выбираем режим работы ROOT.

Шаг 3. Переходим в раздел настроек (нажимаем на «три точки» в верхнем правом углу) и включаем: «Агрессивный Doze», «Отслеживание и отсечение пробуждений» и «Всегда игнор. отсутствие фона».

Шаг 4. Добавляем нажатием на кнопку «+» приложения, активность которых хотим ограничить.

И все же, даже этот вариант остается под вопросом, так как то количество памяти, которое в теории освобождает (не дает занять) нам Greenify практически в 100% объеме «компенсируется» сервисами самого приложения, которые нужны ему для работы. Однако попробовать однозначно стоит. Особенно тем, кто имеет на устройстве root-права и, что еще лучше, установленный Xposed Framework.

Создаем файл подкачки SWAP

Данный способ позволит не столько сэкономить память, сколько расширить ее. Далее мы попробуем создать SWAP-файл, который будет использоваться системой. Фактически это позволит расширить объем оперативной памяти за счет внешнего хранилища – SD-card.

Обратите внимание: для создания SWAP-файла устройство должно иметь root-доступ, установленный BusyBox, а ядро должно поддерживать технологию swappiness. Инструкция ниже предполагает успешное выполнение вашим девайсом всех трех условий.

Итак, чтобы создать файл подкачки для расширения ОЗУ, делаем следующее:

Шаг 1. Убеждаемся, что количество памяти на SD-card, которое мы хотим выделить под ОЗУ, свободно.

Шаг 2. Проверяем, совместим ли необходимый нам софт с устройством. Для этого скачиваем эту утилиту из официального магазина Google Play. Устанавливаем и запускаем, предоставляя root-доступ.

Шаг 3. Запускаем тест нажатием клавиши «Start Ramexpander Test Here». Выбираем место, где будет создан файл для тестирования и ждем некоторое время.

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

Шаг 5. Если в 4 пункте все «ОК», то устанавливаем непосредственно программу для создания SWAP-файла с этого форума (нужно зарегистрироваться). Запускаем и предоставляем root.

Шаг 6. Нажимаем на кнопку «Оптимальное значение», чтобы программа определила нужный для системы размер SWAP-файла.

Шаг 7. Далее будет предложено выбрать раздел для файла подкачки. Выбираем карту памяти и оптимальное значение.

Шаг 8. Ждем некоторое время и убеждаемся в успешности процесса после появления соответствующего окошка. Об успехе также будет сигнализировать уведомление.

Важно! Получение прав суперпользователя (root-доступа) на большинстве современных устройств может обернуться их поломкой и полной потерей работоспособности. Процесс не будет описан в статье, так как способы получения отличаются, в зависимости от производителя и других нюансов. Более подробную информацию о получении root можно узнать на форуме 4PDA.

Прочие причины вылетов

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

Решается здесь все не так просто, как может показаться, так как проблема находится не в нашей «зоне видимости». Все, что мы можем сделать, как рядовой пользователь — переустановить программу или ждать новых обновлений от разработчика. Поэтому, если причина вылета того или иного приложения не связана с количеством свободной оперативной памяти, можно попробовать просто переустановить его. Также может помочь обновление прошивки до последней версии.

Заключение

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

Комментировать