Flutter: !!! FAILED BINDER TRANSACTION !!!という表示が出てAdMob広告が表示されない
結論:Androidエミュレーターを「Cold Boot Now」で再起動する
2023/5/24 Flutter エラー・バグ日記
Androidエミュレーター(API 33、Pixel4)でビルドしたら、コンソールに以下のエラー表示が出た。
E/JavaBinder( ####): !!! FAILED BINDER TRANSACTION !!! (parcel size = 412)
W/GmsClient( ####): IGmsServiceBroker.getService failed
android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died, but this could also be caused by running out of binder buffe
・・・(略)・・・
アプリがクラッシュすることはないが、実装しているAdMobの広告が表示されなくなっている。
本番、テスト広告、いずれで試しても表示されない。
実機やiOSでは発生しない
Androidの実機やiOSのシミュレーターでテストすると、このエラーは表示されず、広告も問題なく表示される。
そのため、実装コードは問題なさそうで、Androidエミュレーターの問題ということになりそう。
通信時のバッファ容量不足が原因?
エラーメッセージを見ると、
- トランザクションが失敗した
- バインダーバッファの不足が原因である可能性がある
といったコメントがある。
何となく、AdMobの広告を受信しようとしたが、容量オーバーしたような印象。。
バインダーバッファ(binder buffer)が何なのか?は、Androidの公式ドキュメントを探しても、明確に見つけられなかったが、下記のような記事を参考にさせていただくと、つまるところ、Androidが通信をする際に設けられているバッファ(緩衝領域)があり、その容量には一定の制限があるらしい。。(全く理解が違っているかもしれないが、、)
同じ現象を報告するイシューが上がっていた
ネット上で、エラーメッセージを検索すると、全く同じ状況について、イシューが上がっていた。
やり取りを拝見すると、やはりAndroidエミュレーターの問題らしく、結論としては、Android StudioのDevice Managerで、
- Wipe Data もしくは、
- Cold Boot Now
のいずれかを実行すれば解消する模様。
Wipe Dataは、エミュレーター内のデータが消えるだけでなく、設定が全て初期化されてしまうので、できれば避けたい。
そのため、いったんエミュレーターを落として「Cold Boot Now」で再起動し、改めてビルドしたところ、確かにエラーは発生せず、広告も表示されるようになった。
しかし、アプリを閉じて、そのままもう一度ビルドすると、また同じエラーが発生する状況に戻ってしまう。
前述のイシュ−にも、「Cold Bootすると、いったん解消するが、また発生する」という報告があるので、それと同じ状況らしい。
ただ、大した手間ではないので、ビルドする度に、Cold Bootを繰り返していたところ、いつの間にかエラーが発生しなくなった^^;。
表示していたAdMobの広告は、常にテスト広告だったので、送られてくるデータ容量が減った訳ではないように思える。
根本解決はできていないかもしれないが、これ以上、調査するのも時間を浪費しそうなので、、また発生した場合は、Cold Bootで対処しようと思う。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/
Dart入門 - Dartの要点をつかむためのクイックツアー