2022年9月30日金曜日

しつこい「android.os.TransactionTooLargeException」

こんにちは。



結構前から掲題の例外「android.os.TransactionTooLargeException: data parcel size 754884 bytes」が発生していて、何度も対応していたのですが、未だに稀に発生していました。

非常に稀なので、優先順位を下げていたのですが、再度本腰をあげて調査しました。



今までも自分で再現できたことが無かったのですが、まずは再現させることから取り掛かりました。

これの例外は、画面の回転、画面がバックスタックに移動、ViewPagerでスクロールなどで、画面の状態を保持する際に、データサイズが上限を超えたときに起きるようです。

ただし、上限は1MBらしいですが、1MB以下でも例外が発生しています。

状態保持は、ActivityやFragmentの「onSaveInstanceState(Bundle)」で行い、「onCreate(Bundle)」などのBundleを使って復元します。


そこで、1MB以上保持するように計算して、テストデータ作成と画面操作(スクロール&バックスタック)をしますが、例外は発生しません。

ここで、Android StudioのProfilerでMemoryのCapture heap dumpを取ってみます。

一覧の「Fragment$SavedState」をみると「Retained Size」が確かに1MB超えています。



そこで、前述の操作はDebugモードで行っていたので、Releaseモードで全く同じ操作をしてみたところ、例外発生しました。

この例外は、Debugモードでは発生しないと推測しました。あくまで推測ですが。



そして修正を施して、Releaseモードでテストを行って、例外が発生しないことを確認しました。

修正した内容は、ViewPagerを使った画面でEditTextを複数配置していて、EditTextの状態保持は既存の処理に任せていたのを自前で行うことに変更しました。

EditTextのプロパティに「android:saveEnabled="false"」を追加して、既存の処理は止めました。



これで様子見です。


以上です。


0 件のコメント:

コメントを投稿