Android Widgets允许以某种方式超过Binder交易限制?

时间:2014-05-20 20:59:51

标签: android android-binder

AppWidgetManager的Android文档中,它说

The total Bitmap memory used by the RemoteViews object cannot exceed that required 
to fill the screen 1.5 times, ie. (screen width x screen height x 4 x 1.5) bytes.

但是TransactionTooLargeException的文档说:

The Binder transaction buffer has a limited fixed size, currently 1Mb, which is 
shared by all transactions in progress for the process.

市场上几乎所有的Android设备都有足够大的屏幕尺寸,填充它的Bitmap会超过1Mb(例如800 x 600 x 4 = 1,920,000字节)。我查看了Android平台源代码,它似乎没有使用ashmem管道或任何深奥的东西,只是normal AIDL file而在RemoteViews中Bitmap对象是以正常方式Parcelable(它does drop down to native code但是它似乎将所有Bitmap像素写入常规Parcel)。

那么Android怎么可能超过Binder交易限制? oneway是否允许发送更大的数据?

2 个答案:

答案 0 :(得分:0)

Bitmaps经过特殊处理。它们在本机内存中,并且仅引用在捆绑包中传递。尝试对byte[]中的位图进行序列化,我敢打赌它会崩溃。

答案 1 :(得分:-1)

CommonsWare在评论中回答了这个问题,答案是否定的,文档是错误的。

在你的aidl中使用oneway可能会使你的代码更有可能命中事务太大,因为RPC会在通过绑定器发送的数据被消耗之前立即返回,允许你将更多的数据推送到粘合剂,让你接近或超过极限。