Adnroid Intent extra size limit
일전에 Intent를 이용하여 Activity간 데이터를 주고받는 형식의 기능을 구현해놓고
테스트를 하는 과정에서 어느 순간만 앱이 튕기는 현상이 일어났다.
에러가 발생하는 위치를 잡지 못해서 헤매던 결과
그 순간에 extra로 넘기는 데이터가 Map의 size로 650개를 담아 넘기는 상황을 발견했는데
혹시나해서 테스트를 더 진행하던 결과 데이터의 크기가 문제가 있다는 결론을 내려
찾아보던 중에 괜찮은 블로그를 발견하여 기록해두고자 한다.
-출처-
원본 : https://www.neotechsoftware.com/blog/android-intent-size-limit
정리된 번역 블로그 : https://parkho79.tistory.com/39
아래와 같이 Intent에 대량의 data를 전달하도록 하면 app이 crash 될 것이다.
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("bytes", new byte[1000 * 1000]);
startActivity(intent);
Android 6 (API 23) 에서는 exception 발생 시 상세 정보를 알려준다.
android.os.TransactionTooLargeException : data parcel size 1002388 bytes
Android 6 이하 버전에서는 각기 다른 exception 이 발생한다.
java.lang.SecurityException : Unable to find app for caller... when publishing content providers
java.io.IOException : Address already in use
정확한 size 한계를 측정하기 위해 실험한 결과는 아래와 같다.
(단, intent 자체의 overhead 도 고려해야 되기 때문에 하단의 값이 실제 순수 data size 라고 할 순 없다.)
API 23 : 517716 bytes (520107 bytes incl. overhead);
API 22 : 517816 bytes ;
API 19 : 518368 bytes ;
API 16 : 518396 bytes ;
API 10 : 518580 bytes ;
Intent 사용 시 가급적 기본적인 정보만을 arguments로 사용하고 더 많은 data를 intent에 담아야 한다면 아래와 같은 옵션으로 대체할 것을 권장한다.
- Data 를 file(임시) 로 저장하고 URI를 활요한다. (Data 가 큰 용량일 경우 유일한 해결책이다.)
- Data 를 Application Instance 에 저장한다.
- Data 를 singleton 에 저장한다.
댓글