Slide 1

Slide 1 text

࣮ફ WorkManager ञҪ ಞ @_atsushisakai mixi, Inc. DroidKaigi 2019 Feb. 8 17:40~ Room 1

Slide 2

Slide 2 text

ञҪ ಞ @_atsushisakai 2011೥ mixi, Inc.ೖࣾ 2014೥ Ո଒ΞϧόϜʮΈͯͶʯͷ։ൃ։࢝ ʢiOS൛ͷ୲౰ʣ 2018೥ ΈͯͶࣄۀ෦։ൃάϧʔϓϚωʔδϟʔ ݉ SRE

Slide 3

Slide 3 text

͜ͷൃදͰ͓࿩͍ͨ͜͠͠ͱɾͶΒ͍ • ղܾ͢΂͖՝୊͸ͳΜͩͬͨͷ͔ʁ • ͳͥWorkManagerΛબ୒ͨ͠ͷ͔ʁ • ͦͷ੒Ռ͸ʁ • ࣄྫΛ͓఻͑͢Δ͜ͱͰɺ՝୊ղܾͷબ୒ࢶΛ૿΍ͯ͠΋Β͍͍ͨɻ

Slide 4

Slide 4 text

1 ʮΈͯͶʯʹ͍ͭͯ

Slide 5

Slide 5 text

ʮΈͯͶʯʹ͍ͭͯ ಛ௃ ࢠڙͷࣸਅ΍ಈըΛڞ༗ɺ੔ཧ Ո଒͚ͩͰ҆৺ͯ͠࢖͑ΔΞϧόϜΞϓϦ 2019೥1݄࣌఺ͰϢʔβʔ਺400ສਓ 1

Slide 6

Slide 6 text

ʮΈͯͶʯʹ͍ͭͯ 2017೥7݄ ӳޠ൛ͷఏڙ։࢝ 1

Slide 7

Slide 7 text

՝୊ 2

Slide 8

Slide 8 text

՝୊ ࣸਅͷද͕ࣔ஗͍ • ւ֎ͷϢʔβʔ͔Βͷ໰͍߹ΘͤɾϨϏϡʔ͕ଟ͔ͬͨɻ • ࣌ંɺࠃ಺ʹ͓͍ͯ΋੠͸্͕͍ͬͯͨɻ 2

Slide 9

Slide 9 text

՝୊ ෼ੳ: Ͳͷ͙Β͍஗͍ͷ͔ʁ 2

Slide 10

Slide 10 text

՝୊ 2

Slide 11

Slide 11 text

Response Time 0.71 sec. Response Time 0.17 sec.

Slide 12

Slide 12 text

ݱ࣮: New York MidtownͷWeWork Wi-FiͰίϨ

Slide 13

Slide 13 text

՝୊ ղܾ͍ͨ͜͠ͱ • ฏۉ஋0.54ඵͷࠩΛຒΊΔͨΊͷUXվળɻ • ੈքதͷͲͷࠃͰ΋೔ຊͱಉ͡ʢ0.17ඵҎԼʣମݧΛͯ͠΋Β͍͍ͨɻ 2

Slide 14

Slide 14 text

WorkManagerΛ࠾༻͢Δ·ͰͷܦҢ 3

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

CDNʹͳΔૣͰΩϟογϡͤ͞Ε͹ྑ͍ͷͰ͸ʁ WorkManagerΛ࠾༻͢Δ·ͰͷܦҢ 3

Slide 17

Slide 17 text

AndroidΞϓϦͷىಈલʹը૾ΛΩϟογϡ͓͚ͯ͠͹ྑ͍ͷͰ͸ʁ WorkManager Λ࠾༻͢Δ·ͰͷܦҢ 3

Slide 18

Slide 18 text

େࡶ೺ͳཁٻ 1. ΞϓϦ͕ىಈ͍ͯ͠ͳ͍࣌ʹॲཧΛߦ͏͜ͱɻ 2. Wi-Fi઀ଓ͍ͯ͠Δ࣌ͷΈॲཧΛߦ͏͜ͱɻ 3. όοςϦʔ͕ॆ෼ʹ͋Δͱ͖ʹॲཧΛߦ͏͜ͱɻ 4. ৽͍͠ΩϟογϡΛऔಘ͢ΔͨΊʹ1೔ʹ1ճ͘Β͍͸ॲཧΛߦ͏͜ͱɻ 5. minSdkVersion 19Ͱ΋ಈ͘ϓϩάϥϜͰ͋Δ͜ͱɻ WorkManager Λ࠾༻͢Δ·ͰͷܦҢ 3

