Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Androidアプリ開発における技術顧問としての役割 #DroidKaigi 2018
Search
Tatsuya Arai
February 22, 2018
Technology
1
2.4k
Androidアプリ開発における技術顧問としての役割 #DroidKaigi 2018
2018/2/9
#DroidKaigi 2018 でお話した「Androidアプリ開発における技術顧問としての役割」の資料です
Tatsuya Arai
February 22, 2018
Tweet
Share
More Decks by Tatsuya Arai
See All by Tatsuya Arai
5 minutes PWA
cutmail
0
180
4年続くアプリにおけるチーム開発 #DroidKaigi 2017
cutmail
13
4.9k
フリルにおけるドッグフーディング / Fashion Tech Meetup #2 LT
cutmail
2
3.8k
Adapter and Custom Layout
cutmail
3
880
いかにして不具合発見時の フィードバックを素早く行うか #potatotips 12
cutmail
0
2.5k
Androidのログ出力をいい感じにする #potatotips 9
cutmail
8
9.7k
コーディング規約を緩く守りつつ仕事の成果を出す方法
cutmail
2
590
Other Decks in Technology
See All in Technology
人はなぜISUCONに夢中になるのか
kakehashi
PRO
6
1.7k
ESXi で仮想化した ARM 環境で LLM を動作させてみるぞ
unnowataru
0
140
実は強い 非ViTな画像認識モデル
tattaka
1
630
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張
hatena
0
160
Amazon S3 Tablesと外部分析基盤連携について / Amazon S3 Tables and External Data Analytics Platform
nttcom
0
150
デスクトップだけじゃないUbuntu
mtyshibata
0
590
Exadata Database Service on Cloud@Customer セキュリティ、ネットワーク、および管理について
oracle4engineer
PRO
1
1.5k
2025-02-21 ゆるSRE勉強会 Enhancing SRE Using AI
yoshiiryo1
1
430
Potential EM 制度を始めた理由、そして2年後にやめた理由 - EMConf JP 2025
hoyo
2
1.3k
NFV基盤のOpenStack更新 ~9世代バージョンアップへの挑戦~
vtj
0
310
生成 AI プロダクトを育てる技術 〜データ品質向上による継続的な価値創出の実践〜
icoxfog417
PRO
5
1.8k
プロダクトエンジニア 360°フィードバックを実施した話
hacomono
PRO
0
130
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
244
12k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
Side Projects
sachag
452
42k
Being A Developer After 40
akosma
89
590k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
980
A designer walks into a library…
pauljervisheath
205
24k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
Building an army of robots
kneath
303
45k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
RailsConf 2023
tenderlove
29
1k
Transcript
AndroidΞϓϦ։ൃʹ ͓͚Δٕज़ސͱͯ͠ ͷׂ DroidKaigi 2018 @cutmail
͢Δ • ٕज़ސͱͯ͠νʔϜΛͲ͏ཱ͔ͯͨ͠ • ٕज़ސͱͯ͠ձࣾʹͲ͏ߩݙ͢Δ͔ • ۙͷϓϩδΣΫτͰԿΛ࠾༻͔ͨ͠
͠ͳ͍ • MVVMɺMVP….ͳͲͷઃܭͷ
ࣗݾհ
ࣗݾհ • @cutmail • ߥҪ ୡ࠸ • ϐοΫΞοϓגࣜձࣾ ٕज़ސ •
Android / iOS / GAE / Go
ΞδΣϯμ • ٕज़ސͱ • ٕज़ސͱ͍ͯͬͯ͠Δ͜ͱ • ٕज़ސͱͯ͠AndroidΞϓϦ։ൃͰ͍ͬͯ Δ͜ͱ • ·ͱΊ
ٕज़ސͱ
ٕज़ސͱ • ٕज़ऀͷ৬Ͱٕज़ࢦಋऀ • ٕज़ͷಛఆྖҬͷΞυόΠβʔ • ৫ʹର͢ΔΞυόΠβʔ
ٕज़ސͱͯ͠ ͍ͬͯΔ͜ͱ
ٕज़ސͷࣄ • ։ൃମ੍ͷཱͯ͠ • ٕज़ใ • ࠾༻ • ࣾͷ੍࡞Γ •
ٕज़ͷબఆ
։ൃମ੍ͷཱͯ͠
%..άϧʔϓ ϐοΫΞοϓ ωΫετΧϨϯγʔ ͦͷଞ άϧʔϓձࣾ
CHIPS
None
։ൃνʔϜମ੍ • PM 1ਓ • σβΠφʔ 1ਓ • αʔόʔ 2ਓ
• iOS 2ਓ • Android 1ਓ
ϓϥοτϑΥʔϜ • iOS • AndroidʢະϦϦʔεʣ • Ұ෦Web
ॳ
ϓϩδΣΫτʹ ೖͬͯΈͨΒ
ۀظͷΑ͏ͳ։ൃ͕ ߦΘΕ͍ͯͨ
ޱ಄ͰͷΓͱΓ
୭Ѳ͍ͯ͠ͳ͍ ։ൃεέδϡʔϧ
ಉ͡ํΛ ͍͍ͯͳ͍
࣋ଓੑͷͳ͍։ൃ
ϚΠϧετʔϯ͕ͳ͍
ʮઓ͔ͳʁʯ
Ͳ͏͔ͨ͠
νʔϜϏϧσΟϯά
߹॓ͷ࣮ࢪ
None
None
߹॓ͷ࣮ࢪ • ΦϑΟεͱ͋͑ͯԕ͍ॴʹ͋͑ͯंͰ • άϧʔϓʹΘ͔ΕͯंͰҠಈ • υϥοΧʔ෩ΤΫααΠζΛத৺ͱͨ͠ϫʔ Ϋγϣοϓ
υϥοΧʔ෩ΤΫααΠζ • 3ͭͷ࣭Ͱ͓ޓ͍ͷ͜ͱΛΓɺظΛ͢Γ ߹ΘͤΔ • ࣗͷಘҙͳ͜ͱ • νʔϜϝϯόʔ͕ࣗʹظ͍ͯ͠Δͱࢥ͏͜ ͱ •
ଞͷϝϯόʔʹظ͢Δ͜ͱ
݁Ռ
͓ޓ͍ͷظΛ͢Γ͋Θͤ Δ͜ͱͰ
νʔϜϝϯόʔͷ૬ޓཧղ͕ ਐΜͩ
νʔϜͷ݁ଋྗ͕ߴ·ͬͨ
։ൃମ੍ͷඋ
։ൃମ੍ͷඋ • 2िؒͷεϓϦϯτ • ελϯυΞοϓϛʔςΟϯά • ϓϩμΫτόοΫϩά • ίʔυϨϏϡʔͷಋೖ
֤ʑ͕͍࣋ͬͯΔλεΫͷ ݟ͑ΔԽ
λεΫͷՄࢹԽ • TrelloΛಋೖ • EleganttͰΨϯτνϟʔτΛݟΕΔΑ͏ʹ
ZenHubಋೖ • issueϚΠϧετʔϯΛGitHubͰ݁Ͱ͖ ΔΑ͏ʹ • ͜ΕΛݟͳ͕ΒελϯυΞοϓMTGΛ࣮ࢪ
None
None
ίʔυϨϏϡʔͷಋೖ
ίʔυϨϏϡʔ࣌ʹϥϕϧΛ͚ͭΔ • [nits] : খ͍͞ࢦఠɻΠϯσϯτtypo • [IMO] : In My
Opinion ࢲ͜͏ࢥ͏͚Ͳผʹ͢͜ͱඞ ਢͰͳ͍ • [COULD] : Ͱ͖Εͨ͠΄͏͕ྑ͍ • [MUST] : ͦ͏ • [Q] : ࣭
ίʔυϨϏϡʔͷ؍ • ༷ͦͦΛຬ͍ͨͯ͠Δ͔ • iOS / AndroidͰۃʹ༷͕ҧ͍ͬͯͳ͍͔ • ໋໊͕ద͔ •
ςετ͕ॻ͔Ε͍ͯΔ͔ • ίϝϯτ͕ͳͯ͘ཧղͰ͖Δ͔ • ࣮ࡍʹಈ͔ͯ͠Έͯҧײ͕ͳ͍͔
ϦϦʔε༰Λ͢ • GitHubͷϦϦʔεػೳΛͬͯɺͦͷόʔ δϣϯʹԿΛϦϦʔε͔ͨ͢͠ • Slack͔Βgit-pr-releaseΛ͚ͨͨΔΑ͏ʹͯ͠ ͍Δ • ։ൃҎ֎ͷϝϯόʔʹϦϦʔεϖʔδΛݟͯ มߋΛѲͯ͠Β͏
ٕज़ใ
ٕज़ใ • ࣾͰ͍ͬͯΔٕज़τϐοΫΛ֎ʹൃ৴ ͢Δ • ςοΫϒϩά • Πϕϯτͷڠࢍɺग़ల
None
%..άϧʔϓ ϐοΫΞοϓ ωΫετΧϨϯγʔ ͦͷଞ άϧʔϓձࣾ
GAE/Go • TELLER શࠃCM์ө࣌GAEͷΦʔτεέʔ ϧͰ༨༟ • ύϑΥʔϚϯε͕མͪΔ͜ͱͳ͍ • ϩʔϧόοΫόʔδϣϯΛ͚ͩ͢
None
None
ࣾͰΘΕ͍ͯΔ ٕज़ελοΫΛ၆ᛌͯ͠ هࣄԽ
֎෦ͷΞτϓοτΛ ૿͢ΈΛ࡞Δ
Πϕϯτͷڠࢍ • ձࣾͷٕज़ελοΫʹ͋͏Πϕϯτʹڠࢍ͢Δ • ڠࢍۚͷ֬อ • ڠࢍ͢Δ͚ͩͰͳ͘ɺొஃґཔ͢Δ
ΤϯδχΞ࠾༻ͷαϙʔτ
ΤϯδχΞ࠾༻ͷαϙʔτ • ٕज़ϒϥϯσΟϯά • Γ͍ͯͳ͍ਓࡐͷཧ/ൃ۷
ٕज़ϒϥϯσΟϯά • ٕज़ϒϥϯσΟϯά࠾༻ϒϥϯσΟϯά • ֎͔Βͷݟ͑ํΛ౿·͑ͯ෦Λվળ͍ͯ͘͠ • ॏཁͳͷද໘͚ͩͰͳ͘ɺ݁Ռతʹ αʔϏε͕ྑ͘ͳΔ͜ͱ
Γ͍ͯͳ͍ਓࡐΛ໌֬Խ • ֤νʔϜ͕ࠓͲͷ৬छΛืू͍ͯ͠Δͷ͔ • Ϧιʔεঢ়گʁ • ืूཁ߲Λ࡞͢Δ • Ͳ͏͍͏εϖοΫͷਓ͕ඞཁͳͷ͔
੍࡞Γ
੍࡞Γ • 50%ϑϦʔϧʔϧ • ηϛφʔࢀՃ੍ • ϑϨϯυγοϓαϙʔτ • ͓ࢼ͠ब৬੍
50%ϑϦʔϧʔϧ • ۀ࣌ؒͷ50%ΛҎԼͷ׆ಈʹ͋ͯͯྑ੍͍ • OSSͷߩݙ • ຊͷࣥච • Πϕϯτొஃɺͦͷ४උ •
࠾༻ʹؔΘΔ׆ಈશൠ
ΧϯϑΝϨϯεࢀՃ੍ • ༗ྉͷ֎෦ηϛφʔΧϯϑΝϨϯεʹࢀՃ Ͱ͖Δ • DroidKaigiɺtry! Swift • ۙͩͱGopherConɺKotlinConfʹϝϯόʔ ͕ࢀՃ༧ఆ
ϑϨϯυγοϓαϙʔτ • ༏लͳ༑ਓͱͷ͝൧ͷඅ༻Λձ͕ࣾෛ୲ • 1ճʹ͖ͭ1ਓ1ສԁ·Ͱิॿ • ༏लͳϝϯόʔ༏लͳ༑ਓΛ͍ͬͯΔ ͣ
͓ࢼ͠ब৬੍ • ҆৺ͯ͠ೲಘͯ͠ೖࣾͯ͠Β͏ͨΊʹɺస ৬લʹ࣮ࡍʹҰॹʹಇ͚Δ • 1~1िؒఔ • ͪΖΜใु͓ࢧ͍
ࣾΠϕϯτͷ։࠵ • ϞόΠϧڞ༗ձ • Goձ • ʮΈΜͳͷGoݴޠʯྠಡձ • ϐοΫΞοϓφΠτ
ϞόΠϧڞ༗ձ • ϞόΠϧΞϓϦΤϯδχΞ͕ू·ͬͯίʔυΛ ಡΜͩΓɺ࠷ۙͷ։ൃτϐοΫʹ͍ͭͯ͢ • DroidKaigiΞϓϦͷιʔείʔυϦʔσΟϯ άΛͨ͠Γ
ϞόΠϧڞ༗ձ • ଞνʔϜͷαʔϏεͷίʔυΛಡΜͰɺઃܭ ʹ͍ͭͯ͋Ε͜Ε • ΞʔΩςΫνϟʹ͍ͭͯͷٞ
Goձ • αʔόʔΤϯδχΞ͕ू·Γɺ֤ϓϩδΣΫ τͷίʔυΛಡΜͩΓɺࠔ͍ͬͯΔ͜ͱɺ ϗοτͳτϐοΫઃܭʹ͍ͭͯ͢ • ΞϓϦΤϯδχΞࢀՃOK
ʮΈΜͳͷGoݴޠʯྠಡձ • 1ষͮͭ࣋ͪճΓͰղઆ • ΞϓϦΤϯδχΞࢀՃ • αʔόʔͷؾ࣋ͪΛཧղͯ͠ Β͏
ϐοΫΞοϓφΠτ • ࣾLTձ • ࢿྉجຊతʹͳ͠Ͱ • ͯ͘5 • ٕज़Ҏ֎ͷτʔΫWelcome
None
Ϟνϕʔγϣϯ • ୯७ʹؾ͍ͮͨ͜ͱΛ൸࿐͍ͨ͠ • খωλΛൃදͰ͖ΔػձΛఏڙ͢Δ • νʔϜؒͰ͢Λ࡞Δ • ·ͣࣾͰ͢ͷʹ׳Ε͔ͯΒ֎෦Ͱొஃ ͢Δಓےʹͯ͠Β͏
ٕज़ސͱͯ͠ AndroidΞϓϦ։ൃͰͬͯ ͍Δ͜ͱ
ٕज़ͷબఆ
None
CHIPSͰͷϥΠϒϥϦ • Kotlin • RxJava2 • Dagger2 • Android Architecture
Component • Lifecycle • Room • Paging
Handling Lifecycles • ActivityFragmentͳͲͷίϯϙʔωϯτʹ ؔ͢ΔใΛอ࣋͠ɺΦϒδΣΫτ͕؍ଌͰ ͖ΔΑ͏ʹ͢Δ
Handling Lifecycles • CHIPSͰLifecycleͷมߋ࣌ʹExoPlayerͷڍ ಈΛม͑ͨΓ͢Δͷʹ͍ͬͯͨΓ͢Δ
Room • SQLiteʹΞΫηε͢ΔநԽϨΠϠʔΛఏڙ
@Entity data class Task( @PrimaryKey val id: String, val name:
String) { } @Dao interface 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 • ͲͷϓϩμΫτ͜ͷߏʹ
None
None
ۙͷࣄྫ
ೝূΛஔ͖͑ͨ
ಠࣗೝূ͔Β Firebase Authentication • ॳճىಈ࣌ʹήετϢʔβʔΛ࡞ • ݩʑಠࣗͷϩδοΫͰϢʔβʔ࡞ɺೝূ • ಠࣗOAuth࣮
ಠࣗೝূ͔ΒFirebase Auth firebaseAuthInstance.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Խ
None
·ͱΊ
ٕज़ސͷࣄͱ • ֎෦ɺ෦ଟذʹΘͨΔ • αʔϏεͷͨΊʹɺظతͳઢͰٕज़Λ બఆ͢Δ • ࣾͰΘΕ͍ͯΔٕज़ελοΫΛັྗʹม͑ Δ •
ձࣾͷΧϧνϟʔ࡞ΓʹӨڹ͢Δ
࠷ޙʹ
ٕज़ސ͔ΒίʔϙϨʔτΤϯ δχΞϦϯά • ΑΓ৫ͷ෦Λվળ͍ͯͨ͘͠Ίɺ ίʔϙϨʔτΤϯδχΞϦϯάࣨΛઃཱ • αʔϏεڞ௨ͷج൫ɺཧγεςϜɺશࣾʹ ඥͮ͘։ൃΛਐΊΔ
͝੩ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