FAILED BINDER TRANSACTION

안드로이드에서 액티비티나 서비스같은 컴포넌트 간 데이터를 전달할 때 인텐트를 쓴다. 정확히는 인텐트 객체 안의mExtras라는Bundle 형 객체를 활용하는데 이 때 전송할 수 있는 데이터의 제한이 있을까?

결론만 이야기하면 있다. 안드로이드 공식문서에 인텐트의 extras의 크기 제한으로 언급된 내용은 없지만, 일정 크기 이상의 데이터를 intent에 넣어 전달하려고 하면 아래와 같은 에러가 발생한다.

09-06 11:04:42.329 6839-6839/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 6966844)
...
Caused by: android.os.TransactionTooLargeException: data parcel size 6966844 bytes
...

참고로, 이는 Bundle이나 Intent 클래스의 제약이 아니다. 안드로이드의 컴포넌트 들간 인텐트 전달을 위해  안드로이드 시스템을 거칠 때, 전달되는 아규먼트나 리턴 값은 바인더 binder transaction buffer 를 거치는데, 이 버퍼의 크기가 1mb로 제한되어 있고,  이 버퍼는 현재 수행중인 모든 트랜잭션이 공유하여 사용한다. 그러므로, 이 버퍼 안에 저장할 수 없을 만큼 아규먼트나 리턴 값이 클 때 TransactionTooLargeException이 발생하는 것이다.

다른 트랜잭션이 없다면 1mb 가까이 intent에 데이터를 넣어도 되겠지만, 보통은 100kb 미만의 데이터만 전달하도록 권장한다. 안드로이드 시스템과 하드웨어가 향상되어 버퍼의 크기는 커질 수 있지만, 크게 바뀔 가능성은 별로 없을 것 같다. 그러므로, 개발자들은 이 버퍼의 크기를 감안하여 데이터 전송량을 최대한 줄이는 것이 좋겠다. 혹시, 이미지나 파일 같은 크기가 큰 데이터를 전송해야 한다면, 파일의 위치를 uri를 통해 전달하는 방식을 고려해보자.

참고

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.