Slide 1

Slide 1 text

ϝϧΧϦ Χ΢ϧͷ։ൃ
 ؾʹͳΔʁ
 ͳΒ࿩ͦ͏ʂ shibuya.apk #17

Slide 2

Slide 2 text

About Me Shinobu Okano @operandoOS Mercari, Inc. Souzoh, Inc.

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Πϯετʔϧ͍ͯͩ͘͠͞Ͷ

Slide 5

Slide 5 text

Souzoh Android Talk https://mercari.connpass.com/ event/63552/

Slide 6

Slide 6 text

Android ΞϓϦઃܭύλʔϯೖ໳ https://peaks.cc/archtecture_patterns

Slide 7

Slide 7 text

https://peaks.cc/archtecture_patterns ߪೖక੾೔2017೥08݄04೔ 23:59

Slide 8

Slide 8 text

ϦϦʔε·ͰͷಓͷΓ • 2݄͘Β͍͔Β࠷ॳͷAndroidΤϯδχΞ͕Χ΢ϧΛ ࡞Γ࢝ΊΔ • 3݄ͷத०͘Β͍͔Βࢲ͕ຊ֨తJOINͯ͠ಈ͖࢝ΊΔ • 5݄຤ʹ͸ग़ͤΔʁͱ͔ͦ͏͍͏ײ͡(͏Δ͓΅͑ • Ͱ͖Δ͔ͳʔ

Slide 9

Slide 9 text

๻͕Χ΢ϧʹJOINͯ͠࠷ॳʹ
 ΍ͬͨ͜ͱ • Crashlyticsͷಋೖ • Update Android Gradle Plugin 2.3.0 • signingConfigͷઃఆ • Travis CIͷઃఆ • Fabric Betaͷઃఆ • CI͔ΒFabric Beta΁ͷΞοϓϩʔυ • dependency updatesͷ௥Ճ

Slide 10

Slide 10 text

dependency updatesͷ௥Ճ Gradle PluginͱCIͱԶ https://www.slideshare.net/shinobuokano7/ gradle-pluginci-62464447

Slide 11

Slide 11 text

๻͕Χ΢ϧʹJOINͯ͠࠷ॳʹ
 ΍ͬͨ͜ͱ • ͛͢ʔࢧԉܥͷλεΫ͹͔ͬΓ • ͍΍·͋͜ʔΏʔͷ͸࠷ॳʹ͕ͬʂͱ΍Δ΄͏ ͕͍͍ͷͩΑ • ։ൃதͷΞϓϦ͕͍ͭͰ΋୭Ͱ΋ݟΕΔΑ͏ʹ ͢Δ • ೝࣝͷζϨΛͳ͘͢

Slide 12

Slide 12 text

͓ʁ͜Ε͸σεϚʔν͔ʁ

Slide 13

Slide 13 text

ͦΜͳ͜ͱ͸ͳ͍ʂ

Slide 14

Slide 14 text

Ͱ΋ݫ͍͠ͷͰ... • ϦϦʔεΰʔϧΛ໌֬ʹ͢Δ • Ͳ͜·Ͱ࣮૷ͨ͠ΒϦϦʔεͰ͖Δ͔ • ϦϦʔεʹ޲͚ͯద੾ͳϚΠϧετʔϯΛઃఆ͢Δ • ϚΠϧετʔϯ͕ऴΘͬͨΒΞϓϦͷ֬ೝձΛ͢Δ (͓͞ΘΓձ) • ϝϯόʔͱձ࿩͢Δ(15෼͘Β͍ͷ೔࣍ఆྫ)

Slide 15

Slide 15 text

΋ͬͱԿ͔޻෉͠ͳ͍ͱ։ൃεϐʔυ
 ग़ͤΜͧʁ

Slide 16

Slide 16 text

͜͏͍͏࣌ͦ͜
 ࣮ݧ(νϟϨϯδ)ͯ͠ΈΔ

Slide 17

Slide 17 text

࣮ݧͨ͜͠ͱ • ίʔυϨϏϡʔͷഇࢭ • શPull Request Self Merge • ϦϦʔε͔ͯ͠Β΋਺िؒίʔυϨϏϡʔҰ౓΋ͯ͠ͳ͔ͬͨ • ։ൃதͷྫ֎ΛSlackʹྲྀ͢ • ى͖ͨྫ֎Λᐆດͷ··ऴΘΒͤͳ͍ • etc.

Slide 18

Slide 18 text

ίʔυϨϏϡʔͷഇࢭ • ೋਓͰAndroid։ൃͯ͠Δ͚Ͳͳͨ͘͠ • ਖ਼௚ίʔυϨϏϡʔΊΜͲͤ͘ʔ • ϨϏϡʔ͢Δ͘Β͍ͳΒίʔυॻ͜͏ͥʂ • ૣ͘ϦϦʔε͠Α͏ͥʂ

Slide 19

Slide 19 text

ίʔυϨϏϡʔΛͳͨ͘͜͠ͱͰ • ϓϩμΫτΛૣ͘ϦϦʔε͢Δ͜ͱʹ͸ߩݙͰ͖ͨ • ୹ظతʹΤϯδχΞͷ੒௕Λ٘ਜ਼ʹ͢Δ • ίʔυͷ࣭Λ্͛Δɺ஌Βͳ͔ͬͨ͜ͱΛ஌Δతͳ໘ • ઃܭͲ͏ͳͷΑʁ • େࣄͳͱ͜Ζ͚ͩ࿩͠߹͑͹΄΅໰୊ͳ͍

Slide 20

Slide 20 text

ઃܭ • ࠓ͸MVP(Model-View-Presenter) • ݩʑ͸MVVM • ʮMVPʹ͠Α͏ͥʂ͓Ε΍ͬͨ͜ͱͳ͍͚Ͳʂʯͱ్தͰ ࢲ͕ݴͬͯҠߦ • ݁ՌతʹMVPʹͯ͠ਖ਼ղͩͬͨͱࢥͬͯΔ • ͦΜͳʹ࿩͢͜ͱ͸ͳ͍...

Slide 21

Slide 21 text

ίʔυϨϏϡʔΛ͠ͳͯ͘΋
 େৎ෉ͳ࢓૊Έ • QA͕खް͍ʂ • ϝϧΧϦ΋ι΢κ΢΋QA͕͍͢͝ʂ • ͓͞ΘΓձͰϝϯόʔʹ৮ͬͯ΋Β͏ • ྫ֎Λݟಀ͞ͳ͍ʂ

Slide 22

Slide 22 text

ࠓ͸ίʔυϨϏϡʔ
 ͯ͠·͢ʂ

Slide 23

Slide 23 text

ϦϦʔεલ ίʔυϨϏϡʔ • ϦϦʔε਺೔લʹޱ಄Ͱ·ͱΊͯPull RequestΛϨϏϡʔ͢Δ • 1ͭͷεΫϦʔϯ্Ͱ͋ʔͩ͜ʔͩ࿩͢ͷͰૣ͍ • ͪΐͬͱͨ͠Tips΋ͬ͘͞ͱݴ͍΍͍͢ • ࢀߟ) ίʔυϨϏϡʔΛձ࿩͠ͳ͕Βߦ͏औΓ૊Έ • http://developer.hatenastaff.com/entry/ 2017/06/23/100000

