java - 为什么我的 160kb 应用程序背景在运行时变成了 49 MB?

标签 java android performance android-memory

我决定调查我的应用程序的内存使用情况,我查看了 Android Studio 的内存监视器,发现我的内存使用情况约为 68 MB。我觉得太高了。

enter image description here

我打开内存分配器并从应用程序的开头开始跟踪。我看到有一个 49 MB 的 NonMovableArray 分配,它是一个 Bitmap

enter image description here

我调试了应用程序,发现它是我正在使用的背景。下面的行来自 PhoneWindow.java 文件,我相信 Android 就是在其中将背景分配给屏幕的。背景对象的大小为 49 MB,分辨率为 2625x4669。

我的应用程序中没有过度绘制,并且我有一个应用于整个主题的背景。

我在 drawable 文件夹中有一个 JPG 格式、分辨率为 750x1,334 的背景可绘制对象。

PhoneWindow.java

if (mBackgroundResource != 0) {
    background = getContext().getDrawable(mBackgroundResource);
} else {
    background = mBackgroundDrawable;
}

我正在 Motorola Nexus 6 设备上进行测试,该设备的密度为 560,分辨率为 1440 x 2560。

有两点我不明白。

  1. 如果设备的分辨率为 1440x2560,为什么我的背景会转换为 2625x4669?
  2. 即使这种转换对于应用来说是最佳方案,为什么 160 KB 的文件最终会变成 49 MB?

如果你们能向我解释一下,那就太好了。谢谢!

最佳答案

If the device has a resolution of 1440x2560, why would my background get converted to 2625x4669?

您将图像放入 res/drawable/ 中。这不是一个好的选择,因为它是 res/drawable-mdpi/的同义词。因此,Android 会重新采样您的图像,认为您的目标是 -mdpi 设备 (~160dpi),因此图像在 Nexus 6 上的物理尺寸大致相同(密度的 3.5 倍)。

res/drawable-nodpi/res/drawable-anydpi/ 是否是正确的选择,但在一定程度上取决于此资源的替代版本,either will probably work .

how come a 160 KB file would end up being 49 MB?

该图像在磁盘上占用 160KB。内存占用是解码后的图像。这将是 ARGB_8888 图像的图像分辨率(重采样后)乘以 4 字节/像素。 2625x4669x4 ~= 49MB。

关于java - 为什么我的 160kb 应用程序背景在运行时变成了 49 MB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35277189/

相关文章:

java - 如何替换文本文件.java中的特定行

java - 充电困惑 : Google Code Jam [2014]

android - pubnub - 发布后备推送通知不起作用

C# 静态类成员和 System.Windows.Controls.Image 性能问题

java - 从 InputStream 读取并写入 OutputStream

java - 如何在Nokia 1200 上安装J2ME?

android - 使用 Google Map API 通过语音控制进行 tbt 导航

android - IntentService 和 Service 可以同时运行吗?

python - 有没有更好的方法来提高连接速度?

javascript - MongoDB:forEach 与 fetch + each