安卓:如何使用“adb shell wm”模拟其他设备

41

所以我买了一台Nexus 10来开发,并对使用“adb shell wm”命令模拟其他设备的可能性感到非常兴奋,它具有尺寸、密度和过扫描子命令。

然而,我在使它工作时遇到了一些问题。我想看看是否还有人遇到/解决了这些问题。为了讨论起见,假设我正在尝试模拟一个典型的手机,运行以下内容:

adb shell wm size 800x480
adb shell wm density 240
adb shell wm overscan reset

首先,设置大小会扰乱菜单栏。在竖屏模式下,只有部分按钮出现,并且比例不正确;而在横屏模式下,菜单栏完全消失。实际上,即使你重置了所有设置,直到你重新启动设备,它仍然会消失。是否有任何解决方法?

其次,overscan命令是做什么用的?我找不到任何文档。

第三,是否有任何方法使设备使用新尺寸的1个像素渲染屏幕,对应到物理屏幕的1个像素?也就是说,如果我将大小设置为800x480,我想看到新屏幕正好占据那么多空间。但实际情况是,800x480的屏幕被拉伸,以适应物理显示器的最长一侧。我怀疑overscan可能是答案,但是当我试图将其设置为0,0,800,480时,它永久地挂起了我的系统,我不得不恢复出厂镜像。

最后,是否有办法让平板电脑在方向变化期间模拟手机的菜单栏行为?在平板电脑上,菜单栏移到屏幕的新底部,而在手机上,它保持在原位。

我目前很喜欢这个设备,但如果我能让设备模拟工作,我会更喜欢它!非常感谢您提供任何建议。


Brian,你有没有遇到这个问题,即WM大小在横向显示时呈现为纵向,浪费了很多屏幕空间? - pt123
@pt123 我的应用是一个横屏应用,所以我没有尝试过那个。 - Brian Rak
它没有以另一种方式进行交换,以适应横向显示,我忘记链接我的问题了,这里有一个图示:http://stackoverflow.com/questions/20086099/adb-set-display-size-is-incorrectly-displaying-portrait-using-landscape 谢谢 - pt123
1
如果你交换尺寸,它是否会有任何不同的作用?例如,720x1200而不是1200x720?如果没有,我会说是的,我同意这是浪费屏幕空间,但操作系统的这个功能唯一真正好用的地方是布局的大致验证,因为无论如何切割,图像都会被极度拉伸或压缩。所以用它来做那个。如果你需要更精确的验证,你就必须在模拟器或实际目标设备上进行测试。 - Brian Rak
哇,谢谢,它起作用了。如果您回答我的问题并将其作为答案提交,我可以批准它,并为此给您应得的积分。现在,这个7英寸平板电脑可以很好地显示4.5英寸的屏幕,这可能会很有用。我发现使用模拟器很难使您的应用程序触摸友好,正确大小的按钮和间距。 - pt123
显示剩余2条评论
3个回答

31

好的,我觉得我已经理解了足够多的知识以便有所用处。我将尝试回答我在原帖中提出的每个问题。然后我会分享一些我学到的关于如何有效使用这个工具的其他东西。

  • 有没有办法在主屏幕时避免弄乱菜单栏?

据我发现,没有,而且更改设置似乎会产生累积效应,通常会彻底搞砸主屏幕直到你重新启动设备。但是,你通常可以至少解锁设备,这已经足够有用了。关键是先启动你的应用程序,然后在运行时调整大小和密度。只需按电源按钮关闭屏幕,根据需要调整大小和密度,然后打开屏幕,解锁,你的应用程序将在新的大小和密度下正常运行。

  • 超扫描命令是什么意思?

我只找到了一些间接参考的资料,但我最好的判断是,它是为那些不保证可用/可见屏幕的电视或其他显示器设计的。我认为它实际上并不适用于普通手机或平板电脑。

  • 有没有办法使设备使用新大小的1像素对应物理屏幕上的1像素进行屏幕渲染?

据我发现,没有。但这可能并不重要。我认为使用adb shell wm命令的主要目的是测试布局,而不是看到像素完美的图形。(相信我,你得到的是与像素完美最远的东西。)

  • 有没有办法使平板电脑模拟手机在方向更改期间菜单栏所发生的情况?

也许是我做错了,但对我来说,菜单栏的行为非常奇怪和不可预测。有时它很大,有时它就消失了。不指望能够使用它。是的,这很糟糕。如果有解决方法,请有人加入讨论。

  • 那么我如何有效地使用“adb shell wm”呢?

