Adb shell wm size

So I bought a Nexus 10 for development and was super excited by the prospect of being able to simulate other devices using the "adb shell wm" command, with its size, density, and overscan subcommands.

However, I’ve had a few problems making this work. I’d like to see if anyone else has encountered/overcome these. For the sake of this discussion, let’s say I’m trying to simulate a typical phone, running the following:

First, setting the size messes up the menu bar. In portrait mode, only some of the buttons will be present and at the wrong scale, and in landscape mode, the menu bar is completely missing. In fact, even after you reset everything, it’s still missing until you restart the device. Any workaround for this?

Secondly, what does the overscan command do? I can’t find any documentation for it anywhere.

Thirdly, is there any way to make the device render the screen using 1 pixel of the new size to 1 pixel of the physical screen? That is to say, if I set the size to 800×480, I’d like to see the new screen take up exactly that much space. Instead, what seems to happen is the 800×480 screen is stretched so that the longest side just fits on the physical display. I suspect that overscan might be the answer, but when I tried to set it to 0,0,800,480, it permanently hung my system and I had to reset to the factory image to recover.

Finally, is there any way to cause the tablet to simulate a phone in terms of what happens to the menu bar during an orientation change? On a tablet, the menu bar goes to new bottom of the screen, but on a phone, it stays where it is.

I like this device so far, but if I could just get this device simulation stuff working, I’d love it! Thanks in advance for any pointers.

2 Answers 2

Okay, I think I figured out enough of this to be useful. I will attempt to answer each of the questions I raised in my original post. Then I’ll share a few other things I’ve learned about how to use this effectively.

  • Is there any way to avoid messing up the menu bar when at the home screen?

Not that I’ve discovered, and changing the settings seems to have a cumulative effect that will usually royally screw up the home screen until you restart the device. However, you can usually at least unlock the device, which is enough to be useful. The key is to start your app first, then adjust the size and density while already running it. Simply press the power button to turn off the screen, adjust the size and density as you like, then power the screen back on, unlock, and you’re app will be running properly at the new size and density.

  • What does the overscan command do?

I’ve found only oblique references to this, but the best I can determine, it’s for TVs or other displays where not all of the screen is guaranteed to be usable/visible. I don’t think it really applies to a regular phone or tablet.

  • Is there any way to make the device render the screen using 1 pixel of the new size to 1 pixel of the physical screen?

Not that I’ve discovered. But it probably doesn’t matter. I think the main point of using the adb shell wm commands is to test layout, not to see pixel-perfect graphics. (And believe me, what you get is the farthest thing possible from pixel-perfect.)

  • Is there any way to cause the tablet to simulate a phone in terms of what happens to the menu bar during an orientation change?

Maybe I’m doing it wrong, but for me, the menu bar behaves in bizarre and unpredictable ways. Sometimes it’s massive, sometimes it’s just missing. Don’t count on being able to use it. Yes, this sucks. Someone please chime in if there’s a solution to this.

  • So how do I use "adb shell wm" effectively?

I’m not sure why, but it took me a little while to grasp this. That’s probably because when I first started this, my mind was not accustomed to the Android way of thinking about things. But it’s actually pretty simple.

First, set the size you want in pixels. For this discussion, let’s say we’re going to use 1024×600.

Next, set the DPI. But what should you set it to?

That’s the tricky part (well, the part I didn’t get at first). When you set the DPI, you’re setting the other half of the equation that will determine the dimensions in DP of the virtual application space, which the app will use to render itself. (Duh, I know, but I at first thought the specified DPI would be used mainly to select resources, which indeed it also does.)

Let’s take a look at the consequences of using various densities with a screen size of 1024×600.

First, keep in mind that

That means if we specify our dpi at 160, the app will believe that the available space is 1024dp x 600dp. If instead we use 240, that changes to a meager 683dp x 400 dp, and conversely, if we use 120, we get an impressive 1365 dp x 800 dp. Set it to 80, and now you’re rocking 2048dp x 1200dp.

The counter-intuitive part is realizing that specifying a low density results an image that appears like what you might see in an ultra-hi-res monitor — everything is tiny. But that’s because the app is now treating the same physical space as though it were a very large size in dp.

