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

Gok*_*rik 0 java performance android android-memory

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

在此输入图像描述

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

在此输入图像描述

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

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

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

PhoneWindow.java

if (mBackgroundResource != 0) {
    background = getContext().getDrawable(mBackgroundResource);
} else {
    background = mBackgroundDrawable;
}
Run Code Online (Sandbox Code Playgroud)

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

有两点我不明白.

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

如果你们可以向我解释这将是伟大的.谢谢!

Com*_*are 5

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

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

是否res/drawable-nodpi/或是res/drawable-anydpi/正确的选择取决于您的替代版本的此资源,但任何一个可能会工作.

怎么一个160 KB的文件最终会变成49 MB?

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