问题描述
我正在将一个对象写入具有图标字段的 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 区域中。