So going back to the example of a density of 80, we have a virtual area of 2048dp x 1200dp, but it is being scrunched onto whatever sized physical screen you’re actually using. Since 160dp is supposed to be about 1 inch, that would be an almost otherworldly tablet with a width of 12.8 inches. But that entire thing is scrunched down to the actual size of your tablet, making your generously sized 30dp text appear pretty puny.

Maybe I’m just the slowest kid in the room, but it took me a while to really grok this. I hope it helps someone else out there.

Одним из изменений Android N станет функция настройки масштаба системы. С обновлением пользователи смогут менять размер всех элементов в зависимости от собственных предпочтений. Однако, не каждому прилетит семерка, и не у каждого установлены неофициальные прошивки с множеством "плюшек", а изменение масштаба системы помогло бы сделать использование устройства приятнее : )

Изменение масштаба осуществляется с помощью изменения плотности пикселей (dpi) на нужное значение.

Чтобы изменить DPI на гаджете с Android, нужно выполнить следующие действия:

2) включите отладку по USB, а также установите в Windows официальный драйвер (обычно поставляется в памяти самого устройства);

Инструкций включения откладки по USB множество, принцип такой: Настройки -> Приложения -> Разработка -> Отладка по USB (установить флаг). В Android 4.2 и выше меню разработчика включается так: зайти Настройки->О телефоне и 7 раз тапнуть по пункту Номер сборки.

3) подключите гаджет к ПК и запустите Minimal ADB and Fastboot. В появившемся окне введите команду adb devices для проверки подключения;

4) рассчитайте реальное физическое значение DPI для дисплея, для чего можно воспользоваться калькулятором. В нем введите физическую диагональ и разрешение экрана, а он самостоятельно поделит одно на другое;

5) если подключение по ADB установлено, тогда введите команду adb shell wm density ХХХ, заменив ХХХ на желаемое значение DPI. Эффект можно увидеть после перезагрузки устройства.

Поэтому я купил Nexus 10 для разработки и был очень взволнован перспективой возможности имитации других устройств с помощью команды «adb shell wm» с ее подкомандами размера, плотности и сверхсканирования.

Тем не менее, у меня было несколько проблем, связанных с этой работой. Я хотел бы увидеть, столкнулся ли кто-нибудь еще с ними. Ради этой дискуссии предположим, что я пытаюсь моделировать типичный телефон, используя следующее:

Во-первых, настройка размера помещается в строку меню. В портретном режиме только некоторые из кнопок будут присутствовать и в неправильном масштабе, а в ландшафтном режиме панель меню полностью отсутствует. Фактически, даже после сброса всего, он все еще отсутствует, пока вы не перезапустите устройство. Любое обходное решение для этого?

Во-вторых, что делает команда overscan? Я нигде не могу найти документацию.

В-третьих, есть ли способ заставить устройство отображать экран с использованием 1 пикселя нового размера до 1 пикселя физического экрана? То есть, если я установил размер 800×480, я бы хотел, чтобы новый экран занимал ровно столько места. Вместо этого, кажется, что экран 800×480 растянут так, что самая длинная сторона просто подходит для физического дисплея. Я подозреваю, что чрезмерное сканирование может быть ответом, но когда я попытался установить его на 0,0800,480, он постоянно повесил мою систему, и мне пришлось сбросить на заводский образ, чтобы восстановиться.

Наконец, есть ли способ заставить планшет имитировать телефон с точки зрения того, что происходит с панелью меню во время изменения ориентации? На планшете строка меню переходит в новую нижнюю часть экрана, но на телефоне она остается там, где она есть.

Мне нравится это устройство до сих пор, но если бы я мог просто заставить работать этот симулятор устройства, мне бы это понравилось! Заранее спасибо за любые указатели.

Хорошо, я думаю, что я понял, что это полезно. Я попытаюсь ответить на каждый из вопросов, которые я поднял в своем первоначальном посте. Затем я расскажу о нескольких других вещах, которые я узнал о том, как эффективно использовать это.

  • Есть ли способ избежать беспорядка панели меню, когда на главном экране?

