在 Android 中将大图标写入 parcelable

Writing large Icon to a parcelable in Android

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

writeToParcel方法下断点时,观察到写图标前的包裹大小是22456字节。

Icon 是数据类型,下面是 toString 在调试器中给出的内容: Icon(typ=DATA len=31189) 表示数据长度为 31189 bytes,通过在 class.

中调用 getDataBytes 验证了这一点

但是,将这个图标写到包裹上后,包裹大小变成了22572字节,比原来多了116字节。

看来在写图标的时候幕后发生了一些事情。我无法通过查看 Icon class.

的源代码来得出结论

有人可以解释一下这是怎么回事吗?我在 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 区域。