how to improve performance
TRANSCRIPT
How to find problem causes and improve performance
Fukui Atsuko
About me
• 福井敦子 / Fukui Atsuko
• @muumuumuumuu
• Retty, Inc.
• その前は組み込み系Androidのお仕事
Agenda• 目標、前提知識の確認
• Case 1: Systrace
• Case 2: Allocation Tracker
• おまけ1: Memory Leak
• おまけ2: 学習資料
本日の目標
もっさりアプリをどうにかするときに 辿りがちな成長レベル
• そもそもどうしていいかわからない (´;ω;`)
• コードからアタリをつけて静的解析 ( ◠‿◠ )
• ツールを活用して効率よく改善 ٩( 'ω' )و
もっさりアプリをどうにかするときに初心者の辿りがちな成長レベル
• そもそもどうしていいかわからない (´;ω;`)
• コードからアタリをつけて静的解析 ( ◠‿◠ )
• ツールを活用して効率よく改善 ٩( 'ω' )و
このあたりの人を対象にお話しします
もっさりアプリをどうにかするときに初心者の辿りがちな成長レベル
• そもそもどうしていいかわからない (´;ω;`)
• コードからアタリをつけて静的解析 ( ◠‿◠ )
• ツールを活用して効率よく改善 ٩( 'ω' )و
このレベルまでいくのが目標
Android Performance 前提知識
AndroidにおけるPerformance
• 一つのApplicationにMain Threadは一つ
• 並列処理をしたかったら別Threadに処理を分ける必要がある
AndroidにおけるPerformance
• ApplicationごとにAndroidシステムのリソース(CPU, メモリ)の奪い合い
• システムが各Applicationにメモリを割り当てる
• メモリ上限に達するとGCが走る
• CPUが使われてPerformanceが低下
ANR
• Application Not Responding (アプリケーションが応答していません)
• Input Eventが5秒以上応答なし
• Broadcast Receiverの処理に10秒以上かかる
具体的に
ご紹介するツール• なるべく普段開発者が親しんでいるツールを使う
• Android Studio (v2.2.3)
コードを使って説明します• Android NのEaster Egg
• コードが公開されています
• https://android.googlesource.com/platform/frameworks/base/+/android-7.0.0_r1/packages/EasterEgg
• 「packages/easteregg」でググっても出ます
Neko • ひたすらねこを集めるアプリ
• ねこあつめのように去ったりしない
• Quick Settingsに餌を置いておくとねこが増えていく
こんな感じ
が100匹近く集まると…
• 一覧画面を開きながら餌を置くとANR
• 一覧画面をスクロールするともたつく
Case 1:一覧画面を開きながら 餌を置くとANR
ANR例
パフォーマンスで困った時は• どの処理に時間がかかっているか調べる
• 時間がかかっている処理を改善する
パフォーマンスで困った時は• どの処理に時間がかかっているか調べる
• 時間がかかっている処理を改善する
Systrace
• Applicationとシステム全体のTrace Logを取得できる
• 時間軸でThreadごとに何が起こっているかわかる
• ANRの原因となるMain Threadをブロックしている原因が見える
Systrace
• Device Monitorを立ち上げる
• Tools > Android > Android Device Monitor
Systrace (続き)
• Deviceタブでtrace対象のアプリを選択
• をクリック
• いろんな設定を確認してOKをクリック
結果を見てみる👀• htmlが生成される
なんか読み込まれてる…
どの辺のコードが動いているか?• “R.drawable.body” でコードを検索
• どうやら を描画する処理が動いている
パフォーマンスで困った時は• どの処理に時間がかかっているか調べる
• 時間がかかっている処理を改善する
処理を改善しよう• 改善以前にそもそも必要な処理なのか考える
• 餌をおくタイミングで の描画処理は必要ないはず
• 不必要な処理が動いてコストが上がっている
コードの追い方• を描画するトリガーをリストアップ
• 一覧画面のonCreate()
• Shared Preference の変更通知
コードの追い方• Shared Preferenceの変更通知のトリガーを考えてみる
• のデータと餌の情報を一つのShared
Preferenceにまとめてしまった
• 餌の状態が変わったため を再描画
修正方法• もともと一つのSharedPreference
エサ
一覧画面再描画処理
SharedPreference ChangeListener
• データを分離し、適切な範囲でlistenerを設定
エサ
修正方法
一覧画面再描画処理
SharedPreferenceChangeListener
🎉
Case 2: 一覧画面をスクロールすると
もたつく
もたつき例
パフォーマンスで困った時は• どの処理に時間がかかっているか調べる
• 時間がかかっている処理を改善する
Allocation Tracker (DDMS)
• Applicationのmemory allocationを記録
• 記録対象
• Call Stack
• メモリサイズ
Allocation Tracker (DDMS)
• Android Studio起動
• Android Monitor > Monitors >
Allocation Tracker (続き)
• Trackingがスタートするので、画面を操作してもたつかせる
• Trackingしたい動作が終了したらもう一度 を押してTracking終了
結果を見てみる👀• .allocファイルが生成される
結果を見てみる👀• Stack Trace をたどれ、どこが重いかわかる
• 右クリックでソースコードに飛べます!
もたつきの原因• スクロールするときに のアイコンを描画する処理が重すぎる
• 処理の詳細を読んでみる
• Bitmapの生成、Vector Drawableの生成を全てメインスレッドで実行
パフォーマンスで困った時は• どの処理に時間がかかっているか調べる
• 時間がかかっている処理を改善する
処理の改善• 重たい処理を別スレッドに移して、画面の更新処理のみメインスレッドで行うように変更する
• 画面の更新処理はUIスレッドで行う必要があるので注意
🎉
おまけ Memory Leakについて
Memory Leak
• GC (Garbage Collection)対象にならないけれど、使われていないオブジェクトがメモリヒープに居座り続けること
• 解放されないと使用可能なメモリが減っていくので、GCが頻繁に起こり、パフォーマンスが低下する
Heap Viewer (DDMS)• 特定時点のメモリの状況を見ることができる
Heap Viewer (DDMS)
• Device Monitorを立ち上げる
• Tools > Android > Android Device Monitor
Heap Viewer (DDMS)
• Device Tab > 対象のプロセスを選択
• を押して Cause GCボタン押下
Heap Viewer (DDMS)
• 任意のタイミングでGCを起こしてHeap Sizeやシステムに割り当てられたメモリを確認できる
Leak Canary
• Square社がオープンソースで公開しているlibrary
• https://github.com/square/leakcanary
• Leakを検知したらリアルタイムで通知
• どのインスタンスがLeakしたかわかる
おまけ 学習資料
Android Developers
• ご存知公式Reference
• このあたりがオススメです
• Develop > Training > Best Practices for Performance
• Develop > Android Studio >User Guide > Profile Your App
UDACITY• オンライン学習プラットフォーム
• https://www.udacity.com/
• Googleがパートナーシップを締結
• Android Performanceコース
• 動画とコードとクイズの組み合わせ
書籍• メモリリークの話がぼんやりとしかわからなかった人向け
• Javaでなぜつくるのか 知っておきたいJavaプログラミングの基礎知識
• 米持 幸寿, 日経BP社, 309p
書籍• AndroidのThreadやProcessをもっと知りたい人向け
• Androidのなかみ InsideAndroid
• Tae Yeon Kim他, パーソナルメディア, 506p
Thank you!