Slide 1

Slide 1 text

How to find problem causes and improve performance DroidKaigi 2017.3.10 Room1 11:50- Fukui Atsuko

Slide 2

Slide 2 text

About me • ෱Ҫರࢠ / Fukui Atsuko • @muumuumuumuu • Retty, Inc. • ͦͷલ͸૊ΈࠐΈܥAndroidͷ͓࢓ࣄ

Slide 3

Slide 3 text

Agenda • ໨ඪɺલఏ஌ࣝͷ֬ೝ • Case 1: Systrace • Case 2: Allocation Tracker • ͓·͚1: Memory Leak • ͓·͚2: ֶशࢿྉ

Slide 4

Slide 4 text

ຊ೔ͷ໨ඪ

Slide 5

Slide 5 text

΋ͬ͞ΓΞϓϦΛͲ͏ʹ͔͢Δͱ͖ʹ ḷΓ͕ͪͳ੒௕Ϩϕϧ • ͦ΋ͦ΋Ͳ͏͍͍͔ͯ͠Θ͔Βͳ͍ (´ʀωʀʆ) • ίʔυ͔ΒΞλϦΛ͚ͭͯ੩తղੳ ( ◠‿◠ ) • πʔϧΛ׆༻ͯ͠ޮ཰Α͘վળ ٩( 'ω' )و

Slide 6

Slide 6 text

΋ͬ͞ΓΞϓϦΛͲ͏ʹ͔͢Δͱ͖ ʹॳ৺ऀͷḷΓ͕ͪͳ੒௕Ϩϕϧ • ͦ΋ͦ΋Ͳ͏͍͍͔ͯ͠Θ͔Βͳ͍ (´ʀωʀʆ) • ίʔυ͔ΒΞλϦΛ͚ͭͯ੩తղੳ ( ◠‿◠ ) • πʔϧΛ׆༻ͯ͠ޮ཰Α͘վળ ٩( 'ω' )و ͜ͷ͋ͨΓͷਓΛର৅ʹ͓࿩͠͠·͢

Slide 7

Slide 7 text

΋ͬ͞ΓΞϓϦΛͲ͏ʹ͔͢Δͱ͖ ʹॳ৺ऀͷḷΓ͕ͪͳ੒௕Ϩϕϧ • ͦ΋ͦ΋Ͳ͏͍͍͔ͯ͠Θ͔Βͳ͍ (´ʀωʀʆ) • ίʔυ͔ΒΞλϦΛ͚ͭͯ੩తղੳ ( ◠‿◠ ) • πʔϧΛ׆༻ͯ͠ޮ཰Α͘վળ ٩( 'ω' )و ͜ͷϨϕϧ·Ͱ͍͘ͷ͕໨ඪ

Slide 8

Slide 8 text

Android Performance લఏ஌ࣝ

Slide 9

Slide 9 text

Androidʹ͓͚ΔPerformance • ҰͭͷApplicationʹMain Thread͸Ұͭ • ฒྻॲཧΛ͔ͨͬͨ͠ΒผThreadʹॲཧΛ෼ ͚Δඞཁ͕͋Δ

Slide 10

Slide 10 text

Androidʹ͓͚ΔPerformance • Application͝ͱʹAndroidγεςϜͷϦιʔε ʢCPU, ϝϞϦʣͷୣ͍߹͍ • γεςϜ͕֤ApplicationʹϝϞϦΛׂΓ౰ͯΔ • ϝϞϦ্ݶʹୡ͢ΔͱGC͕૸Δ • CPU͕࢖ΘΕͯPerformance͕௿Լ

Slide 11

Slide 11 text

ANR • Application Not Responding (ΞϓϦέʔ γϣϯ͕Ԡ౴͍ͯ͠·ͤΜ) • Input Event͕5ඵҎ্Ԡ౴ͳ͠ • Broadcast Receiverͷॲཧʹ10ඵҎ্͔͔ Δ

Slide 12

Slide 12 text

۩ମతʹ

Slide 13

Slide 13 text

͝঺հ͢Δπʔϧ • ͳΔ΂͘ීஈ։ൃऀ͕਌͠ΜͰ͍ΔπʔϧΛ ࢖͏ • Android Studio (v2.2.3)

Slide 14

Slide 14 text

ίʔυΛ࢖ͬͯઆ໌͠·͢ • Android NͷEaster Egg • ίʔυ͕ެ։͞Ε͍ͯ·͢ • https://android.googlesource.com/ platform/frameworks/base/+/ android-7.0.0_r1/packages/EasterEgg • ʮpackages/eastereggʯͰάάͬͯ΋ग़·͢

Slide 15

Slide 15 text

Neko • ͻͨ͢ΒͶ͜ΛूΊΔΞϓϦ • Ͷ͋ͭ͜ΊͷΑ͏ʹڈͬͨΓ͠ͳ͍ • Quick Settingsʹ㕒Λஔ͍͓ͯ͘ͱͶ͕͜૿ ͍͑ͯ͘

Slide 16

Slide 16 text

͜Μͳײ͡

Slide 17

Slide 17 text

ɹ ͕100ඖۙ͘ू·Δͱ… • Ұཡը໘Λ։͖ͳ͕Β㕒Λஔ͘ͱANR • Ұཡը໘ΛεΫϩʔϧ͢Δͱ΋ͨͭ͘

Slide 18

Slide 18 text

Case 1:
 Ұཡը໘Λ։͖ͳ͕Β 㕒Λஔ͘ͱANR

Slide 19

Slide 19 text

ANRྫ

Slide 20

Slide 20 text

ύϑΥʔϚϯεͰࠔͬͨ࣌͸ • Ͳͷॲཧʹ͕͔͔͍࣌ؒͬͯΔ͔ௐ΂Δ • ͕͔͔͍࣌ؒͬͯΔॲཧΛվળ͢Δ

Slide 21

Slide 21 text

ύϑΥʔϚϯεͰࠔͬͨ࣌͸ • Ͳͷॲཧʹ͕͔͔͍࣌ؒͬͯΔ͔ௐ΂Δ • ͕͔͔͍࣌ؒͬͯΔॲཧΛվળ͢Δ

Slide 22

Slide 22 text

Systrace • ApplicationͱγεςϜશମͷTrace LogΛऔ ಘͰ͖Δ • ࣌ؒ࣠ͰThread͝ͱʹԿ͕ى͍ͬͯ͜Δ͔Θ ͔Δ • ANRͷݪҼͱͳΔMain ThreadΛϒϩοΫ ͍ͯ͠ΔݪҼ͕ݟ͑Δ

Slide 23

Slide 23 text

Systrace • Device MonitorΛ্ཱͪ͛Δ • Tools > Android > Android Device Monitor

Slide 24

Slide 24 text

Systrace (ଓ͖) • DeviceλϒͰtraceର৅ͷΞϓϦΛબ୒ • ɹɹΛΫϦοΫ • ͍ΖΜͳઃఆΛ֬ೝͯ͠OKΛΫϦοΫ

Slide 25

Slide 25 text

݁ՌΛݟͯΈΔ • html͕ੜ੒͞ΕΔ

Slide 26

Slide 26 text

ͳΜ͔ಡΈࠐ·ΕͯΔ…

Slide 27

Slide 27 text

Ͳͷลͷίʔυ͕ಈ͍͍ͯΔ͔ʁ • “R.drawable.body” ͰίʔυΛݕࡧ • Ͳ͏΍Β ɹ ɹΛඳը͢Δॲཧ͕ಈ͍͍ͯΔ

Slide 28

Slide 28 text

ύϑΥʔϚϯεͰࠔͬͨ࣌͸ • Ͳͷॲཧʹ͕͔͔͍࣌ؒͬͯΔ͔ௐ΂Δ • ͕͔͔͍࣌ؒͬͯΔॲཧΛվળ͢Δ

Slide 29

Slide 29 text

ॲཧΛվળ͠Α͏ • վળҎલʹͦ΋ͦ΋ඞཁͳॲཧͳͷ͔ߟ͑Δ • 㕒Λ͓͘λΠϛϯάͰ ɹ ͷඳըॲཧ͸ ඞཁͳ͍͸ͣ • ෆඞཁͳॲཧ͕ಈ͍ͯίετ্͕͕͍ͬͯ Δ

Slide 30

Slide 30 text

ίʔυͷ௥͍ํ • ɹɹ Λඳը͢ΔτϦΨʔΛϦετΞοϓ • Ұཡը໘ͷonCreate() • Shared Preference ͷมߋ௨஌

Slide 31

Slide 31 text

ίʔυͷ௥͍ํ • Shared Preferenceͷมߋ௨஌ͷτϦΨʔΛ ߟ͑ͯΈΔ • ɹ ɹͷσʔλͱ㕒ͷ৘ใΛҰͭͷShared Preferenceʹ·ͱΊͯ͠·ͬͨ • 㕒ͷঢ়ଶ͕มΘͬͨͨΊɹɹɹΛ࠶ඳը

Slide 32

Slide 32 text

मਖ਼ํ๏ • ΋ͱ΋ͱҰͭͷSharedPreference Τα Ұཡը໘࠶ඳըॲཧ 4IBSFE1SFGFSFODF$IBOHF-JTUFOFS

Slide 33

Slide 33 text

• σʔλΛ෼཭͠ɺద੾ͳൣғͰlistenerΛઃ ఆ Τα मਖ਼ํ๏ Ұཡը໘࠶ඳըॲཧ 4IBSFE1SFGFSFODF$IBOHF-JTUFOFS

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

Case 2: Ұཡը໘ΛεΫϩʔϧ͢Δͱ ΋ͨͭ͘

Slide 36

Slide 36 text

΋͖ͨͭྫ

Slide 37

Slide 37 text

ύϑΥʔϚϯεͰࠔͬͨ࣌͸ • Ͳͷॲཧʹ͕͔͔͍࣌ؒͬͯΔ͔ௐ΂Δ • ͕͔͔͍࣌ؒͬͯΔॲཧΛվળ͢Δ

Slide 38

Slide 38 text

Allocation Tracker (DDMS) • Applicationͷmemory allocationΛه࿥ • ه࿥ର৅ • Call Stack • ϝϞϦαΠζ

Slide 39

Slide 39 text

Allocation Tracker (DDMS) • Android Studioىಈ • Android Monitor > Monitors >

Slide 40

Slide 40 text

Allocation Tracker (ଓ͖) • Tracking͕ελʔτ͢ΔͷͰɺը໘Λૢ࡞͠ ͯ΋͔ͨͭͤΔ • Tracking͍ͨ͠ಈ࡞͕ऴྃͨ͠Β΋͏Ұ౓ɹ Λԡͯ͠Trackingऴྃ

Slide 41

Slide 41 text

݁ՌΛݟͯΈΔ • .allocϑΝΠϧ͕ੜ੒͞ΕΔ

Slide 42

Slide 42 text

݁ՌΛݟͯΈΔ • Stack Trace ΛͨͲΕɺͲ͕͜ॏ͍͔Θ͔Δ • ӈΫϦοΫͰιʔείʔυʹඈ΂·͢ʂ

Slide 43

Slide 43 text

΋͖ͨͭͷݪҼ • εΫϩʔϧ͢Δͱ͖ʹɹɹ ͷΞΠίϯΛඳ ը͢Δॲཧ͕ॏ͗͢Δ • ॲཧͷৄࡉΛಡΜͰΈΔ • Bitmapͷੜ੒ɺVector Drawableͷੜ੒Λ શͯϝΠϯεϨουͰ࣮ߦ

Slide 44

Slide 44 text

ύϑΥʔϚϯεͰࠔͬͨ࣌͸ • Ͳͷॲཧʹ͕͔͔͍࣌ؒͬͯΔ͔ௐ΂Δ • ͕͔͔͍࣌ؒͬͯΔॲཧΛվળ͢Δ

Slide 45

Slide 45 text

ॲཧͷվળ • ॏ͍ͨॲཧΛผεϨουʹҠͯ͠ɺը໘ͷߋ ৽ॲཧͷΈϝΠϯεϨουͰߦ͏Α͏ʹมߋ ͢Δ • ը໘ͷߋ৽ॲཧ͸UIεϨουͰߦ͏ඞཁ͕ ͋ΔͷͰ஫ҙ

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

͓·͚ Memory Leakʹ͍ͭͯ

Slide 48

Slide 48 text

Memory Leak • GC (Garbage Collection)ର৅ʹͳΒͳ͍͚ ΕͲɺ࢖ΘΕ͍ͯͳ͍ΦϒδΣΫτ͕ϝϞϦ ώʔϓʹډ࠲Γଓ͚Δ͜ͱ • ղ์͞Εͳ͍ͱ࢖༻ՄೳͳϝϞϦ͕ݮ͍ͬͯ ͘ͷͰɺGC͕සൟʹى͜ΓɺύϑΥʔϚϯ ε͕௿Լ͢Δ

Slide 49

Slide 49 text

Heap Viewer (DDMS) • ಛఆ࣌఺ͷϝϞϦͷঢ়گΛݟΔ͜ͱ͕Ͱ͖Δ

Slide 50

Slide 50 text

Heap Viewer (DDMS) • Device MonitorΛ্ཱͪ͛Δ • Tools > Android > Android Device Monitor

Slide 51

Slide 51 text

Heap Viewer (DDMS) • Device Tab > ର৅ͷϓϩηεΛબ୒ • ɹΛԡͯ͠ Cause GCϘλϯԡԼ

Slide 52

Slide 52 text

Heap Viewer (DDMS) • ೚ҙͷλΠϛϯάͰGCΛىͯ͜͠Heap Size ΍γεςϜʹׂΓ౰ͯΒΕͨϝϞϦΛ֬ೝͰ ͖Δ

Slide 53

Slide 53 text

Leak Canary • Square͕ࣾΦʔϓϯιʔεͰެ։͍ͯ͠Δ library • https://github.com/square/leakcanary • LeakΛݕ஌ͨ͠ΒϦΞϧλΠϜͰ௨஌ • ͲͷΠϯελϯε͕Leak͔ͨ͠Θ͔Δ

Slide 54

Slide 54 text

͓·͚ ֶशࢿྉ

Slide 55

Slide 55 text

Android Developers • ͝ଘ஌ެࣜReference • ͜ͷ͋ͨΓ͕ΦεεϝͰ͢ • Develop > Training > Best Practices for Performance • Develop > Android Studio >User Guide > Profile Your App

Slide 56

Slide 56 text

UDACITY • ΦϯϥΠϯֶशϓϥοτϑΥʔϜ • https://www.udacity.com/ • Google͕ύʔτφʔγοϓΛక݁ • Android Performanceίʔε • ಈըͱίʔυͱΫΠζͷ૊Έ߹Θͤ

Slide 57

Slide 57 text

ॻ੶ • ϝϞϦϦʔΫͷ࿩͕΅Μ΍Γͱ͔͠Θ͔Βͳ ͔ͬͨਓ޲͚ • JavaͰͳͥͭ͘Δͷ͔ ஌͓͖͍ͬͯͨJava ϓϩάϥϛϯάͷجૅ஌ࣝ • ถ࣋ ޾ण, ೔ܦBPࣾ, 309p

Slide 58

Slide 58 text

ॻ੶ • AndroidͷThread΍ProcessΛ΋ͬͱ஌Γͨ ͍ਓ޲͚ • Androidͷͳ͔Έ InsideAndroid • Tae Yeon Kimଞ, ύʔιφϧϝσΟΞ, 506p

Slide 59

Slide 59 text

Thank you!