Slide 19

Slide 19 text

WorkManagerͱ͸ʁ • όοΫάϥ΢ϯυδϣϒΛ࣮ߦɾ؅ཧ͢ΔͨΊͷAndroid Jetpackίϯϙʔωϯτ • ΞϓϦ͕ऴྃͯ͠΋࣮֬ʹλεΫΛऴ͍͑ͨॲཧΛ࣮ߦͤ͞Δ • ༷ʑͳ੍໿ʢConstraintsʣΛ૊Έ߹Θͤͯδϣϒͷ࣮ߦΛ੍ޚ͢Δ͜ͱ͕Ͱ͖Δ • API 14Ҏ߱Ͱಉ͡ίʔυ͕ಈ͘ • API 23+Ͱ͸JobScheduler͕࢖ΘΕΔ • API 14~22Ͱ͸AlarmManager + BroadcastReceiver͕࢖ΘΕΔ WorkManager Λ࠾༻͢Δ·ͰͷܦҢ 3

Slide 20

Slide 20 text

WorkManager͸ը૾Ωϟογϡʹ࠷ద WorkManager Λ࠾༻͢Δ·ͰͷܦҢ 3

Slide 21

Slide 21 text

࣮૷ 4

Slide 22

Slide 22 text

࣮૷ 4 Synchronizer Server/CDN SQLite WorkManager Worker Glide Synchronizer Server/CDN SQLite WorkManager Worker Glide Request Metadata Response Metadata Save Metadata Enqueue Job Cache Image Select Metadata Request Image Response Image Execute Job

Slide 23

Slide 23 text

࣮૷ 4 Synchronizer Server/CDN SQLite WorkManager Worker Glide Synchronizer Server/CDN SQLite WorkManager Worker Glide Request Metadata Response Metadata Save Metadata Enqueue Job Cache Image Select Metadata Request Image Response Image Execute Job

Slide 24

Slide 24 text

Enqueue Job ࣮૷ 4

Slide 25

Slide 25 text

Constraints ෇͖ͷ Enqueue • Wi-FiωοτϫʔΫʹ઀ଓ͍ͯ͠Δ • όοςϦʔ͕ॆ෼ʹ͋Δɺ΋͘͠͸ॆిதͰ͋Δ ࣮૷ 4

Slide 26

Slide 26 text

࣮૷ 4

Slide 27

Slide 27 text

Jobͷ܁Γฦ࣮͠ߦ • 24࣌ؒʹ1ճ࣮ߦ͍ͤͨ͞ɻ ࣮૷ 4

Slide 28

Slide 28 text

࣮૷ 4

Slide 29

Slide 29 text

࣮૷ 4

Slide 30

Slide 30 text

PeriodicWorkRequest • ܁Γฦ͠ಉ͡JobΛIntevalຖʹ࣮ߦͤ͞ΔΑ͏WorkManagerʹϦΫΤετ͢Δɻ • ࠷ॳͷ࣮ߦ͸ଈ࣌΋͘͠͸੍໿Λຬͨͨ͠௚ޙʹߦΘΕΔɻ https://developer.android.com/reference/androidx/work/PeriodicWorkRequest ࣮૷ 4

Slide 31

Slide 31 text

࣮૷ 4

Slide 32

Slide 32 text

࣮૷ 4

Slide 33

Slide 33 text

enqueueUniquePeriodicWork • ϢχʔΫͳ໊લͷ෇͍ͨPeriodicWorkRequestΛৗʹͻͱ͚ͭͩenqueue͞Ε͍ͯΔঢ়ଶΛอূͰ͖Δɻ • ಉ࣌ʹ;ͨͭͷJob͕ฒྻʹಈ͘ඞཁ͕ແ͍৔߹ʹ࠷దͳenqueueํ๏ɻ https://developer.android.com/reference/androidx/work/WorkManager#enqueueUniquePeriodicWork ࣮૷ 4

Slide 34

Slide 34 text

Execute Job ࣮૷ 4

Slide 35

Slide 35 text

Workerͷ࣮૷ • ࣮૷಺༰͸୯७ • SQLite͔ΒϨίʔυΛऔಘ • URLʹΞΫηε͠ը૾Λऔಘ • Glideʹऔಘͨ͠ը૾ΛΩϟογϡ ࣮૷ 4

