Android小部件是否有办法超出Binder事务限制?

4
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设备都有足够大的屏幕,使得填充它的位图将超过1Mb(例如800 x 600 x 4 = 1,920,000字节)。我查看了Android平台源代码,似乎没有使用管道或任何奇特的ashmem,只是一个normal AIDL file和在RemoteViews中,位图对象以正常方式进行可包含化处理(它确实降级到本地代码但似乎将所有位图像素写入常规Parcel)。那么Android如何可能超过Binder事务限制?是否oneway允许发送更大的数据?

由于我在 Stack Overflow 上看到了一些人在使用应用程序小部件时失败了绑定事务的问题,因此我对 AppWidgetManager 文档在这一点上的准确性产生了质疑。 - CommonsWare
谢谢,看起来文档确实是错误的。 - satur9nine
2个回答

0

Bitmaps被特殊处理。它们位于本地内存中,只有引用被传递到bundle中。尝试将位图序列化为byte[],我敢打赌它会崩溃。


-1

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

此外,在您的aidl中使用oneway可能会使您的代码更有可能遇到事务过大的问题,因为RPC将立即返回,而尚未消耗通过binder发送的数据,允许您向binder推送更多数据,并使您接近或超过限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接