Fix maxBitmapSize calculation with FILL for preventing too large bitmap crash on Android platform #3259
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
AsyncImage on Compose will exceeds maxBitmapSize limitation, and leads crash on some Android platforms.
Reproducer
This layout is like this:
In this example, the AsyncImage receives
Infinityconstraints in ConstraintsSizeResolver.Then, resolved size is
Size(width = Undefined, height = Undefined)(Size.ORIGINAL).Then, DecodeUtils.computeSizeMultiplier() will calculate as
Scale.FILLto(dstWidth, dstHeight) = (4096, 4000). dstWidth is limited to maxBitmapSize. So themultiplier = 1.0fwill be used.Finally, AsyncImage will draw the bitmap with 8000px x 4000px, and this will cause crash on some Android versions (old versions or hardware limitation?).
Fix
The problem is
DecodeUtils.computeSizeMultiplier(). When it computes withScale.FILL, the multiplier and resulting bitmap will be larger than the size of maxBitmapSize.I fixed computeSizeMultiplier() on this PR, by limiting the multiplier after calculating that with
FILLorFIT. The multiplier will be limited to the both of the maxBitmapSize.width and the maxBitmapSize.height.