在parcel中查找binder对象

Fur*_*ell 0 android marshalling parcel android-binder

如何在android包中找到binder对象?我想编组一个有位图的包裹,但我得到了运行时异常,说包裹有绑定对象.

Adr*_*lor 6

可悲的是,你做不到.Parcel遗憾的是,有时不仅仅是一个字节流.偶尔它包含一个称为Binder的智能对象.这些对象可以使用IPC传递,并且具有由Android系统的不同部分中的不同进程调用的方法.

这就是这种情况下发生的事情.当你打电话给Bitmap.writeToParcel()它时,会在那里放置一些智能对象,这需要被操作系统的其他部分查询.这意味着这个Parcel根本无法简化为字节流.

(具体来说,我认为发生了什么 - 但我可能是错的.我相信这段代码:http: //androidxref.com/4.1.1/xref/frameworks/native/libs/binder/Parcel.cpp#736 正在写作位图数据到共享内存区域,并将该共享内存区域的引用放入包中.这意味着数据不需要经常复制,这在将包裹传递给另一个包时很有用.使用IPC的过程,但如果您只是使用它来序列化数据则不太好.)

使用Parcel.marshall有时表明糟糕的设计...正如评论所说,

您在此处检索的数据不得放在任何类型的持久存储中(在本地磁盘上,通过网络等).为此,您应该使用标准序列化或其他类型的通用序列化机制.Parcel编组表示针对本地IPC进行了高度优化,因此不会尝试保持与在不同版本的平台中创建的数据的兼容性.

如果您将它用于本地IPC,那么您不需要调用Parcel.marshall- 因为通常它将是AIDL接口的一部分,其中这些事情是自动处理的.

对不起,没有立即解决方案!如果您将其用于IPC,请使用AIDL.如果你将它用于其他东西,那就不要使用Parcel.marshall- 相反,你需要付出更多努力将位图字节写入你自己的数据格式.