In the Android documentation for AppWidgetManager it says
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.
But the documentation for TransactionTooLargeException says:
The Binder transaction buffer has a limited fixed size, currently 1Mb, which is
shared by all transactions in progress for the process.
Nearly every Android device on the market has a screen size large enough that a Bitmap filling it would exceed 1Mb (for example 800 x 600 x 4 = 1,920,000 bytes). I looked into the Android platform source and it doesn't seem to be using ashmem with pipes or anything esoteric, just a normal AIDL file and inside RemoteViews the Bitmap objects are Parcelable in a normal way (it does drop down to native code but it seems to write all the Bitmap pixels to a regular Parcel).
So how is it possible that Android is exceeding the Binder transaction limit? Does oneway
allow larger data to be sent?
CommonsWare answered this question in a comment, the answer is no, documentation is wrong.
Also using oneway
in your aidl will possibly make it more likely for your code to hit transaction too large because the RPC will return immediately before the data sent through the binder has been consumed allowing you to push more data to the binder and getting you closer to or over the limit.