【Kotlin/Android】LeakCanaryでメモリリークを検知する方法!

この記事からわかること
- Android Studio/Kotlinでメモリリークの検知する方法
- Memory Profilerの使い方
- LeakCanaryの導入と確認方法
\ アプリをリリースしました /
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
メモリリークとは?
Androidアプリを開発しているとメモリが解放されず、確保されたままになってしまうことがあり、これをメモリリークと呼びます。基本的にActivityやFragmentなどはライフサイクルを保持しているためAndroidシステムがライフサイクルに応じたタイミングでメモリを解放してくれます。
しかしリソースやオブジェクトを不適切に管理するとメモリリークが発生する可能性があります。
[Android]LeakCanaryに怒られない実装をする
メモリリークの発生や原因を調査する
メモリリーク自体が発生していることを検知するためには以下2つのツールが役に立ちます。
- Memory Profiler・・・CPUやメモリの使用量を把握する
- LeakCanary・・・実際にメモリリークが発生している箇所を特定する
Memory Profiler
「Memory Profiler」はAndroid Studioの機能の「Android Profiler」から提供されている1つで、アプリのメモリ消費量などを確認することができます。これは実機へビルドしてテストしている場合に利用することができます。
Android Profiler
- CPU Profiler・・・CPUの使用量(パフォーマンス)
- Memory Profiler・・・メモリの消費量(割り当て量)
- Energy Profiler・・・バッテリーの消耗につながる可能性があるエネルギー使用量
Android Profilerを起動させるには上部メニュー「View」 > 「Tool Windows」 > 「Profiler」をクリックします(Android Studioボトムバーの「Profiler」からでも表示できます)。起動させると以下のように上からCPU/Memory/Energyの使用量が可視化されて表示されるようになります。

メモリリークが発生している場合はこのMemoryの使用量が減らずにどんどん増えていくような挙動になります。
LeakCanary
「LeakCanary」はAndroid Studio標準装備の機能ではなくオープンソースのライブラリです。メモリの使用量などを確認するツールではなく実際にアプリにメモリリークが発生した際に通知を行い、詳細なレポートを提供してくれるものになります。
検出できるメモリリークは以下の通りです。
- Activity
- Fragment
- fragment View
- ViewModel
- Service
導入するには以下を「build.gradle(Module:App)」に追加します。デバッグ環境でのみ動作させたいのでdebugImplementation
を使用します。動作させたい環境がstaging
ならstagingImplementation
と指定します。
導入はこれだけであとは普通にアプリをビルドするだけです。こちらは実機でなくエミュレーターでも動作するようです。すると端末に黄色い鳥のアイコンのアプリが自動で一緒にインストールされます。

また正常にLeakCanaryが動作している場合はデバッグログに以下のように出力されているはずなので確認してみてください。もしなければ実行環境がdebugかどうかなどを確かめてみてください。
メモリリークが発生した場合
まずは意図的にメモリリークを発生させてみます。Activity
を静的な参照として保持させておき、Activity
を終了させればメモリリークが発生します。
メモリリークが発生すると「Leaks」アプリ内で以下のようにメモリリークが発生しているクラスが表示されます。

クリックすると詳細なスタックトレースを参照することができます。

またAndroid Studioのデバッグログにも以下のように同じものが出力されます。
Swiftでのメモリリークがらみ
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。