Slide 24

Slide 24 text

Danger

Slide 25

Slide 25 text

https://github.com/danger/danger http://danger.systems/ruby/

Slide 26

Slide 26 text

Dangerͷಋೖ • ࡶʹ͍͏ͱίʔυϨϏϡʔɺPull RequestϨϏϡʔΛࣗಈԽ͢Δ • Ruby or JSͰࣗಈԽͷεΫϦϓτΛॻ͘ • εΫϦϓτ಺ͰPull Requestͷ৘ใ͕औΕΔͷͰࣗಈԽॻ͖΍͍͢ • CIʹ΋ಋೖ͠΍͍͢ • νΣοΫ͍ͨ͠ϓϩδΣΫτࣗମͷݴޠ͸ͳΜͰ΋͍͍

Slide 27

Slide 27 text

Pull RequestͰ͜͏͍͏͜ͱ
 ͋ΔͰ͠ΐʁ • ࢓༷νέοτͷϦϯΫష͍ͬͯͩ͘͞ • ϚΠϧετʔϯ͚͍ͭͯͩ͘͞ • ϥϕϧ͚͍ͭͯͩ͘͞ • etc.

Slide 28

Slide 28 text

ϨϏϡʔ͢Δଆ΋͞ΕΔଆ΋ ਏ͍

Slide 29

Slide 29 text

Dangerʹ೚ͤΔ • ϚΠϧετʔϯ͕ઃఆ͞Εͯͳ͚Ε͹ίϝϯτ͢Δ • ϥϕϧ͕ઃఆ͞Εͯͳ͚Ε͹ίϝϯτ͢Δ • ϦϦʔεϒϥϯνͩͬͨΒϦϦʔεखॱίϝϯτ͢Δ • etc.

Slide 30

Slide 30 text

Gemfile source 'https://rubygems.org' gem 'danger'

Slide 31

Slide 31 text

