-
Android Camera : (OutOfMemoryError 오류)회사 생활/기타 지식들 2023. 7. 17. 17:27
안드로이드 Camera에서 실시간으로 데이터를 받고 전송을 하는 것을 하다보니 처음 OOM이라는걸 만나봤다.
공부만 해봤지 실제로 만나 본건 처음이라 많이 어색하지만 기쁘기도 하다.
카메라에서 가져온 이미지를 가져오는 과정에서 너무 많이 Heap 메모리를 사용하는 것 같다.
... 생략 ... final int[] count = {0}; mCamera.setPreviewCallback((data, camera) -> { Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { // 3초 후에 실행할 작업을 여기에 작성합니다 // ... if (count[0] < 3) { // YUV 데이터에서 RGB로 변환하여 Bitmap 생성 Camera.Parameters parameters = camera.getParameters(); int w = parameters.getPreviewSize().width; int h = parameters.getPreviewSize().height; YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, w, h, null); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); yuvImage.compressToJpeg(new Rect(0, 0, w, h), 100, outputStream); byte[] jpegData = outputStream.toByteArray(); mBitmap = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length); ... 생략 ...2023-07-17 17:20:18.742 10706-10706/w2022v9o12.simple.photoapp E/Camera: Error 1 2023-07-17 17:20:21.789 11458-11458/w2022v9o12.simple.photoapp E/BufferQueueProducer: Unable to open libpenguin.so: dlopen failed: library "libpenguin.so" not found. 2023-07-17 17:20:27.838 11458-11558/w2022v9o12.simple.photoapp E/Camera-JNI: Couldn't allocate byte array for JPEG data 2023-07-17 17:20:27.870 11458-11558/w2022v9o12.simple.photoapp E/Camera-JNI: Couldn't allocate byte array for JPEG data 2023-07-17 17:20:27.902 11458-11558/w2022v9o12.simple.photoapp E/Camera-JNI: Couldn't allocate byte array for JPEG data 2023-07-17 17:20:27.938 11458-11558/w2022v9o12.simple.photoapp E/Camera-JNI: Couldn't allocate byte array for JPEG data 2023-07-17 17:20:27.973 11458-11558/w2022v9o12.simple.photoapp E/Camera-JNI: Couldn't allocate byte array for JPEG data 2023-07-17 17:20:28.004 11458-11558/w2022v9o12.simple.photoapp E/Camera-JNI: Couldn't allocate byte array for JPEG data 2023-07-17 17:20:28.035 11458-11558/w2022v9o12.simple.photoapp E/Camera-JNI: Couldn't allocate byte array for JPEG data 2023-07-17 17:20:28.367 11458-11458/w2022v9o12.simple.photoapp E/AndroidRuntime: FATAL EXCEPTION: main Process: w2022v9o12.simple.photoapp, PID: 11458 java.lang.OutOfMemoryError: Failed to allocate a 1048592 byte allocation with 51824 free bytes and 50KB until OOM, target footprint 268435456, growth limit 268435456 at java.util.Arrays.copyOf(Arrays.java:3670) at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:211) at w2022v9o12.simple.photoapp.Fragments.CameraFragments.SelfCameraFragment$3.run(SelfCameraFragment.java:225) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:226) at android.os.Looper.loop(Looper.java:313) at android.app.ActivityThread.main(ActivityThread.java:8757) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)해결 방법 :
largeHeap을 AndroidManifest.xml에 추가 하기
android:largeHeap="true"<application android:name=".MyApplication" android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/SplashTheme" android:usesCleartextTraffic="true" android:largeHeap="true" tools:targetApi="31">인터넷을 찾아보니 largeHeap을 추가하면 해결할수 있다고 하고 추가해보니 해결되었다.
내가 생각했었던 해결방법 그러나 안됨 (X). MultiProcess 사용
내 Process와 Thread를 학습한 것을 바탕으로 멀티 프로세스를 사용하는 방법으로도 해결이 가능할 것 같았다. (참고)
예를 들어 <activity> 태그 안에 android:process=":name"을 넣으면 다른 프로세스에서 실행된는데 이런 방식으로 새로운 Process를 만들면 heap이 충분할 것으로 생각했다.
<activity android:name=".Activities.MainActivity" android:process=":photo" android:exported="true"> <meta-data android:name="android.app.lib_name" android:value="" /> </activity>하지만 이미 Camera에서 Frame을 가공하면서 먹는 heap resource가 하나의 thread의 heap 영역 보다도 큰 것인지 똑같은 오류가 생겼다. 그래서 결과적으로 large heap을 사용해야 하는 것 같다.
'회사 생활 > 기타 지식들' 카테고리의 다른 글
CameraX 사진 깨지는 현상 (1) 2024.01.25 앱 계정 이전 (0) 2023.08.07 웹뷰 ERR_UNKNOWN_URL_SCHEME 오류 (fb://fullscreen_video~~) (0) 2023.08.07 앱 빌드 속도가 느려지는 문제 (우즈벡에서) (0) 2023.05.31 회사 앱 안드로이드 출시 과정들 (0) 2023.05.20