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

时间:2016-02-08 18:58:51

标签: java android performance android-memory

我决定调查我应用的内存使用情况,然后查看了Android Studio的内存监视器,我的内存使用量大约是68 MB。这对我来说太高了。

enter image description here

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

enter image description here

我调试了应用程序,发现它是我使用的背景。以下行来自PhoneWindow.java文件,即Android将背景分配给我认为的屏幕。背景对象的大小为 49 MB 和2625x4669分辨率。

我的应用程序没有透支,我有一个应用于整个主题的背景。

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

PhoneWindow.java

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

我正在摩托罗拉Nexus 6设备上进行测试,该设备密度为560,分辨率为1440 x 2560.

有两点我不明白。

  1. 如果设备的分辨率为1440x2560,为什么我的背景会转换为2625x4669?
  2. 即使这种转换是应用程序的最佳方案,为什么160 KB文件最终会达到49 MB?
  3. 如果你们能向我解释一下那会很棒。谢谢!

3 个答案:

答案 0 :(得分:5)

  

如果设备的分辨率为1440x2560,为什么我的背景会转换为2625x4669?

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

res/drawable-nodpi/res/drawable-anydpi/是否是正确的选择取决于您对此资源的替代版本,either will probably work

  

如何将160 KB文件最终变为49 MB?

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

答案 1 :(得分:1)

Bitmap的默认和最高质量配置为ARGB_8888,每个像素使用4个字节。由于您的图像缩放到2625 * 4669,那就是:

2625*4669*4 bytes = 49024500 bytes

http://developer.android.com/reference/android/graphics/Bitmap.Config.html

答案 2 :(得分:0)

我不确定分辨率差异,但使用的内存与文件大小之间的差异是因为 JPG 格式的图像(与许多其他格式一样)是压缩(请参阅wiki了解如何)。当您将其加载到内存中时,它不再被压缩,因为它用于绘制屏幕上的每个像素。