ArthurHub / ArthurHub/Android-Image-Cropper

OutOfMemoryError

Open
#493 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
6.4k
Forks
1.4k
PR merge metrics
No merged PRs in 30d

Description

I'm getting an OOM when trying to crop a large image on an older device (S2):

```
E/art: Throwing OutOfMemoryError "Failed to allocate a 24540476 byte allocation with 7663480 free bytes and 7MB until OOM"
A/art: sart/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: JNI SetIntField called with pending exception 'java.lang.OutOfMemoryError' thrown in unknown throw location
A/art: sart/runtime/check_jni.cc:65] in call to SetIntField
A/art: sart/runtime/check_jni.cc:65] from android.graphics.Bitmap android.graphics.BitmapRegionDecoder.nativeDecodeRegion(long, int, int, int, int, android.graphics.BitmapFactory$Options)
A/art: sart/runtime/check_jni.cc:65] "AsyncTask #2" prio=5 tid=19 Runnable
A/art: sart/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x12ecb1c0 self=0xafc72800
A/art: sart/runtime/check_jni.cc:65] | sysTid=29925 nice=10 cgrp=apps/bg_non_interactive sched=0/0 handle=0xafc04780
A/art: sart/runtime/check_jni.cc:65] | state=R schedstat=( 0 0 0 ) utm=56 stm=12 core=0 HZ=100
A/art: sart/runtime/check_jni.cc:65] | stack=0x9eae6000-0x9eae8000 stackSize=1036KB
A/art: sart/runtime/check_jni.cc:65] | held mutexes= "mutator lock"(shared held)
A/art: sart/runtime/check_jni.cc:65] native: #00 pc 000045d4 /system/lib/libbacktrace_libc++.so (_ZN13UnwindCurrent6UnwindEjP8ucontext+23)
A/art: sart/runtime/check_jni.cc:65] native: #01 pc 00002e55 /system/lib/libbacktrace_libc++.so (_ZN9Backtrace6UnwindEjP8ucontext+8)
A/art: sart/runtime/check_jni.cc:65] native: #02 pc 002473e9 /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiPKcPNS_6mirror9ArtMethodE+68)
A/art: sart/runtime/check_jni.cc:65] native: #03 pc 0022c04b /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+146)
A/art: sart/runtime/check_jni.cc:65] native: #04 pc 000b17b3 /system/lib/libart.so (_ZN3artL8JniAbortEPKcS1_+582)
A/art: sart/runtime/check_jni.cc:65] native: #05 pc 000b1eed /system/lib/libart.so (_ZN3art9JniAbortFEPKcS1_z+60)
A/art: sart/runtime/check_jni.cc:65] native: #06 pc 000b4ffd /system/lib/libart.so (_ZN3art11ScopedCheckC2EP7_JNIEnviPKc+1284)
A/art: sart/runtime/check_jni.cc:65] native: #07 pc 000b8a89 /system/lib/libart.so (_ZN3art8CheckJNI11SetIntFieldEP7_JNIEnvP8_jobjectP9_jfieldIDi+28)
A/art: sart/runtime/check_jni.cc:65] native: #08 pc 00076345 /system/lib/libandroid_runtime.so (???)
A/art: sart/runtime/check_jni.cc:65] native: #09 pc 00095739 /system/lib/libandroid_runtime.so (???)
A/art: sart/runtime/check_jni.cc:65] native: #10 pc 01251931 /system/framework/arm/boot.oat (Java_android_graphics_BitmapRegionDecoder_nativeDecodeRegion__JIIIILandroid_graphics_BitmapFactory_00024Options_2+152)
A/art: sart/runtime/check_jni.cc:65] at android.graphics.BitmapRegionDecoder.nativeDecodeRegion(Native method)
A/art: sart/runtime/check_jni.cc:65] at android.graphics.BitmapRegionDecoder.decodeRegion(BitmapRegionDecoder.java:373)
A/art: sart/runtime/check_jni.cc:65] - locked <0x2c672869> (a java.lang.Object)
A/art: sart/runtime/check_jni.cc:65] at com.theartofdev.edmodo.cropper.BitmapUtils.decodeSampledBitmapRegion(BitmapUtils.java:655)
A/art: sart/runtime/check_jni.cc:65] at com.theartofdev.edmodo.cropper.BitmapUtils.cropBitmap(BitmapUtils.java:485)
A/art: sart/runtime/check_jni.cc:65] at com.theartofdev.edmodo.cropper.BitmapUtils.cropBitmap(BitmapUtils.java:254)
A/art: sart/runtime/check_jni.cc:65] at com.theartofdev.edmodo.cropper.BitmapCroppingWorkerTask.doInBackground(BitmapCroppingWorkerTask.java:183)
A/art: sart/runtime/check_jni.cc:65] at com.theartofdev.edmodo.cropper.BitmapCroppingWorkerTask.doInBackground(BitmapCroppingWorkerTask.java:23)
A/art: sart/runtime/check_jni.cc:65] at android.os.AsyncTask$2.call(AsyncTask.java:288)
A/art: sart/runtime/check_jni.cc:65] at java.util.concurrent.FutureTask.run(FutureTask.java:237)
A/art: sart/runtime/check_jni.cc:65] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
A/art: sart/runtime/check_jni.cc:65] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
A/art: sart/runtime/check_jni.cc:65] at java.lang.Thread.run(Thread.java:818)
A/art: sart/runtime/check_jni.cc:65]
A/art: sart/runtime/runtime.cc:286] Runtime aborting...
A/art: sart/runtime/runtime.cc:286] Aborting thread:
A/art: sart/runtime/runtime.cc:286] "AsyncTask #2" prio=4 tid=19 Native
A/art: sart/runtime/runtime.cc:286] | group="" sCount=0 dsCount=0 obj=0x12ecb1c0 self=0xafc72800
A/art: sart/runtime/runtime.cc:286] | sysTid=29925 nice=10 cgrp=apps/bg_non_interactive sched=0/0 handle=0xafc04780
A/art: sart/runtime/runtime.cc:286] | state=R schedstat=( 0 0 0 ) utm=56 stm=16 core=1 HZ=100
A/art: sart/runtime/runtime.cc:286] | stack=0x9eae6000-0x9eae8000 stackSize=1036KB
A/art: sart/runtime/runtime.cc:286] | held mutexes= "abort lock" "mutator lock"(shared held)
A/art: sart/runtime/runtime.cc:286] native: #00 pc 000045d4 /system/lib/libbacktrace_libc++.so (_ZN13UnwindCurrent6UnwindEjP8ucontext+23)
A/art: sart/runtime/runtime.cc:286] native: #01 pc 00002e55 /system/lib/libbacktrace_libc++.so (_ZN9Backtrace6UnwindEjP8ucontext+8)
A/art: sart/runtime/runtime.cc:286] native: #02 pc 002473e9 /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiPKcPNS_6mirror9ArtMethodE+68)
A/art: sart/runtime/runtime.cc:286] native: #03 pc 0022c04b /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+146)
A/art: sart/runtime/runtime.cc:286] native: #04 pc 0021c68f /system/lib/libart.so (_ZN3art10AbortState10DumpThreadERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPNS_6ThreadE+22)
A/art: sart/runtime/runtime.cc:286] native: #05 pc 0021c8f5 /system/lib/libart.so (_ZN3art10AbortState4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+364)
A/art: sart/runtime/runtime.cc:286] native: #06 pc 0021cac1 /system/lib/libart.so (_ZN3art7Runtime5AbortEv+72)
A/art: sart/runtime/runtime.cc:286] native: #07 pc 000a8263 /system/lib/libart.so (_ZN3art10LogMessageD1Ev+1322)
A/art: sart/runtime/runtime.cc:286] native: #08 pc 000b1991 /system/lib/libart.so (_ZN3artL8JniAbortEPKcS1_+1060)
A/art: sart/runtime/runtime.cc:286] native: #09 pc 000b1eed /system/lib/libart.so (_ZN3art9JniAbortFEPKcS1_z+60)
A/art: sart/runtime/runtime.cc:286] native: #10 pc 000b4ffd /system/lib/libart.so (_ZN3art11ScopedCheckC2EP7_JNIEnviPKc+1284)
A/art: sart/runtime/runtime.cc:286] native: #11 pc 000b8a89 /system/lib/libart.so (_ZN3art8CheckJNI11SetIntFieldEP7_JNIEnvP8_jobjectP9_jfieldIDi+28)
A/art: sart/runtime/runtime.cc:286] native: #12 pc 00076345 /system/lib/libandroid_runtime.so (???)
A/art: sart/runtime/runtime.cc:286] native: #13 pc 00095739 /system/lib/libandroid_runtime.so (???)
A/art: sart/runtime/runtime.cc:286] native: #14 pc 01251931 /system/framework/arm/boot.oat (Java_android_graphics_BitmapRegionDecoder_nativeDecodeRegion__JIIIILandroid_graphics_BitmapFactory_00024Options_2+152)
A/art: sart/runtime/runtime.cc:286] at android.graphics.BitmapRegionDecoder.nativeDecodeRegion(Native method)
A/art: sart/runtime/runtime.cc:286] at android.graphics.BitmapRegionDecoder.decodeRegion(BitmapRegionDecoder.java:373)
A/art: sart/runtime/runtime.cc:286] - locked <0x2c672869> (a java.lang.Object)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapUtils.decodeSampledBitmapRegion(BitmapUtils.java:655)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapUtils.cropBitmap(BitmapUtils.java:485)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapUtils.cropBitmap(BitmapUtils.java:254)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapCroppingWorkerTask.doInBackground(BitmapCroppingWorkerTask.java:183)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapCroppingWorkerTask.doInBackground(BitmapCroppingWorkerTask.java:23)
A/art: sart/runtime/runtime.cc:286] at android.os.AsyncTask$2.call(AsyncTask.java:288)
A/art: sart/runtime/runtime.cc:286] at java.util.concurrent.FutureTask.run(FutureTask.java:237)
A/art: sart/runtime/runtime.cc:286] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
A/art: sart/runtime/runtime.cc:286] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
A/art: sart/runtime/runtime.cc:286] at java.lang.Thread.run(Thread.java:818)
A/art: sart/runtime/runtime.cc:286] Pending exception java.lang.OutOfMemoryError thrown by 'unknown throw location'
A/art: sart/runtime/runtime.cc:286] java.lang.OutOfMemoryError: Failed to allocate a 24540476 byte allocation with 7663480 free bytes and 7MB until OOM
A/art: sart/runtime/runtime.cc:286] at java.lang.Object dalvik.system.VMRuntime.newNonMovableArray!(java.lang.Class, int) (VMRuntime.java:-2)
A/art: sart/runtime/runtime.cc:286] at android.graphics.Bitmap android.graphics.BitmapRegionDecoder.nativeDecodeRegion(long, int, int, int, int, android.graphics.BitmapFactory$Options) (BitmapRegionDecoder.java:-2)
A/art: sart/runtime/runtime.cc:286] at android.graphics.Bitmap android.graphics.BitmapRegionDecoder.decodeRegion(android.graphics.Rect, android.graphics.BitmapFactory$Options) (BitmapRegionDecoder.java:373)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapUtils$BitmapSampled com.theartofdev.edmodo.cropper.BitmapUtils.decodeSampledBitmapRegion(android.content.Context, android.net.Uri, android.graphics.Rect, int, int, int) (BitmapUtils.java:655)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapUtils$BitmapSampled com.theartofdev.edmodo.cropper.BitmapUtils.cropBitmap(android.content.Context, android.net.Uri, float[], int, int, int, boolean, int, int, int, int, boolean, boolean, int) (BitmapUtils.java:485)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapUtils$BitmapSampled com.theartofdev.edmodo.cropper.BitmapUtils.cropBitmap(android.content.Context, android.net.Uri, float[], int, int, int, boolean, int, int, int, int, boolean, boolean) (BitmapUtils.java:254)
A/art: sart/runtime/runtime.cc:286] at com.theartofdev.edmodo.cropper.BitmapCroppingWorkerTask$Result com.theartofdev.edmodo.cropper.BitmapCroppingWorkerTask.doInBackground(java.lang.Void[]) (BitmapCroppingWorkerTask.java:183)
A/art: sart/runtime/runtime.cc:286] at java.lang.Object com.theartofdev.edmodo.cropper.BitmapCroppingWorkerTask.doInBackground(java.lang.Object[]) (BitmapCroppingWorkerTask.java:23)
A/art: sart/runtime/runtime.cc:286] at java.lang.Object android.os.AsyncTask$2.call() (AsyncTask.java:288)
A/art: sart/runtime/runtime.cc:286] at void java.util.concurrent.FutureTask.run() (FutureTask.java:237)
A/art: sart/runtime/runtime.cc:286] at void java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (ThreadPoolExecutor.java:1112)
A/art: sart/runtime/runtime.cc:286] at void java.util.concurrent.ThreadPoolExecutor$Worker.run() (ThreadPoolExecutor.java:587)
A/art: sart/runtime/runtime.cc:286] at void java.lang.Thread.run() (Thread.java:818)
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by inspecting BitmapUtils.decodeSampledBitmapRegion at line 655 and its callers in cropBitmap and BitmapCroppingWorkerTask.doInBackground at line 183. Reproduce the large-image crop on the older S2 device and trace the region-decoding allocation; done means the reported crop no longer aborts with OutOfMemoryError.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, java
Domain
mobile, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
28/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.