将大图标写入 Android 中的 Parcelable

问题描述

我正在将一个对象写入具有图标字段的 Parcel。

writetoParcel 方法中放置断点时,我观察到写入图标前的包裹大小为 22456 字节。

Icon 是数据类型,以下是调试器中 toString 给出的内容Icon(typ=DATA len=31189) 表示数据长度为 31189 bytes,通过在类中调用 getDataBytes 来验证这一点。

但是,将此图标写入包裹后,包裹大小变为 22572 字节,仅比原来多 116 字节。

所以在编写图标时,似乎在幕后发生了一些事情。我无法通过查看 Icon class 的源代码得出结论。

有人可以解释一下这里发生了什么吗?我在课堂上看到了一些关于 ashmen 记忆的参考资料,但我不确定这意味着什么以及它如何加起来。

编辑:对于预览为 Icon(typ=DATA len=11129) 的另一个对象,包裹大小增加相同的 11129 字节。

编辑 2:

original size: Icon(typ=DATA len=4864),bytes taken in parcel: 4888
original size: Icon(typ=DATA len=4314),bytes taken in parcel: 4340
original size: Icon(typ=DATA len=4314),bytes taken in parcel: 4340
original size: Icon(typ=DATA len=31189),bytes taken in parcel: 48
original size: Icon(typ=DATA len=11129),bytes taken in parcel: 11156
original size: Icon(typ=DATA len=58126),bytes taken in parcel: 48
original size: Icon(typ=DATA len=11705),bytes taken in parcel: 11732
original size: Icon(typ=DATA len=7713),bytes taken in parcel: 7740
original size: Icon(typ=DATA len=7713),bytes taken in parcel: 7740

解决方法

在深入研究本机代码后得到了答案。

我们可以看到 here,包裹的就地 blob 限制是 16KB。如果大于此值,则将其复制到共享的 ashmem 区域中。