再現性が低い改善が難しいパフォーマンス問題に対処するために、パフォーマンスの前提知識をつけ、定性と定量との両輪からアプローチしていく方法論に関して話しています。
- パフォーマンス改善の発端 - アプリパフォーマンスの定義 - パフォーマンス課題 - UIの改善 - データ通信量 - バッテリー消費
"OESPJEʹ͓͚ΔύϑΥʔϚϯενϡʔχϯά࣮ફ@neonankiti
View Slide
גࣜձࣾFiNC Technologies— Mobile Engineer(Android/iOS/Flutter)ೆཬ༐ؾ@neonankiti#εϊϘʔ #όεέ #Ωϟϯϓ #Γ #GoldGymࣗݾհ
ύϑΥʔϚϯε՝ͷࢦఠCTOΞϓϦͷಈ࡞͓ͳ͍ʁͯ͘͠ɻΘ͔Γ·ͨ͠ʂʂσʔλফඅྔ͘ͳ͍ʁͯ͠ɻΊͬͪΌి৯ͬͯͳ͍ʂʁʂʁʂ
ͳΜ͔Θ͔ΒΜ͚ͲɺͬͯΈΔ͔
νʔϜͷ࠶ฤBefore Afterػೳ1ػೳ2ػೳ3ػೳ1ػೳ2ػೳ3ڞ௨ج൫
ڞ௨ج൫νʔϜര
ͳͥνʔϜΛ࠶ฤͨ͠ͷ͔ʁνʔϜମ੍ػೳ(υϝΠϯ)୯Ґ→ػೳ୯ҐͰ͕ᐆດͳ͕ੜ͡Δ
۩ମతʹى͖ͨɾݪҼͷΘ͔Γਏ͍Ϋϥογϡɾσʔλ௨৴ྔͷ૿ՃɾόοςϦʔফඅͷ૿ՃɾͳΜ͔ͬ͞Γͯ͠Δ
ڞ௨ج൫νʔϜͷൃಛఆͷػೳʹґଘ͠ͳ͍Λվળ͠ΞϓϦͷ࣭ΛߴΊΔ͜ͱ͕
RailsςοΩʔͳϚΠΫϩαʔϏεͷཁૉٕज़ͷϚωδϝϯτͷΞϓϦύϑΥʔϚϯεվળͷલʹ
ΞϓϦύϑΥʔϚϯεͱʁ
ϢʔβʔମݧʹӨڹΛ༩͑ΔཁૉɾΫϥογϡɾANRɾσʔλϩʔυɾUI(Ξχϝʔγϣϯ)ɾόοςϦʔফඅɾσʔλ௨৴ྔΞϓϦύϑΥʔϚϯε
ϦϦʔεޙʹൃੜ͍͢͠ݦࡏԽͷλΠϛϯάϦϦʔεςετʷύϑΥʔϚϯεѱԽ
ͳͥϦϦʔεޙʹൃੜ͍͢͠ͷ͔ʁςετͰͷ࠶ݱੑ͕͍͠ɾຊ൪։ൃ2"ڥͷࠩҟɾ࣌ؒత੍Ͱػೳςετ͕ࠔ
ςετΑΓલͷϑϩʔͰରࡦ͢Δ࣮࣌ʹՄೳͳݶΓࢭΊΔϦϦʔεςετʷύϑΥʔϚϯεѱԽ࣮
ΤϯδχΞ͕ग़དྷΔ͜ͱɾલఏͱͳΔࣝΛ͚ͭΔɾΞϯνύλʔϯΛ౿·ͳ͍࣮ΞϓϦύϑΥʔϚϯεʹؔͯ͠
ຊͷτϐοΫ
ຊ߲͢ɾ6*ͷվળɾσʔλ௨৴ྔɾόοςϦʔফඅ࠶ݱੑ͕͍߲͠
RailsςοΩʔͳϚΠΫϩαʔϏεͷཁૉٕज़ͷϚωδϝϯτͷΞϓϦύϑΥʔϚϯενϡʔχϯά࣮ફ
ύϑΥʔϚϯενϡʔχϯά࣮ફ6*ͷվળσʔλ௨৴ྔόοςϦʔফඅ
ɾ6*ͷΧΫπΩUIͷɾ$16 (16ʹෛ୲Λ༩͑Δॲཧ
ͳͥ6*ΧΫπΫͷ͔ʁ
'SBNF3BUF͕͍
ɾFPS = Frame Per Secondsɻɾਓؒɺ60FPS͕࠷దͱײ͡ΔFrame Rateͱɾ60FPS ≒ 16ms/frame≒1ඵؒʹॲཧ͞ΕΔϑϨʔϜ(੩ࢭը໘)
'14ͷ࣮ݱ
ΞϓϦͷىಈ = LinuxϓϩηεͷىಈશͯͷλεΫϝΠϯεϨου(UIεϨου)Ͱ࣮ߦUIDrawingLameWorkAppEventsUIDrawingUIDrawingMain Thread(UI Thread)PROCESSAndroidΞϓϦͷ࣮ߦϓϩηεࢀߟIUUQTXXXZPVUVCFDPNXBUDI W)[email protected]#8R:U7*S';8S#;D#@XG98
NTGSBNFΛӽ͑ͯ͠·͏→Frame͕Drop͞ΕΔ16msUIDrawingLameWorkAppEventsUIDrawingUIDrawingMain Thread(UI Thread)PROCESS16ms 16msDropOver 16ms60FPSͷࣦഊ
ɾλεΫΛNTGSBNFʹ͑Δ60FPSͷ࣮ݱํ๏ɾλεΫΛࢄ͢Δ
ɾωοτϫʔΫॲཧ16ms/frameΛΦʔόʔ͍͢͠λεΫɾ*0ॲཧˠϝΠϯεϨουͱผεϨουͰ࣮ߦ
1. εϨου(ҎޙϫʔΧʔεϨου)ͷੜ2. ϫʔΧʔεϨου্ͰλεΫ࣮ߦ3. ݁ՌΛϝΠϯεϨουWorker ThreadMain Thread(UI Thread)Update some UIPrep some workDo some long workϚϧνεϨοσΟϯά
ɾϝϞϦཧϦʔΫϚϧνεϨοσΟϯάͷҰൠతͳίετɾεϨουੜͷΦʔόʔϔου
εϨουΛ͍ͭੜ͠ɺഁغ͢Δ͔ඞܾͣΊΔɾView͔Βͷࢀর(Activity) -> LeakCanaryͷར༻ϝϞϦཧ/ϦʔΫରԠɾMemory Profilerͷར༻
Memory Profiler1. ώʔϓɺϝϞϦྔͷλΠϜϥΠϯ2. ಛఆͷλΠϛϯάͰͷΞϩέʔτ͞ΕͨΦϒδΣΫτ1 2ࢀߟIUUQTEFWFMPQFSBOESPJEDPNTUVEJPQSPpMFNFNPSZQSPpMFS IMKB
ɾCPU Profileͷར༻εϨουੜͷΦʔόʔϔουରԠɾεϨουੜΦʔόʔϔουίετ͕ߴ͍ɾεϨουࣗମΛݮΒ͢(࠷େݸCPUʹґଘ)ɾ࠶ར༻(RxJavaThreadPoolΛར༻)ࢀߟIUUQTEFWFMPQFSBOESPJEDPNTUVEJPQSPpMFDQVQSPpMFS IMKB
ϨϯμϦϯά
ɾը໘ͷσʔλπϦʔߏAndroidϨϯμϦϯάͷಛɾιϑτΣΞඳըͱϋʔυΣΞΞΫηϥϨʔγϣϯҎޙ)8"
ɾτϥόʔαϧͳϓϩηεͷͨΊίετ͕ߴ͍ϨϯμϦϯάͷίετɾ7JFXͷݺͼग़͠ɾ͕ࢠΛଌఆ NFBTVSF3PPU7JFX7JFX7JFX7JFX 7JFX 7JFX7JFXɾ࠶ؼతɾSPPUͷαΠζ͕ܾఆɾը໘্ͷҐஔΛܾఆ MBZPVUɾ༿ϊʔυͷҐஔ͕ܾఆ
ιϑτΣΞඳըͱHWAɾ$16PS(16ඳըํ๏ιϑτΣΞඳը HWAInvalidateCanvas ผϨΠϠʔશͯͷϊʔυʹӨڹ dirtyͷΈߋ৽
Πϝʔδ$BOWBTιϑτΣΞඳը HWA→શߋ৽ →dirtyͷΈ$BOWBTϋʔυΣΞϨΠϠʔdirty
ɾਂ͍View֊ɾιϑτΣΞඳըʹ͓͚ΔonDraw()ɾOverdrawingʹΑΔGPU࣌ؒͷফඅ্࣮ͷ
Ұ୴πʔϧΛͬͯΈΔ
ɾ։ൃऀΦϓγϣϯɹɾGPUϨϯμϦϯάͷϓϩϑΝΠϧ࡞ɹɾGPUΦʔόʔυϩʔΛσόοάɹɾGPUදࣔͷߋ৽ΛදࣔϨϯμϦϯάͷσʔλղੳπʔϧɾLayoutInspector
ɾLayoutͷώΤϥϧΩʔΛRuntimeͰղੳ͢ΔͨΊͷπʔϧɻxmlɺ·ͨಈతੜͨ͠ViewͳͲͷ֊ߏ͕Θ͔Βͳ͍ࡍʹར༻͢ΔɻɾTools -> LayoutInspector͔Β࣮ߦͰ͖Δɾproject_root/capturesʹRuntimeͷεφοϓγϣοτ͕อଘ͞ΕΔLayoutInspector
όʔδϣϯཧ(6*࣮ߏϓϩύςΟCaptureͷΓସ͑ Viewߏ※) stagingڥͷͨΊdebug tool view͕දࣔ͞Ε͍ͯΔViewϓϩύςΟαϯϓϧ
ɾGPUϨϯμϦϯάͷϓϩϑΝΠϧ࡞ɾGPUϨϯμϦϯάͷϓϩηεຖͷίετɾGPUΦʔόʔυϩʔΛσόοάɾGPUϨϯμϦϯάͷOverdrawɾGPUදࣔͷߋ৽ΛදࣔɾGPUϨϯμϦϯάߋ৽ॴͷಛఆ։ൃऀΦϓγϣϯ
։ൃऀΦϓγϣϯGPUϓϩϑΝΠϧGPUΦʔόʔυϩʔ- ࢵɺԫͷΤϦΞGPUදࣔͷߋ৽- ͍ਖ਼ํܗ16msϥΠϯ1frameαϯϓϧ
'J/$ΞϓϦʹࢼͯ͠ΈΔ
'J/$ΞϓϦͷར༻ස͕ߴ͍ը໘Ͱଌఆɾ͍৭Overdrawճ͕4ճΛ͑Δͷɻɾఆظ࣮ߦΞχϝʔγϣϯ͕ΔʹɺGPU Profilerͷ͍όʔ͕Ͷ্͕Δɾఆظ࣮ߦΞχϝʔγϣϯΛࢭΊͯɺͳ͔ͥඵຖʹը໘ͷΟϯυ͕໓͠ɺΞοϓσʔτ͕ͬͯ͠·͏ɻɾGPU Profilerͷ੨͍όʔ͕େ͖͍ɻϨϯμϦϯάύϑΥʔϚϯεଌఆ
ύϑΥʔϚϯεͷج४Λઃஔ͢Δج४Λઃఆ͢ΔɾແବͳվળΛ͠ͳ͍ͨΊɾఆྔత͕͚͠Εɺج४Λ࡞Δɾߴ࣭ΞϓϦɾಉػೳΞϓϦ
*OTUBHSBNͱͷൺֱ ՄೳͳݶΓಉ݅ɾ͍όʔಉ͡ఔɾ੨͍όʔ͕શମతʹߴ͍ɻɾશମతʹOverdraw͕গͳ͍ɻɹɾView֊͕গͳ͍ɹɾແବͳΞϧϑΝ͕ͳ͍ɹɾదͳΫϦοϐϯάॲཧߴ࣭ΞϓϦͱͷൺֱ
ɾOverdrawRecyclerViewͷitemViewͷ༨ͳView֊ɾGPU Profilerɾ੨͍όʔ͕େ͖͍ = onDraw()ͷDisplayListੜͷίετɻonDraw()ͷසɺoff-screenͷϨϯμϦϯάɺonDraw()ͷॲཧ͕ॏ͍ɾGPUඳըͷߋ৽ɾఆظ࣮ߦΞχϝʔγϣϯͷίετɹɾFiNCͪΌΜ(ΞΠίϯ)۩ମతͳ
ɾෆཁͳbackgroundͷআOverdrawͷରԠɾਂ͍ViewΛઙ͘͢Δ
Viewίϯςφʹແବͳ֊ͳ͍͔ʁෆཁͳbackgroundͷআTextView FrameLayoutRecyclerView
ɾxml্ͰແବͳViewίϯςφΛ࡞Βͳ͍ਂ͍ViewΛઙ͘͢ΔɾಈతʹՃ͢Δ߹ͰɺmergeΛݕ౼ɾConstraintLayoutΛར༻͢Δ
վળ݁Ռվળલ վળޙ
ɾPO%SBXͰͷϝϞϦΞϩέʔτېࢭGPUϨϯμϦϯάͷରԠɾPO%SBXͰͷMPPQॲཧͷվળɾPGGTDSFFOϨϯμϦϯάͷఀࢭ
PO%SBXίετ͕ߴ͍ɾෆมΦϒδΣΫτɺελοΫྖҬʹల։͢ΔBeforeonDrawͰͷϝϞϦΞϩέʔτېࢭɾGC͕ߴ͍සͰͬͯ͠·͏After
MPPQͷ$BOWBTૢ࡞ίετ͕ߴ͍ɾGPUϨϯμϦϯάGPUͷΦϒδΣΫτΛੜ͢ΔonDrawͰͷloopॲཧͷվળɾCanvas#drawLineͰloopͰͳ͘ɺCanvas#drawLinesΛ͏
PGGεΫϦʔϯ࣌ͷॲཧΛࢭΊΔoff-screenͷϨϯμϦϯάͷېࢭɾBVUPTMJEF͕ద༻ɾλϒ ΧελϜ7JFX1BHFSҠಈ࣌ʹࢭΊΔɾWJTJCMF6TFS)JOU
ఆظ࣮ߦΞχϝʔγϣϯͷ࣮ߦGPUඳըͷߋ৽ˠΧελϜϏϡʔͷ)8"Λ༗ޮʹ
ɾ6*ͷجૅΛֶͼɺΞϯνύλʔϯΛ౿·ͳ͍UIվળͷ·ͱΊɾ5PPMΛదʹ͍ɺύϑΥʔϚϯεΛվળ
6*ͷվળσʔλ௨৴ྔόοςϦʔফඅύϑΥʔϚϯενϡʔχϯά࣮ફ
Ωϟογϡͷར༻σʔλ௨৴ྔΛݮ͢ΔͨΊʹωοτϫʔΫPacketPacketPacketը૾σʔλͷݮมγϦΞϥΠθʔγϣϯ
Ωϟογϡͷར༻
ϝϞϦΩϟογϡͱʁσʔλͷϩʔυΛߴԽ͢ΔͨΊͷΈσΟεΫ
Ϣʔεέʔεʹ߹Θͤͯ͏σʔλอ࣋ظؒϝϞϦΩϟογϡ σΟεΫΩϟογϡ࣮ߦεϨουΞϓϦϓϩηε ΠϯετʔϧதͲͷεϨουͰྑ͍ ϫʔΧʔεϨουอଘྖҬ গͳ͍ ଟ͍ϝϞϦ vs σΟεΫΩϟογϡ
ɾϝϞϦΩϟογϡ༻ͷAndroidఏڙΫϥε→༻ՄೳϝϞϦ্ݶͷνΣοΫ→্ه͔ΒLruCacheͷར༻ՄೳϝϞϦྔΛׂΓͯࢀߟ) https://developer.android.com/topic/performance/graphics/cache-bitmapɾ༻ස͕͍σʔλΛআ͍ͯ͘͠LruCacheΛ༻͍ͨϝϞϦΩϟογϡ
ɾσΟεΫ: ετϨʔδͷ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-L190PicassoΛ༻͍ͨϝϞϦ/σΟεΫΩϟογϡ
Ωϟογϡೋछྨ͋ΓɺϝϞϦشൃੑɺσΟεΫෆشൃੑΩϟογϡσʔλͷΞΫηεΛߴԽ͢ΔΩϟογϡར༻ͷ·ͱΊ→σʔλϩʔυͷͨΊͷωοτϫʔΫॲཧճ͕ݮগ͠ɺύϑΥʔϚϯε্͕͢Δɻ
γϦΞϥΠθʔγϣϯ
ྫ)ɾAPI௨৴ͰͷKotlin 㲗 JSONɾΩϟογϡ࣌ͷϑΝΠϧॻ͖ࠐΈྻԽͷ͜ͱɻಛఆͷڥʹґଘͨ͠ΦϒδΣΫτΛόΠτྻʹม͢Δ͜ͱγϦΞϥΠθʔγϣϯͱʁม
γϦΞϥΠθʔγϣϯͷύϑΥʔϚϯεϝϦοτςΩετ(JSON, XML) όΠφϦʔܗࣜՄಡੑ͕ߴ͍σϝϦοτ ແବͳσʔλ͕ଟ͍σʔλྔ͕গͳ͍Մಡੑ͕͍ςΩετ vs όΠφϦʔ
+40/ͰͷςΩετܗࣜɾςΩετϕʔεͷܗࣜͰσʔλྔ͕ଟ͘ͳΔ{“id”: 0,“name”: “bison”,“image”: “https://bisonworks/bisons/1/image”}ۭനϦλʔϯࢀরJSON
ɾprotoϑΝΠϧΛఆٛ→ίϯύΠϧ→ݴޠ͝ͱͷߏମͷੜɾόΠφϦܗࣜͰγϦΞϥΠζ͞ΕΔɻɾෳݴޠؒͰͷҰ؏ੑΛอͯΔɾprotoϑΝΠϧՄಡੑߴ͍message Animal {required string name = 1;required int32 id = 2;optional string image =3;}Protocol Buffers
ɾςΩετܗࣜ(JSON, XML)Մಡੑߴ͍͕ɺσʔλྔଟ͍ɾόΠφϦʔܗࣜՄಡੑ͍͕ɺσʔλྔগͳ͍ɻɾProtocol BuffersDSLͷΑ͏ͳͷͰɺՄಡੑ͕ߴ͘ɺ͔ͭૹड৴࣌ͷγϦΞϥΠζ͞Εͨσʔλྔগͳ͍γϦΞϥΠθʔγϣϯͷ·ͱΊ→Protocol BufferͰՄಡੑߴ͘ɺσʔλྔ͕গͳ͍γϦΞϥΠζΛߦ͏
ը૾σʔλͷݮ
ը૾ϑΥʔϚοτʹؔͯ͠ը૾ͷϑΥʔϚοτʹҙ͢Δɾσʔλྔ͕ஶ͘͠มΘΔɾը૾ͷΫΦϦςΟ͕มΘΔ
ը૾ϑΥʔϚοτνʔτγʔτࢀߟIUUQTEFWFMPQFSBOESPJEDPNUPQJDQFSGPSNBODFOFUXPSLYGFS
WebPͷύϑΥʔϚϯεՄٯѹॖͷ߹ɺPNGΑΓ26%খ͍͞ෆՄٯѹॖͷ߹ɺJPEGΑΓ25-34%খ͍͞ࢀߟIUUQTEFWFMPQFSTHPPHMFDPNTQFFEXFCQ
WebPҎ֎ͷ߹PNG͔JPEG͔
PNGͱJPEGPNGJPEGɾಁաʹରԠɾՄٯѹॖɾෆՄٯѹॖ
ϢʔεέʔεPNGJPEGɾγϯϓϧͳը૾ɾෳࡶͳը૾Α͘ݴΘΕΔը૾ͷ͍͚
γϯϓϧͳը૾ͷఆٛͱ
γϯϓϧͳը૾PNGJPEGɾෳࡶͳۂઢ͕ଘࡏ͠ͳ͍ܗɾ৭ͷόϦΤʔγϣϯ͕গͳ͍ɾෳͷ৭ͷόϦΤʔγϣϯɾෳࡶͳۂઢ
ͳ͔ͥʁ
PNGѹॖͷΞϧΰϦζϜ(Indexed Format)RGBΛࢀর͢Δܗʹมߋ͢Δɾը૾ϐΫηϧ͝ͱʹRGBใΛ࣋ͭɾ8bit(256֊ௐ) * 3 = 24bit = 2^24 ≒ 1600ສ৭ɾϐΫηϧ͕࣋ͭใIndexͷΈɾΧϥʔύϨοτΛ࣋ͭ(্ݶΛઃ͚Δ)
୯ҐϐΫηϧͷใྔ͕ܹݮ͢ΔύϨοτ2,4,16,256͕ࢦఆͰ͖Δɾ1byteͰදݱͰ͖Δ24bit = 3bytes 1byte
JPEGͷΞϧΰϦζϜ8ϐΫηϧ͝ͱͷϒϩοΫʹ͚ͯॲཧϒϩοΫͰใΛϑΟϧλϦϯά͢Δ
ઢతͳڥքʹऑ͍ڥք͕ΑΓઢͩͱը࣭͕ѱ͘ͳΔ8pixel
ࢹνΣοΫਓؒͷ͍͍ՃݮࢹνΣοΫͰσʔλྔͷݮΛʂ
ը૾σʔλݮͷ·ͱΊWebPରԠ͍ͯ͠ΕWebPͷҰJPEGɺPNGͷσʔλྔΛཧղ͢Δɻͦͷ্Ͱ࣮ࡍͷͰ֬ೝͯ͠ѹॖ͢Δɻ
ɾϓϩηοα(ϋʔυ)Ͱిྲྀ͕ྲྀΕΔɾOS(ιϑτ)͕CPUͷϞʔυมߋΛߦ͏→ CPUϞʔυΛ͘อͭόοςϦʔফඅΛݮ͢ΔͨΊʹ
$16ిྗΛޮతʹ͓͏ͱ͢ΔCPUʹϞʔυ͕͋Δ
࣍ͷॲཧʹඋ͑Δ,FFQ"XBLFͷίετϞόΠϧ௨৴࣌ͷফඅిྗ
ϞόΠϧ௨৴ΛࡉΕʹͨ͘͠ͳ͍
όονॲཧͱʁࢄͨ͠λεΫΛಉ࣌ʹ࣮ߦ͢Δ͜ͱɻΦʔόʔϔουΛݮগͤ͞ΔɻTaskBefore AfterExecutedTaskExecutedTaskExecutedTaskTaskTaskExecuted1111ϞόΠϧ௨৴࣌ͷফඅిྗ
αʔόʔͱͷσʔλͷಉظੑ͕ݫີͰͳ͍ͷ࠷ѱɺσʔλ͕ࣦΘΕ͕ͯͳ͍ͷੳϩάσʔλఆظతͳσʔλͷಉظϞόΠϧʹ͓͚Δόονॲཧ
ɾJobSchedulerͱAlertManagerΛOSόʔδϣϯͰ͍͚ɾෳλεΫͷνΣΠϯɾδϣϒʹ੍ݶΛ͚ͭΒΕΔɾόοςϦʔফඅ/ωοτϫʔΫঢ়ଶ/ॆిঢ়ଶ/CPUͷঢ়ଶ/ετϨʔδͷۭ͖ɾԆͰ͖Δ(Deferrable)ఆظత/ϫϯλΠϜͳδϣϒʹ͏WorkManagerɾόοΫΦϑ(ࢦؔతස)αϙʔτ
ϘτϧωοΫΛ୳Γ͍ͨ
#BUUFSZ)JTUPSJBOͷόοςϦʔফඅྔΛՄࢹԽग़དྷΔπʔϧ1. OverViewͷάϥϑɾ߲ΛϐοΫͨ͠ΧελϜάϥϑͰ͖Δ2. App SelectionɾΞϓϦ/߲ͰϑΟϧλՄೳ3. TablesɾΞϓϦؒൺֱ/ώετϦʔ(ྦྷੵσʔλ)/ΞϓϦελοπ4. ݁ՌɾϑΟϧλ݁ՌΛදࣔ͢Δσʔλղੳπʔϧ
ɾͷిফඅྔΛՄࢹԽग़དྷΔπʔϧɾDocker্Ͱಈ͘(Α͏ʹͳͬͯΔʂ)1. OverViewͷάϥϑ2. App Selection3. Tables4. ݁ՌBattery Historianͷશମతͳߏ
ɾެࣜ: https://github.com/google/battery-historianEPDLFSSVOQQPSUHDSJPBOESPJECBUUFSZIJTUPSJBOTUBCMFQPSUɾԿͰΑ͍ɻ9999ͱ͔ʹ͓ͯ͘͠IUUQMPDBMIPTUQPSUɾAndroidʹbugreportsͷdir͕͋Δadb bugreport bugreport.zip※) ެࣜͷͰΤϥʔ͕ग़Δਓී௨ʹabdͰϑΝΠϧసૹ͍ͯͩ͘͠͞ɻڥߏங
Battery Level1ࠁΈͳͷͰɺ͍෦͕ফඅిྗ͕ߴ͍෦όοςϦʔͷղੳํ๏
CPUͷϞʔυϞόΠϧ௨৴ίετ͕ߴ͍όοςϦʔͷղੳํ๏
ܧଓతଌఆ͕͍͠
ܦݧ্ɺٙͬͯΈΔͱྑͦ͞͏ͳ͜ͱόοΫάϥϯυͰఆظతͳॲཧΛ࣮ߦ͍ͯ͠Δը໘্Ͱଟ͘ͷωοτϫʔΫॲཧΛߦ͍ͬͯΔλεΫఆੑతʹΞϓϩʔν͢Δɾසɺॏ͍ॲཧɾෆదͳϥΠϑαΠΫϧ(onResumeͳͲ)Ͱͷίʔϧ
CPUͷϞʔυ(awake, sleep)ΛSleepϞόΠϧ௨৴ԆΛݕ౼͢Δఆྔͱఆੑతͳ྆໘͔ΒΞϓϩʔν͢ΔόοςϦʔফඅͷ࠷దԽ·ͱΊ
RailsςοΩʔͳϚΠΫϩαʔϏεͷཁૉٕज़ͷϚωδϝϯτͷશମతͳ·ͱΊ
શମతͳ·ͱΊ࠶ݱੑ͕͍ύϑΥʔϚϯεʹରॲ͢ΔύϑΥʔϚϯεͷલఏࣝΛ͚ͭɺఆੑͱఆྔͱͷ྆ྠ͔ΒΞϓϩʔν͍ͯ͘͠