Не то, что я обнаружил, и изменение настроек, похоже, имеет кумулятивный эффект, который, как правило, замаскирует домашний экран до тех пор, пока вы не перезапустите устройство. Тем не менее, вы обычно можете хотя бы разблокировать устройство, которого достаточно, чтобы быть полезным. Ключ должен сначала запустить ваше приложение, а затем настроить размер и плотность, когда он уже запущен. Просто нажмите кнопку питания, чтобы отключить экран, отрегулируйте размер и плотность по своему усмотрению, затем включите экран, разблокируйте, и приложение будет работать должным образом с новыми размерами и плотностью.

  • Что делает команда overscan?

Я нашел только косвенные ссылки на это, но лучшее, что я могу определить, это для телевизоров или других дисплеев, где не все из экрана гарантированно будут использоваться / видимы. Я не думаю, что это действительно относится к обычным телефонам или планшетам.

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

Не то, чтобы я открыл. Но это, вероятно, не имеет значения. Я считаю, что основным моментом использования команд wm shell adm является проверка макета, а не графика, отличная от пикселя. (И поверьте мне, то, что вы получаете, самое дальнее, что возможно от идеального пикселя.)

  • Есть ли способ заставить планшет имитировать телефон с точки зрения того, что происходит с панелью меню во время изменения ориентации?

Возможно, я делаю это неправильно, но для меня панель меню ведет себя странно и непредсказуемо. Иногда он массивный, иногда он просто отсутствует. Не рассчитывайте на возможность использовать его. Да, это отстой. Кто-то, пожалуйста, звоните, если есть решение.

  • Итак, как я могу эффективно использовать «adb shell wm»?

Я не знаю, почему, но мне потребовалось немного времени, чтобы понять это. Вероятно, потому, что, когда я впервые начал это, мой разум не привык к идеям Android о том, что нужно делать. Но на самом деле это довольно просто.

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

Затем установите DPI. Но что вы должны установить?

Это сложная часть (ну, в первую очередь, я не получил). Когда вы устанавливаете DPI, вы устанавливаете другую половину уравнения, которое будет определять размеры в DP виртуального пространства приложения, которое приложение будет использовать для рендеринга. (Дух, я знаю, но я сначала подумал, что указанный ДОИ будет использоваться в основном для выбора ресурсов, что и в самом деле.)

Давайте рассмотрим последствия использования различных плотностей с размером экрана 1024×600.

Во-первых, имейте в виду, что

Это означает, что если мы укажем наш dpi на 160, приложение будет считать, что доступное пространство 1024dp x 600dp. Если вместо этого мы будем использовать 240, то это изменится до 683dp x 400 dp, и наоборот, если мы будем использовать 120, мы получим впечатляющий 1365 dp x 800 dp. Установите его на 80, и теперь вы качаете 2048dp x 1200dp.

Контринтуитивная часть понимает, что определение низкой плотности приводит к тому, что изображение выглядит так, как вы можете видеть на мониторе с ультра-высоким разрешением – все крошечное. Но это потому, что приложение теперь обрабатывает одно и то же физическое пространство, как если бы он был очень большим размером в dp.

Поэтому, возвращаясь к примеру плотности 80, у нас есть виртуальная область 2048dp x 1200dp, но она сжимается на любом физическом экране, который вы фактически используете. Поскольку 160dp должно быть около 1 дюйма, это будет почти потусторонний планшет с шириной 12,8 дюйма. Но все это сведено к фактическому размеру вашего планшета, делая ваш текст размером 30dp с щедрым размером довольно кратким.

Может быть, я всего лишь самый медленный ребенок в комнате, но мне потребовалось некоторое время, чтобы действительно понять это. Надеюсь, это поможет кому-то другому.

Я предполагаю, что overscan устанавливает пространство экрана («margin»), которое не используется. Попробуйте что-то вроде adb shell wm overscan 200,200,200,200, запустите приложение, и вы увидите разницу. В Доме разница не так ясна.

Если это действительно полезно в сочетании с размером и плотностью, я не знаю. Я сделал несколько тестов, но не принес никакого полезного результата. Это немного сложно (?), Чтобы увидеть, какие значения использовать …

[an error occurred while processing the directive]
Карта сайта