2013-02-25 2 views
1

AES 암호화를 사용하여 미디어 (그림, 비디오 등)를 암호화하는 Android 애플리케이션에서 작업 중이며 큰 파일 (예 : 90 개 이상)을 읽을 때 java.lang.OutOfMemoryError이 있습니다. MB) : this 또는 this 주제 또는 다른 사람에 따르면Android : 바이트 할당이 최대 힙 바이트 크기를 초과했습니다.

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileToEncrypt)); 
ByteBuffer bb = ByteBuffer.allocate((int) fileToEncrypt.length()); 
bis.read(bb.array()); 
bis.close(); 

, 나는 AndroidManifest.xml에있는 android:largeHeap="true" 옵션을 사용하고,하지만 난 그게 최선의 해결책이다 모르겠어요. 그렇지? 그렇지 않다면 큰 파일을 조작하는 것이 가장 좋습니다.

+0

큰 파일은 부분적으로 처리해야합니다. 'largeHeap'은 안드로이드 플랫폼간에 일관성이 없습니다. 모든 전화에 동일한 힙 크기를주지는 않습니다. – auselen

답변

1

android : largeHeap 플래그는 잠재적으로 위험하므로 아무에게도 추천하지 않습니다. 뭔가를 시도하고 싶을 때 좋지만 최종 솔루션으로 큰 힙에 의존 할 수는 없습니다. 큰 힙을 사용하면이 특정 응용 프로그램에 대한 dalvik 메모리가 낮을뿐만 아니라 실제 메모리가 부족하여 예기치 않은 크래시가 발생할 수 있습니다.

  • 메모리 매핑 된 파일 : 나를 위해

    는 두 가지 솔루션이 있습니다. MMF에 관한 인터넷에는 많은 것들이 있습니다. 참조 : http://developer.android.com/reference/java/nio/channels/FileChannel.html 표준 NIO 클래스를 사용하여 블록 단위로 파일 블록을 읽을 수 있습니다. 그것은 전체 파일이 메모리에 있다는 환상을 만듭니다.

  • 기본 메모리를 사용하십시오. 참조 : http://code.google.com/p/native-buffer/ NDK를 사용하면 전체 RAM에 액세스 할 수 있습니다. 문제는 C 스타일로 메모리를 관리해야한다는 것입니다.
관련 문제