how to improve performance

59
How to find problem causes and improve performance Fukui Atsuko

Upload: atsuko-fukui

Post on 19-Mar-2017

21 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: How to improve performance

How to find problem causes and improve performance

Fukui Atsuko

Page 2: How to improve performance

About me

• 福井敦子 / Fukui Atsuko

• @muumuumuumuu

• Retty, Inc.

• その前は組み込み系Androidのお仕事

Page 3: How to improve performance

Agenda• 目標、前提知識の確認

• Case 1: Systrace

• Case 2: Allocation Tracker

• おまけ1: Memory Leak

• おまけ2: 学習資料

Page 4: How to improve performance

本日の目標

Page 5: How to improve performance

もっさりアプリをどうにかするときに 辿りがちな成長レベル

• そもそもどうしていいかわからない (´;ω;`)

• コードからアタリをつけて静的解析 ( ◠‿◠ )

• ツールを活用して効率よく改善 ٩( 'ω' )و

Page 6: How to improve performance

もっさりアプリをどうにかするときに初心者の辿りがちな成長レベル

• そもそもどうしていいかわからない (´;ω;`)

• コードからアタリをつけて静的解析 ( ◠‿◠ )

• ツールを活用して効率よく改善 ٩( 'ω' )و

このあたりの人を対象にお話しします

Page 7: How to improve performance

もっさりアプリをどうにかするときに初心者の辿りがちな成長レベル

