본문 바로가기
My Record/이론 및 공부

[Android] The Intent extra data 크기 제한 - [펌]

by 썸머워즈 2019. 12. 8.
반응형


Adnroid Intent extra size limit


일전에 Intent를 이용하여 Activity간 데이터를 주고받는 형식의 기능을 구현해놓고


테스트를 하는 과정에서 어느 순간만 앱이 튕기는 현상이 일어났다.


에러가 발생하는 위치를 잡지 못해서 헤매던 결과


그 순간에 extra로 넘기는 데이터가 Map의 size로 650개를 담아 넘기는 상황을 발견했는데


혹시나해서 테스트를 더 진행하던 결과 데이터의 크기가 문제가 있다는 결론을 내려


찾아보던 중에 괜찮은 블로그를 발견하여 기록해두고자 한다.



아래와 같이 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 에 저장한다.


반응형


댓글

TOP