Save 37% off PRO during our Black Friday Sale! »

DroidKaigiカンファレンスアプリの歴史からみるアプリアーキテクチャのこれまでとこれから

 DroidKaigiカンファレンスアプリの歴史からみるアプリアーキテクチャのこれまでとこれから

DroidKaigi2021 Day2 発表資料です。
DroidKaigi2015から2021までのカンファレンスアプリを主にアーキテクチャの点から比較し、どのような技術に置き換わっていったのか・未来のアプリ開発のデファクトスタンダードはどうなるのかを知ることができます。

https://droidkaigi.jp/2021/timetable/?day=2

A445824f9bb334ec104f5c1c7b67fee2?s=128

Kazuki Chigita

October 20, 2021
Tweet

Transcript

  1. %SPJE,BJHJΧϯϑΝϨϯεΞϓϦͷ ྺ࢙͔ΒΈΔ ΞϓϦΞʔΩςΫνϟͷ ͜Ε·Ͱͱ͜Ε͔Β ,B[VLJ$IJHJUB DIJHJDIBO "The Android robot is

    reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License." DroidKaigi2021
  2. Speaker ,B[VLJ$IJHJUB chigichan24 "OESPJEBQQMJDBUJPOEFWFMPQFS *OUFSFTUFE "QQMJDBUJPO"SDIJUFDUVSF 4ZTUFN%FTJHO %JTUSJCVUFE4ZTUFN 1BTU UBMLPO%SPJE,BJHJ

    ܧଓతʹػೳ։ൃΛਐΊͳ͕Βߦ͏ϚϧνϞδϡʔϧԽ  %SPJE,BJHJ ”Twemoji” ©Twitter, Inc and other contributors (Licensed under CC-BY 4.0) https://twemoji.twitter.com/
  3. Break the Ice 2%SPJE,BJHJΧϯϑΝϨϯεΞϓϦ͕͋Δͷ஌ͬͯ·͔ͨ͠ʁ ͦΜͳ΋ͷ͕͋ͬͨͷ͔ʂ ࠓ͸͡Ίͯ஌Γ·ͨ͠ ΋ͪΖΜ஌ͬͯΔΑ Πϯετʔϧͯ͠ΔΑ ίϯτϦϏϡʔτͯ͠ΔΑ ࢲ͕99ը໘ͷ࡞ऀͰ͢

    ഑৴αΠτ΍5XJUUFSͰίϝϯτͯ͠Ͷʙ ”Twemoji” ©Twitter, Inc and other contributors (Licensed under CC-BY 4.0) https://twemoji.twitter.com/
  4.  ࣌఺ͷεΫϦʔϯγϣοτɾಈըͰ͢

  5. None
  6. None
  7. Androiod iOS  ࣌఺ͷεΫϦʔϯγϣοτͰ͢

  8. 2021 2015

  9. എܠͱൃදͰ ໨ࢦ͢ΰʔϧ ֤೥ͷ ηογϣϯ ৘ใऔಘը໘ ࣮૷ ೥ͷ %,BJHJΞϓϦ ͔Βඥղ͘ ະདྷͷ

    σϑΝΫτ Section 1 Section 2 Section 3 Agenda
  10. എܠͱൃදͰ ໨ࢦ͢ΰʔϧ ֤೥ͷ ηογϣϯ ৘ใऔಘը໘ ࣮૷ ೥ͷ %,BJHJΞϓϦ ͔Βඥղ͘ ະདྷͷ

    σϑΝΫτ Section 1 Section 2 Section 3 Agenda
  11. (Section1) Background and purpose of this presentation ͜ͷηΫγϣϯͷ໨త  ϓϨθϯશମͷഎܠɾ໨తɾ

    ΰʔϧΛڞ༗͢Δɻ  ͜Μͳʹ΋มԽ͍ͯ͠Δͷ͔ʂͷ ڻ͖Λڞ༗͢Δɻ
  12. (Section1) Background & Goal 2021 2015

  13. (Section1) Background & Goal 2016 2021 VS

  14. 2016 2021 In Google I/O 2017, the Android team announced

    first-class support for Kotlin. Main Language JAVA Kotlin Supported Platform Android Android iOS web Main Libraries Jetpack Compose rxjava1 Android-Orma Dagger2 Kotlin Coroutines & Flows Hilt
  15. 2016 2021 In Google I/O 2017, the Android team announced

    first-class support for Kotlin. Main Language JAVA Kotlin Supported Platform Android Android iOS web Main Libraries Jetpack Compose rxjava1 Android-Orma Dagger2 Kotlin Coroutines & Flows Hilt ΊͪΌͪ͘Ό มԽ͍ͯ͠Δ
  16. (Section1) Background & Goal ΧϯϑΝϨϯεΞϓϦͷྺ࢙Λඥղ͍ͯ೔ʑͷ։ൃͷώϯτʹ͠Α͏ ະདྷͷ"OESPJEΞϓϦ։ൃͷσϑΝΫτΛײ͡Α͏

  17. (Section1) Background & Goal ΧϯϑΝϨϯεΞϓϦͷྺ࢙Λඥղ͍ͯ೔ʑͷ։ൃͷώϯτʹ͠Α͏ ະདྷͷ"OESPJEΞϓϦ։ൃͷσϑΝΫτΛײ͡Α͏ ࣌୅͕มԽ͢Δத ࣮૷ͷτϨϯυ ϥΠϒϥϦ ΞʔΩςΫνϟ͸

    Ͳ͏มΘͬͨͷ͔Λ஌Δ
  18. (Section1) Background & Goal ΧϯϑΝϨϯεΞϓϦͷྺ࢙Λඥղ͍ͯ೔ʑͷ։ൃͷώϯτʹ͠Α͏ ະདྷͷ"OESPJEΞϓϦ։ൃͷσϑΝΫτΛײ͡Α͏ ࣌୅͕มԽ͢Δத ࣮૷ͷτϨϯυ ϥΠϒϥϦ ΞʔΩςΫνϟ͸

    Ͳ͏มΘͬͨͷ͔Λ஌Δ ௕ظؒϝϯς͞Ε͍ͯΔ ػೳͷ࣮૷ஔ͖׵͑ ϦϑΝΫλϦϯά ͷ ಓඪΛ୳Δ
  19. (Section1) Background & Goal ΧϯϑΝϨϯεΞϓϦͷྺ࢙Λඥղ͍ͯ೔ʑͷ։ൃͷώϯτʹ͠Α͏ ະདྷͷ"OESPJEΞϓϦ։ൃͷσϑΝΫτΛײ͡Α͏ ࣌୅͕มԽ͢Δத ࣮૷ͷτϨϯυ ϥΠϒϥϦ ΞʔΩςΫνϟ͸

    Ͳ͏มΘͬͨͷ͔Λ஌Δ ௕ظؒϝϯς͞Ε͍ͯΔ ػೳͷ࣮૷ஔ͖׵͑ ϦϑΝΫλϦϯά ͷ ಓඪΛ୳Δ ະདྷͷ "OESPJEΞϓϦ։ൃʹ ඞཁʹͳΔ஌ࣝ ΞʔΩςΫνϟΛ ײ͡Δ
  20. എܠͱൃදͰ ໨ࢦ͢ΰʔϧ ֤೥ͷ ηογϣϯ ৘ใऔಘը໘ ࣮૷ ೥ͷ %,BJHJΞϓϦ ͔Βඥղ͘ ະདྷͷ

    σϑΝΫτ Section 1 Section 2 Section 3 Agenda
  21. എܠͱൃදͰ ໨ࢦ͢ΰʔϧ ֤೥ͷ ηογϣϯ ৘ใऔಘը໘ ࣮૷ ೥ͷ %,BJHJΞϓϦ ͔Βඥղ͘ ະདྷͷ

    σϑΝΫτ Section 1 Section 2 Section 3 Agenda
  22. (Section2) Implementation difference of each years ͜ͷηΫγϣϯͷ໨త  ֤೥ͷ࣮૷Λ؆୯ʹཧղ͠ɺ ࠩ෼Λ஌Δɻ

     ͜Μͳʹ΋มԽ͍ͯ͠Δͷ͔ʂͷ ڻ͖Λڞ༗͢Δɻ
  23. (Section2) Implementation Diff ҎԼͷ؍఺͔Β֤೥ͷηογϣϯৄࡉϖʔδͷ࣮૷Λൺֱͯ͠ΈΑ͏ ओཁϥΠϒϥϦ ΞʔΩςΫνϟ ઃܭํ਑ͳͲ ࣌୅എܠ ֤छTUBUT

  24. 2015

  25. TUBUT 1SJWBUF ਓ +BWB"OESPJEPOMZ ΞʔΩςΫνϟ .7$ͬΆ͍ ࣌୅എܠ %SPJE,BJHJ͕Ͱ͖ͨ೥ɻ "OESPJEYܥ͕͡Θ͡Θͱਁಁ 

    "35͕σϑΥϧτͷϥϯλΠϜʹɻ  ϚςϦΞϧσβΠϯͷొ৔ɻ ओͳϥΠϒϥϦ 4VQQPSUMJCSBSZ 'SBHNFOU "DUJWJUZ QSJWBUFͳͷͰϥΠϒϥϦৄࡉ͸Θ͔Γ·ͤΜ 2015 !NIJEBLB͞Μ͔Βͷ఻ঝʹΑͬͯ͜ͷ೥ͷࢿྉΛ࡞੒Ͱ͖·ͨ͠ɻେײँ🙇🙇
  26. 2015 ύοέʔδ͸ػೳɾը໘͝ͱͱ͍͏ΑΓ΋ɺ ໾ׂʹؔ͢ΔϨΠϠ͝ͱ "DUJWJUZ'SBHNFOU΋ඇৗʹ؆ܿ

  27. 2015 ύοέʔδ͸ػೳɾը໘͝ͱͱ͍͏ΑΓ΋ɺ ໾ׂʹؔ͢ΔϨΠϠ͝ͱ "DUJWJUZ'SBHNFOU΋ඇৗʹ؆ܿ γϯϓϧͳ6*ͱͦΕΛ࣮ݱ͢Δ γϯϓϧͳΞʔΩςΫνϟ

  28. 2016

  29. 2016 TUBUT 044 ਓ +BWB"OESPJEPOMZ ΞʔΩςΫνϟ .7$ ࣌୅എܠ (PPHMF*0Ͱ%BUB#JOEJOH͕ൃදɻ "OESPJEYܥͷ࣌୅

     ύʔϛογϣϯपΓ͕Ξοϓσʔτ  %P[FϞʔυͷొ৔ ओͳϥΠϒϥϦ 3Y+BWB %BHHFS "OESPJE0SNB 0L)UUQ 3FUSPGJU 4UFUIP %BUB#JOEJOH
  30. 2016 Activity Fragment xml DAO Model ActivityNavigator DataBinding Orma API

    Retrofit + OkHttp Observable(RxJava1) Call startActivityॲཧΛ୲͏ callback Call
  31. 2016 Activity Fragment xml DAO Model ActivityNavigator DataBinding Orma API

    Retrofit + OkHttp Observable(RxJava1) Call startActivityॲཧΛ୲͏ callback Call Model View Controller
  32. 2016 Activity Fragment xml DAO Model ActivityNavigator DataBinding Orma API

    Retrofit + OkHttp Observable(RxJava1) Call startActivityॲཧΛ୲͏ callback Call Model View Controller ංେԽ ෳࡶԽ
  33. 2016 Dagger2ʹΑΔInjectionͷ༷ࢠ

  34. 2016 Dagger2ʹΑΔInjectionͷ༷ࢠ  ΞʔΩςΫνϟʹΑΔ໾ׂ෼ׂ  $POUSPMMFSɾ.PEFMͷංେԽ

  35. 2017

  36. 2017 TUBUT 044 ਓ +BWB ,PUMJO "OESPJEPOMZ ΞʔΩςΫνϟ .77. 3FQPTJUPSZQBUUFSO

    ࣌୅എܠ ,PUMJO͕GJSTUTVQQPSUMBOHVBHFͱൃදɻ "OESPJEYܥͷ࣌୅  NVMUJXJOEPXNPEFͷొ৔ ओͳϥΠϒϥϦ 3Y+BWB %BHHFS "OESPJE0SNB 0L)UUQ 3FUSPGJU 4UFUIP %BUB#JOEJOH 1FSNJTTJPO%JTQBUDIFS
  37. 2017 Model Single/Maybe/Completable (RxJava2) Activity Fragment xml DataBinding LocalDataSource Orma

    RemoteDataSource Retrofit + OkHttp Repository ViewModel call call call
  38. 2017 Model Single/Maybe/Completable (RxJava2) Activity Fragment xml DataBinding LocalDataSource Orma

    RemoteDataSource Retrofit + OkHttp Repository ViewModel call call call Model View ViewModel Repository
  39. 2017 Model Single/Maybe/Completable (RxJava2) Activity Fragment xml DataBinding LocalDataSource Orma

    RemoteDataSource Retrofit + OkHttp Repository ViewModel call call call Model View ViewModel Repository ੍ޚ೉
  40. 2017

  41. 2017 खಈͰ։์͠ͳ͍ͱԿ͕ى͖Δ͔Θ͔Βͳ͍ Jetpack (AAC) ViewModel ͕·ͩଘࡏ͠ͳ͍

  42. "OESPJEΞϓϦઃܭύλʔϯೖ໳ ୈষʮ044ʹ͓͚Δઃܭऀͷ໾ׂʯ ʢখ੢༟հ!LPOJGBSʣ 2017 ͋ΘͤͯಡΈ͍ͨ

  43. "OESPJEΞϓϦઃܭύλʔϯೖ໳ ୈষʮ044ʹ͓͚Δઃܭऀͷ໾ׂʯ ʢখ੢༟հ!LPOJGBSʣ 2017 ͋ΘͤͯಡΈ͍ͨ .77.ʹΑΔΞϓϩʔν ϥΠϑαΠΫϧϋϯυϧͷ೉͠͞

  44. 2018

  45. 2018 TUBUT 044 ਓ ,PUMJO"OESPJEPOMZ ΞʔΩςΫνϟ .77. 3FQPTJUPSZQBUUFSO ࣌୅എܠ "OESPJEYܥͷ࣌୅

     QJDUVSFJOQJDUVSFͷαϙʔτ 'MVUUFS౳ʹΑΔϚϧνϓϥοτϑΥʔϜ ओͳϥΠϒϥϦ 3Y+BWB %BHHFS 3PPN 0L)UUQ 3FUSPGJU (SPVQJF %BUB#JOEJOH "OESPJE ,59
  46. 2018 Model Single/Maybe/Completable/Flowable (RxJava2) Activity Fragment xml DataBinding Database Room

    API Retrofit + OkHttp Repository ViewModel call call call LiveData
  47. 2018 Model Single/Maybe/Completable/Flowable (RxJava2) Activity Fragment xml DataBinding Database Room

    API Retrofit + OkHttp Repository ViewModel call call call LiveData data View ViewModel Repository
  48. 2018 Model Single/Maybe/Completable/Flowable (RxJava2) Activity Fragment xml DataBinding Database Room

    API Retrofit + OkHttp Repository ViewModel call call call LiveData data View ViewModel Repository ,PUMJOʹΑΔදݱͷγϯϓϧԽ ""$ͷ୆಄ 7JFX.PEFMͷංେԽɾ 7JFXͷෳࡶԽ
  49. 2019

  50. 2019 TUBUT 044 ਓ ,PUMJOɾ4XJGU"OESPJEɾJ04 ΞʔΩςΫνϟ 'MVY 3FQPTJUPSZ .VMUJ.PEVMF ࣌୅എܠ

    ,PUMJO$PSPVUJOFT͕੮ר "OESPJEYܥͷ࣌୅  ϊονελΠϧͷσΟεϓϨΠ ओͳϥΠϒϥϦ %BHHFS ,PUMJO$PSPVUJOFT ,UPS 0L)UUQ 4UFUIP (SPVQJF %BUB#JOEJOH 1JDBTP
  51. 2019 Dispatcher Database Room API Ktor-client ActionCreator xml Store Fragment

    Repository suspend call DataBinding BroadcastChannel suspend call suspend call suspend call LiveData call
  52. Dispatcher Database Room API Ktor-client ActionCreator xml Store Fragment Repository

    suspend call DataBinding BroadcastChannel suspend call suspend call suspend call LiveData Flux call data Repository 2019
  53. None
  54. 'MVYʹΑΔ7JFX؅ཧͷ৽͍͠ Ξϓϩʔν ϞδϡʔϧԽʹΑΔ໾ׂɾ ґଘؔ܎ͷ໌֬Խ

  55. 2020

  56. 2020 TUBUT 044 ਓ ,PUMJOɾ4XJGU"OESPJEɾJ04 ΞʔΩςΫνϟ .77. 3FQPTJUPSZ .VMUJ.PEVMF ࣌୅എܠ

    +FUQBDL$PNQPTFBMQIBͰ੝Γ্͕Δɻ "OESPJEY Yܥͷ࣌୅  δΣενϟφϏήʔγϣϯͷରԠ ओͳϥΠϒϥϦ %BHHFS ,PUMJO$PSPVUJOFT'MPXT ,UPS 0L)UUQ 4UFUIP (SPVQJF %BUB#JOEJOH $PJM
  57. 2020 Model Coroutines Flow Activity Fragment xml DataBinding Database Room

    API Ktor-Client Repository ViewModel call Suspend call Suspend call LiveData
  58. 2020 Model Coroutines Flow Activity Fragment xml DataBinding Database Room

    API Ktor-Client Repository ViewModel call Suspend call Suspend call LiveData data View ViewModel Repository
  59. None
  60. "OESPJE%FWFMPQFSTʹهࡌ͞ΕΔ ਪ঑ΞʔΩςΫνϟ΁ͷ௥ै 6J.PEFMΛ༻͍ͨ7JFX΁ͷ ঢ়ଶߋ৽ͷ໌֬Խ

  61. എܠͱൃදͰ ໨ࢦ͢ΰʔϧ ֤೥ͷ ηογϣϯ ৘ใऔಘը໘ ࣮૷ ೥ͷ %,BJHJΞϓϦ ͔Βඥղ͘ ະདྷͷ

    σϑΝΫτ Section 1 Section 2 Section 3 Agenda
  62. എܠͱൃදͰ ໨ࢦ͢ΰʔϧ ֤೥ͷ ηογϣϯ ৘ใऔಘը໘ ࣮૷ ೥ͷ %,BJHJΞϓϦ ͔Βඥղ͘ ະདྷͷ

    σϑΝΫτ Section 1 Section 2 Section 3 Agenda
  63. (Section3) Learn future de facto for Android app development from

    conference app 2021. ͜ͷηΫγϣϯͷ໨త  ະདྷͷΞʔΩςΫνϟσϑΝΫτΛ DPOGFSFODFBQQ͔Βײ͡Δ  +FUQBDL$PNQPTFͱͷ޲͖߹͍ํɾ ϚϧνϓϥοτϑΥʔϜͰͷ ڞ௨Խʹ͍ͭͯߟ͑Δ
  64. 2021

  65. 2021 TUBUT 044 ਓ ,PUMJOɾ4XJGU"OESPJEɾJ04 ΞʔΩςΫνϟ .77. .7* .VMUJNPEVMF ࣌୅എܠ

    ,..ʹΑΔϚϧνϓϥοτϑΥʔϜ "OESPJEͷ࣌୅  .BUFSJBM:PV ओͳϥΠϒϥϦ )JMU ,PUMJO$PSPVUJOFT'MPXT ,UPS %BUB4UPSF +FUQBDL$PNQPTF
  66. 2021 $PNQPTFͷར༻ʹΑΔ 6*هड़ෳࡶԽ΁ͷ௅ઓ ,..ʹΑΔ"OESPJEɾJ04 ϩδοΫڞ௨Խ

  67. 2021 Model Coroutines Flow Activity Fragment Jetpack Compose Database DataStore

    API Ktor-Client Repository ViewModel call Suspend call Suspend call flow
  68. 2021 Model Coroutines Flow Activity Fragment Jetpack Compose Database API

    Ktor-Client Repository ViewModel call Suspend call Suspend call flow View DataStore
  69. 2021 ViewModel Screen(Statefull) Screen(Steteless) Screen Data Data Event Event Event

    State Effect
  70. 2021 Model Coroutines Flow Activity Fragment Jetpack Compose Database DataStore

    API Ktor-Client Repository ViewModel call Suspend call Suspend call flow
  71. 2021 Model Coroutines Flow Activity Fragment Jetpack Compose Database API

    Ktor-Client Repository ViewModel call Suspend call Suspend call flow Data (Android/iOS) DataStore
  72. 2021 Data Compose Android iOS ViewModel Wrapper SwiftUI call flow

    call flow ͲͪΒͷϓϥοτϑΥʔϜͰ΋ಈ͘Α͏ͳٕज़બఆ
  73. Conclusion

  74. Conclusion 2021 2015 Dagger2 Hilt xml Compose rxjava1 rxjava2 coroutines

    orma room DataStore Picasso Glide Coil
  75. ΧϯϑΝϨϯεΞϓϦͷྺ࢙Λඥղ͍ͯ೔ʑͷ։ൃͷώϯτʹ͠Α͏ 7JFXͷෳࡶੑʹཱͪ޲͔͏ͨΊʹ༷ʑͳΞϓϩʔν͕औΒΕ͖ͯͨ ϨΠϠؒΛͭͳ͙ TUSFBNͷϥΠϒϥϦ͸සൟʹมԽ͖ͯͨ͠ Conclusion Կ͕Կʹஔ͖׵Θͬͨͷ͔Λ৻ॏʹோΊΔ͜ͱ͕େ੾

  76. ΧϯϑΝϨϯεΞϓϦͷྺ࢙Λඥղ͍ͯ೔ʑͷ։ൃͷώϯτʹ͠Α͏ ະདྷͷ"OESPJEΞϓϦ։ൃͷσϑΝΫτΛײ͡Α͏ 7JFXͷෳࡶੑʹཱͪ޲͔͏ͨΊʹ༷ʑͳΞϓϩʔν͕औΒΕ͖ͯͨ ϨΠϠؒΛͭͳ͙ TUSFBNͷϥΠϒϥϦ͸සൟʹมԽ͖ͯͨ͠ $PNQPTFʹΑΔ 6*࡞੒ ,..ʹΑΔϩδοΫڞ௨Խ Conclusion Կ͕Կʹஔ͖׵Θͬͨͷ͔Λ৻ॏʹோΊΔ͜ͱ͕େ੾

    ՝୊΋·ͩ͋Δ
  77. Thank you ࣭໰͸ΦϑΟεΞϫʔʹ͓ͯئ͍͠·͢ʂ

  78. Bibliography

  79. [1] DroidKaigi, “DroidKaigi公式フィードアプリ” https://play.google.com/store/apps/details?id=io.github.droidkaigi.feeder [2] konifar, “DroidKaigi2016 Repository” https://github.com/konifar/droidkaigi2016 [3]

    DroidKaigi, “DroidKaigi2017 Repository” https://github.com/DroidKaigi/conference-app-2017 [4] DroidKaigi, “DroidKaigi2018 Repository” https://github.com/DroidKaigi/conference-app-2018 [5] DroidKaigi, “DroidKaigi2019 Repository” https://github.com/DroidKaigi/conference-app-2019 [6] DroidKaigi, “DroidKaigi2020 Repository” https://github.com/DroidKaigi/conference-app-2020 [7] DroidKaigi, “DroidKaigi2021 Repository” https://github.com/DroidKaigi/conference-app-2021 [8] ⽇⾼正博,⼩⻄裕介,藤原聖,吉岡毅,今井智章, “Androidアプリ設計パターン⼊⾨” https://peaks.cc/books/architecture_patterns [9] Johannes, “The good and bad of modern app architecture” https://droidkaigi.jp/2019/timetable/70668 [10] mhidaka, “mhidakaさんのtweets” https://twitter.com/mhidaka/status/1441264050332061699 [11] konifar, “DroidKaigi2018-flutter Repository” https://github.com/konifar/droidkaigi2018-flutter [12] chigichan24, “DroidKaigi2019のコードを読み解く” https://speakerdeck.com/chigichan24/read-droidkaigi2019-app-source-code [13] Aakira, “flux with kotlin” https://speakerdeck.com/aakira/flux-with-kotlin-abema-dev-con-2016 [14] 釘宮慎之介,横幕圭真, “チームで育てるAndroidアプリ設計” https://peaks.cc/books/architecture_with_team [15] KenzoNirasawa, “iOSエンジニアがKMPで⼤規模アプリのロジック共通化をしてうまくできている話” https://speakerdeck.com/nirazo/iosdc2021 [16] Wikipedia, “Android version history” https://en.wikipedia.org/wiki/Android_version_history [17] chigichan24, “継続的に機能開発を進めながら⾏うマルチモジュール化” https://speakerdeck.com/chigichan24/ji-sok-de-niji-neng-kai-fa-wojin-menagaraxing-umarutimoziyuruhua [18] Google Developers, “アプリアーキテクチャガイド” https://developer.android.com/jetpack/guide [19] Google Developers, “開発者基調講演 (Google I/O ’17)” https://www.youtube.com/watch?v=EtQ8Le8-zyo