Slide 36

Slide 36 text

࣮૷࣌ͷTIPS΍஫ҙࣄ߲ 5

Slide 37

Slide 37 text

Worker͸ႈ౳ੑΛ୲อͨ͠ॲཧΛॻ͘ • ಉ͡ύϥϝʔλͰෳ਺ճJob͕enqueue͞Ε࣮ߦ͞Εͯ΋ৗʹಉ݁͡Ռɾঢ়ଶ͕ฦΔΑ͏ʹ࣮૷͢Δɻ ࣮૷࣌ͷTIPS΍஫ҙࣄ߲ 5

Slide 38

Slide 38 text

ϦτϥΠͷڍಈΛཧղ͢Δ • σϑΥϧτ͸BackoffPolicy.EXPONENTIAL • WorkSpec#calculateNextRunTime ΛಡΉͱΞϧΰϦζϜΛཧղͰ͖Δɻ • ࠷ऴతʹ਺೔ޙʹJob͕ϦτϥΠ͞ΕΔ͜ͱ΋͋ΓಘΔɻ • ϦτϥΠճ਺ͷ࠷େ஋͸ઃఆͰ͖ͳ͍ɻ • Worker#getRunAttemptCount Ͱݱࡏͷࢼߦճ਺Λऔಘ͠ɺFailureͰऴ͑Δɻ • ͦ΋ͦ΋ҙਤ͠ͳ͍ϦτϥΠ͕ߦΘΕͳ͍Α͏ʹΤϥʔϋϯυϦϯά͓ͯ͘͠ࣄ΋ॏཁɻ ࣮૷࣌ͷTIPS΍஫ҙࣄ߲ 5

Slide 39

Slide 39 text

WorkerͷίʔυΛΞοϓσʔτ͢Δͱ͖ʹ͸஫ҙ • InputDataͷܕ΍ΩʔΛແҋʹมߋͯ͠͠·͏ͱɺલͷόʔδϣϯͰenqueueͨ͠Job͕Ξοϓσʔτޙ ʹ࣮ߦ͞ΕͯɺWorkerͷ࣮૷͕มΘͬͯҙਤ͠ͳ͍ΤϥʔʹͳΔɻ • WorkerͷΫϥε໊Λมߋͨ͠৔߹͸ɺ࣮ߦ࣌ʹinitͰ͖ͣɺ͙͢ʹFailureѻ͍ʹͳΔɻ ࣮૷࣌ͷTIPS΍஫ҙࣄ߲ 5

Slide 40

Slide 40 text

Worker͸λΠϜΞ΢τ͞ΕΔ • Jobຖʹ10෼ؒͷλΠϜΞ΢τ஋͕ଘࡏ͍ͯ͠Δɻ • ௕͘ͳΓͦ͏ͳॲཧΛ࣮ߦ͢Δͱ͖͸ɺॲཧͷ୯ҐΛࡉ෼Խ͠ෳ਺ͷWorkerΛνΣʔϯ͢ΔΑ͏ ʹߏ੒͢Δɻʢ࣍ϖʔδࢀরʣ ࣮૷࣌ͷTIPS΍஫ҙࣄ߲ 5

Slide 41

Slide 41 text

࣮૷࣌ͷTIPS΍஫ҙࣄ߲ 5 https://developer.android.com/reference/androidx/work/WorkManager

Slide 42

Slide 42 text

WorkerΛcancel͢Δ࣌ͷڍಈʹ஫ҙ • WorkManagerʹWorkerΛcancel͢ΔΠϯλʔϑΣʔε͕͋Δ͕શͯϕετΤϑΥʔτͰ͋Δɻ • ಈ͍͍ͯΔWorker͕͙͢͞·ఀࢭ͞ΕΔΘ͚Ͱ͸ͳ͍ɻ • ಈ͍͍ͯΔWorker͕cancelཁٻ͞Εͨͱ͖ʹԿ͔Λ͍ͨ͠৔߹͸ҎԼΛ֬ೝ͢Δɻ • onStopped͕࣮ߦ͞ΕΔ • isStoppedͰtrue͕ฦΔΑ͏ʹͳΔ ࣮૷࣌ͷTIPS΍஫ҙࣄ߲ 5

Slide 43

Slide 43 text

