- PVSM.RU - https://www.pvsm.ru -
Как известно, Андроид устройств существует много… очень много. Это дает нам огромное число экранов, с различным сочетанием разрешения и плотности пикселей, что значительно усложняет разработку приложений. В определенный момент захотелось постараться упростить проверку приложения на разных экранах и избежать запуска на многих устройствах и эмуляторах. Анализ проблемы показал, что все необходимое для решения проблемы есть и, используя Adb, можно обойтись одним подключенным устройством. В итоге была разработана кроссплатформенная утилита для автоматического сохранения скриншотов приложения на разных параметрах экрана одного устройства, не требующая никаких дополнительных манипуляций с исходным кодом приложения (с эмуляторами также все работает). После работы утилиты получаются скриншоты приложения в том виде, в каком оно выглядит на различных устройствах. В дальнейшем, используя полученные скриншоты, можно выявлять артефакты отображения приложения и анализировать оптимальность лэйаутов.
Чтобы не обременять чтением людей, не интересующихся деталями разработки приложения, приведу сразу краткую информацию по работе с программой.
Подробные инструкции со ссылками на Java и Adb находятся на GitHub [2]
Само использование DroidShoter крайне простое: запускаем утилиту, выбираем устройство, задаем параметры и нажимаем «Start!». Пример результата работы программы Вы можете найти под спойлером в конце статьи.
Согласно официальной документации Google [3], по своему размеру экраны делятся на: small, normal, large и xlarge; по плотности пикселей: ldpi, mdpi, hdpi, xhdpi:
Видно, что многообразие комбинаций экранов возникает из пересечения возможного размера и плотности пикселей. При этом комбинация размера экрана и плотности пикселей определяет его разрешение. Таким образом, можно выделить две базовые характеристики, в достаточной степени характеризующие экраны: разрешение и плотность пикселей. Именно данные характеристики мы и можем менять при помощи Adb. Также мы можем использовать Adb для снятия скриншотов, а значит нам ничего не мешает пройтись по разным комбинациям параметров экрана и делать скриншоты на каждом из них. Именно этот процесс и захотелось автоматизировать.
Для начала нужно было научиться забирать параметры экрана. И если для устройств, начиная с Android 4.3, проблем не было (парсим вывод команд «wm size» и «wm density»), то, для остальных необходимо было найти иной метод. В результате я использовал команду «dumpsys window», находя в выводе результата строку, наподобие «init=480x800 240dpi». К сожалению, некоторые устройства (пока только один телефон от Sharp) при таком подходе не выдают density и утилитой поддерживаться не будут.
Для изменения параметров дисплея используются следующие команды Adb shell:
К сожалению, при изменении конфигурации экрана системные элементы (status bar, например) могут быть неверно отрисованы. Данная проблема кроется в Android и решить ее не удалось. Однако это не мешает самому приложению отображаться корректно.
В общем-то, к данному моменту, было уже ясно, что все необходимое для работы есть и утилите – быть. Дело осталось за непосредственной разработкой. В качестве языка я использовал Java, как наиболее близкий мне язык программирования на данный момент и Swing фреймворк для работы с UI. Кроме того, для Java есть замечательная библиотека ddmlib, значительно упрощающая работу с Adb.
В DroidShoter заложена довольно простая на данный момент базовая логика. При выборе устройства определяются физические параметры экрана, и на их основе выстраивается порядок параметров дисплея для последующей работы. Затем, после нажатия на «Start», начинается процесс смены параметров экрана и снятия скриншотов.
В качестве очереди параметров дисплея используются все комбинации разрешения экрана и значения плотности пикселей из «базовых», которые меньше физических параметров устройства. Т.е. для экрана с физическим разрешением 720x1280, разрешение 1020x1980 использоваться не будет. То же самое и с плотностью 320 при физической плотности 240.
Строго говоря, Adb позволяет использовать параметры, превышающие физические показатели устройства, однако на данный момент я решил отказаться от их использования, т.к. возникнет потеря некоторых пикселей и внешний вид приложения не будет соответствовать реальному (к примеру, в списках могут вообще выпасть разделители элементов).
Dpi | Разрешение экрана — максимальнаая плотность пикселей для разрешения |
---|---|
XXXHDPI — 640 DPI_560 — 560 XXHDPI — 480 DPI_420 — 420 XHDPI — 320 HDPI — 240 MDPI — 160 |
2560x1600 — XHDPI 2560x1440 — DPI_560 1920x1200 — DPI_560 1920x1080 — DPI_560 1280x768 — DPI_420 1280x720 — DPI_420 854x480 — HDPI 800x480 — HDPI 480x320 — MDPI 320x240 — MDPI |
Логика была обрамлена дополнительными фичами для удобства:
Для некоторых приложений может возникнуть ситуация, когда оно «падает» при каких-либо параметрах экрана. В подобных случаях достаточно исключить данный режим из работы (но, конечно же, лучше рассмотреть причину «краша» – может быть проблема в приложении).
С точки зрения операционной системы, смена параметров дисплея – это изменение конфигурации экрана, что влечет за собой стандартный процесс пересоздания текущей activity. Смена конфигурации происходит по параметру screenSize и может быть перехвачена в activity путем регистрации в manifest с тэгом
android:configChanges="screenSize"
Отсюда вытекает дополнительный плюс DroidShoter: тестируется корректность восстановления приложением состояния после изменения конфигурации.
План развития DroidShoter, если программа будет востребована сообществом:
Ваши идеи, проблемы и предложения приветствуются в комментариях, в виде issue на GitHub [4] или могут быть отправлены личным сообщением.
P.S. Ни одно устройство в процессе работы не пострадало.
Автор: JamesTag
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/testirovanie/115401
Ссылки в тексте:
[1] GitHub в секции Releases: https://github.com/vfarafonov/DroidShoter/releases/latest
[2] GitHub: https://github.com/vfarafonov/DroidShoter
[3] официальной документации Google: http://developer.android.com/intl/ru/guide/practices/screens_support.html#range
[4] issue на GitHub: https://github.com/vfarafonov/DroidShoter/issues
[5] Источник: https://habrahabr.ru/post/279573/
Нажмите здесь для печати.