【问题标题】:How to create an avd with android studio to preview a real device?如何使用 android studio 创建 avd 来预览真实设备?
【发布时间】:2017-09-28 08:30:07
【问题描述】:

我制作了小米红米3s(294dpi)的avd,规格如下:

Android 中的广义密度为:

  • Ldpi(低)~ 120 dpi -> dp = px * 0.74
  • Mdpi(平均)~ 160 dpi -> dp = px * 1
  • Hdpi(高)~ 240 dpi -> dp = px * 1.5
  • Xhdpi (extraalta) ~ 320 dpi -> dp = px * 2
  • Xxhdpi (extra extraalta) ~ 480 dpi -> dp = px * 3
  • Xxxhdpi (extra extra extraalta) ~ 640 dpi -> dp = px * 4

当我创建带有设备规格的avd时,分配的密度是xhdpi(x2),但实际的设备密度因子小于x2,与大多数设备一样,所以预览结果与设备的实际外观不匹配屏幕。比如Nexus 5x也是这样,资源密度是xxhdpi(x3),但实际密度是2.63

在 Android Studio 中,Nexus 5x 或 Pixel XL 等模拟设备分别指定了 420dpi 和 560dpi 的特殊密度,其中密度因子约为 2.6 (xxhdpi) 和 3.5 (xxxhdpi)。

确定我用过的小米红米3S的宽度dp及其密度系数:

dpi/160 = 密度像素值 294/160 = 1,8375

我用https://stackoverflow.com/a/5104104/4114846计算了真实密度

结果是294dpi的密度,实际密度因子是1.83,但是系统分配的资源文件夹是xhdpi(x2),预览对应的是广义密度。

如何通过指定设备的密度或其密度因子来创建 avd 和预览,使其看起来像实际设备?

如果你不能用android studio指定,我们有什么替代方案?

【问题讨论】:

  • 使用实际设备。恕我直言,尝试使用模拟器模仿特定的 Android 设备是徒劳的。使用模拟器测试一般场景。
  • 感谢您这么快回答。我不能有一个真正的设备。我的需求来自无法很好地看到屏幕的用户报告。必须有某种方法来正确模拟设备。
  • 请用户向您发送屏幕截图。如果您的 UI 对密度的微小变化如此敏感,那么您在 UI 中就有主要问题。您应该能够在各种模拟器以及您可以访问的任何设备中看到这些问题。除此之外,使用可以为您提供屏幕截图的托管应用测试服务。

标签: android android-studio avd screen-density


【解决方案1】:

找到您的 AVD 文件夹。

C:\users\<user>\.android\avd

打开设备文件夹并编辑行:

hw.lcd.density=320

config.ini

虽然您计算了 294 ppi,但不允许使用 294。允许的值为:

120, 160, 213, 240, 280, 320, 360, 400, 420, 480, 560, 640

请注意,这些是密度:

0.75, 1, 1.33, 1.5, ...

请注意,1.33 不适合 ldpi、mdpi、hdpi、...的 Android 列表

它是必需的,因此 mdpi 和 hpdi 之间存在一个值。我怀疑有些硬件有 213 ppi 显示器,但硬件规格经常发生变化。今天的手机在保持相同像素数的情况下变得越来越大,因此几年前的 4.5 英寸、213 ppi 手机已被 5 英寸、196 ppi 手机取代。

硬件工厂将逻辑密度设置为他们喜欢的任何数字,但如果明智的话,他们会将其设置为尽可能接近物理密度。因此,即使它实际上是 196,设备也会设置为 213。

很遗憾,这会导致您遇到类似的问题。由于您说物理屏幕尺寸的分辨率为 294 ppi,因此硬件很可能设置为密度 1.75 (280 ppi)。这比物理 ppi 低 5%,但设备报告与物理密度不同的逻辑密度是很常见的(例如,213 比 196 大 8%)。

因为 280 正好介于 240 hdpi 和 320 xhdpi 之间,所以我不知道它将如何缩放视图。模拟器可能会完美地呈现您的布局,但它可能使用 hdpi 文件夹中的可绘制对象。您的客户端硬件可能会从 xhdpi 文件夹中选择可绘制对象,这会以非常不同的方式缩放它们。

【讨论】:

  • @RussWheeler 我让模拟器以我想要的逻辑密度精确工作。如果您的意思是您希望模拟器以 345 的逻辑密度运行,那么在 Studio 中没有人可以做到这一点,并且不存在以该密度运行的 Android 硬件,因为 Google 已经定义了允许的密度,而 345 不在列表中。我想有人可以编写一个以这种密度运行的仿真器,但是由于没有硬件在它上面运行,而且我是为硬件而不是非仿真器编写的,所以我看不出这样做有什么好处。正如我的回答所说,即使硬件具有制造商近似的特定物理密度。
  • 也许我有一个不同的用例给你。我正在使用一个名为 libGDX 的游戏库。在使用它时,我不受 android 存储桶大小的限制,所以我的游戏在每台设备上看起来都不同。当我在 Nexus 6 和 Nexus 6P 上查看我的游戏时,它们看起来不同,因为设备上的 dpi 不同。但是,使用模拟器不可能创建差异 dpi,因为模拟器总是向上/向下舍入到最近的存储桶。这有意义吗?
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多