Pull to refresh

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

Reading time2 min
Views7.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, и так же потенциально протестировать поведение приложения на других устройствах, на которых данные значения другие (хотя это и не заменит полноценного тестирования на самом устройстве конечно).
Tags:
Hubs:
Total votes 31: ↑31 and ↓0+31
Comments12

Articles