QA͕೉͍͠ • όοΫάϥ΢ϯυॲཧ͸ݟ͑ͳ͍ͷͰσόοάը໘Λ༻ҙ͢ΔͳͲͯ͠޻෉͢Δɻ • ඞཁʹԠͯ͡WorkInfoΛऔಘͯ͠Jobͷঢ়ଶΛݟ͑ΔΑ͏ʹ͓ͯ͘͠ɻ ࣮૷࣌ͷTIPS΍஫ҙࣄ߲ 5

Slide 44

Slide 44 text

ςετʹ͍ͭͯ 6

Slide 45

Slide 45 text

ͲͷΑ͏ʹςετΛهड़͢Δͷ͔ • WorkerΛಉظ࣮ߦ͠ɺҰ࿈ͷTransactionͷ಺༰Λςετ͢Δɻ • WorkManagerTestInitHelperͱ͍͏Ϋϥε͕༻ҙ͞Ε͍ͯΔͷͰ͜ΕΛར༻͢Δɻ • ςετͷ಺༰ • WorkInfo#outputDataΛ֬ೝͨ͠Γɺґଘ͢ΔϥΠϒϥϦͷverifyΛߦͳ͍ͬͯ͘ɻ ςετʹ͍ͭͯ 6

Slide 46

Slide 46 text

WorkManagerTestInitHelperʹ͍ͭͯ • Test࣮ߦ࣌ͷContextΛ࢖ͬͯγϯάϧτϯͳWorkManagerΛinitͤ͞Δɻ • TestDriverΛੜ੒͠ɺConstraintsʢ੍໿ʣΛِ૷͠ɺWorkerΛ͙͢ʹ࣮ߦ͢Δ͜ͱ͕Ͱ͖Δɻ ςετʹ͍ͭͯ 6

Slide 47

Slide 47 text

ςετʹ͍ͭͯ 6

Slide 48

Slide 48 text

• https://issuetracker.google.com/issues/122553577 > We never supported Roboelectric. All WorkManager tests need to run as an Android 
 > instrumentation test. ςετʹ͍ͭͯ 6

Slide 49

Slide 49 text

੒Ռ 7

Slide 50

Slide 50 text

Response Time 0.71 sec. Get from cache

Slide 51

Slide 51 text

େ੒ޭ • UI্ͷϩʔυ஗Ԇ͸Ұ੾ͳ͘ͳͬͨɻ • ϨεϙϯελΠϜΛҙࣝ͢Δඞཁ͕ͳ͘ͳΓɺੈքதͰಉ͡ମݧΛఏڙͰ͖ΔΑ͏ʹͳͬͨɻ ੒Ռ 7

Slide 52

Slide 52 text

࢒͞Εͨ՝୊ 8

Slide 53

Slide 53 text

୺຤ଆͷϦιʔεʹཔΓ͗͢ • ୺຤ͷόοςϦʔɾετϨʔδɾωοτϫʔΫϦ ιʔεʹগͳ͔ΒͣෛՙΛ͔͚͍ͯΔɻ • όοΫάϥ΢ϯυδϣϒͷڍಈΛϢʔβʔ͕೚ҙ ʹௐ੔Ͱ͖ΔΑ͏ͳUIΛ༻ҙ͍ͯ͠Δɻ ࢒͞Εͨ՝୊ 8

Slide 54

Slide 54 text

ϦΫΤετʹඥ෇͔ͳ͍CDN΁ͷ೚ҙΩϟογϡػೳ͕ແ͍໰୊ • AWSଆʹڧ͘ػೳϦΫΤετΛ͍ͯ͠Δʂ • ͦͷػೳΛ࣋ͭAWSҎ֎ͷCDNΛ࢖͏બ୒ࢶ΋͋Δʹ͸͋Δɻ ࢒͞Εͨ՝୊ 8

Slide 55

Slide 55 text

·ͱΊ 9

Slide 56

Slide 56 text

• WorkManagerΛ࢖ͬͨUXվળͷࣄྫΛ͝঺հ͠·ͨ͠ɻ • ࣮ફతͳഎܠΛ౿·࣮͑ͨ૷࣌ͷϙΠϯτ΍஫ҙͨ͜͠ͱɾςετͷख๏ͳͲΛ͝঺հ͠·ͨ͠ɻ ·ͱΊ 9

Slide 57

Slide 57 text

THANK YOU!!