Как стать автором
Обновить

Тестирование поведения приложения в условиях нехватки памяти

Время на прочтение2 мин
Количество просмотров7.2K
В android мы можем перехватить событие low memory для нашего приложения или активити, путем установки им через registerComponentCallbacks в качестве обрабочика наследника от интерфейса ComponentCallbacks переопределив ему метод onLowMemory.

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

Так же система гарантирует что после вызова onLowMemory будет вызвана системная сборка мусора (garbage collector)

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

И есть и второй способ — изменить данный лимит, о чем собственно и речь пойдет ниже.

К сожалению данный способ будет работать только на рутованных устройствах.

И так, планировщик задач в android делит запущенные приложения на 6 следующих типов:

FOREGROUND_APP:
// This is the process running the current foreground app. We'd really
// rather not kill it! Value set in system/rootdir/init.rc on startup.

VISIBLE_APP:
// This is a process only hosting activities that are visible to the
// user, so we'd prefer they don't disappear. Value set in
// system/rootdir/init.rc on startup.

SECONDARY_SERVER:
// This is a process holding a secondary server -- killing it will not
// have much of an impact as far as the user is concerned. Value set in
// system/rootdir/init.rc on startup.

HIDDEN_APP:
// This is a process only hosting activities that are not visible,
// so it can be killed without any disruption. Value set in
// system/rootdir/init.rc on startup.

CONTENT_PROVIDER:
// This is a process with a content provider that does not have any clients
// attached to it. If it did have any clients, its adjustment would be the
// one for the highest-priority of those processes.

EMPTY_APP:
// This is a process without anything currently running in it. Definitely
// the first to go! Value set in system/rootdir/init.rc on startup.
// This value is initalized in the constructor, careful when refering to
// this static variable externally.


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

Данные лимиты можно посмотреть следующим образом

adb shell cat /sys/module/lowmemorykiller/parameters/minfree

Для Samsung Galaxy Nexus значения будут следующие

7469,9396,11324,13372,15299,19034

Значения измеряются в страницах памяти, каждая страница равна 4 килобайтам.

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

echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree

При перезагрузке устройства значения востанавливаются.

И так, изменяя данные значения в рантайме вы можете легко добиться вызова вашего обработчика onLowMemory, и так же потенциально протестировать поведение приложения на других устройствах, на которых данные значения другие (хотя это и не заменит полноценного тестирования на самом устройстве конечно).
Теги:
Хабы:
+31
Комментарии12

Публикации

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн