Что такое wm на самом деле:
На свежих прошивках (Android 11-15) wm это однострочный скрипт в /system/bin, который вызывает cmd window. То есть wm size и cmd window size, одна и та же команда. Полный список подкоманд:
Код: Выделить всё
adb shell wm helpwm size, чтение и подмена разрешения:
Без аргументов команда показывает физическое разрешение панели:
Код: Выделить всё
adb shell wm size
Physical size: 1080x2400Код: Выделить всё
adb shell wm size 720x1600Код: Выделить всё
adb shell wm size
Physical size: 1080x2400
Override size: 720x1600Код: Выделить всё
adb shell wm size resetКод: Выделить всё
adb shell wm size -d 1Код: Выделить всё
adb shell wm density
Physical density: 420Код: Выделить всё
adb shell wm density 560Код: Выделить всё
adb shell wm density resetРецепты эмуляции устройств для тестов:
Бюджетник с HD+ экраном на вашем флагмане:
Код: Выделить всё
adb shell wm size 720x1600
adb shell wm density 320Планшетная верстка sw600dp на обычном телефоне:
Код: Выделить всё
adb shell wm size 1200x1920
adb shell wm density 320Грабли, на которые наступают все:
Первое. Уже запущенные приложения после смены size/density перерисовываются не всегда корректно. Лечится перезапуском:
Код: Выделить всё
adb shell am force-stop com.example.appВторое. Если выставить дикую плотность вроде 40 или 1200, экраном станет невозможно пользоваться. Без паники: adb продолжает работать, вслепую набираем wm density reset.
Третье. Скриншоты screencap (глава 14) снимаются уже в override-разрешении. Для прогонов по матрице экранов это плюс, но не удивляйтесь неродному размеру картинок.
Управление поворотом:
Исторически поворот крутят не через wm, а через settings (подробно о них в главе 16). Сначала выключаем автоповорот, потом задаем ориентацию:
Код: Выделить всё
adb shell settings put system accelerometer_rotation 0
adb shell settings put system user_rotation 1Код: Выделить всё
adb shell settings get system user_rotation
1На Android 12-15 у wm есть и собственная подкоманда:
Код: Выделить всё
adb shell wm user-rotation lock 3
adb shell wm user-rotation freewm overscan, некролог и замена:
Команда задавала отступы от краев экрана в пикселях (лево, верх, право, низ), изначально для телевизоров, которые обрезают края картинки:
Код: Выделить всё
adb shell wm overscan 0,0,0,120Код: Выделить всё
adb shell wm overscan 0,0,0,120
Error: Unknown command: overscanКод: Выделить всё
adb shell cmd overlay list android | grep cutout
[ ] com.android.internal.display.cutout.emulation.corner
[ ] com.android.internal.display.cutout.emulation.double
[ ] com.android.internal.display.cutout.emulation.hole
[ ] com.android.internal.display.cutout.emulation.tall
[ ] com.android.internal.display.cutout.emulation.waterfallКод: Выделить всё
adb shell cmd overlay enable com.android.internal.display.cutout.emulation.tallМногооконный режим и am task:
Команды этой группы живут в am, но управляют именно окнами, поэтому разбираем их здесь. Сначала нужно узнать id задачи. Классика:
Код: Выделить всё
adb shell am stack listКод: Выделить всё
adb shell dumpsys activity activities | grep "Task{"
* Task{f8a3c21 #74 type=standard A=10287:org.telegram.messenger U=0 visible=true ...}Закрепление экрана (screen pinning), полезно для киоск-сценариев и автотестов, где приложение не должно сворачиваться:
Код: Выделить всё
adb shell am task lock 74
adb shell am task lock stopИзменение размеров окна работает только для задач во freeform-режиме. На обычном телефоне его сперва нужно включить (это те же переключатели, что в меню разработчика):
Код: Выделить всё
adb shell settings put global enable_freeform_support 1
adb shell settings put global force_resizable_activities 1
adb rebootКод: Выделить всё
adb shell am start --windowingMode 5 -n com.android.settings/.SettingsТеперь окно можно двигать и растягивать по координатам left,top,right,bottom в пикселях:
Код: Выделить всё
adb shell am task resizeable 74 2
adb shell am task resize 74 100,200,980,1500Связка с автоматизацией:
Матрица плотностей в один цикл (bash, подробнее о скриптах в главе 22):
Код: Выделить всё
for d in 320 420 560; do
adb shell wm density $d
adb shell am force-stop com.example.app
adb shell am start -n com.example.app/.MainActivity
sleep 3
adb exec-out screencap -p > shot_$d.png
done
adb shell wm density resetГлавное из главы: wm size и wm density подменяют экран на лету и переживают ребут (сбрасывайте явно), поворот делается парой settings put system или wm user-rotation, overscan мертв с Android 11 (замена для тестов отступов это эмуляция cutout), а am task lock/resize дают контроль над окнами, но ресайз требует включенного freeform.