KeyguardManager によるメモリリークはグーグルのバグらしい
KeygurardManagerによるメモリリークが確認された。どうやってこれを解消すればいいか検討したが、結論からいうと、どうやらこれはグーグルのバグで、解消できない可能性が高そうだ。(もし詳しい方がおられたら教えてください)
----------------------------
アプリを作ったら、メモリリークがないか確認しなければならない。
メモリリークとは、アプリが確保したメモリが不要になっても解放されないままになることで、使えるメモリが減ってしまい不具合の原因となる。その確認のためにリークキャナリー(LeakCanary)を入れて確認することが広く行われている。
リークキャナリーの入れ方についてはこちら。非常に簡単である。
https://zenn.dev/yass97/articles/e25960d5511c30
ただ、その読み方はちょっと難しい。今回確認されたリークは次のようなもの。
これを見ていくと、上から1/3くらいのところにKeyguardManager とあり、また、下から1/3くらいのところにAlarmActivityとある。さらにそのすぐ下にLeakinng:YES とあるので、結局、AlarmActivityというアクティビティの中にある、KeyguardManagerのインスタンスにリークがあるということなのだ。
ちなみに、KeyguardManager とは、スマホのロックを管理するクラスで、私は目覚まし時計を作る際に、スマホがロックされていてもアラームの画面だけは表示できるようにするために使ったのだ。
さて、ではどうやってこのメモリリークを解消するか。
メモリリークは多くの場合、アクティビティ等を閉じる段階(onPauseやonDestroy)において、リークの原因となっているオブジェクトを解放し、nullにしてやることで解消できる。このブログでも次のような例について、メモリリークが解消できたことを報告した。
https://marsh-mashro.blogspot.com/2023/08/broadcastreceiver.html
https://marsh-mashro.blogspot.com/2023/08/handler.html
しかしKeyguardManagerのメモリリークはこのような方法では解消できない。試しに、KeyguardManagerをnull許容型のメンバ変数としてonCreateの外で宣言し、onDestroyの中でkeyguardManager = null としてみたが、リークは解消されなかった。
そこでいろいろ調べてみると、次のような記事が見つかった。
https://stackoverflow.com/questions/60477120/keyguardmanager-memory-leak
https://copyprogramming.com/howto/android-is-keyguardmanager-necessary-to-use-fingerprint
これらによると、KeyguardManagerのメモリリークはGoogleのバグであり、「Android フレームワークにバグを報告する必要がある」などとしている。従ってコーディングによって解消することはできないと思われる。
なお、上記のサイトの投稿は、前者が2020年3月、後者は2023年3月であるが、現在(2024年1月)も同じ問題が起きているということは、4年近く修正がなされないままということになる。バグの報告は実際に行われたのだろうか。
私にやり方がわかれば、重複かもしれないが念のためバグを報告しても良いのだが、いかんせん初心者なので何をどうすればいいのかわからない。どなたかご存知なら教えていただければありがたいです。
コメント
コメントを投稿