ArthurHub / ArthurHub/Android-Image-Cropper
OutOfMemoryError
- 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