has_milestone = github.pr_json["milestone"] != nil warn "͋ΕΕʁϚΠϧετʔϯ͕ઃఆ͞Εͯͳ͍Αʁ" unless has_milestone warn "WIPͳͷʁ͸΍͘ऴΘΔͱ͍͍Ͷʔʂ" if github.pr_title.include? "[WIP]" or github.pr_labels.include?("WIP") if github.branch_for_head.start_with?(“release/") then message "ҎԼͷWikiͷखॱʹैͬͯ҆શʹϦϦʔε͠Αʔ :rocket: \nRelease Workflow” end if github.branch_for_head.start_with?("release/") then warn "mapping file͕มߋ͞Εͯͳ͍͚Ͳେৎ෉͔ͳʔʁ" unless git.diff_for_file("app/mapping/mapping.txt") end Dangerfile

Slide 32

Slide 32 text

Dangerʹ೚ͤΔ

Slide 33

Slide 33 text

DangerʹAndroid LintΛಋೖ͢Δ • ؆୯! • ͸΍͍ʂ • ΍͍͢ʂ • ͏·͍ʂ • ͏͍͟ʂ

Slide 34

Slide 34 text

Gemfile source 'https://rubygems.org' gem 'danger' gem 'danger-android_lint'

Slide 35

Slide 35 text

Dangerfile android_lint.gradle_task = "app:lintDebug" android_lint.report_file = 
 "app/build/reports/lint-results-debug.xml" android_lint.filtering = true android_lint.lint(inline_mode: true)

Slide 36

Slide 36 text

PRʹ݁ՌΛίϝϯτͯ͘͠ΕΔ

Slide 37

Slide 37 text

PRʹ݁ՌΛίϝϯτͯ͘͠ΕΔ

Slide 38

Slide 38 text

https://github.com/operando/ AndroidDangerSample/ Sample Android + Travis CI + Danger

Slide 39

Slide 39 text

DangerͰ͜Μͳ͜ͱ΋Ͱ͖ͦ͏ʂ • File DiffΛݟͯͲͷػೳʹӨڹ͢ΔPull Requestͳͷ͔ڭ͑ͯ͘ΕΔ • QAʹ΋ӨڹൣғΛ఻͑΍͘͢͢Δ • ӨڹൣғͷӕΛ͚ͭͳ͘͢Δʂʂ • ςετίʔυॻ͍ͨΒ๙Ίͯ͘ΕΔʂ • ϥϯμϜͰͱʹ͔͘๙Ίͯ͘ΕΔʂ • etc.

Slide 40

Slide 40 text

։ൃதͷྫ֎ΛSlackʹྲྀ͢ • CrashlyticsͷSlack࿈ܞͩͱNew Crash௨஌͸͘Δ • ͚ͩͲɺͦΕҎ߱ಉ͡ྫ֎͕ى͖ͯ΋௨஌͸͜ͳ͍ (͸ͣ) • ྫ֎͕ૹΔͨͼʹSlackʹ௨஌ͯ͠΄͍͠ʂ • ࣗ࡞͢Ε͹ͬ͘͞ͱͰ͖Δ

Slide 41

Slide 41 text

։ൃதͷྫ֎ΛSlackʹྲྀ͢

Slide 42

Slide 42 text

ྫ֎ΛՄࢹԽͰ͖ͨʂ • νʔϜϝϯόʔͷखݩͰى͖ͨྫ֎͕͙͢ʹΘ͔ΔΑ͏ʹͳͬͨʂ • ى͖ͨྫ֎Λͦͷ··΄͓͍ͬͯͯɺ࣮͸…Έ͍ͨͳ͜ͱ͸
 ͳ͘ͳͬͨ • Slackʹྲྀͯ͠ΔͷͰΈΜͳݟ͑Δ • ͋ʔͦͷྫ֎ͳʔΘ͔Δʔͱ͍͏΍ͭΛҰॹʹ։ൃͯ͠Δϝϯόʔ ͕ىͯ͜͠ΔͱͳΜ͔Ұਓ͡Όͳ͍ײ͋ͬͯΑ͍☺ • ΄ͬ͜Γ͢Δ☺

Slide 43

Slide 43 text

Crash-Free User • ॳճϦϦʔεͰΧϝϥͷ໰୊Ͱࠔͬͨ...
 (ϨϏϡʔͰ΋ݟ͔ͭΒͳ͍໰୊) • ϦϦʔεͨ࣍͠ͷ೔ʹݪҼಛఆͯ͠मਖ਼ • ͦΕҎ߱͸ 99.5%͘Β͍ҡ࣋ͯ͠Δ • Mobile Vision APIͷCamera͕ਏ͍...

Slide 44

Slide 44 text

͋ͱ͸ࡶʹ࣮૷ͷ࿩

Slide 45

Slide 45 text

Լλϒ

Slide 46

Slide 46 text

Լλϒ͑͑Ͱ☺

Slide 47

Slide 47 text

Լλϒͷ࣮૷ • ࣗ࡞ Լλϒ(Not CustomView) + ViewPager • λϒ੾Γସ͑ͷදࣔ͸ViewPagerͷϖʔδΛ ੾Γସ͑Δ͚ͩͳͷͰૣ͍ • View TreeΈͨΒϠόͦ͏͔ײ͡ʹͳͬͯΔͷ Ͱͥͻਅࣅͯ͠΄͍͠

Slide 48

Slide 48 text

ͳΜͰBottomNavigationView ࢖Θͳ͍ͷʁ ԼλϒͷσβΠϯతͳࣄ৘Ͱ͢

Slide 49

Slide 49 text

Լλϒ + ViewPager͕͜͜ਏ͍Α • ͦͦ͜͜ϝϞϦ΋࢖͏ • λϒͷ਺ͷPager͸ৗʹอ࣋(setOffscreenPageLimit) • λϒ੾Γସ͑ͨ࣌͠ͷToolbarͱ͔ͷ੍ޚ͕஍ຯʹେมͩͬͨ • BottomNavigationView࢖ͬͯ΋ಉ͡ʁ • ActivityΛอ࣋͠ͳ͍ʹऑ͍ • ஌Δ͔ • λϒؒͷεςʔλεಉظ • Static Subject͓͡͞Μ

Slide 50

Slide 50 text

API • ΞϓϦ಺Ͱ͸Χ΢ϧ APIͱϝϧΧϦ API྆ํΛୟ࣮͘૷͕ ೖͬͯΔ • ϝϧΧϦ APIΛRetrofitʹ߹ΘͤΔͷ͕ۤ࿑ͨ͠… • Responseͷܕ͕͖ͬͪΓܾ·Βͳ͍ • MercariResponseConverterര஀ʂ • Χ΢ϧ API͸JSON RPC

Slide 51

Slide 51 text

JSON RPC • JSRON RPC Clintࣗ࡞ͯ͠·͢ • JSRON RPC ClintͷίΞ෦෼͚ͩϥΠϒϥϦԽ • ޷͖ͳHttp Clientͱ߹Θͤͯ࢖͑ΔΑ͏ʹͯ͠Δ • ι΢κ΢ͷଞͷΞϓϦͰ΋࢖͑ΔΑ͏ʹ • ۀ຿࣌ؒதʹ͍ͬͨ͡Γͯ͠·͢s

Slide 52

Slide 52 text

gummi https://github.com/operando/ gummi

Slide 53

Slide 53 text

gummi • ࠷ۙ 2.0ग़͠·ͨ͠ • 1.0͸Χ΢ϧͰಋೖࡁΈͰͪΌΜͱಈ͍ͯΔ • 2.0͸…ࢼ͢PR͸ࣾ಺Ͱग़ͯ͠Δ • ͪΌΜͱಈ͍ͯΔͬΆ͍ • ଟ෼େৎ෉ͩΖ͏...

Slide 54

Slide 54 text

Guild • https://github.com/operando/Guild • Simple java tuples • JSON RPCͷResponseΛTupleͰϥοϓͯ͠Δ

Slide 55

Slide 55 text

JSON-RPC-OkHttp-Logging- Interceptor • https://github.com/operando/JSON-RPC- OkHttp-Logging-Interceptor • Χ΢ϧͰ࢖͓͏ͱࢥͬͯ࡞͚ͬͨͲ
 ࢖ͬͯͳ͍ͬ͢...

Slide 56

Slide 56 text

ผʑͷAPIΛ࣮ߦ͢Δͱ͍͏͜ͱ͸... • ผʑͷAPIୟ͘ͷͰ଴ͪ߹Θ͕ͤඞཁ • JSON RPC(Χ΢ϧ) + REST API(ϝϧΧϦ) • JSON RPC͚ͩͳΒ΄΅଴ͪ߹Θͤඞཁͳ͍ • API Clintͷ໭Γ͸RxJavaͷSingleʹ౷Ұ • ଴ͪ߹Θͤ͸Single.zip

Slide 57

Slide 57 text

RxJava • ։ൃॳΊ͸RxJava 1ͩͬͨ • ్தͰRxJava 2ʹ͍͑΍ʂͰஔ͖׵͑ • ੾Γସ͑લʹRxJava 2ࣾ಺ษڧձΛ΍ͬͨ • ͦͷλΠϛϯάͰAPI Clintͷ໭Γ΋Single΁Ҡߦ

Slide 58

Slide 58 text

RxJava1 → RxJava2΁ͷҠߦ

Slide 59

Slide 59 text

RxJava1 → RxJava2΁ͷҠߦ ࢀߟ • http://in.fablic.co.jp/entry/ 2017/04/27/110000 • https://github.com/ReactiveX/RxJava/ wiki/What%27s-different-in-2.0 • http://reactivex.io/RxJava/2.x/javadoc/

Slide 60

Slide 60 text

ແݶͬΆ͍ViewPager • ࣮͸༗ݶͳ΍ʔͭʔͶ • RecyclerTabLayout͓ੈ࿩ʹͳΓ·ͨ͠ • https://github.com/nshmura/ RecyclerTabLayout • PagerAdapterͷcount্͛Ε͹͑͑Μ΍ʂ

Slide 61

Slide 61 text

๭ϑϦϚΞϓϦͷແݶͬΆ͍ ViewPager • εΫϩʔϧͯ͠ɺҰप͢ΔͱεΫϩʔϧ͕
 Ұ൪্ʹ໭ͬͯΔʂʁ • ݩʑݟͯͨ΋ͷ͕Θ͔Βͳ͍… • ͑ɺͳʹ͜Ε

Slide 62

Slide 62 text

ϝϧΧϦɹΧ΢ϧͷແݶͬΆ͍ ViewPager • εΫϩʔϧͯ͠ɺҰप͖ͯͯ͠΋ಉ͡ঢ়ଶ͕อ࣋͞ΕͯΔʂʁ • Page͕ഁغ͞ΕΔ࣌ʹStateΛอ࣋͢Ε͹؆୯ • RecyclerViewͷҐஔ͸ LinearLayoutManager#findFirstVisibleItemPositionͰอ࣋ • LinearLayoutManager#scrollToPositionWithOffsetͰҐஔ Λ໭͢ • حົͳ࣮૷͚ͩͲϢʔβͷརศੑ͕༏Δ

Slide 63

Slide 63 text

͗͢ΐ͍

Slide 64

Slide 64 text

Data Binding • ࢖ͬͯ·͢ • View΁ͷ൓өॲཧΛUtilతͳѻ͍Ͱ
 custom binding logicΛ࡞ͬͯΔ • XML಺ʹ৚݅ࣜ͸ॻ͔Εͯͳ͍ • Two-way bindingతͳػೳ͸࢖ͬͯͳ͍

Slide 65

Slide 65 text

ΞϓϦ಺ͷը૾ • ΄΅Vector Drawable • Ϛδָ࠷ߴ • Ұ෦Ͱ͔͍ը૾͚ͩWebP

Slide 66

Slide 66 text

͜ͱΓΜ

Slide 67

Slide 67 text

͜ͱΓΜ...͜ͱΓΜ...͜ͱΓΜ...

Slide 68

Slide 68 text

Java 8 Backport API • Lightweight-Stream-API • https://github.com/aNNiMON/Lightweight- Stream-API • StreamͱOptional͸Զʹ೚ͤΖʂ • Retrolambda • ThreeTen Android Backport

Slide 69

Slide 69 text

Analytics • Firebase Analytics

Slide 70

Slide 70 text

Push௨஌ • FCM + Firebase Notification • Firebase Notification͸ͪΌΜͱ
 υΩϡϝϯτಡΜͰ࣮૷ͨ͠ํ͕͍͍

Slide 71

Slide 71 text

Crash Reporting • Crashlytics • Firebase Crash Reporting • Firebase Analyticsͷϩά͕ग़ΔͷͰͲΜͳ ߦಈΛͯ͠Ϋϥογϡͨ͠ͷ͔աఔ͕
 Θ͔ͬͯ࠷ߴ

Slide 72

Slide 72 text

ϝϧΧϦͱͷؔΘΓ • ϝϧΧϦͱΧ΢ϧ͕࿈ܞ͢ΔͨΊʹϝϧΧϦଆʹ࣮૷͕ඞཁ • ͓ɺ͓Ε͕࣮૷͢Δʔʂʂ • ࣮૷͠·ͨ͠ʔ • ཉ͘͠ͳͬͨਓ͕࣮૷͢ΔελΠϧʂ • ࣮૷ͯ͠΋Β͏͜ͱ΋͋ΔΑ☺

Slide 73

Slide 73 text

·͋͜Μͳ΋Μ͔ͳ

Slide 74

Slide 74 text

࣭ٙԠ౴ͷ͕࣌ؒ͋Ε͹...

Slide 75

Slide 75 text

Thanks!!