2018/2/9 #DroidKaigi 2018 でお話した「Androidアプリ開発における技術顧問としての役割」の資料です
AndroidΞϓϦ։ൃʹ͓͚Δٕज़ސͱͯ͠ͷׂDroidKaigi 2018@cutmail
View Slide
͢Δ• ٕज़ސͱͯ͠νʔϜΛͲ͏ཱ͔ͯͨ͠• ٕज़ސͱͯ͠ձࣾʹͲ͏ߩݙ͢Δ͔• ۙͷϓϩδΣΫτͰԿΛ࠾༻͔ͨ͠
͠ͳ͍• MVVMɺMVP….ͳͲͷઃܭͷ
ࣗݾհ
ࣗݾհ• @cutmail• ߥҪ ୡ࠸• ϐοΫΞοϓגࣜձࣾ ٕज़ސ• Android / iOS / GAE / Go
ΞδΣϯμ• ٕज़ސͱ• ٕज़ސͱ͍ͯͬͯ͠Δ͜ͱ• ٕज़ސͱͯ͠AndroidΞϓϦ։ൃͰ͍ͬͯΔ͜ͱ• ·ͱΊ
ٕज़ސͱ
ٕज़ސͱ• ٕज़ऀͷ৬Ͱٕज़ࢦಋऀ• ٕज़ͷಛఆྖҬͷΞυόΠβʔ• ৫ʹର͢ΔΞυόΠβʔ
ٕज़ސͱ͍ͯͬͯ͠Δ͜ͱ
ٕज़ސͷࣄ• ։ൃମ੍ͷཱͯ͠• ٕज़ใ• ࠾༻• ࣾͷ੍࡞Γ• ٕज़ͷબఆ
։ൃମ੍ͷཱͯ͠
%..άϧʔϓϐοΫΞοϓ ωΫετΧϨϯγʔͦͷଞ άϧʔϓձࣾ
CHIPS
։ൃνʔϜମ੍• PM 1ਓ• σβΠφʔ 1ਓ• αʔόʔ 2ਓ• iOS 2ਓ• Android 1ਓ
ϓϥοτϑΥʔϜ• iOS• AndroidʢະϦϦʔεʣ• Ұ෦Web
ॳ
ϓϩδΣΫτʹ ೖͬͯΈͨΒ
ۀظͷΑ͏ͳ։ൃ͕ ߦΘΕ͍ͯͨ
ޱ಄ͰͷΓͱΓ
୭Ѳ͍ͯ͠ͳ͍ ։ൃεέδϡʔϧ
ಉ͡ํΛ ͍͍ͯͳ͍
࣋ଓੑͷͳ͍։ൃ
ϚΠϧετʔϯ͕ͳ͍
ʮઓ͔ͳʁʯ
Ͳ͏͔ͨ͠
νʔϜϏϧσΟϯά
߹॓ͷ࣮ࢪ
߹॓ͷ࣮ࢪ• ΦϑΟεͱ͋͑ͯԕ͍ॴʹ͋͑ͯंͰ• άϧʔϓʹΘ͔ΕͯंͰҠಈ• υϥοΧʔ෩ΤΫααΠζΛத৺ͱͨ͠ϫʔΫγϣοϓ
υϥοΧʔ෩ΤΫααΠζ• 3ͭͷ࣭Ͱ͓ޓ͍ͷ͜ͱΛΓɺظΛ͢Γ߹ΘͤΔ• ࣗͷಘҙͳ͜ͱ• νʔϜϝϯόʔ͕ࣗʹظ͍ͯ͠Δͱࢥ͏͜ͱ• ଞͷϝϯόʔʹظ͢Δ͜ͱ
݁Ռ
͓ޓ͍ͷظΛ͢Γ͋ΘͤΔ͜ͱͰ
νʔϜϝϯόʔͷ૬ޓཧղ͕ ਐΜͩ
νʔϜͷ݁ଋྗ͕ߴ·ͬͨ
։ൃମ੍ͷඋ
։ൃମ੍ͷඋ• 2िؒͷεϓϦϯτ• ελϯυΞοϓϛʔςΟϯά• ϓϩμΫτόοΫϩά• ίʔυϨϏϡʔͷಋೖ
֤ʑ͕͍࣋ͬͯΔλεΫͷݟ͑ΔԽ
λεΫͷՄࢹԽ• TrelloΛಋೖ• EleganttͰΨϯτνϟʔτΛݟΕΔΑ͏ʹ
ZenHubಋೖ• issueϚΠϧετʔϯΛGitHubͰ݁Ͱ͖ΔΑ͏ʹ• ͜ΕΛݟͳ͕ΒελϯυΞοϓMTGΛ࣮ࢪ
ίʔυϨϏϡʔͷಋೖ
ίʔυϨϏϡʔ࣌ʹϥϕϧΛ͚ͭΔ• [nits] : খ͍͞ࢦఠɻΠϯσϯτtypo• [IMO] : In My Opinion ࢲ͜͏ࢥ͏͚Ͳผʹ͢͜ͱඞਢͰͳ͍• [COULD] : Ͱ͖Εͨ͠΄͏͕ྑ͍• [MUST] : ͦ͏• [Q] : ࣭
ίʔυϨϏϡʔͷ؍• ༷ͦͦΛຬ͍ͨͯ͠Δ͔• iOS / AndroidͰۃʹ༷͕ҧ͍ͬͯͳ͍͔• ໋໊͕ద͔• ςετ͕ॻ͔Ε͍ͯΔ͔• ίϝϯτ͕ͳͯ͘ཧղͰ͖Δ͔• ࣮ࡍʹಈ͔ͯ͠Έͯҧײ͕ͳ͍͔
ϦϦʔε༰Λ͢• GitHubͷϦϦʔεػೳΛͬͯɺͦͷόʔδϣϯʹԿΛϦϦʔε͔ͨ͢͠• Slack͔Βgit-pr-releaseΛ͚ͨͨΔΑ͏ʹ͍ͯ͠Δ• ։ൃҎ֎ͷϝϯόʔʹϦϦʔεϖʔδΛݟͯมߋΛѲͯ͠Β͏
ٕज़ใ
ٕज़ใ• ࣾͰ͍ͬͯΔٕज़τϐοΫΛ֎ʹൃ৴͢Δ• ςοΫϒϩά• Πϕϯτͷڠࢍɺग़ల
GAE/Go• TELLER શࠃCM์ө࣌GAEͷΦʔτεέʔϧͰ༨༟• ύϑΥʔϚϯε͕མͪΔ͜ͱͳ͍• ϩʔϧόοΫόʔδϣϯΛ͚ͩ͢
ࣾͰΘΕ͍ͯΔ ٕज़ελοΫΛ၆ᛌͯ͠ هࣄԽ
֎෦ͷΞτϓοτΛ ૿͢ΈΛ࡞Δ
Πϕϯτͷڠࢍ• ձࣾͷٕज़ελοΫʹ͋͏Πϕϯτʹڠࢍ͢Δ• ڠࢍۚͷ֬อ• ڠࢍ͢Δ͚ͩͰͳ͘ɺొஃґཔ͢Δ
ΤϯδχΞ࠾༻ͷαϙʔτ
ΤϯδχΞ࠾༻ͷαϙʔτ• ٕज़ϒϥϯσΟϯά• Γ͍ͯͳ͍ਓࡐͷཧ/ൃ۷
ٕज़ϒϥϯσΟϯά• ٕज़ϒϥϯσΟϯά࠾༻ϒϥϯσΟϯά• ֎͔Βͷݟ͑ํΛ౿·͑ͯ෦Λվળ͍ͯ͘͠• ॏཁͳͷද໘͚ͩͰͳ͘ɺ݁Ռతʹ αʔϏε͕ྑ͘ͳΔ͜ͱ
Γ͍ͯͳ͍ਓࡐΛ໌֬Խ• ֤νʔϜ͕ࠓͲͷ৬छΛืू͍ͯ͠Δͷ͔• Ϧιʔεঢ়گʁ• ืूཁ߲Λ࡞͢Δ• Ͳ͏͍͏εϖοΫͷਓ͕ඞཁͳͷ͔
੍࡞Γ
੍࡞Γ• 50%ϑϦʔϧʔϧ• ηϛφʔࢀՃ੍• ϑϨϯυγοϓαϙʔτ• ͓ࢼ͠ब৬੍
50%ϑϦʔϧʔϧ• ۀ࣌ؒͷ50%ΛҎԼͷ׆ಈʹ͋ͯͯྑ੍͍• OSSͷߩݙ• ຊͷࣥච• Πϕϯτొஃɺͦͷ४උ• ࠾༻ʹؔΘΔ׆ಈશൠ
ΧϯϑΝϨϯεࢀՃ੍• ༗ྉͷ֎෦ηϛφʔΧϯϑΝϨϯεʹࢀՃͰ͖Δ• DroidKaigiɺtry! Swift• ۙͩͱGopherConɺKotlinConfʹϝϯόʔ͕ࢀՃ༧ఆ
ϑϨϯυγοϓαϙʔτ• ༏लͳ༑ਓͱͷ͝൧ͷඅ༻Λձ͕ࣾෛ୲• 1ճʹ͖ͭ1ਓ1ສԁ·Ͱิॿ• ༏लͳϝϯόʔ༏लͳ༑ਓΛ͍ͬͯΔͣ
͓ࢼ͠ब৬੍• ҆৺ͯ͠ೲಘͯ͠ೖࣾͯ͠Β͏ͨΊʹɺస৬લʹ࣮ࡍʹҰॹʹಇ͚Δ• 1~1िؒఔ• ͪΖΜใु͓ࢧ͍
ࣾΠϕϯτͷ։࠵• ϞόΠϧڞ༗ձ• Goձ• ʮΈΜͳͷGoݴޠʯྠಡձ• ϐοΫΞοϓφΠτ
ϞόΠϧڞ༗ձ• ϞόΠϧΞϓϦΤϯδχΞ͕ू·ͬͯίʔυΛಡΜͩΓɺ࠷ۙͷ։ൃτϐοΫʹ͍ͭͯ͢• DroidKaigiΞϓϦͷιʔείʔυϦʔσΟϯάΛͨ͠Γ
ϞόΠϧڞ༗ձ• ଞνʔϜͷαʔϏεͷίʔυΛಡΜͰɺઃܭʹ͍ͭͯ͋Ε͜Ε• ΞʔΩςΫνϟʹ͍ͭͯͷٞ
Goձ• αʔόʔΤϯδχΞ͕ू·Γɺ֤ϓϩδΣΫτͷίʔυΛಡΜͩΓɺࠔ͍ͬͯΔ͜ͱɺϗοτͳτϐοΫઃܭʹ͍ͭͯ͢• ΞϓϦΤϯδχΞࢀՃOK
ʮΈΜͳͷGoݴޠʯྠಡձ• 1ষͮͭ࣋ͪճΓͰղઆ• ΞϓϦΤϯδχΞࢀՃ• αʔόʔͷؾ࣋ͪΛཧղͯ͠ Β͏
ϐοΫΞοϓφΠτ• ࣾLTձ• ࢿྉجຊతʹͳ͠Ͱ• ͯ͘5• ٕज़Ҏ֎ͷτʔΫWelcome
Ϟνϕʔγϣϯ• ୯७ʹؾ͍ͮͨ͜ͱΛ൸࿐͍ͨ͠• খωλΛൃදͰ͖ΔػձΛఏڙ͢Δ• νʔϜؒͰ͢Λ࡞Δ• ·ͣࣾͰ͢ͷʹ׳Ε͔ͯΒ֎෦Ͱొஃ͢Δಓےʹͯ͠Β͏
ٕज़ސͱͯ͠AndroidΞϓϦ։ൃͰ͍ͬͯΔ͜ͱ
ٕज़ͷબఆ
CHIPSͰͷϥΠϒϥϦ• Kotlin• RxJava2• Dagger2• Android Architecture Component• Lifecycle• Room• Paging
Handling Lifecycles• ActivityFragmentͳͲͷίϯϙʔωϯτʹؔ͢ΔใΛอ࣋͠ɺΦϒδΣΫτ͕؍ଌͰ͖ΔΑ͏ʹ͢Δ
Handling Lifecycles• CHIPSͰLifecycleͷมߋ࣌ʹExoPlayerͷڍಈΛม͑ͨΓ͢Δͷʹ͍ͬͯͨΓ͢Δ
Room• SQLiteʹΞΫηε͢ΔநԽϨΠϠʔΛఏڙ
@Entitydata class Task(@PrimaryKeyval id: String,val name: String) {}@Daointerface TaskDao {@Query("DELETE FROM task")fun deleteAll()}Room
Paging• RoomͳͲͷίϯϙʔωϯτͱγʔϜϨεʹ࿈ܞͰ͖ΔϖʔδϯάϥΠϒϥϦ
Paging• PositionalDataSource• RoomΛ࣮͍ͯ͠Εɺ˓͔Β˓݅औಘΈ͍ͨͳΠϯλϑΣʔεΛࣗಈతʹੜͯ͘͠ΕΔhttps://developer.android.com/topic/libraries/architecture/paging.html
جຊతʹGoogleίϛϡχςΟओྲྀͷٕज़Λ࠾༻͍ͯ͘͠
ͦͷଞϥΠϒϥϦ• Firebase Authentication• Firebase Performance• Retrofit2• ExoPlayer• Glide
CIڥͷඋ• Bitrise• Danger• Android Lint• ktlint• Fabric betaͰࣾ• ৗʹ࠷৽൛͕QAͰ͖Δମ੍ʹ
Πϕϯτܭଌڥͷඋ• Firebase Analytics →BigQuery → CHATIO• ͲͷϓϩμΫτ͜ͷߏʹ
ۙͷࣄྫ
ೝূΛஔ͖͑ͨ
ಠࣗೝূ͔Β Firebase Authentication• ॳճىಈ࣌ʹήετϢʔβʔΛ࡞• ݩʑಠࣗͷϩδοΫͰϢʔβʔ࡞ɺೝূ• ಠࣗOAuth࣮
ಠࣗೝূ͔ΒFirebase AuthfirebaseAuthInstance.signInAnonymously().addOnCompleteListener { task ->if (task.isSuccessful) {observer.onSuccess(task.result.user)} else {val cause = task.exception.toOption().fold({ RuntimeException("unknown firebase auth error") }, { th -> th })observer.onError(cause)}}ΞϓϦFirebaseͷtokenΛαʔόʔʹ͛Δ͚ͩ
ೝূFirebase AuthೝՄࣗαʔόʔͰ
ೝূํ๏Λ૿͢߹Firebase AuthenticationͰ ಠࣗೝূΛ࣮͢Δhttps://firebase.google.com/docs/auth/web/custom-auth?hl=ja https://developers-jp.googleblog.com/2016/10/authenticate-your-firebase-users-with.html
ӡ༻Λָʹ͢ΔΞʔΩςΫνϟΛબ͢Δ
ӡ༻ΑΓαʔϏε։ൃʹ ूத͠Α͏
αʔϏεͷίΞͳՁఏڙʹ ྗ͢Δ
͜Ε͔ΒΓ͍ͨ͜ͱ
API Documentͷࣗಈੜ• ιʔείʔυ͔Βࣗಈੜ• ৽͍͠ΫϥΠΞϯτΞϓϦͳͲΛ࡞Δ࣌ʹඞਢ
GAE/GoɺFirebaseΛͬͨαʔϏεج൫ͷ։ൃ• ϘΠϥʔςϯϓϨʔτ• ೝূϩάͳͲͷجຊతͳίϯϙʔωϯτΛཏͨ͠αʔϏεج൫• αʔϏεͷ্ཱͪ͛Λૣ͘Ͱ͖ΔΑ͏ʹ• ӡ༻ָʹ
• iOS, AndroidͰڞ௨ͷίϯϙʔωϯτͱͯ͠Γग़ͤΔͷΛReact NativeԽ
·ͱΊ
ٕज़ސͷࣄͱ• ֎෦ɺ෦ଟذʹΘͨΔ• αʔϏεͷͨΊʹɺظతͳઢͰٕज़Λબఆ͢Δ• ࣾͰΘΕ͍ͯΔٕज़ελοΫΛັྗʹม͑Δ• ձࣾͷΧϧνϟʔ࡞ΓʹӨڹ͢Δ
࠷ޙʹ
ٕज़ސ͔ΒίʔϙϨʔτΤϯδχΞϦϯά• ΑΓ৫ͷ෦Λվળ͍ͯͨ͘͠Ίɺ ίʔϙϨʔτΤϯδχΞϦϯάࣨΛઃཱ• αʔϏεڞ௨ͷج൫ɺཧγεςϜɺશࣾʹඥͮ͘։ൃΛਐΊΔ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