Как установить приоритет программы в андроид
Если вы заметили, что смартфон стал работать медленнее, а некоторые приложения зависают или перестают отвечать, возможно, виной тому являются процессы, которые работают в фоновом режиме и отнимают слишком много ресурсов телефона. В этой статье расскажем как ограничить их работу с помощью скрытой настройки меню.
Работа смартфона — весьма сложный процесс, который не прекращается ни на минуту даже ночью, когда телефон лежит у вас под подушкой. Большинство процессов в смартфоне продолжают свою работу незаметно для глаз пользователя и могут потреблять достаточно большое количество ресурсов.
Многие пользователи ошибочно считают, что оперативную память «съедают» те приложения, которые остаются свернутыми, и если их закрыть, можно таким образом освободить бОльшую часть памяти.
На самом деле это не так. Свернутые приложения, находящиеся в режиме ожидания — это лишь верхушка айсберга. По сути – это только кэшированные данные, которые позволяют вам вернуться в приложение без потери последних данных. Закрыв их, вы сможете лишь немного освободить оперативную память телефона. Основная же часть ресурсов приходится на процессы или службы приложений. Именно они потребляют оперативную память и расходуют заряд батареи даже тогда, когда приложение закрыто.
Не все из них одинаково полезны, но есть и те, которые могут отвечать за безопасность устройства и его стабильную работу. Тем не менее, если телефон стал слишком задумчивым и вы замечаете, что он потребляет заряд батареи, даже находясь в режиме ожидания, вам будет полезно узнать как ограничить работу фоновых процессов и тем самым освободить оперативную память устройства, а также повысить его быстродействие.
Как управлять фоновыми процессами
Получить расширенный контроль над фоновыми процессами можно с помощью специальных инструментов, встроенных в операционную систему. В смартфонах Android эта возможность реализована с помощью скрытого меню для разработчиков.
Как включить параметры разработчика
Для того, чтобы активировать режим разработчика, необходимо перейти в Настройки телефона, открыть пункт «Сведения о телефоне», затем «Сведения о ПО» и несколько раз подряд нажать на пункт «Номер Сборки» до появления системного уведомления о том, что режим разработчика активирован.
Затем нужно вернуться назад, в главные настройки. Если все было сделано правильно, вы увидите, что внизу появился новый пункт меню «Параметры разработчика».
Как управлять фоновыми процессами
Для того, чтобы управлять фоновыми процессами, в меню «Параметры разработчика» необходимо найти пункт «Приложения». Здесь находится несколько параметров, отвечающих за работу фоновых процессов. Например, параметр «Вытеснение фоновых Activity» позволяет принудительно останавливать действия приложений после их закрытия (не рекомендуем включать), а параметр ANR в фоновом режиме — отображать фоновые уведомление в случае, когда какой-то процесс не отвечает.
Больше всего нас здесь интересует параметр «Лимит фоновых процессов», который позволяет выбрать какое количество процессов будет использоваться вашим смартфоном в фоне. Данное ограничение затрагивает в основном сторонние приложения, установленные пользователем, поэтому можно не переживать за работающие системные службы.
По умолчанию здесь установлено значение «Стандартное ограничение».
Для слабых смартфонов с небольшим количеством оперативной памяти можно ограничиться значением «не более 1−2 процессов». Для устройств «пошустрее» можно установить лимит «не более 4 процессов».
Полное отключение фоновых процессов может повлиять на корректную работу некоторых приложений, поэтому мы не рекомендуем использовать данную функцию по максимуму, особенно если вы активно пользуетесь мессенджерами, почтой и другими приложениями, которые требуют проверки уведомлений.
Заключение
Теперь вы знаете, как, изменив лимит фоновых процессов, можно существенно снизить потребление оперативной памяти и повысить общее быстродействие смартфона. Но помните, что использовать меню разработчика стоит только в том случае, если у вас наблюдаются существенные проблемы в работе устройства и не пренебрегайте этим правилом без крайней необходимости, в противном случае есть риск навредить работе гаджета.
Примечание переводчика: при переводе старался максимально пользоваться терминологией, которую предлагает сам Google в русскоязычной версии документации по Android, таким образом «service» стал «службой», «content provider» стал «поставщиком контента», и так далее. А вот «activity» стать «операцией» так и не смог — не пересилил я себя. Извините.
Давайте признаем: мобильные устройства не обладают бесконечной памятью, бесконечным зарядом батареи, или чем-то ещё бесконечным. Для нас это означает следующее: мы должны рассматривать смерть процесса как натуральную часть жизненного цикла наших приложений. Важно убедиться, что освобождение памяти, связанное с уничтожением процесса, не приводит к негативным для нашего пользователя последствиям. Для выполнения этой задачи большая часть архитектуры процессов в Android была создана таким образом, чтобы обеспечить жёсткую иерархию, в соответствии с которой процессы живут и умирают.
Иерархия процессов в Android
Если вы обратитесь к документации, то обнаружите, что самые важные процессы называются процессами переднего плана, за ними следуют видимые процессы, служебные процессы, фоновые и, наконец, пустые процессы. Кстати, заметьте, что хотя говорить мы будем о компонентах Android-приложений (службах, Activity , и так далее), Android всегда уничтожает процессы, а не компоненты. Разумеется, это никак не противоречит сборке мусора (в результате которой в систему возвращается память, занимаемая объектами, на которые больше никто не ссылается), но это тема для отдельного поста.
Процессы переднего плана
Вы наверняка думаете, что то, с чем взаимодействует пользователь в любой отдельно взятый момент времени является тем компонентом системы, который уничтожать никак нельзя (по крайней мере пока пользователь продолжает свою работу), и вы абсолютно правы. Одно но: «то, с чем взаимодействует пользователь в любой отдельно взятый момент времени» — слегка нечёткое определение. Одним из компонентов, попадающих в эту категорию, является Activity переднего плана — та, в которой onResume() уже вызван, а onPause() — ещё нет.
Пока одни Activity полагаются в своей работе только на самих себя, другие перекладывают часть её на привязанные службы (bound services). Любой процесс, содержащий службу, привязанную к Activity переднего плана, получает от системы точно такой же приоритет, как и процесс, содержащий саму Activity переднего плана. И это правильно: если Activity переднего плана полагает, что для её работы необходимо держать постоянное соединение со службой, то держать эту службу живой и невредимой в интересах как самой Activity , так и Android. Тот же самый принцип применяется и к поставщикам контента (content providers).
Но кто сказал, что Activity — это единственный компонент, исчезновение которого тут же заставит пользователя негодовать? Я вот точно бы рассвирепел, если бы моя музыка внезапно прекратила играть, или же подсказки от моей навигационной системы растворились бы в тумане. К счастью, Android позволяет службам уведомить систему о том, что они обладают высоким приоритетам через вызов метода startForeground(). Вызов этого метода является наилучшим способом обеспечить фоновое проигрывание музыки, а, что касается других задач, то перед тем как вызвать startForeground() , нужно спросить себя: «А пользователь точно сразу же заметит то, что моя служба прекратила свою работу?» Службы переднего плана должны использоваться только в критических случаях, тогда, когда прерывание работы станет сразу же очевидным.
Примечание: службы переднего плана требуют, чтобы вы размещали уведомление, которое сообщало бы пользователю о том, что служба работает. Если вам кажется, что в вашем конкретном случае уведомление не нужно, то, наверное, служба переднего плана вам и не нужна (это нормально, есть и другие способы обеспечить работу в фоновом режиме, о которых будет рассказано далее).
Видимые процессы
Так, стоп, я же уже рассказал про Activity переднего плана? Рассказал, но Android в неисповедимой мудрости своей позволяет возникать таким ситуациям, когда ваша Activity является видимой, но не находится на переднем плане. Такое может случиться, когда Activity переднего плана стартует другую Activity , тема которой наследуется от Dialog. Или когда стартуемая Activity является полупрозрачной. Или когда вы вызываете системный диалог с запросом у пользователя тех или иных разрешений (который, на самом деле, является Activity !).
Activity является видимой от вызова onStart() до вызова onStop(). Между этими двумя вызовами можно делать всё, что ожидается от видимой Activity : обновление экрана, и так далее.
Кстати, процессы, в которых находятся привязанные службы и поставщики контента видимых Activity тоже получают такой же приоритет как и процесс с видимой Activity (подобно тому, как это происходит у Activity переднего плана), и по тем же причинам: чтобы гарантировать, что эти зависимые процессы не будут уничтожены системой.
Обратите внимание на следующий момент: то, что ваш процесс является видимым, не гарантирует того, что он не будет уничтожен системой. Если процессы переднего плана будут требовать под свои нужны много памяти, есть вероятность того, что Android все-таки пойдёт на крайние меры и прихлопнет видимый процесс. Для пользователя это будет выглядеть следующим образом видимая Activity , находящаяся под Activity переднего плана, будет замещена чёрным экраном. Разумеется, если вы правильно пересоздаёте убиенную Activity , ваш процесс и ваша Activity будут созданы заново без потери состояния как только Activity переднего плана будет уничтожена.
Примечание: одной из причин того, что результат startActivityForResult() обрабатывается в onActivityResult(), а результат requestPermissions() — в onRequestPermissionsResult(), а не в функциях обратного вызова, как раз-таки и является возможность уничтожения видимого процесса — если весь ваш процесс будет уничтожен, то и все существующие в нем функции обратного вызова будут уничтожены тоже. Поэтому, если вы видите библиотеки, использующие подход с функциями обратного вызова, знайте: они могут работать не так, как вам хочется, в случае нехватки памяти в системе.
Служебные процессы
Если ваш процесс не попадает ни в одну из вышеназванных категорий, но в нём есть запущенная служба, то ваш процесс получает приоритет служебного процесса. Такие случаи типичны для многих приложений, которые осуществляют фоновую работу (например, загрузку данных), но результаты этой работы не являются настолько важным, как в случае служб переднего плана.
И эти процессы не являются такими уж бесполезными, как может показаться. Для большого круга задач такой процесс является наилучшим способом выполнения фоновых задач, так как он будет уничтожен только если в видимых процессах и процессах переднего плана происходит столько всего, что нужно срочно откуда-то взять память.
Обратите особое внимание на константу, возвращаемую вами из onStartCommand(), так как она определяет поведение системы в случае, если ваш процесс будет уничтожен при нехватке памяти:
-
подразумевает, что система возродит вашу службу тогда, когда это будет возможно, но она не будет заново посылать службе последний ею полученный Intent (например, вы сами можете восстановить состояние, или у вас есть самописный жизненный цикл, определяющий, что делать при старте и останове службы). предназначается для служб, которые хотят запускаться заново с тем же самым Intent 'ом, который был получен ими в onStartCommand() пригодится службам, которые необязательно перезапускать, если они тихонько растворились в тумане. Такое поведение может быть полезно для служб, выполняющих такие периодические задачи, выполнение которых можно на время опустить.
Фоновые процессы
Допустим, что у вас была Activity переднего плана, и пользователь нажал на кнопку Home, что привело к вызову onStop(). Если кроме этой Activity у вас больше не было ничего, что позволяло бы и дальше сохранять высокий приоритет вашего процесса, то ваш процесс переходит в разряд фоновых процессов. Они, кстати, и занимают большую часть памяти устройства, на случай, если пользователь решит потом вернуться к одному из ранее открытых приложений.
Android не уничтожает процессы направо и налево, так как запуск их с нуля довольно ресурсозатратная операция. Поэтому они могут оставаться в памяти некоторое время, перед тем как быть уничтоженными, если на горизонте появится новый высокоприоритетный процесс. Уничтожение происходит в порядке вытеснения давно неиспользуемых: первыми уничтожаются те процессы, которые не использовались более всего. Так же как и в случае с уничтожением видимых процессов/ Activity , нужно уметь правильно пересоздать Activity без потери данных.
Пустые процессы
Как и в любой иерархии, всегда есть самый низкий уровень. В пустых процессах нет ни одного активного компонента, и Android может уничтожить их в любой момент, но обычно они всё-таки удерживаются в памяти какое-то время (это опять к слову об эффективном использовании памяти, которое не заключается в том, чтобы вычищать всё подряд).
На что стоит обратить внимание
Хотя мы и говорили о приоритетах процессов в терминах того, какие компоненты запущены в ваших процессах, помните, что иерархия существует на уровне процессов, а не компонентов. Один лишь компонент (например, служба переднего плана) переведёт весь ваш процесс в категорию процессов переднего плана. Хотя большинство приложений прекрасно живут в одном процессе, нужно помнить, что если жизненный цикл вашего приложения может сильно отличаться от запуска к запуску, или же в приложении есть как очень тяжелая задача, так и долго выполняющаяся, но легковесная, причем первая не зависит от второй, то есть смысл выделить два процесса. Пусть тяжёлая задача выполняется в первом процессе, а легковесная во втором, и тогда в случае нехватки памяти тяжёлая может быть приостановлена, а легковесная продолжит свою работу.
Важно также помнить, что приоритет вашего процесса определяется тем, что происходит на уровне компонентов. Это означает, что если вы запустите очень важную задачу, которая должна выполняться долгое время, в отдельном потоке, но из-под Activity , то вас ждёт неприятный сюрприз, когда ваш процесс внезапно станет фоновым. Используйте доступные вам инструменты (например, службы, или службы переднего плана), чтобы гарантировать, что система в курсе того, что вы делаете.
Не забывайте о других и помните о вашем пользователе
Создавайте ваше приложение таким образом, чтобы оно постоянно работало на том уровне приоритета, который ему нужен — не больше и не меньше. Помните также, что вы как разработчик имеете на руках устройство, которое намного мощнее слабейших устройств конечных пользователей, и из-за этого вы можете никогда не увидеть своими глазами уничтожение видимого процесса (а служебного — и подавно), но это не значит, что этого никогда не происходит.
Хоть я и рекомендую обычно покупать для тестирования как можно более слабое устройство, вы можете потестировать поведение своего приложения при его уничтожении даже на своём флагмане. Чтобы уничтожить своё приложение (вместе со всеми его процессами), выполните следующее:
Если у вас несколько процессов, вы можете сначала найти PID нужного вам процесса, посмотрев на вторую колонку (то есть первое число) результата следующей команды:
И потом прихлопнуть этот процесс:
Это будет первым шагом к тому, чтобы добиться корректной работы приложения на большинстве устройств, вне зависимости от того, какие ограничения по памяти будут возникать.
Мы поговорили о некоторых новых интересных функциях Android Lollipop
, но тогда мы не упомянули Приоритетный режим, потому что это была маленькая вещь. Кроме того, мы были на пределе, поскольку Google также покончила с традиционным, но надежным бесшумным режимом.
Но Приоритетный режим, похоже, останется здесь, поэтому в этом руководстве мы поможем вам взять его под контроль.
Что такое режим приоритета и что он делает?
Если у вас есть Android-устройство с версией 5.0 Lollipop или новее, у вас будет приоритетный режим по умолчанию. Чтобы получить к нему доступ, нажмите кнопку увеличения или уменьшения громкости на телефоне, и под слайдером громкости, отмеченным звездочкой, появится опция.
Задача Приоритетного режима — блокировать раздражающие уведомления в Android
, Тем не менее, приложение не умное приложение; то есть он не распознает автоматически, какое приложение раздражает или какие звонки вы хотите получать. Это то, что вы должны будете установить сами.
Кроме того, приоритетный режим может быть настроен на автоматическое включение в определенное время в определенные дни или в определенное время каждый день. Например, Android легко автоматизировать, чтобы не беспокоить вас ночью
Как установить продолжительность режима приоритета Автоматизировать это
Когда вы активируете Приоритетный режим с помощью кнопок громкости, вы можете настроить его на запуск:
- На неопределенный срок — вам придется вручную деактивировать его, когда вы будете готовы разрешить прерывания
- На фиксированное время — вы можете настроить его автоматическое отключение через 15 минут, 30 минут, 45 минут, 1 час, 2 часа, 3 часа, 4 часа или 8 часов.
Прокрутите вниз до настроек, и вы можете:
- Выберите дни недели, в которые вы хотите, чтобы время простоя включалось автоматически.
- Установите время начала и время окончания.
- В разделе «Разрешенные прерывания» выберите «Только приоритет», чтобы разрешить приоритетный режим, или «Нет» для общего режима «Не беспокоить».
Например, настройка режима «Не беспокоить» для выходных может быть полезна для того, чтобы избавить вас от простоев, которые вам нужны вдали от работы, и это не даст телефону испортить вам жизнь.
Как разрешить звонки и тексты от нужных людей
На этой же странице настроек вы также можете переключать события, напоминания, звонки и тексты, чтобы разрешить или запретить их в приоритетном режиме.
Если у вас нет помеченных контактов, вам нужно зайти в свою телефонную книгу и сделать это. Вы можете использовать стандартное приложение для контактов Android или стороннее решение, такое как лучшее приложение для контактов и номеронабирателей.
Как разрешить приложение в режиме приоритета
Как мы уже говорили, Priority Mode — это своего рода привратник. Это позволит только уведомления из приложений, которые вы одобряете. Итак, как вы разрешаете эти приложения?
В Android Lollipop есть новое меню для управления уведомлениями для всех приложений, куда вам нужно будет перейти.
- Выберите «Настройки»> «Звук и уведомления»> «Уведомления приложений».
- Нажмите на приложение, которое вы хотите разрешить в режиме приоритета
- Нажмите на переключатель «Приоритет», который позволит уведомлениям этого приложения проходить в режиме «Приоритет».
из помеченных контактов в вашей телефонной книге Android.
Вы можете использовать собственные настройки уведомлений WhatsApp, чтобы дополнительно фильтровать, от кого вы хотите получать уведомления, а от кого нет. Большинство основных приложений для социальных сетей и мессенджеров на Android позволяют устанавливать уведомления на этом уровне.
Как вернуть тихий режим?
Не нравится Приоритетный режим, и вы хотите вернуть старый добрый Silent Mode? Как всегда, для этого есть приложение! Познакомьтесь с SoundHUD [Больше не доступно], который вы можете скачать и попробовать бесплатно в течение двух недель, после чего он оплачивается.
SoundHUD добавляет более глубокие настройки управления громкостью к вашим кнопкам увеличения / уменьшения громкости. Благодаря этому вы можете регулировать громкость звонка телефона, уведомлений, будильника, музыки и голосовых вызовов. Он появляется при нажатии кнопок громкости, поэтому вы можете быстро настроить параметры для определенного источника звука и вернуться к тому, что вы делали.
Если вы планируете использовать SoundHUD, рекомендуем перейти в Дополнительные настройки приложения и включить параметры для Игнорировать длительные нажатия а также Отключить на экране блокировки. Таким образом, приложение не связывается с другими функциями Android.
Вам нравится режим приоритета?
Приоритетный режим пользуется большой ненавистью в сообществе Android — главным образом потому, что настоящий тихий режим был убран. Тем не менее, чем больше я играю с Приоритетным режимом, тем больше я к нему отношусь.
Что вы думаете об этой функции от Android? Вам не хватает тихого режима? Дайте нам знать об этом в комментариях.
В наши дни Wi-Fi стал повсеместным. Вы даже можете использовать различные услуги, чтобы найти бесплатные точки доступа Wi-Fi рядом с вами.
, Хотя это в основном благо, это также означает, что в одном и том же пространстве конкурирует слишком много сигналов.
Ваш смартфон учитывает различные детали, такие как уровень сигнала, уровень безопасности Wi-Fi
, стабильность сети и т. д., а затем подключается к сети Wi-Fi, который он считает лучшим. Но из-за большого количества точек доступа Wi-Fi вашему телефону иногда бывает трудно решить, к какой сети подключаться.
К счастью, вы можете контролировать этот процесс, отдавая предпочтение сетям Wi-Fi, тем самым обеспечивая подключение вашего смартфона к наилучшей доступной сети Wi-Fi. Это может помочь вам добиться согласованного подключения и обеспечить плавный переход между доступными сетями Wi-Fi.
Сегодня мы увидим, как расставить приоритеты сетей Wi-Fi на устройстве Android, а также на iPhone.
Установите приоритет сети Wi-Fi на устройствах Android
В Android есть два маршрута, которые вы можете выбрать в зависимости от того, какое у вас устройство. Вы можете попробовать найти встроенную настройку, и если она не работает, попробуйте другой вариант.
Приоритезация сетей с использованием встроенных настроек
Некоторые пользовательские ПЗУ для Android
) поставляется со встроенной настройкой для установки приоритета сети Wi-Fi. Чтобы проверить, есть ли у вас ROM, откройте Настройки> Wi-Fi. Нажмите на переполнение меню, а затем нажмите на Расширенный Wi-Fi. Если вы видите Приоритет Wi-Fi Здесь вы можете указать приоритет сетей Wi-Fi.
Похоже, у стокового Android такой встроенной опции нет. Но не волнуйтесь, вы можете использовать сторонние приложения, чтобы выполнить то же самое.
Расставьте приоритеты в сетях с помощью WiFi Prioritizer
WiFi Prioritizer — это бесплатное приложение, которое позволяет вам установить приоритет подключения Wi-Fi на устройствах Android. Он периодически контролирует уровень сигнала и соответственно переключается между сетями Wi-Fi.
После установки приложения откройте его и включите Включить запланированное задание. Вы должны увидеть список всех сохраненных сетей Wi-Fi. Сети в верхней части списка имеют более высокий приоритет, чем сети в нижней части. Здесь вы можете перетащить сети в том порядке, в каком вы хотите к ним подключиться.
По умолчанию он сканирует новые сети Wi-Fi каждые 60 секунд и переключается соответствующим образом. Если вы хотите изменить этот интервал обновления, нажмите на переполнение меню а затем нажмите на настройки. Нажмите на Интервал обновления и установите любое время от 5 секунд до 30 минут. Более низкие значения позволят быстрее переключаться, хотя и за счет времени автономной работы.
В тех же настройках вы можете изменить минимальный уровень сигнала для подключения к сети. Если доступна сеть с более высоким приоритетом, и если сигнал лучше этого значения, он переключится на сеть с более высоким приоритетом. Он также может проверить подключение к Интернету в текущей сети. Если в текущей сети нет подключения к Интернету, он автоматически переключится на следующую доступную сеть.
Если вы хотите временно отключить приоритет Wi-Fi, вы можете переключить Включить запланированное задание выкл. Чтобы отключить его навсегда, просто удалите приложение.
Установить приоритет Wi-Fi сети на iPhone
Невозможно установить приоритет сети Wi-Fi непосредственно на iPhone. Однако, если у вас есть Mac, вы можете установить приоритетность сетей на вашем Mac, а затем синхронизировать его с вашим iPhone.
Прежде чем продолжить, убедитесь, что вы используете один и тот же Apple ID на обоих устройствах. Также убедитесь, что iCloud Sync включен. Чтобы убедиться в этом, откройте Системные настройки на вашем Mac. Нажмите на ICloud и убедитесь, что Брелок проверено.
На вашем iPhone откройте настройки и нажмите на название баннера в верхней части. Перейдите к iCloud> Брелок и включи его.
Теперь, когда мы проверили предварительные условия, вот как установить приоритет сети Wi-Fi на iPhone.
На вашем Mac, нажмите на Значок строки меню Wi-Fi и нажмите Открыть сетевые настройки. Далее нажмите на продвинутый.
Здесь вы должны увидеть список сохраненных сетей Wi-Fi. Сети в верхней части списка имеют более высокий приоритет, чем сети в нижней части. Вы можете перетащить сети в порядок, к которому хотите подключиться. Нажмите Хорошо после того, как вы сделали.
Теперь ваши предпочтения должны быть сохранены и синхронизированы с вашим iPhone. Если у вас возникли проблемы с синхронизацией их с iPhone, убедитесь, что вы вошли в систему с одинаковым Apple ID на обоих устройствах и в iCloud Keychain.
Хотя этот метод сам по себе не сложен, его зависимость от наличия Mac делает его немного неудобным. Нельзя отрицать, что Mac и iPhone отлично работают вместе
, но это не учитывает владельцев iPhone, которые предпочитают использовать Windows.
Надеемся, что Apple добавляет способ изменить приоритет сети Wi-Fi непосредственно на iPhone.
Приоритезация сетей Wi-Fi для согласованного подключения
Ранее мой телефон Android оставался подключенным к сети Wi-Fi до тех пор, пока не исчезнет последний бит сигнала. Он не будет подключаться к другой доступной сети Wi-Fi, хотя другие сети имели более сильную сеть.
Используя Приоритет Wi-Fi на Android, я потратил некоторое время на настройку настроек и в итоге нашел комбинацию настроек, которая работает. Теперь мой телефон Android переключается между сетями Wi-Fi более легко, чем когда-либо прежде.
Вы пытались установить приоритетность сетей Wi-Fi на своем Android или iPhone? Помогло ли это сделать переключение между вашими Wi-Fi сетями без проблем? Дайте нам знать ваши мысли в комментариях ниже.
Приоритет процесса приложения для платформы Android
Мы все знаем, что на телефоны Android можно установить множество приложений, и в каждом приложении есть хотя бы один процесс. Создание процесса - это хлопотная и ресурсоемкая вещь. Чтобы ускорить запуск приложения, Android будет кэшировать процесс приложения, которое временно не используется, но память ограничена, поэтому невозможно разместить все процессы. В памяти, так что Android имеет механизм исключения, он устанавливает приоритет процесса (oom_adj) в соответствии с состоянием приложения, а затем уничтожает процессы с низким приоритетом (большой oom_adj) в соответствии с плотностью памяти. Чтобы гарантировать, что другие процессы могут иметь достаточное использование памяти.
обработать
- Зиготный процесс
Это основной процесс платформы Android. Все процессы приложения и процесс системного обслуживания SystemServer разветвляются процессом Zygote. - Основной процесс приложения
Каждое приложение запускается в отдельном процессе, имя процесса - имя пакета приложения. Эти процессы являются вилами процесса Zygote и управляются AMS (ActivityManagerService). - Вспомогательный процесс приложения
позволяет приложению иметь несколько процессов. Настройте атрибут android: process в AndroidManifest.xml для запуска нескольких процессов. Имена этих процессов - packagename: name, чтобы различать, принадлежат ли они Какое приложение я обычно называю вспомогательным процессом. Но эти процессы также совпадают с основным процессом, они также разветвляются из процесса Zygote и управляются AMS. - Родной процесс
Помимо Java, в Android также есть NDK, вы можете использовать C / C ++ для разработки, а затем вы также можете раскошелиться на этот процесс, я обычно называю его собственным процессом, AMS не может повлиять на собственный процесс. Управление, много свободы, в этой статье пока не будем об этом говорить
приоритет
Приоритет процесса приложения com.android.server.am.ProcessList Определен в классе. Этот класс не найден в Android API. Если вы хотите увидеть реализацию внутри, вы можете перейти к Android SDK, чтобы найти его, расположенный в $\sources\android-23\com\android\server\am\ProcessList.java
Существует несколько уровней приоритета (значение oom_adj):
- UNKNOWN_ADJ = 16
Зарезервирован самый низкий уровень, обычно этот уровень можно установить для кэшированных процессов.
Adjustment used in certain places where we don't know it yet. (Generally this is something that is going to be cached, but we don't know the exact value in the cached range to assign yet.)
- CACHED_APP_MAX_ADJ = 15
Процесс , пустой процесс, сначала будет уничтожен в случае нехватки памяти
This is a process only hosting activities that are not visible, so it can be killed without any disruption.
- CACHED_APP_MIN_ADJ = 9
процесс кэширования, который является пустым процессом - SERVICE_B_ADJ = 8
неактивный процесс
The B list of SERVICE_ADJ -- these are the old and decrepit services that aren't as shiny and interesting as the ones in the A list.
This is the process of the previous application that the user was in. This process is kept above other things, because it is very common to switch back to the previous app. This is important both for recent task switch (toggling between the two top recent apps) as well as normal UI flow such as clicking on a URI in the e-mail app to view in the browser, and then pressing back to return to e-mail.
- HOME_APP_ADJ = 6
Процесс взаимодействия с домом
This is a process holding the home application -- we want to try avoiding killing it, even if it would normally be in the background, because the user interacts with it so much.
This is a process holding an application service -- killing it will not have much of an impact as far as the user is concerned.
- HEAVY_WEIGHT_APP_ADJ = 4
Процесс с большим весом
This is a process with a heavy-weight application. It is in the background, but we want to try to avoid killing it. Value set in system/rootdir/init.rc on startup.
- BACKUP_APP_ADJ = 3
Процесс, для которого выполняется резервное копирование
This is a process currently hosting a backup operation. Killing it is not entirely fatal but is generally a bad idea.
- PERCEPTIBLE_APP_ADJ = 2
Воспринимаемый процесс, например воспроизведение музыки
This is a process only hosting components that are perceptible to the user, and we really want to avoid killing them, but they are not immediately visible. An example is background music playback.
This is a process only hosting activities that are visible to the user, so we'd prefer they don't disappear.
This is the process running the current foreground app. We'd really rather not kill it!
This is a process that the system or a persistent process has bound to, and indicated it is important.
This is a system persistent process, such as telephony. Definitely don't want to kill it, but doing so is not completely fatal.
The system process runs at the default adjustment.
- NATIVE_ADJ = -17
Собственный процесс из системы
Special code for native processes that are not being managed by the system (so don't have an oom adj assigned by the system).
В Android-18 и ниже пустой процесс не называется CACHED_APP_MIN_ADJ, он называется HIDDEN_APP_MIN_ADJ. Есть некоторые различия, но значения одинаковы.
Как просмотреть приоритет процесса приложения
Для процесса App, поскольку он управляется AMS, будет файл oom_adj, в котором записывается значение oom_adj, но для процесса Native AMS не может его контролировать.
Lowmemorykiller механизм
Этот механизмgoldfishРеализованный на уровне, если вы хотите точно знать, как выбрать, чтобы убить процесс, вы должны увидетьКод lowmemorykiller.c под Android драйверы。
Те, кто скомпилировал золотую рыбку, должны знать, что на самом деле это ядро Linux. Поскольку Android является операционной системой на основе Linux, ядро фактически следует за ядром Linux, но есть некоторые вещи, которые должны быть разработаны (или оптимизированы) специально для Android. Lowmemorykiller является его частью и драйвером. Что касается того, почему это будет размещено drivers/staging В каталоге вы можете обратиться к этой статье«Небольшая дискуссия по стадионному дереву Linux»
Есть несколько ключевых моментов:
- Зарегистрируйте обратный вызов lowmem_shrinker в системе и вызывайте его, когда свободной системной памяти недостаточно для прекращения процесса
- Если свободной памяти меньше, чем сколько, убить процесс на этом уровне, я называю это стратегией
- Стратегия уничтожения определяется прикладным уровнем в соответствии с состоянием памяти, а записанный файл передается драйверу.
- Согласно стратегии, min_score_adj будет рассчитываться
- Каждый процесс приложения имеет значение oom_adj. Oom_score_adj (значение оценки) вычисляется в соответствии со значением oom_adj. Чем больше oom_adj, тем выше oom_score_adj. Те, которые выше min_score_adj, будут включены в список смерти.
- В списке смерти выберите процесс, который занимает наибольшую память для уничтожения
Поэтому, когда памяти недостаточно, процесс с низким приоритетом (чем больше oom_adj), процесс App, занимающий большой объем памяти, будет убит первым.
Что касается этой стратегии, то каждое ПЗУ может быть несовместимым: оно сформулировано в соответствии с объемом памяти и строгостью системы, но их можно разделить только на 6 уровней.
minfree: список 6 порогов памяти.
Например: 32768,61440,73728,129024,147456,184320
adj: список 6 уровней oom_adj.
Например: 0,1,2,3,9,15
Эти два значения соответствуют друг другу, и процесс этого уровня будет прерван, когда свободной памяти станет меньше, чем много.
Конечно, некоторые ПЗУ также определяют этот параметр в init.rc, а затем записывают minfree и adj файлы после загрузки и передают их драйверу
механизм отделки приложений
Только убить процесс только когда памяти мало? Очевидно, что нет, есть много условий для работы приложения, таких как сбой, выход из приложения, очистка системы и удаление.
trimApplications - это метод, определенный в ActivityManagerService, такого класса в Android API нет, его нужно найти в SDK, расположенном в $\sources\android-23\com\android\server\am\ActivityManagerService.java
Этот механизм, вероятно, также имеет несколько ключевых моментов:
- Бесполезные процессы, пакет которых был удален, будут уничтожены
- За персистентным приложением позаботятся в первую очередь, а приоритет процесса будет установлен в PERSISTENT_PROC_ADJ = -12
- Приложение, которое Activity запускается только в основном процессе, будет считаться процессом с большим весом, HEAVY_WEIGHT_APP_ADJ = 4
- FORREGROUND_APP_ADJ = 0 только для процесса переднего плана, процесс переднего плана не будет убит
- Всякий раз, когда изменяется жизненный цикл Activity, Service и т. Д., Это вызывает корректировку oo_adj процесса.
- В этом процессе нет активности, и он будет убит первым
- Пустые процессы, скорее всего, будут убиты
Как повысить приоритет фонового процесса приложения
На самом деле идея платформы Android очень хороша: для пустых процессов и процессов, которые не имеют ничего общего, уничтожайте их напрямую, что не повлияет на взаимодействие с пользователем, но часто наше приложение имеет функцию push. Бывает, что GCM (Google Cloud Messaging) недоступно в Китае, поэтому во многих случаях мы также надеемся, что приложение не будет убито, когда оно находится в фоновом режиме.
Вы можете рассмотреть возможность повышения приоритета фонового процесса приложения. Вот несколько способов:
- Настройте постоянные атрибуты в AndroidManifest.xml
- Перегрузите событие возврата ключа, позвольте активности работать в фоновом режиме, не уничтожайте
- Откройте Сервис и установите основной режим работы
- Взаимодействуйте с NotificationManager, чтобы сделать процесс заметным процессом
- Отправляйте / получайте трансляции, не позволяйте себе стать пустым процессом
Очевидно, что это потребляет больше энергии и является немного мошенническим. Некоторые требования могут быть не выполнены.
Читайте также: