Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Androidにおけるパフォーマンスチューニング実践

neonankiti
February 08, 2019

 Androidにおけるパフォーマンスチューニング実践

再現性が低い改善が難しいパフォーマンス問題に対処するために、パフォーマンスの前提知識をつけ、定性と定量との両輪からアプローチしていく方法論に関して話しています。

- パフォーマンス改善の発端
- アプリパフォーマンスの定義
- パフォーマンス課題
- UIの改善
- データ通信量
- バッテリー消費

neonankiti

February 08, 2019
Tweet

More Decks by neonankiti

Other Decks in Programming

Transcript

  1. "OESPJEʹ͓͚Δ
    ύϑΥʔϚϯενϡʔχϯά࣮ફ
    @neonankiti

    View Slide

  2. גࣜձࣾFiNC Technologies
    — Mobile Engineer(Android/iOS/Flutter)
    ೆཬ༐ؾ
    @neonankiti
    #εϊϘʔ #όεέ #Ωϟϯϓ #௼Γ #GoldGym
    ࣗݾ঺հ

    View Slide

  3. ύϑΥʔϚϯε՝୊ͷࢦఠ
    CTO
    ΞϓϦͷಈ࡞͓΋ͳ͍ʁ͸΍ͯ͘͠΍ɻ
    Θ͔Γ·ͨ͠ʂʂ
    σʔλফඅྔ΍͹͘ͳ͍ʁ௚ͯ͠΍ɻ
    ΊͬͪΌి஑৯ͬͯͳ͍ʂʁʂʁʂ

    View Slide

  4. ͳΜ͔Θ͔ΒΜ͚Ͳɺ΍ͬͯΈΔ͔

    View Slide

  5. νʔϜͷ࠶ฤ੒
    Before After
    ػೳ1
    ػೳ2
    ػೳ3
    ػೳ1
    ػೳ2
    ػೳ3
    ڞ

    ج

    View Slide

  6. ڞ௨ج൫νʔϜര஀

    View Slide

  7. ͳͥνʔϜΛ࠶ฤ੒ͨ͠ͷ͔ʁ
    νʔϜମ੍͸ػೳ(υϝΠϯ)୯Ґ
    →ػೳ୯ҐͰ͸੹೚͕ᐆດͳ໰୊͕ੜ͡Δ

    View Slide

  8. ۩ମతʹى͖ͨ໰୊
    ɾݪҼͷΘ͔Γਏ͍Ϋϥογϡ
    ɾσʔλ௨৴ྔͷ૿Ճ
    ɾόοςϦʔফඅͷ૿Ճ
    ɾͳΜ͔΋ͬ͞Γͯ͠Δ

    View Slide

  9. ڞ௨ج൫νʔϜͷൃ଍΁
    ಛఆͷػೳʹґଘ͠ͳ͍໰୊Λվળ͠
    ΞϓϦͷ඼࣭ΛߴΊΔ͜ͱ͕੹຿

    View Slide

  10. RailsςοΩʔͳ࿩
    ϚΠΫϩαʔϏεͷཁૉٕज़ͷ࿩
    Ϛωδϝϯτͷ࿩
    ΞϓϦύϑΥʔϚϯεվળͷલʹ

    View Slide

  11. ΞϓϦύϑΥʔϚϯεͱ͸ʁ

    View Slide

  12. ϢʔβʔମݧʹӨڹΛ༩͑Δཁૉ
    ɾΫϥογϡ
    ɾANR
    ɾσʔλϩʔυ
    ɾUI(Ξχϝʔγϣϯ)
    ɾόοςϦʔফඅ
    ɾσʔλ௨৴ྔ
    ΞϓϦύϑΥʔϚϯε

    View Slide

  13. ϦϦʔεޙʹൃੜ͠΍͍͢
    ݦࡏԽͷλΠϛϯά
    ϦϦʔε
    ςετ
    ʷ
    ύϑΥʔϚϯεѱԽ

    View Slide

  14. ͳͥϦϦʔεޙʹൃੜ͠΍͍͢ͷ͔ʁ
    ςετͰͷ࠶ݱੑ͕೉͍͠
    ɾຊ൪։ൃ2"؀ڥͷࠩҟ
    ɾ࣌ؒత੍໿Ͱػೳςετ͕ࠔ೉

    View Slide

  15. ςετΑΓલͷϑϩʔͰରࡦ͢Δ
    ࣮૷࣌ʹՄೳͳݶΓࢭΊΔ
    ϦϦʔε
    ςετ
    ʷ
    ύϑΥʔϚϯεѱԽ
    ࣮૷

    View Slide

  16. ΤϯδχΞ͕ग़དྷΔ͜ͱ
    ɾલఏͱͳΔ஌ࣝΛ͚ͭΔ
    ɾΞϯνύλʔϯΛ౿·ͳ͍࣮૷
    ΞϓϦύϑΥʔϚϯεʹؔͯ͠

    View Slide

  17. ຊ೔ͷτϐοΫ

    View Slide

  18. ຊ೔࿩߲͢໨
    ɾ6*ͷվળ
    ɾσʔλ௨৴ྔ
    ɾόοςϦʔফඅ
    ࠶ݱੑ͕೉͍߲͠໨

    View Slide

  19. RailsςοΩʔͳ࿩
    ϚΠΫϩαʔϏεͷཁૉٕज़ͷ࿩
    Ϛωδϝϯτͷ࿩
    ΞϓϦύϑΥʔϚϯενϡʔχϯά࣮ફ

    View Slide

  20. ύϑΥʔϚϯενϡʔχϯά࣮ફ
    6*ͷվળ
    σʔλ௨৴ྔ
    όοςϦʔফඅ

    View Slide

  21. ɾ6*ͷΧΫπΩ
    UIͷ໰୊
    ɾ$16 (16ʹෛ୲Λ༩͑Δॲཧ

    View Slide

  22. ɾ6*ͷΧΫπΩ
    UIͷ໰୊
    ɾ$16 (16ʹෛ୲Λ༩͑Δॲཧ

    View Slide

  23. ͳͥ6*͸ΧΫπΫͷ͔ʁ

    View Slide

  24. 'SBNF3BUF͕௿͍

    View Slide

  25. ɾFPS = Frame Per Secondsɻ
    ɾਓؒ͸ɺ60FPS͕࠷దͱײ͡Δ
    Frame Rateͱ͸
    ɾ60FPS ≒ 16ms/frame
    ≒1ඵؒʹॲཧ͞ΕΔϑϨʔϜ਺(੩ࢭը໘)

    View Slide

  26. '14ͷ࣮ݱ

    View Slide

  27. ΞϓϦͷىಈ = Linuxϓϩηεͷىಈ
    શͯͷλεΫ͸ϝΠϯεϨου(UIεϨου)Ͱ࣮ߦ
    UI
    Drawing
    LameWork
    App
    Events
    UI
    Drawing
    UI
    Drawing
    Main Thread(UI Thread)
    PROCESS
    AndroidΞϓϦͷ࣮ߦϓϩηε
    ࢀߟ
    IUUQTXXXZPVUVCFDPNXBUDI W)[email protected]#8R:U7*S';8S#;D#@XG98

    View Slide

  28. NTGSBNFΛӽ͑ͯ͠·͏
    →Frame͕Drop͞ΕΔ
    16ms
    UI
    Drawing
    LameWork
    App
    Events
    UI
    Drawing
    UI
    Drawing
    Main Thread(UI Thread)
    PROCESS
    16ms 16ms
    Drop
    Over 16ms
    60FPSͷࣦഊ

    View Slide

  29. ɾλεΫΛNTGSBNFʹ཈͑Δ
    60FPSͷ࣮ݱํ๏
    ɾλεΫΛ෼ࢄ͢Δ

    View Slide

  30. ɾωοτϫʔΫॲཧ
    16ms/frameΛΦʔόʔ͠΍͍͢λεΫ
    ɾ*0ॲཧ
    ˠϝΠϯεϨουͱผεϨουͰ࣮ߦ

    View Slide

  31. 1. εϨου(ҎޙϫʔΧʔεϨου)ͷੜ੒
    2. ϫʔΧʔεϨου্ͰλεΫ࣮ߦ
    3. ݁ՌΛϝΠϯεϨου΁

    Worker Thread
    Main Thread(UI Thread)
    Update some UI
    Prep some work
    Do some long work
    ϚϧνεϨοσΟϯά


    View Slide

  32. ɾϝϞϦ؅ཧϦʔΫ
    ϚϧνεϨοσΟϯάͷҰൠతͳίετ
    ɾεϨουੜ੒ͷΦʔόʔϔου

    View Slide

  33. εϨουΛ͍ͭੜ੒͠ɺഁغ͢Δ͔͸ඞܾͣΊΔ
    ɾView͔Βͷࢀর(Activity) -> LeakCanaryͷར༻
    ϝϞϦ؅ཧ/ϦʔΫରԠ
    ɾMemory Profilerͷར༻

    View Slide

  34. Memory Profiler
    1. ώʔϓɺϝϞϦྔͷλΠϜϥΠϯ
    2. ಛఆͷλΠϛϯάͰͷΞϩέʔτ͞ΕͨΦϒδΣΫτ
    1 2
    ࢀߟ
    IUUQTEFWFMPQFSBOESPJEDPNTUVEJPQSPpMFNFNPSZQSPpMFS IMKB

    View Slide

  35. ɾCPU Profileͷར༻
    εϨουੜ੒ͷΦʔόʔϔουରԠ
    ɾεϨουੜ੒͸Φʔόʔϔουίετ͕ߴ͍
    ɾεϨουࣗମΛݮΒ͢(࠷େݸ਺͸CPUʹґଘ)
    ɾ࠶ར༻(RxJava͸ThreadPoolΛར༻)
    ࢀߟ
    IUUQTEFWFMPQFSBOESPJEDPNTUVEJPQSPpMFDQVQSPpMFS IMKB

    View Slide

  36. ɾ6*ͷΧΫπΩ
    UIͷ໰୊
    ɾ$16 (16ʹෛ୲Λ༩͑Δॲཧ

    View Slide

  37. ϨϯμϦϯά

    View Slide

  38. ɾը໘ͷσʔλ͸πϦʔߏ଄
    AndroidϨϯμϦϯάͷಛ௃
    ɾιϑτ΢ΣΞඳըͱϋʔυ΢ΣΞΞΫηϥϨʔγϣϯ
    Ҏޙ)8"

    View Slide

  39. ɾτϥόʔαϧͳϓϩηεͷͨΊίετ͕ߴ͍
    ϨϯμϦϯάͷίετ
    ɾ7JFXͷݺͼग़͠
    ɾ਌͕ࢠΛଌఆ NFBTVSF

    3PPU
    7JFX
    7JFX
    7JFX
    7JFX 7JFX 7JFX
    7JFX
    ɾ࠶ؼత
    ɾSPPUͷαΠζ͕ܾఆ
    ɾը໘্ͷҐஔΛܾఆ MBZPVU

    ɾ༿ϊʔυͷҐஔ͕ܾఆ

    View Slide

  40. ιϑτ΢ΣΞඳըͱHWA
    ɾ$16PS(16
    ඳըํ๏
    ιϑτ΢ΣΞඳը HWA
    Invalidate
    Canvas ผϨΠϠʔ
    શͯͷϊʔυʹӨڹ dirtyͷΈߋ৽

    View Slide

  41. Πϝʔδ
    $BOWBT
    ιϑτ΢ΣΞඳը HWA
    →શߋ৽ →dirtyͷΈ
    $BOWBT
    ϋʔυ΢ΣΞ
    ϨΠϠʔ
    dirty

    View Slide

  42. ɾਂ͍View֊૚
    ɾιϑτ΢ΣΞඳըʹ͓͚ΔonDraw()
    ɾOverdrawingʹΑΔGPU࣌ؒͷফඅ
    ࣮૷্ͷ໰୊

    View Slide

  43. Ұ୴πʔϧΛ࢖ͬͯΈΔ

    View Slide

  44. ɾ։ൃऀΦϓγϣϯ
    ɹɾGPUϨϯμϦϯάͷϓϩϑΝΠϧ࡞੒
    ɹɾGPUΦʔόʔυϩʔΛσόοά
    ɹɾGPUදࣔͷߋ৽Λදࣔ
    ϨϯμϦϯάͷσʔλղੳπʔϧ
    ɾLayoutInspector

    View Slide

  45. ɾLayoutͷώΤϥϧΩʔΛRuntimeͰղੳ͢ΔͨΊͷπʔ
    ϧɻxmlɺ·ͨ͸ಈతੜ੒ͨ͠ViewͳͲͷ֊૚ߏ଄͕Θ͔Β
    ͳ͍ࡍʹར༻͢Δɻ
    ɾTools -> LayoutInspector͔Β࣮ߦͰ͖Δ
    ɾproject_root/capturesʹRuntimeͷεφοϓγϣοτ͕อଘ͞ΕΔ
    LayoutInspector

    View Slide

  46. όʔδϣϯ؅ཧ(6*࣮૷ߏ଄ϓϩύςΟ
    Captureͷ੾Γସ͑ Viewߏ଄
    ※) staging؀ڥͷͨΊdebug tool view͕දࣔ͞Ε͍ͯΔ
    ViewϓϩύςΟ
    αϯϓϧ

    View Slide

  47. ɾGPUϨϯμϦϯάͷϓϩϑΝΠϧ࡞੒
    ɾGPUϨϯμϦϯάͷϓϩηεຖͷίετ
    ɾGPUΦʔόʔυϩʔΛσόοά
    ɾGPUϨϯμϦϯάͷOverdraw
    ɾGPUදࣔͷߋ৽Λදࣔ
    ɾGPUϨϯμϦϯάߋ৽৔ॴͷಛఆ
    ։ൃऀΦϓγϣϯ

    View Slide

  48. ։ൃऀΦϓγϣϯ
    GPUϓϩϑΝΠϧ
    GPUΦʔόʔυϩʔ
    - ࢵɺԫ྘ͷΤϦΞ
    GPUදࣔͷߋ৽
    - ੺͍ਖ਼ํܗ
    16msϥΠϯ
    1frame
    αϯϓϧ

    View Slide

  49. 'J/$ΞϓϦʹࢼͯ͠ΈΔ

    View Slide

  50. 'J/$ΞϓϦͷར༻ස౓͕ߴ͍ը໘Ͱଌఆ
    ɾ੺͍৭͸Overdrawճ਺͕4ճΛ௒͑Δ΋ͷɻ
    ɾఆظ࣮ߦΞχϝʔγϣϯ͕૸Δ౓ʹɺGPU Profilerͷ੺
    ͍όʔ͕௓Ͷ্͕Δ
    ɾఆظ࣮ߦΞχϝʔγϣϯΛࢭΊͯ΋ɺͳ͔ͥ਺ඵຖʹը
    ໘ͷ΢Οϯυ΢͕఺໓͠ɺΞοϓσʔτ͕૸ͬͯ͠·͏ɻ
    ɾGPU Profilerͷ੨͍όʔ͕େ͖͍ɻ
    ϨϯμϦϯάύϑΥʔϚϯεଌఆ

    View Slide

  51. ύϑΥʔϚϯεͷج४Λઃஔ͢Δ
    ج४Λઃఆ͢Δ
    ɾແବͳվળΛ͠ͳ͍ͨΊ
    ɾఆྔత͕೉͚͠Ε͹ɺج४Λ࡞Δ
    ɾߴ඼࣭ΞϓϦ
    ɾಉػೳΞϓϦ

    View Slide

  52. *OTUBHSBNͱͷൺֱ ՄೳͳݶΓಉ৚݅

    ɾ੺͍όʔ͸ಉ͡ఔ౓
    ɾ੨͍όʔ͕શମతʹߴ͍ɻ
    ɾશମతʹOverdraw͕গͳ͍ɻ
    ɹɾView֊૚͕গͳ͍
    ɹɾແବͳΞϧϑΝ͕ͳ͍
    ɹɾద੾ͳΫϦοϐϯάॲཧ
    ߴ඼࣭ΞϓϦͱͷൺֱ

    View Slide

  53. ɾOverdraw
    RecyclerViewͷitemViewͷ༨෼ͳView֊૚
    ɾGPU Profiler
    ɾ੨͍όʔ͕େ͖͍ = onDraw()ͷDisplayListੜ੒ͷίετɻ
    onDraw()ͷස౓ɺoff-screenͷϨϯμϦϯάɺonDraw()ͷॲཧ͕ॏ͍
    ɾGPUඳըͷߋ৽
    ɾఆظ࣮ߦΞχϝʔγϣϯͷίετ
    ɹɾFiNCͪΌΜ(ΞΠίϯ)
    ۩ମతͳ໰୊఺

    View Slide

  54. ɾෆཁͳbackgroundͷ࡟আ
    Overdraw΁ͷରԠ
    ɾਂ͍ViewΛઙ͘͢Δ

    View Slide

  55. Viewίϯςφʹແବͳ֊૚͸ͳ͍͔ʁ
    ෆཁͳbackgroundͷ࡟আ
    TextView FrameLayout
    RecyclerView

    View Slide

  56. ɾxml্ͰແବͳViewίϯςφΛ࡞Βͳ͍
    ਂ͍ViewΛઙ͘͢Δ
    ɾಈతʹ௥Ճ͢Δ৔߹Ͱ΋ɺmergeΛݕ౼
    ɾConstraintLayoutΛར༻͢Δ

    View Slide

  57. վળ݁Ռ
    վળલ վળޙ

    View Slide

  58. ɾPO%SBX಺ͰͷϝϞϦΞϩέʔτېࢭ
    GPUϨϯμϦϯά΁ͷରԠ
    ɾPO%SBX಺ͰͷMPPQॲཧͷվળ
    ɾPGGTDSFFOϨϯμϦϯάͷఀࢭ

    View Slide

  59. PO%SBX͸ίετ͕ߴ͍
    ɾෆมΦϒδΣΫτ͸ɺελοΫྖҬʹల։͢Δ
    Before
    onDraw಺ͰͷϝϞϦΞϩέʔτېࢭ
    ɾGC͕ߴ͍ස౓Ͱ૸ͬͯ͠·͏
    After

    View Slide

  60. MPPQͷ$BOWBTૢ࡞͸ίετ͕ߴ͍
    ɾGPUϨϯμϦϯά͸GPU΁ͷΦϒδΣΫτΛੜ੒͢Δ
    onDraw಺Ͱͷloopॲཧͷվળ
    ɾCanvas#drawLineͰloopͰ͸ͳ͘ɺCanvas#drawLinesΛ࢖͏

    View Slide

  61. PGGεΫϦʔϯ࣌ͷॲཧΛࢭΊΔ
    off-screenͷϨϯμϦϯάͷېࢭ
    ɾBVUPTMJEF͕ద༻
    ɾλϒ ΧελϜ7JFX1BHFS
    Ҡಈ࣌ʹࢭΊΔ
    ɾWJTJCMF6TFS)JOU

    View Slide

  62. ఆظ࣮ߦΞχϝʔγϣϯͷ࣮ߦ
    GPUඳըͷߋ৽
    ˠΧελϜϏϡʔͷ)8"Λ༗ޮʹ

    View Slide

  63. ɾ6*ͷجૅΛֶͼɺΞϯνύλʔϯΛ౿·ͳ͍
    UIվળͷ·ͱΊ
    ɾ5PPMΛద੾ʹ࢖͍ɺύϑΥʔϚϯεΛվળ

    View Slide

  64. 6*ͷվળ
    σʔλ௨৴ྔ
    όοςϦʔফඅ
    ύϑΥʔϚϯενϡʔχϯά࣮ફ

    View Slide

  65. Ωϟογϡͷར༻
    σʔλ௨৴ྔΛ࡟ݮ͢ΔͨΊʹ
    ωοτϫʔΫ
    Packet
    Packet
    Packet
    ը૾σʔλͷ࡟ݮ
    ม׵
    γϦΞϥΠθʔγϣϯ

    View Slide

  66. Ωϟογϡͷར༻

    View Slide

  67. ϝϞϦ
    Ωϟογϡͱ͸ʁ
    σʔλͷϩʔυΛߴ଎Խ͢ΔͨΊͷ࢓૊Έ
    σΟεΫ

    View Slide

  68. Ϣʔεέʔεʹ߹Θͤͯ࢖͏
    σʔλอ࣋ظؒ
    ϝϞϦΩϟογϡ σΟεΫΩϟογϡ
    ࣮ߦεϨου
    ΞϓϦϓϩηε Πϯετʔϧத
    ͲͷεϨουͰ΋ྑ͍ ϫʔΧʔεϨου
    อଘྖҬ গͳ͍ ଟ͍
    ϝϞϦ vs σΟεΫΩϟογϡ

    View Slide

  69. ɾϝϞϦΩϟογϡ༻ͷAndroidఏڙΫϥε
    →࢖༻ՄೳϝϞϦ্ݶͷνΣοΫ
    →্ه͔ΒLruCacheͷར༻ՄೳϝϞϦྔΛׂΓ౰ͯ
    ࢀߟ) https://developer.android.com/topic/performance/graphics/cache-bitmap
    ɾ࢖༻ස౓͕௿͍σʔλΛ࡟আ͍ͯ͘͠
    LruCacheΛ༻͍ͨϝϞϦΩϟογϡ

    View Slide

  70. ɾσΟεΫ: ετϨʔδͷ2%ΛׂΓ౰ͯ
    (5MBʙ50MBͷൣғ಺)
    ࢀߟ) https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso3/Utils.java#L163-L182
    ɾsquareࣾͷը૾ϩʔυ&ΩϟογϡͷϥΠϒϥϦ
    ࢀߟ) https://github.com/JakeWharton/picasso2-okhttp3-downloader/blob/master/src/main/java/com/jakewharton/picasso/OkHttp3Downloader.java
    ɾΧελϜΩϟογϡ(Okhttp3)
    ɾϝϞϦ: ώʔϓྖҬͷ15%ΛׂΓ౰ͯ
    ࢀߟ) https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso3/Utils.java#L184-L190
    PicassoΛ༻͍ͨϝϞϦ/σΟεΫΩϟογϡ

    View Slide

  71. Ωϟογϡ͸ೋछྨ͋ΓɺϝϞϦ͸شൃੑɺσΟε
    Ϋ͸ෆشൃੑ
    Ωϟογϡ͸σʔλ΁ͷΞΫηεΛߴ଎Խ͢Δ
    Ωϟογϡར༻ͷ·ͱΊ
    →σʔλϩʔυͷͨΊͷωοτϫʔΫॲཧճ਺͕ݮ
    গ͠ɺύϑΥʔϚϯε͕޲্͢Δɻ

    View Slide

  72. Ωϟογϡͷར༻
    σʔλ௨৴ྔΛ࡟ݮ͢ΔͨΊʹ
    ωοτϫʔΫ
    Packet
    Packet
    Packet
    ը૾σʔλͷ࡟ݮ
    ม׵
    γϦΞϥΠθʔγϣϯ

    View Slide

  73. γϦΞϥΠθʔγϣϯ

    View Slide

  74. ྫ)
    ɾAPI௨৴ͰͷKotlin 㲗 JSON
    ɾΩϟογϡ࣌ͷϑΝΠϧॻ͖ࠐΈ
    ௚ྻԽͷ͜ͱɻಛఆͷ؀ڥʹґଘͨ͠ΦϒδΣΫτ
    ΛόΠτྻʹม׵͢Δ͜ͱ
    γϦΞϥΠθʔγϣϯͱ͸ʁ
    ม׵

    View Slide

  75. γϦΞϥΠθʔγϣϯͷύϑΥʔϚϯε
    ϝϦοτ
    ςΩετ(JSON, XML) όΠφϦʔܗࣜ
    Մಡੑ͕ߴ͍
    σϝϦοτ ແବͳσʔλ͕ଟ͍
    σʔλྔ͕গͳ͍
    Մಡੑ͕௿͍
    ςΩετ vs όΠφϦʔ

    View Slide

  76. +40/ͰͷςΩετܗࣜ
    ɾςΩετϕʔεͷܗࣜ͸৑௕Ͱσʔλྔ͕ଟ͘ͳΔ
    {
    “id”: 0,
    “name”: “bison”,
    “image”: “https://bisonworks/bisons/1/image”
    }
    ۭന
    Ϧλʔϯ
    ࢀর
    JSON

    View Slide

  77. ɾprotoϑΝΠϧΛఆٛ
    →ίϯύΠϧ
    →ݴޠ͝ͱͷߏ଄ମͷੜ੒
    ɾόΠφϦܗࣜͰγϦΞϥΠζ͞ΕΔɻ
    ɾෳ਺ݴޠؒͰͷҰ؏ੑΛอͯΔ
    ɾprotoϑΝΠϧ͸Մಡੑ΋ߴ͍
    message Animal {
    required string name = 1;
    required int32 id = 2;
    optional string image =3;
    }
    Protocol Buffers

    View Slide

  78. ɾςΩετܗࣜ(JSON, XML)͸Մಡੑ͸ߴ͍͕ɺσʔλྔ͸ଟ͍
    ɾόΠφϦʔܗࣜ͸Մಡੑ͸௿͍͕ɺσʔλྔ͸গͳ͍ɻ
    ɾProtocol Buffers͸DSLͷΑ͏ͳ΋ͷͰɺՄಡੑ͕ߴ͘ɺ
    ͔ͭૹड৴࣌ͷγϦΞϥΠζ͞Εͨσʔλྔ΋গͳ͍
    γϦΞϥΠθʔγϣϯͷ·ͱΊ
    →Protocol BufferͰՄಡੑߴ͘ɺσʔλྔ͕গͳ͍γϦ
    ΞϥΠζΛߦ͏

    View Slide

  79. Ωϟογϡͷར༻
    σʔλ௨৴ྔΛ࡟ݮ͢ΔͨΊʹ
    ωοτϫʔΫ
    Packet
    Packet
    Packet
    ը૾σʔλͷ࡟ݮ
    ม׵
    γϦΞϥΠθʔγϣϯ

    View Slide

  80. ը૾σʔλͷ࡟ݮ

    View Slide

  81. ը૾ϑΥʔϚοτʹؔͯ͠
    ը૾ͷϑΥʔϚοτʹ஫ҙ͢Δ
    ɾσʔλྔ͕ஶ͘͠มΘΔ
    ɾը૾ͷΫΦϦςΟ͕มΘΔ

    View Slide

  82. ը૾ϑΥʔϚοτνʔτγʔτ
    ࢀߟ
    IUUQTEFWFMPQFSBOESPJEDPNUPQJDQFSGPSNBODFOFUXPSLYGFS

    View Slide

  83. WebPͷύϑΥʔϚϯε
    Մٯѹॖͷ৔߹ɺPNGΑΓ26%খ͍͞
    ෆՄٯѹॖͷ৔߹ɺJPEGΑΓ25-34%খ͍͞
    ࢀߟ
    IUUQTEFWFMPQFSTHPPHMFDPNTQFFEXFCQ

    View Slide

  84. WebPҎ֎ͷ৔߹
    PNG͔JPEG͔

    View Slide

  85. PNGͱJPEG
    PNG
    JPEG
    ɾಁաʹରԠ
    ɾՄٯѹॖ
    ɾෆՄٯѹॖ

    View Slide

  86. Ϣʔεέʔε
    PNG
    JPEG
    ɾγϯϓϧͳը૾
    ɾෳࡶͳը૾
    Α͘ݴΘΕΔը૾ͷ࢖͍෼͚

    View Slide

  87. γϯϓϧͳը૾ͷఆٛͱ͸

    View Slide

  88. γϯϓϧͳը૾
    PNG
    JPEG
    ɾෳࡶͳۂઢ͕ଘࡏ͠ͳ͍ܗ
    ɾ৭ͷόϦΤʔγϣϯ͕গͳ͍
    ɾෳ਺ͷ৭ͷόϦΤʔγϣϯ
    ɾෳࡶͳۂઢ

    View Slide

  89. ͳ͔ͥʁ

    View Slide

  90. PNGѹॖͷΞϧΰϦζϜ(Indexed Format)
    RGBΛࢀর͢Δܗʹมߋ͢Δ
    ɾը૾͸ϐΫηϧ͝ͱʹRGB৘ใΛ࣋ͭ
    ɾ8bit(256֊ௐ) * 3 = 24bit = 2^24 ≒ 1600ສ৭
    ɾϐΫηϧ͕࣋ͭ৘ใ͸IndexͷΈ
    ɾΧϥʔύϨοτΛ࣋ͭ(্ݶΛઃ͚Δ)

    View Slide

  91. ୯ҐϐΫηϧͷ৘ใྔ͕ܹݮ͢Δ
    ύϨοτ਺͸2,4,16,256͕ࢦఆͰ͖Δ
    ɾ1byteͰදݱͰ͖Δ
    24bit = 3bytes 1byte

    View Slide

  92. JPEGͷΞϧΰϦζϜ
    8ϐΫηϧ͝ͱͷϒϩοΫʹ෼͚ͯॲཧ
    ϒϩοΫ಺Ͱ৘ใΛϑΟϧλϦϯά͢Δ

    View Slide

  93. ௚ઢతͳڥքʹऑ͍
    ڥք͕ΑΓ௚ઢͩͱը࣭͕ѱ͘ͳΔ
    8pixel

    View Slide

  94. ໨ࢹνΣοΫ
    ਓؒͷ໨͸͍͍Ճݮ
    ໨ࢹνΣοΫͰσʔλྔͷ࡟ݮΛʂ

    View Slide

  95. ը૾σʔλ࡟ݮͷ·ͱΊ
    WebPରԠ͍ͯ͠Ε͹WebPͷҰ୒
    JPEGɺPNGͷσʔλྔΛཧղ͢Δɻ
    ͦͷ্Ͱ࣮ࡍͷ໨Ͱ֬ೝͯ͠ѹॖ͢Δɻ

    View Slide

  96. 6*ͷվળ
    σʔλ௨৴ྔ
    όοςϦʔফඅ
    ύϑΥʔϚϯενϡʔχϯά࣮ફ

    View Slide

  97. ɾϓϩηοα(ϋʔυ)Ͱిྲྀ͕ྲྀΕΔ
    ɾOS(ιϑτ)͕CPUͷϞʔυมߋΛߦ͏
    → CPUϞʔυΛ௿͘อͭ
    όοςϦʔফඅΛ࡟ݮ͢ΔͨΊʹ

    View Slide

  98. $16͸ిྗΛޮ཰తʹ࢖͓͏ͱ͢Δ
    CPUʹ͸Ϟʔυ͕͋Δ

    View Slide

  99. ࣍ͷॲཧʹඋ͑Δ,FFQ"XBLFͷίετ
    ϞόΠϧ௨৴࣌ͷফඅిྗ

    View Slide

  100. ϞόΠϧ௨৴Λࡉ੾Εʹͨ͘͠ͳ͍

    View Slide

  101. όονॲཧͱ͸ʁ
    ෼ࢄͨ͠λεΫΛಉ࣌ʹ࣮ߦ͢Δ͜ͱɻΦʔόʔϔουΛݮগͤ͞Δɻ
    Task
    Before After
    Executed
    Task
    Executed
    Task
    Executed
    Task
    Task
    Task
    Executed
    1
    1
    1
    1
    ϞόΠϧ௨৴࣌ͷফඅిྗ

    View Slide

  102. αʔόʔͱͷσʔλͷಉظੑ͕ݫີͰͳ͍΋ͷ
    ࠷ѱɺσʔλ͕ࣦΘΕͯ΋໰୊͕ͳ͍΋ͷ
    ෼ੳϩάσʔλ
    ఆظతͳσʔλͷಉظ
    ϞόΠϧʹ͓͚Δόονॲཧ

    View Slide

  103. ɾJobSchedulerͱAlertManagerΛOSόʔδϣϯͰ࢖͍෼͚
    ɾෳ਺λεΫͷνΣΠϯ
    ɾδϣϒʹ੍ݶΛ͚ͭΒΕΔ
    ɾόοςϦʔফඅ/ωοτϫʔΫঢ়ଶ/ॆిঢ়ଶ/CPUͷঢ়ଶ/ετϨʔδͷۭ͖
    ɾ஗ԆͰ͖Δ(Deferrable)ఆظత/ϫϯλΠϜͳδϣϒʹ࢖͏
    WorkManager
    ɾόοΫΦϑ(ࢦ਺ؔ਺తස౓)αϙʔτ

    View Slide

  104. ϘτϧωοΫΛ୳Γ͍ͨ

    View Slide

  105. #BUUFSZ)JTUPSJBO
    ୺຤ͷόοςϦʔফඅྔΛՄࢹԽग़དྷΔπʔϧ
    1. OverViewͷάϥϑ
    ɾ߲໨ΛϐοΫͨ͠ΧελϜάϥϑ΋Ͱ͖Δ
    2. App Selection
    ɾΞϓϦ/߲໨ͰϑΟϧλՄೳ
    3. Tables
    ɾΞϓϦؒൺֱ/ώετϦʔ(ྦྷੵσʔλ)/ΞϓϦελοπ
    4. ݁Ռ
    ɾϑΟϧλ݁ՌΛදࣔ͢Δ
    σʔλղੳπʔϧ

    View Slide

  106. ɾ୺຤ͷి஑ফඅྔΛՄࢹԽग़དྷΔπʔϧ
    ɾDocker্Ͱಈ͘(Α͏ʹͳͬͯΔʂ)
    1. OverViewͷάϥϑ
    2. App Selection
    3. Tables
    4. ݁Ռ
    Battery Historianͷશମతͳߏ੒

    View Slide

  107. ɾެࣜ: https://github.com/google/battery-historian
    EPDLFSSVOQQPSUHDSJPBOESPJECBUUFSZIJTUPSJBOTUBCMFQPSU
    ɾ͸ԿͰ΋Α͍ɻ9999ͱ͔ʹ͓ͯ͘͠
    IUUQMPDBMIPTUQPSU
    ɾAndroid୺຤಺ʹbugreportsͷdir͕͋Δ
    adb bugreport bugreport.zip
    ※) ެࣜͷͰΤϥʔ͕ग़Δਓ͸ී௨ʹabdͰϑΝΠϧసૹ͍ͯͩ͘͠͞ɻ
    ؀ڥߏங

    View Slide

  108. Battery Level͸1ࠁΈͳͷͰɺ୹͍෦෼͕ফඅిྗ͕ߴ͍෦෼
    όοςϦʔͷղੳํ๏

    View Slide

  109. CPUͷϞʔυ
    ϞόΠϧ௨৴͸ίετ͕ߴ͍
    όοςϦʔͷղੳํ๏

    View Slide

  110. ܧଓతଌఆ͕೉͍͠

    View Slide

  111. ܦݧ্ɺٙͬͯΈΔͱྑͦ͞͏ͳ͜ͱ
    όοΫάϥ΢ϯυͰఆظతͳॲཧΛ࣮ߦ͍ͯ͠Δ
    ը໘্Ͱଟ͘ͷωοτϫʔΫॲཧΛߦ͍ͬͯΔλεΫ
    ఆੑతʹ΋Ξϓϩʔν͢Δ
    ɾස౓ɺॏ͍ॲཧ
    ɾෆద੾ͳϥΠϑαΠΫϧ(onResumeͳͲ)Ͱͷίʔϧ

    View Slide

  112. CPUͷϞʔυ(awake, sleep)ΛSleep΁
    ϞόΠϧ௨৴͸஗ԆΛݕ౼͢Δ
    ఆྔͱఆੑతͳ྆໘͔ΒΞϓϩʔν͢Δ
    όοςϦʔফඅͷ࠷దԽ·ͱΊ

    View Slide

  113. RailsςοΩʔͳ࿩
    ϚΠΫϩαʔϏεͷཁૉٕज़ͷ࿩
    Ϛωδϝϯτͷ࿩
    શମతͳ·ͱΊ

    View Slide

  114. શମతͳ·ͱΊ
    ࠶ݱੑ͕௿͍ύϑΥʔϚϯε໰୊ʹରॲ͢Δ
    ύϑΥʔϚϯεͷલఏ஌ࣝΛ͚ͭɺఆੑͱఆྔͱͷ
    ྆ྠ͔ΒΞϓϩʔν͍ͯ͘͠

    View Slide