DroidKaigi 2019の登壇資料です。 こちらの詳細はブログエントリにもまとめていますので合わせてご覧ください。 https://medium.com/mixi-developers/%E5%AE%9F%E8%B7%B5-workmanager-ea9344bf09a3
࣮ફ WorkManagerञҪ ಞ @_atsushisakaimixi, Inc.DroidKaigi 2019 Feb. 8 17:40~ Room 1
View Slide
ञҪ ಞ @_atsushisakai2011 mixi, Inc.ೖࣾ2014 ՈΞϧόϜʮΈͯͶʯͷ։ൃ։࢝ ʢiOS൛ͷ୲ʣ2018 ΈͯͶࣄۀ෦։ൃάϧʔϓϚωʔδϟʔ ݉ SRE
͜ͷൃදͰ͓͍ͨ͜͠͠ͱɾͶΒ͍• ղܾ͖͢՝ͳΜͩͬͨͷ͔ʁ• ͳͥWorkManagerΛબͨ͠ͷ͔ʁ• ͦͷՌʁ• ࣄྫΛ͓͑͢Δ͜ͱͰɺ՝ղܾͷબࢶΛ૿ͯ͠Β͍͍ͨɻ
1 ʮΈͯͶʯʹ͍ͭͯ
ʮΈͯͶʯʹ͍ͭͯಛࢠڙͷࣸਅಈըΛڞ༗ɺཧՈ͚ͩͰ҆৺ͯ͑͠ΔΞϧόϜΞϓϦ20191݄࣌ͰϢʔβʔ400ສਓ1
ʮΈͯͶʯʹ͍ͭͯ20177݄ ӳޠ൛ͷఏڙ։࢝1
՝2
՝ࣸਅͷද͕͍ࣔ• ւ֎ͷϢʔβʔ͔Βͷ͍߹ΘͤɾϨϏϡʔ͕ଟ͔ͬͨɻ• ࣌ંɺࠃʹ্͓͍͕͍ͯͬͯͨɻ2
՝ੳ: Ͳͷ͙Β͍͍ͷ͔ʁ2
Response Time 0.71 sec. Response Time 0.17 sec.
ݱ࣮: New York MidtownͷWeWork Wi-FiͰίϨ
՝ղܾ͍ͨ͜͠ͱ• ฏۉ0.54ඵͷࠩΛຒΊΔͨΊͷUXվળɻ• ੈքதͷͲͷࠃͰຊͱಉ͡ʢ0.17ඵҎԼʣମݧΛͯ͠Β͍͍ͨɻ2
WorkManagerΛ࠾༻͢Δ·ͰͷܦҢ3
CDNʹͳΔૣͰΩϟογϡͤ͞Εྑ͍ͷͰʁWorkManagerΛ࠾༻͢Δ·ͰͷܦҢ3
AndroidΞϓϦͷىಈલʹը૾ΛΩϟογϡ͓͚ͯ͠ྑ͍ͷͰʁWorkManager Λ࠾༻͢Δ·ͰͷܦҢ3
େࡶͳཁٻ1. ΞϓϦ͕ىಈ͍ͯ͠ͳ͍࣌ʹॲཧΛߦ͏͜ͱɻ2. Wi-Fiଓ͍ͯ͠Δ࣌ͷΈॲཧΛߦ͏͜ͱɻ3. όοςϦʔ͕ॆʹ͋Δͱ͖ʹॲཧΛߦ͏͜ͱɻ4. ৽͍͠ΩϟογϡΛऔಘ͢ΔͨΊʹ1ʹ1ճ͘Β͍ॲཧΛߦ͏͜ͱɻ5. minSdkVersion 19Ͱಈ͘ϓϩάϥϜͰ͋Δ͜ͱɻWorkManager Λ࠾༻͢Δ·ͰͷܦҢ3
WorkManagerͱʁ• όοΫάϥϯυδϣϒΛ࣮ߦɾཧ͢ΔͨΊͷAndroid Jetpackίϯϙʔωϯτ• ΞϓϦ͕ऴ࣮ྃͯ֬͠ʹλεΫΛऴ͍͑ͨॲཧΛ࣮ߦͤ͞Δ• ༷ʑͳ੍ʢConstraintsʣΛΈ߹Θͤͯδϣϒͷ࣮ߦΛ੍ޚ͢Δ͜ͱ͕Ͱ͖Δ• API 14Ҏ߱Ͱಉ͡ίʔυ͕ಈ͘• API 23+ͰJobScheduler͕ΘΕΔ• API 14~22ͰAlarmManager + BroadcastReceiver͕ΘΕΔWorkManager Λ࠾༻͢Δ·ͰͷܦҢ3
WorkManagerը૾Ωϟογϡʹ࠷ద WorkManager Λ࠾༻͢Δ·ͰͷܦҢ3
࣮4
࣮4SynchronizerServer/CDN SQLite WorkManager Worker GlideSynchronizerServer/CDN SQLite WorkManager Worker GlideRequest MetadataResponse MetadataSave MetadataEnqueue JobCache ImageSelect MetadataRequest ImageResponse ImageExecute Job
Enqueue Job࣮4
Constraints ͖ͷ Enqueue• Wi-FiωοτϫʔΫʹଓ͍ͯ͠Δ• όοςϦʔ͕ॆʹ͋Δɺ͘͠ॆిதͰ͋Δ࣮4
Jobͷ܁Γฦ࣮͠ߦ• 24࣌ؒʹ1ճ࣮ߦ͍ͤͨ͞ɻ࣮4
PeriodicWorkRequest• ܁Γฦ͠ಉ͡JobΛIntevalຖʹ࣮ߦͤ͞ΔΑ͏WorkManagerʹϦΫΤετ͢Δɻ• ࠷ॳͷ࣮ߦଈ੍࣌͘͠Λຬͨͨ͠ޙʹߦΘΕΔɻhttps://developer.android.com/reference/androidx/work/PeriodicWorkRequest࣮4
enqueueUniquePeriodicWork• ϢχʔΫͳ໊લͷ͍ͨPeriodicWorkRequestΛৗʹͻͱ͚ͭͩenqueue͞Ε͍ͯΔঢ়ଶΛอূͰ͖Δɻ• ಉ࣌ʹ;ͨͭͷJob͕ฒྻʹಈ͘ඞཁ͕ແ͍߹ʹ࠷దͳenqueueํ๏ɻhttps://developer.android.com/reference/androidx/work/WorkManager#enqueueUniquePeriodicWork࣮4
Execute Job࣮4
Workerͷ࣮• ࣮༰୯७• SQLite͔ΒϨίʔυΛऔಘ• URLʹΞΫηε͠ը૾Λऔಘ• Glideʹऔಘͨ͠ը૾ΛΩϟογϡ࣮4
࣮࣌ͷTIPSҙࣄ߲5
WorkerႈੑΛ୲อͨ͠ॲཧΛॻ͘• ಉ͡ύϥϝʔλͰෳճJob͕enqueue͞Ε࣮ߦ͞Εͯৗʹಉ݁͡Ռɾঢ়ଶ͕ฦΔΑ͏ʹ࣮͢Δɻ࣮࣌ͷTIPSҙࣄ߲5
ϦτϥΠͷڍಈΛཧղ͢Δ• σϑΥϧτBackoffPolicy.EXPONENTIAL• WorkSpec#calculateNextRunTime ΛಡΉͱΞϧΰϦζϜΛཧղͰ͖Δɻ• ࠷ऴతʹޙʹJob͕ϦτϥΠ͞ΕΔ͜ͱ͋ΓಘΔɻ• ϦτϥΠճͷ࠷େઃఆͰ͖ͳ͍ɻ• Worker#getRunAttemptCount ͰݱࡏͷࢼߦճΛऔಘ͠ɺFailureͰऴ͑Δɻ• ͦͦҙਤ͠ͳ͍ϦτϥΠ͕ߦΘΕͳ͍Α͏ʹΤϥʔϋϯυϦϯά͓ͯ͘͠ࣄॏཁɻ࣮࣌ͷTIPSҙࣄ߲5
WorkerͷίʔυΛΞοϓσʔτ͢Δͱ͖ʹҙ• InputDataͷܕΩʔΛແҋʹมߋͯ͠͠·͏ͱɺલͷόʔδϣϯͰenqueueͨ͠Job͕Ξοϓσʔτޙʹ࣮ߦ͞ΕͯɺWorkerͷ࣮͕มΘͬͯҙਤ͠ͳ͍ΤϥʔʹͳΔɻ• WorkerͷΫϥε໊Λมߋͨ͠߹ɺ࣮ߦ࣌ʹinitͰ͖ͣɺ͙͢ʹFailureѻ͍ʹͳΔɻ࣮࣌ͷTIPSҙࣄ߲5
WorkerλΠϜΞτ͞ΕΔ• Jobຖʹ10ؒͷλΠϜΞτ͕ଘࡏ͍ͯ͠Δɻ• ͘ͳΓͦ͏ͳॲཧΛ࣮ߦ͢Δͱ͖ɺॲཧͷ୯ҐΛࡉԽ͠ෳͷWorkerΛνΣʔϯ͢ΔΑ͏ʹߏ͢Δɻʢ࣍ϖʔδࢀরʣ࣮࣌ͷTIPSҙࣄ߲5
࣮࣌ͷTIPSҙࣄ߲5https://developer.android.com/reference/androidx/work/WorkManager
WorkerΛcancel͢Δ࣌ͷڍಈʹҙ• WorkManagerʹWorkerΛcancel͢ΔΠϯλʔϑΣʔε͕͋Δ͕શͯϕετΤϑΥʔτͰ͋Δɻ• ಈ͍͍ͯΔWorker͕͙͢͞·ఀࢭ͞ΕΔΘ͚Ͱͳ͍ɻ• ಈ͍͍ͯΔWorker͕cancelཁٻ͞Εͨͱ͖ʹԿ͔Λ͍ͨ͠߹ҎԼΛ֬ೝ͢Δɻ• onStopped͕࣮ߦ͞ΕΔ• isStoppedͰtrue͕ฦΔΑ͏ʹͳΔ࣮࣌ͷTIPSҙࣄ߲5
QA͕͍͠• όοΫάϥϯυॲཧݟ͑ͳ͍ͷͰσόοάը໘Λ༻ҙ͢ΔͳͲͯ͢͠Δɻ• ඞཁʹԠͯ͡WorkInfoΛऔಘͯ͠Jobͷঢ়ଶΛݟ͑ΔΑ͏ʹ͓ͯ͘͠ɻ࣮࣌ͷTIPSҙࣄ߲5
ςετʹ͍ͭͯ6
ͲͷΑ͏ʹςετΛهड़͢Δͷ͔• WorkerΛಉظ࣮ߦ͠ɺҰ࿈ͷTransactionͷ༰Λςετ͢Δɻ• WorkManagerTestInitHelperͱ͍͏Ϋϥε͕༻ҙ͞Ε͍ͯΔͷͰ͜ΕΛར༻͢Δɻ• ςετͷ༰• WorkInfo#outputDataΛ֬ೝͨ͠Γɺґଘ͢ΔϥΠϒϥϦͷverifyΛߦͳ͍ͬͯ͘ɻςετʹ͍ͭͯ6
WorkManagerTestInitHelperʹ͍ͭͯ• Test࣮ߦ࣌ͷContextΛͬͯγϯάϧτϯͳWorkManagerΛinitͤ͞Δɻ• TestDriverΛੜ͠ɺConstraintsʢ੍ʣΛِ͠ɺWorkerΛ͙͢ʹ࣮ߦ͢Δ͜ͱ͕Ͱ͖Δɻςετʹ͍ͭͯ6
• https://issuetracker.google.com/issues/122553577> We never supported Roboelectric. All WorkManager tests need to run as an Android > instrumentation test.ςετʹ͍ͭͯ6
Ռ7
Response Time 0.71 sec. Get from cache
େޭ • UI্ͷϩʔυԆҰͳ͘ͳͬͨɻ• ϨεϙϯελΠϜΛҙࣝ͢Δඞཁ͕ͳ͘ͳΓɺੈքதͰಉ͡ମݧΛఏڙͰ͖ΔΑ͏ʹͳͬͨɻՌ7
͞Εͨ՝8
ଆͷϦιʔεʹཔΓ͗͢• ͷόοςϦʔɾετϨʔδɾωοτϫʔΫϦιʔεʹগͳ͔ΒͣෛՙΛ͔͚͍ͯΔɻ• όοΫάϥϯυδϣϒͷڍಈΛϢʔβʔ͕ҙʹௐͰ͖ΔΑ͏ͳUIΛ༻ҙ͍ͯ͠Δɻ͞Εͨ՝8
ϦΫΤετʹඥ͔ͳ͍CDNͷҙΩϟογϡػೳ͕ແ͍• AWSଆʹڧ͘ػೳϦΫΤετΛ͍ͯ͠Δʂ• ͦͷػೳΛ࣋ͭAWSҎ֎ͷCDNΛ͏બࢶ͋Δʹ͋Δɻ͞Εͨ՝8
·ͱΊ9
• WorkManagerΛͬͨUXվળͷࣄྫΛ͝հ͠·ͨ͠ɻ• ࣮ફతͳഎܠΛ౿·࣮͑ͨ࣌ͷϙΠϯτҙͨ͜͠ͱɾςετͷख๏ͳͲΛ͝հ͠·ͨ͠ɻ·ͱΊ9
THANK YOU!!