我不确定为什么,但我花了一点时间才掌握这个。这可能是因为当我刚开始学习时,我的思维方式还不习惯于Android的思考方式。但它实际上相当简单。

首先,以像素为单位设置所需的大小。在本讨论中,假设我们将使用1024x600。

接下来,设置DPI。但你应该设置多少呢?

这是棘手的部分(好吧,我一开始没有明白的部分)。当你设置DPI时,你正在设置将确定虚拟应用程序空间中的DP维度的方程的另一半,应用程序将使用它来呈现自己。(嗯,我知道,但一开始我认为指定的DPI主要被用于选择资源,它确实也有这个作用。)

让我们来看看使用不同密度在1024x600屏幕尺寸下的后果。

首先,请记住

dp = px * (160 / dpi)
这意味着,如果我们将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文本看起来相当小。
也许我只是房间里最慢的人,但我花了很长时间才真正理解这一点。我希望它能帮助其他人。

当我运行 adb shell wm density 240 时,我收到错误信息:/system/bin/sh: wm: not found。为什么?我的设备已经取得了 root 权限! - Bobs
2
@breceivemail:wm仅在JellyBean 4.3及以上版本中可用。您可以在4.3以下的设备上使用am display-size和am display-density。 - aravindsagar
2
我的 Nexus 4 的底部 20% 不工作。我使用命令:wm overscan 0,0,0,210,让 Android WM 在该区域不绘制任何内容,以便我可以再次完全操作所有已绘制的区域。 - UltraInstinct
@Brian Rak 更正:px = dp *(dpi / 160),来源:http://developer.android.com/intl/ru/guide/practices/screens_support.html - VinayChoudhary99
感谢您提供的出色指南。我正在尝试将其用于不同的用例,其中我的设备上的某些应用程序应该以特定的dpi运行,当这些应用程序退出时,dpi应该被重置回制造商定义的值。您认为这样做会有什么问题吗? - siva

1
我猜测overscan是设置屏幕未使用的空间(“边距”)。尝试使用类似adb shell wm overscan 200,200,200,200的命令启动应用程序,你会看到差异。在主屏幕上,差异不是很明显。
如果这与大小和密度结合使用真的有用,我不知道。我进行了一些测试,但没有有用的结果。看起来有点复杂,难以确定要使用哪些值...

谢谢您的回复。它帮助确认了我所看到的内容。我认为它会使屏幕的某些部分无法使用,这对于CRT和其他不保证整个屏幕可见的监视器可能是有用的。我不明白的是,它似乎实际上从指定的应用程序大小中占用了空间。因此,如果您将应用程序大小设置为800x600但设置了200,0,0,0的超扫描,则您的实际界面仅为600x600。我想,如果您真的想使用超扫描,您只需将超扫描量添加到原始尺寸尺寸即可。 - Brian Rak
我也使用Nexus 10来测试不同屏幕尺寸的应用程序。我认为adb shell wm很有用。 "物理屏幕尺寸"不正确(它被拉伸了),导航栏是损坏的(还有主屏幕),就像你说的那样。但是组件的相对大小似乎是正确的,您可以看到事物是否适合屏幕等。在旧PC上模拟平板电脑的AVD非常缓慢... - Kjelle J
我注意到过扫会使碎片变得混乱。可能的原因是什么?尝试设置过扫并打开像Gmail这样的应用,超出过扫区域的空间仍然是白色的。 - aravindsagar
@aravindsagar:是的,我也看到了!也许这是GMail的一个bug?我还注意到,当我回复任何电子邮件并将键盘拉下时,它不会发生。 - UltraInstinct
@Thrustmaster:我注意到在多个应用程序中,比如Inbox,以及我开发的一个应用程序中。我注意到所有这些应用程序中的共同点是它们都有导航抽屉。也许这是抽屉布局的问题。 - aravindsagar

0

如果有人在尝试更改设备分辨率后遇到“恢复出厂映像”崩溃菜单,以下是我如何解决它而不进行工厂重置(多次硬重启总会导致相同的“蓝屏”菜单):

  • 通过 USB 将计算机连接到手机(由于手机已重新启动,因此无法使用 wifi 连接)
  • 在手机启动并崩溃之间的时间内(你必须快速),发送 adb 命令以设置原始尺寸(adb shell wm <width>x<height>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接