• そもそもどうしていいかわからない (´;ω;`)

• コードからアタリをつけて静的解析 ( ◠‿◠ )

• ツールを活用して効率よく改善 ٩( 'ω' )و

このレベルまでいくのが目標

Page 8: How to improve performance

Android Performance 前提知識

Page 9: How to improve performance

AndroidにおけるPerformance

• 一つのApplicationにMain Threadは一つ

• 並列処理をしたかったら別Threadに処理を分ける必要がある

Page 10: How to improve performance

AndroidにおけるPerformance

• ApplicationごとにAndroidシステムのリソース(CPU, メモリ)の奪い合い

• システムが各Applicationにメモリを割り当てる

• メモリ上限に達するとGCが走る

• CPUが使われてPerformanceが低下

Page 11: How to improve performance

ANR

• Application Not Responding (アプリケーションが応答していません)

• Input Eventが5秒以上応答なし

• Broadcast Receiverの処理に10秒以上かかる

Page 12: How to improve performance

具体的に

Page 13: How to improve performance

ご紹介するツール• なるべく普段開発者が親しんでいるツールを使う

• Android Studio (v2.2.3)

Page 14: How to improve performance

コードを使って説明します• Android NのEaster Egg

• コードが公開されています

• https://android.googlesource.com/platform/frameworks/base/+/android-7.0.0_r1/packages/EasterEgg

• 「packages/easteregg」でググっても出ます

Page 15: How to improve performance

Neko • ひたすらねこを集めるアプリ

• ねこあつめのように去ったりしない

• Quick Settingsに餌を置いておくとねこが増えていく

Page 16: How to improve performance

こんな感じ

Page 17: How to improve performance

  が100匹近く集まると…

• 一覧画面を開きながら餌を置くとANR

• 一覧画面をスクロールするともたつく

Page 18: How to improve performance

Case 1:一覧画面を開きながら 餌を置くとANR

Page 19: How to improve performance

ANR例

Page 20: How to improve performance

パフォーマンスで困った時は• どの処理に時間がかかっているか調べる

• 時間がかかっている処理を改善する

Page 21: How to improve performance

パフォーマンスで困った時は• どの処理に時間がかかっているか調べる

• 時間がかかっている処理を改善する

Page 22: How to improve performance

Systrace

• Applicationとシステム全体のTrace Logを取得できる

• 時間軸でThreadごとに何が起こっているかわかる

• ANRの原因となるMain Threadをブロックしている原因が見える

Page 23: How to improve performance

Systrace

• Device Monitorを立ち上げる

• Tools > Android > Android Device Monitor

Page 24: How to improve performance

Systrace (続き)

• Deviceタブでtrace対象のアプリを選択

•   をクリック

• いろんな設定を確認してOKをクリック

Page 25: How to improve performance

結果を見てみる👀• htmlが生成される

Page 26: How to improve performance

なんか読み込まれてる…

Page 27: How to improve performance

どの辺のコードが動いているか?• “R.drawable.body” でコードを検索

• どうやら    を描画する処理が動いている

Page 28: How to improve performance

パフォーマンスで困った時は• どの処理に時間がかかっているか調べる

• 時間がかかっている処理を改善する

Page 29: How to improve performance

処理を改善しよう• 改善以前にそもそも必要な処理なのか考える

• 餌をおくタイミングで   の描画処理は必要ないはず

• 不必要な処理が動いてコストが上がっている

Page 30: How to improve performance

コードの追い方•    を描画するトリガーをリストアップ

• 一覧画面のonCreate()

• Shared Preference の変更通知

Page 31: How to improve performance

コードの追い方• Shared Preferenceの変更通知のトリガーを考えてみる

•    のデータと餌の情報を一つのShared

Preferenceにまとめてしまった

• 餌の状態が変わったため   を再描画

Page 32: How to improve performance

修正方法• もともと一つのSharedPreference

エサ

一覧画面再描画処理

SharedPreference ChangeListener

Page 33: How to improve performance

• データを分離し、適切な範囲でlistenerを設定

エサ

修正方法

一覧画面再描画処理

SharedPreferenceChangeListener

Page 34: How to improve performance

🎉

Page 35: How to improve performance

Case 2: 一覧画面をスクロールすると

もたつく

Page 36: How to improve performance

もたつき例

Page 37: How to improve performance

パフォーマンスで困った時は• どの処理に時間がかかっているか調べる

• 時間がかかっている処理を改善する

Page 38: How to improve performance

Allocation Tracker (DDMS)

• Applicationのmemory allocationを記録

• 記録対象

• Call Stack

• メモリサイズ

Page 39: How to improve performance

Allocation Tracker (DDMS)

• Android Studio起動

• Android Monitor > Monitors >

Page 40: How to improve performance

Allocation Tracker (続き)

• Trackingがスタートするので、画面を操作してもたつかせる

• Trackingしたい動作が終了したらもう一度 を押してTracking終了

Page 41: How to improve performance

結果を見てみる👀• .allocファイルが生成される

Page 42: How to improve performance

結果を見てみる👀• Stack Trace をたどれ、どこが重いかわかる

• 右クリックでソースコードに飛べます!

Page 43: How to improve performance

もたつきの原因• スクロールするときに   のアイコンを描画する処理が重すぎる

• 処理の詳細を読んでみる

• Bitmapの生成、Vector Drawableの生成を全てメインスレッドで実行

Page 44: How to improve performance

パフォーマンスで困った時は• どの処理に時間がかかっているか調べる

• 時間がかかっている処理を改善する

Page 45: How to improve performance

処理の改善• 重たい処理を別スレッドに移して、画面の更新処理のみメインスレッドで行うように変更する

• 画面の更新処理はUIスレッドで行う必要があるので注意

Page 46: How to improve performance

🎉

Page 47: How to improve performance

おまけ Memory Leakについて

Page 48: How to improve performance

Memory Leak

• GC (Garbage Collection)対象にならないけれど、使われていないオブジェクトがメモリヒープに居座り続けること

• 解放されないと使用可能なメモリが減っていくので、GCが頻繁に起こり、パフォーマンスが低下する

Page 49: How to improve performance

Heap Viewer (DDMS)• 特定時点のメモリの状況を見ることができる

Page 50: How to improve performance

Heap Viewer (DDMS)

• Device Monitorを立ち上げる

• Tools > Android > Android Device Monitor

Page 51: How to improve performance

Heap Viewer (DDMS)

• Device Tab > 対象のプロセスを選択

•  を押して Cause GCボタン押下

Page 52: How to improve performance

Heap Viewer (DDMS)

• 任意のタイミングでGCを起こしてHeap Sizeやシステムに割り当てられたメモリを確認できる

Page 53: How to improve performance

Leak Canary

• Square社がオープンソースで公開しているlibrary

• https://github.com/square/leakcanary

• Leakを検知したらリアルタイムで通知

• どのインスタンスがLeakしたかわかる

Page 54: How to improve performance

おまけ 学習資料

Page 55: How to improve performance

Android Developers

• ご存知公式Reference

• このあたりがオススメです

• Develop > Training > Best Practices for Performance

• Develop > Android Studio >User Guide > Profile Your App

Page 56: How to improve performance

UDACITY• オンライン学習プラットフォーム

• https://www.udacity.com/

• Googleがパートナーシップを締結

• Android Performanceコース

• 動画とコードとクイズの組み合わせ

Page 57: How to improve performance

書籍• メモリリークの話がぼんやりとしかわからなかった人向け

• Javaでなぜつくるのか 知っておきたいJavaプログラミングの基礎知識

• 米持 幸寿, 日経BP社, 309p

Page 58: How to improve performance

書籍• AndroidのThreadやProcessをもっと知りたい人向け

• Androidのなかみ InsideAndroid

• Tae Yeon Kim他, パーソナルメディア, 506p

Page 59: How to improve performance

Thank you!