Slide 1

Slide 1 text

CVJMEHSBEMFLUTʹҠߦ͠Α͏ !UOK :VLJ'VKJTBLJ %FQMPZ(BUF*OD %SPJE,BJHJ %BZ 3PPN

Slide 2

Slide 2 text

ର৅ build.gradleΛ,PUMJOԽͯ͠Έ͍ͨ (SBEMF (SPPWZ ͸ͳΜͱͳ͘ॻ͍͍ͯΔ ,PUMJOͩͬͨΒॻ͚ͦ͏

Slide 3

Slide 3 text

͜ͷ෼ͷΰʔϧ ,PUMJOԽͷϝϦοτΛ஌Δ build.gradle.ktsʹҠߦ͢Δ࠶ݱՄೳͳखॱΛ஌Δ Α͋͘Δ໰୊ͱରԠࡦΛ஌Δ ࿩͞ͳ͍͜ͱ ߴ଎Խʢߏ੒ճආ"1*ͳͲʣ΍ϦϑΝΫλϦϯά

Slide 4

Slide 4 text

ΞδΣϯμ (SBEMF,PUMJO%4-ʹ͍ͭͯ ,PUMJOԽͰخ͍͜͠ͱ ࣮ࡍͷҠߦ جૅฤ ࣮ફฤ

Slide 5

Slide 5 text

؀ڥ "OESPJE4UVEJP "OESPJE(SBEMF1MVHJO (SBEMF (SBEMF,PUMJO%4-3$ ݱ࣌఺Ͱ࠷৽͸3$ (SBEMF,PUMJO%4- ࢖ͬͯΔϓϥάΠϯ͕(SBEMFܥରԠͯ͠Ε͹࠷৽͕Φεεϝ ࡢ೔ ϦϦʔε

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

(SBEMF,PUMJO%4-ʹ͍ͭͯ (SBEMFͰϦϦʔε (SBEMFϏϧυεΫϦϓτΛ,PUMJOεΫϦϓτ LUT Ͱॻ͚Δ (SBEMFຊମػೳͷҰ෦ͱͯ͠ఏڙ͞ΕΔ ,PUMJOεΫϦϓτͷίϯύΠϥࣗମ΋ຒΊࠐΈ (SPPWZ͕%FQSFDBUFEʹͳΔ༧ఆ͸ͳ͍

Slide 8

Slide 8 text

,PUMJOʹͳͬͯخ͍͜͠ͱ %FWFMPQFS&YQFSJFODF͕ߴ͍ ίʔυิ׬͕ޮ͘ɺΤϥʔݕ͕ࠪಇ͍ͯ͘ΕΔ ॻ͍ͯΔίʔυͷϑΟʔυόοΫ͕ߴ଎ ϝϯς͠΍͍͢ ܕ͕͋ΔɺϦϑΝΫλ͕Ͱ͖Δ

Slide 9

Slide 9 text

ͭ·Γ*%&͕ͪΌΜͱ࢓ࣄ͢Δ

Slide 10

Slide 10 text

ઓུ ४උ·ͣ଍৔Λ੔͑Δ "(1ରԠ (SPPWZͷ··Ұ୴εΫϦϓτΛ੔ཧ ҠߦϏϧυ͕௨Δঢ়ଶΛҡ࣋͠ͳ͕ΒҠߦ શ෦ΛҰ౓ʹ΍Βͳ͍(SPPWZͱ,PUMJOڞଘՄ

Slide 11

Slide 11 text

جૅฤ Š·ͣϓϨʔϯͳϓϩδΣΫτͰ੒ޭମݧΛੵΉ

Slide 12

Slide 12 text

ର৅ "OESPJE4UVEJPͰ#BTJD"DUJWJUZϓϩδΣΫτ σϑΥϧτઃఆ -BOHVBHF,PUMJO ͷ··࡞Δ

Slide 13

Slide 13 text

ͭͷ(SBEMFεΫϦϓτ "OESPJE(SBEMF1MVHJOΛ࢖ͬ ͨΫϦʔϯͳϓϩδΣΫτ ·ͣ͸Ϗϧυ͕௨ΓɺΞϓϦΛ ىಈͰ͖Δ͜ͱΛ֬ೝ

Slide 14

Slide 14 text

༨ஊ 6TF"OESPJE9BSUJGBDUTΛ༗ޮʹͯ͠ΔͱΞϓϦ͕ଈࢮ͠·͢ // ͍͕ͭ͜൜ਓɺ1.1.3ʹ্͛·͠ΐ͏ implementation "androidx.constraintlayout:constraintlayout:1.1.2"

Slide 15

Slide 15 text

ॻ͖׵͑ͯΈΑ͏ ⾣TFUUJOHTHSBEMF ⌛ CVJMEHSBEMF ⌛ BQQCVJMEHSBEMF

Slide 16

Slide 16 text

TFUUJOHTHSBEMF͸ߦ include ':app' จࣈྻϦςϥϧ(SPPWZ͸'ͱ"ͷ྆ํɺ,PUMJO͸"ͷΈ ϝιουݺͼग़͠(SPPWZ͸()ΛলུՄɺ,PUMJOͰ͸ඞਢ ‎"..."ʹͯ͠()Λ෇͚Ε͹ͲͪΒͰ΋ಈ͘

Slide 17

Slide 17 text

(SPPWZͷ·· ‑ ฤूͨ͠ΒҰ୴ Sync ͠·͢

Slide 18

Slide 18 text

4ZODͷํ๏ ώϯτతʹग़ͯ͘Δ4ZOD/PXϦϯΫ

Slide 19

Slide 19 text

4ZODͷํ๏ πʔϧόʔͷ4ZOD1SPKFDUXJUI(SBEMF'JMFT ͜ͷϘλϯΛ͓͖֮͑ͯ·͠ΐ͏

Slide 20

Slide 20 text

௨ͬͨΒɺϑΝΠϧ໊Λมߋͯ͠ΈΔ 1SPKFDUπϦʔ͔Βsettings.gradleΛϦωʔϜ 4IJGU' build.gradle.ktsʹม͑·͢ Ҿ਺໊ώϯτ͕ग़͖ͯͯಥવ*%&ͷཧղ౓͕͏ͳ͗ొΓ

Slide 21

Slide 21 text

ࢼ͠ʹଘࡏ͠ͳ͍ࣝผࢠΛॻ͍ͯΈΔ (SPPWZWT,PUMJO ੺͘ͳΔʂؒҧͬͯΔ͜ͱΛͦͷ৔Ͱࢦఠͯ͘͠ΕΔ τϥΠΞϯυΤϥʔ͕ര଎Խ

Slide 22

Slide 22 text

ॻ͖׵͍͑ͯ͘ ✅ TFUUJOHTHSBEMF ⾣CVJMEHSBEMF ⌛ BQQCVJMEHSBEMF

Slide 23

Slide 23 text

ϓϩδΣΫτϧʔτͷbuild.gradle

Slide 24

Slide 24 text

ػցతͳमਖ਼ ਖ਼نදݱνʔτγʔτ จࣈྻϦςϥϧ'([^']+)'‎"$1" ϝιουݺͼग़͠(classpath|delete) (\S+)‎$1($2)

Slide 25

Slide 25 text

4ZOD௨ͬͨΒϑΝΠϧ໊Λมߋ 1SPKFDUπϦʔ͔Β1SPKFDUͷbuild.gradleΛϦωʔϜ

Slide 26

Slide 26 text

ౖΒΕΔ ͦ͏қʑͱ,PUMJOͩͱ͸ೝΊͯ͘Εͳ͍ ͕ɺϦωʔϜ࣌఺Ͱ͸Կ͕ѱ͍ͷ͔ڭ͑ͯ͘ͳ͍

Slide 27

Slide 27 text

ΤϥʔΛ஌Δ 4ZOD͢ΔͱίϯιʔϧʹΤϥʔ͕ग़Δ Ұ౓ґଘؔ܎ΛධՁͰ͖Δ·Ͱίʔυʹ৭͕෇͔ͳ͍

Slide 28

Slide 28 text

࠷ॳͷนext buildscript { ext.kotlin_version = "1.3.20" // => Unresolved reference: ext } extͳΜͯఆٛ͞Εͯͳ͍ͧͱݴΘΕΔ

Slide 29

Slide 29 text

ͦ΋ͦ΋extͬͯ ΞυϗοΫʹ޷͖ͳ஋ΛಥͬࠐΊΔ,FZ7BMVF4UPSF Project ˺build.gradle ͕ࣗಈతʹ͍࣋ͬͯΔ extʹηοτͨ͠ޙ͸ProjectͷείʔϓͰ΋ࢀরՄೳ rootProjectͰηοτͨ͠஋͸͢΂ͯͷࢠProject͔Β ΋ݟ͑Δ ࣮ߦॱংͷؔ܎্buildscript {}಺Ͱఆٛ͢Δඞཁ͕͋Δ

Slide 30

Slide 30 text

ಁաੑ buildscript { ext.kotlin_version = "1.3.20" } // ext είʔϓͰ΋ɺ Project είʔϓͰ΋ࢀরͰ͖Δ println ext.kotlin_version // => "1.3.20" println kotlin_version // => "1.3.20" SPPU1SPKFDUͰఆٛͨ͠஋͸ଞͷ1SPKFDU͔Β΋ࢀরͰ͖Δ // app/build.gradle println kotlin_version // => "1.3.20" println rootProject.kotlin_version // => "1.3.20"

Slide 31

Slide 31 text

Ұํ,PUMJO͸੩తܕ෇͚ݴޠ ͍͖ͳΓ୅ೖ͠Α͏ͱͯ͠΋ະఆٛͷϓϩύςΟͱݟ၏͞ΕΔ

Slide 32

Slide 32 text

ٹੈओextra ExtraPropertiesExtensionsͰఏڙ͞ΕΔҕৡϓϩύςΟ ม਺ͱͯ͠ࢀরͭͭ͠ɺ಺෦Ͱext΁ͷTFUHFUΛҕৡ ܕਪ࿦͕ޮ͘

Slide 33

Slide 33 text

͜͜Λॻ͖׵͑Δ͚ͩͰੈքʹ৭͕ʂ

Slide 34

Slide 34 text

࣍ͷนtasksͷमਖ਼ taskͷఆٛͷߏจมߋ // Groovy task clean(type: Delete) {} ɹɹɹɹɹɹ‑ // Kotlin tasks.create("clean", type = Delete::class) {} // or task("clean") {}

Slide 35

Slide 35 text

#&'03&CVJMEHSBEMF

Slide 36

Slide 36 text

"'5&3CVJMEHSBEMFLUT !

Slide 37

Slide 37 text

ॻ͖׵͍͑ͯ͘ ✅ TFUUJOHTHSBEMF ✅ CVJMEHSBEMF ⾣BQQCVJMEHSBEMF

Slide 38

Slide 38 text

BQQCVJMEHSBEMF

Slide 39

Slide 39 text

ಉ͡Α͏ʹԼ͝͠Β͑ จࣈྻ '([^']+)'ˠ"$1" ϝιουݺͼग़͠ ()Λ෇͚͍ͨɺΜ͚ͩͲʜ

Slide 40

Slide 40 text

͜Ε͸୅ೖ ϝιουݺͼग़͠ applicationId "sh.nothing.myapplication" minSdkVersion 21 targetSdkVersion 28 versionCode 1 versionName "1.0" ϝιουݺͼग़͠ͷ()ΛলུͰ͖Δ ϓϩύςΟ୅ೖͷ=ΛলུͰ͖Δ ‎ݟͨ໨ͷ۠ผ͕෇͔ͳ͍ʂ

Slide 41

Slide 41 text

ެࣜҠߦΨΠυͷઓུ ʮ໎ͬͨΒҰ୴୅ೖʹͯ͠ɺౖΒΕͨΒݺͼग़͠ʹ͢΂͠ʯ

Slide 42

Slide 42 text

΋͘͠͸*%&ͷྗʹཔΔ ϝιουͩͬͨΒ$PNNBOE΋͘͠͸$USMΛԡ͠ͳ͕Β Ϛ΢εΧʔιϧΛ߹ΘͤΔͱఆ͕ٛҾ͚Δ ͜ͷ৔߹͸setMinifyEnabled(false)

Slide 43

Slide 43 text

νʔτγʔτ (\w+(?:ion|Files)) (.+)$‎$1($2) ϓϩδΣΫτॳظઃఆͷ··Ͱ͋Ε͹͜ΕͰย෇͖·͢

Slide 44

Slide 44 text

௥ՃͷԼ͝͠Β͑ จࣈྻͱϝιουݺͼग़͠ʹՃ͑ͯ apply plugin:ʹ΋खΛೖΕ͓͖͍ͯͨ

Slide 45

Slide 45 text

apply plugin:͔Βplugins {}ʹҠߦ // apply plugin: ܈Λ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' ɹɹɹɹɹɹ‑ // plugins ߏจʹॻ͖׵͑Δ plugins { id("com.android.application") id("kotlin-android") id("kotlin-android-extensions") }

Slide 46

Slide 46 text

plugins {}Ҡߦͷഎܠ (SBEMFϓϥάΠϯ͸ίʔυͰ࣮ߦ࣌ʹ௥Ճ͞ΕΔ࢓૊Έ ྫ"OESPJE(SBEMF1MVHJOͷandroid {}ϒϩοΫ project.extensions.add('android', BaseAppModuleExtension) ‎2Ͳ͏΍ͬͯ͜ΕΛ੩తʹղܾ͢Δͷ͔

Slide 47

Slide 47 text

"ΞΫηα͕ੜ੒͞ΕΔ ,PUMJO%4-͕&YUFOTJPO͔Β,PUMJOίʔυΛࣗಈੜ੒ ͨͩ͠QMVHJOTͰఆٛ͞Εͨ΋ͷ͚ͩ ͳ͓(SBEMF͸ݩʑ(SPPWZͰ΋plugins {}Λਪ঑͍ͯ͠Δ

Slide 48

Slide 48 text

4ZOD௨ͬͨΒϑΝΠϧ໊Λมߋ 1SPKFDUπϦʔ͔Β.PEVMFBQQͷbuild.gradleΛϦωʔϜ

Slide 49

Slide 49 text

4ZODͯ͠ΤϥʔΛ֬ೝ ্͔Βॱʹ౗͍ͯ͘͠ ͨ͘͞Μग़Δ͚Ͳɺͭ౗ͤ͹ෳ਺ݮΓ·͢ ࠓճͷ৔߹͸࣮࣭ͭ

Slide 50

Slide 50 text

MapͷҾ਺ fileTree(dir: "libs", include: ["*.jar"]) ࢖ͬͯͳ͍ͷͰҰ୴ίϝϯτΞ΢τͰ΋Αͦ͞͏ ,PUMJOԽ fileTree("dir" to "libs", "include" to listOf("*.jar"))

Slide 51

Slide 51 text

buildTypes {}ͷఆٛ release‎getByName("release")ʹ ΋͠not foundͱݴΘΕͨΒɺcreate("release")ʹ ͪΐͬͱ໘౗͍͘͞

Slide 52

Slide 52 text

kotlin_version ͖ͬ͞΍Γ·ͨ͠ͶrootProjectͷext͸ʜ // ͢΂ͯͷ Project είʔϓͰݟ͑Δ val kotlin_version: String by project // ΋͘͠͸ `rootProject.extra` ͔Βऔಘͯ͠΋͍͍Ͱ͢ val kotlin_version: String by rootProject.extra

Slide 53

Slide 53 text

͜ΕͰLUTԽ׬ྃ !

Slide 54

Slide 54 text

جૅฤͷ࿩ ॱংTFUUJOHTHSBEMFˠCVJMEHSBEMFˠBQQCVJMEHSBEMF (SPPWZͷ··ઌʹԼ͝͠Β͑ จࣈྻΫΦʔτɺϝιουݺͼग़͠ɺplugins (SBEMFͷ֓೦ͱ(SPPWZͷ,PUMJOԽ extͱextra taskͷఆٛ getByNameͱcreate

Slide 55

Slide 55 text

جૅฤͷײ૝ ׂͱ୯७ͳஔ͖׵͕͑ଟ͍ײ͡ ࢥͬͯͨΑΓ͸ɺ͍͚ͦ͏ͳײ͡ʁ ૣ଎ɺࣗ෼ͷϓϩδΣΫτͰࢼͯ͠ΈΑ͏

Slide 56

Slide 56 text

࣮ફฤ Š࣮ࡍͷϓϩδΣΫτʹಋೖ͢Δ৔߹ͷোนͱରԠࡦͷ঺հ

Slide 57

Slide 57 text

ࢼͯ͠ΈΑ͏ͱࢥͬͨɺΜ͚ͩͲͶ

Slide 58

Slide 58 text

͍͍ͩͨ͜͜ͰఘΊΔ ಀ͍͛ͨ .gradleϑΝΠϧͬͯؾ͕ͭ͘ͱ૿͑ͯΔΑͶ Ͱ΋ʂ࣮ࡍͷҠߦͷྲྀΕ͸جૅฤͱ·ͬͨ͘ಉ͡ ‎࣮ફฤ్தͷোนͱͯ͋͠Γ͕ͪͳ՝୊ΛऔΓ্͛ͯ঺հ

Slide 59

Slide 59 text

࣮ફฤτϐοΫ "OESPJE(SBEMF1MVHJOʹ্͛Δ ڊେextΛͳΜͱ͔͍ͨ͠ ࣮͸,PUMJOεΫϦϓτ͔Β(SPPWZεΫϦϓτΛݺ΂Δ ϑΝΠϧͷ຤ඌʹapply plugin:͕͋Δ ͜ͷهड़ಈ͔ͳ͍ɺͲ͏͢Ε͹

Slide 60

Slide 60 text

࣮ફฤτϐοΫ "OESPJE(SBEMF1MVHJOʹ্͛Δ ڊେextΛͳΜͱ͔͍ͨ͠ ࣮͸,PUMJOεΫϦϓτ͔Β(SPPWZεΫϦϓτΛݺ΂Δ ϑΝΠϧͷ຤ඌʹapply plugin:͕͋Δ ͜ͷهड़ಈ͔ͳ͍ɺͲ͏͢Ε͹

Slide 61

Slide 61 text

"(1Λʹ্͛Δ 3.3.1ʹͯ͠4ZOD

Slide 62

Slide 62 text

(SBEMF΋্͛ͯͶͱݴΘΕΔ (SBEMFҎ্͕ඞཁ Fix Gradle wrapper and re-import project͢Δ

Slide 63

Slide 63 text

͜͜ͰϏϧυ͕௨Βͳ͘ͳΔ৔߹ جຊ͸֤छϓϥάΠϯͷόʔδϣϯΛ্͛ͯղܾ ./gradlew --stacktrace͋ͨΓ͕ࢀߟʹͳΔ͸ͣ

Slide 64

Slide 64 text

࣌఺ͰͷҾ͔͔ͬΓϙΠϯτ google-servicesҎ্͕ඞਢ Ϗϧυ͸௨ͬͯ΋ΞϓϦ͕མͪͨΓɺ'BCSJD͕͏·͘ಈ͔ͳ ͔ͬͨΓ͢Δ android-junit5jacoco-android લऀ͕࠷৽ͷ1.3.2.0ͩͱಈ͔ͳ͍ɺ1.3.1.0ͳΒେৎ෉ *TTVF

Slide 65

Slide 65 text

8"3/*/(͕ফ͑ͳ͍ ઃఆ͕ѱ͍Α͏ʹݟ͑Δ͚Ͳɺର৅͸ϓϥάΠϯͷ࣮૷ ϓϥάΠϯ։ൃऀͷΈΜͳ"(1ରԠͯ͘͠ΕཔΉ ׬શͳΔϒʔϝϥϯ

Slide 66

Slide 66 text

"(1ʹ্͕ͬͨΒ settings.gradle͔ΒҠߦ͠͸͡ΊͯΈ·͠ΐ͏ جຊฤͱಉ͡Ͱॠࡴ include ['"]([^'"]+)['"]ˠinclude("$1")

Slide 67

Slide 67 text

࣮ફฤτϐοΫ "OESPJE(SBEMF1MVHJOʹ্͛Δ ڊେextΛͳΜͱ͔͍ͨ͠ ࣮͸,PUMJOεΫϦϓτ͔Β(SPPWZεΫϦϓτΛݺ΂Δ ϑΝΠϧͷ຤ඌʹapply plugin:͕͋Δ ͜ͷهड़ಈ͔ͳ͍ɺͲ͏͢Ε͹

Slide 68

Slide 68 text

ڊେextΛͳΜͱ͔͍ͨ͠

Slide 69

Slide 69 text

extͷ··ͩͱׂͱਏ͍ ࢀর͕໘౗͍͘͞ val by extra࿈ൃ͠ΜͲ͍ΑͶ (SPPWZͷ··࢖ͬͯͯ΋ׂͱෆศ ίʔυδϟϯϓͰ͖ͳ͍

Slide 70

Slide 70 text

ެࣜͷΦεεϝCVJME4SDʹ੾Γग़ ͠·͠ΐ͏ CVJME4SDσΟϨΫτϦ ϏϧυεΫϦϓτ༻ͷಛผͳϓ ϩδΣΫτ தʹஔ͍ͨεΫϦϓτ͸ɺશͯ ͷ1SPKFDU͔ΒࢀরՄೳ ֤छఆ਺΍ࣗ࡞ͷϓϥάΠϯஔ ͖৔ʹ࠷ద

Slide 71

Slide 71 text

CVJME4SDࣄ࢝Ί σΟϨΫτϦΛ࡞Δ buildSrc/ ࠷௿ݶͷϑΝΠϧΛ࡞੒ buildSrc/settings.gradle.kts த਎͸ۭ buildSrc/build.gradle.kts

Slide 72

Slide 72 text

CVJME4SDCVJMEHSBEMFLUT // kotlin-dslΛ༗ޮʹ͢Δ࠷௿ݶͷఆٛ plugins { `kotlin-dsl` } repositories { jcenter() }

Slide 73

Slide 73 text

extͷத਎ΛҠ͢ buildSrc/src/main/kotlinʹDeps.ktΛ࡞੒ object Depsʹvalͱ֤ͯ͠छఆ਺Λఆٛ

Slide 74

Slide 74 text

ར༻Օॴͷॻ͖׵͑ $kotlinVersion‎${Deps.kotlinVersion} Ұׅஔ׵ͱ͔ͰؤுΔ \$(\w+Version)ˠ\$\{Deps.$1\} rootProject\.ext\.(\w+)ˠDeps.$1

Slide 75

Slide 75 text

ࢀরͰ͖ΔΑ͏ʹͳͬͯศར

Slide 76

Slide 76 text

ͳΜ͔໘౗ͦ͘͞͏ͳͷ͕͋Δʜͬͯ࣌ ྫ؀ڥม਺΍gitͷ৘ใΛextʹಥͬࠐΉ ,PUMJOͰॻ͖׵͑Ε͹͍͍Μ͚ͩͲɺޙճ͠ʹ͍ͨ͠

Slide 77

Slide 77 text

ผϑΝΠϧʹ੾Γग़ͯ͠͠·͏ ྫ͑͹ͦͷ··ci_vars.gradleͱͯ͠੾Γग़͢ ݩͷ৔ॴʹapply from: "ci_vars.gradle" ,PUMJOԽͯ͠΋ͦͷ··Ͱ͍͍ apply(from="ci_vars.gradle") ,PUMJO͔Β(SPPWZͷ(SBEMFϑΝΠϧΛݺ΂Δʂ

Slide 78

Slide 78 text

࣮ફฤτϐοΫ "OESPJE(SBEMF1MVHJOʹ্͛Δ ڊେextΛͳΜͱ͔͍ͨ͠ ࣮͸,PUMJOεΫϦϓτ͔Β(SPPWZεΫϦϓτΛݺ΂Δ ϑΝΠϧͷ຤ඌʹapply plugin:͕͋Δ ͜ͷهड़ಈ͔ͳ͍ɺͲ͏͢Ε͹

Slide 79

Slide 79 text

Ұ୴·Δͬͱ੾Γग़ͯ͠͠·͏ͱ͍͏େ୾ͳઓུ΋Մೳ // app/build.gradle.kts apply(from="original.build.gradle") // ͜ͷ1ߦ͚ͩ ‎ͦͷޙplugins {}ͱରԠ͢ΔઃఆΛҰͭͣͭҠ͍ͯ͘͠

Slide 80

Slide 80 text

ྫkapt {}͚ͩҠߦ // app/build.gradle.kts plugins { kotlin("kapt") } apply(from="original.build.gradle") kapt { useBuildCache = true }

Slide 81

Slide 81 text

੾Γग़͢ͱ͖ͷ੍໿ buildscript {} ͸੾Γग़ͤͳ͍ ୯७ʹJODMVEFͯ͠ΔΘ͚Ͱͳ͘ϓϥάΠϯѻ͍ ϑΝΠϧ͝ͱʹผͷDMBTTMPBEFSʹͳΔ it instanceOf AppPlugin తͳ൑ఆ͕ਖ਼͘͠ಈ࡞͠ͳ͍ hasPlugin("com.android.application") ͸0,

Slide 82

Slide 82 text

࣮ફฤτϐοΫ "OESPJE(SBEMF1MVHJOʹ্͛Δ ڊେextΛͳΜͱ͔͍ͨ͠ ࣮͸,PUMJOεΫϦϓτ͔Β(SPPWZεΫϦϓτΛݺ΂Δ ϑΝΠϧͷ຤ඌʹapply plugin:͕͋Δ ͜ͷهड़ಈ͔ͳ͍ɺͲ͏͢Ε͹

Slide 83

Slide 83 text

຤ඌʹ͋Δ͜Ε apply plugin: "com.google.gms.google-services" plugins {}ʹॻ͘ͱͦͷ࣌఺Ͱapply͞Εͯ͠·͏ ਖ਼͘͠ಈ࡞͠ͳ͍

Slide 84

Slide 84 text

idએݴʹapply falseΛ෇༩ apply plugin:͸ݩͷҐஔʹஔ͍ͨ·· plugins { // Groovy id "com.google.gms.google-services" apply false } plugins { // Kotlin id("com.google.gms.google-services") apply false }

Slide 85

Slide 85 text

࣮ફฤτϐοΫ "OESPJE(SBEMF1MVHJOʹ্͛Δ ڊେextΛͳΜͱ͔͍ͨ͠ ࣮͸,PUMJOεΫϦϓτ͔Β(SPPWZεΫϦϓτΛݺ΂Δ ϑΝΠϧͷ຤ඌʹapply plugin:͕͋Δ ͜ͷهड़ಈ͔ͳ͍ɺͲ͏͢Ε͹

Slide 86

Slide 86 text

repositories {}ฤ ଟ෼ਅͬઌʹҾ͔͔ͬΔ΍ͭ maven { url "https://plugins.gradle.org/m2/" } ɹɹɹɹɹɹɹɹ‑ maven("https://plugins.gradle.org/m2/") RepositoryHandlerExtensions Ͱ֦ு͞Ε͍ͯΔ maven ivy

Slide 87

Slide 87 text

sourceSets {}ฤ sourceSets { // Groovy main.java.srcDirs += 'src/main/kotlin' } ɹɹɹɹɹɹɹɹ‑ sourceSets { // Kotlin getByName("main").java.srcDirs("src/main/kotlin") } (SPPWZ΋·ͬͨ͘ಉ͡ίʔυ͕௨Δ

Slide 88

Slide 88 text

testOptions {} testOptions { unitTests { /* Closure Λظ଴͞ΕͯΔ */ } }

Slide 89

Slide 89 text

ίʔυδϟϯϓͯ͠ΈΔ UnitTestOptions ܕͷઃఆΛ͢Δ$MPTVSFΒ͍͠ ͜ͷܕ৘ใΛ,PUMJO%4-ʹ༩͑Δඞཁ͕͋Δ

Slide 90

Slide 90 text

delegateClosureOf Ͱғͬͯ͋͛Δͱ unitTests( delegateClosureOf {} ) ແࣄઃఆͰ͖ΔΑ͏ʹ

Slide 91

Slide 91 text

ઃఆ͕·ͬͨ͘ॻ͚ͳ͍ &YUFOTJPO͕ෆՄࢹͳέʔε ྫHSBEMFBOESPJESJCCPOJ[FSQMVHJO this: Anyʜͩͱʜ

Slide 92

Slide 92 text

&YUFOTJPOʹQVCMJD͕໌ࣔ͞Εͯͳ͍΍ͭ ribbonizerJTOPUBDDFTTJCMFJOBUZQFTBGFXBZCFDBVTF RibbonizerExtensionJTOPUQVCMJD (SPPWZͩͱΞΫηεͰ͖ΔΜ͚ͩͲͶʜ

Slide 93

Slide 93 text

࠷ޙͷखwithGroovyBuilderΛ࢖͏ จࣈྻͰઃఆ஋ʹΞΫηεʢܕ΍Ҿ਺ͷݕ͕ࠪޮ͔ͳ͍ʣ ribbonizer { forcedVariantsNames("release") } ɹɹɹɹɹɹɹɹɹ‑ ribbonizer { withGroovyBuilder { "forcedVariantsNames"("release") } }

Slide 94

Slide 94 text

༨ஊ৐Γӽ͑ͯ΋ࡉ͔͍ઃఆ͕Ͱ͖ͳ͔ͬͨͷͰ gradle-android-ribbonizer-pluginʹ͸γϡοͱ1VMM3FRVFTU Λ౤͛·ͨ͠

Slide 95

Slide 95 text

࣮ફฤ·ͱΊ ·ͣ"(1ʹ্͛Δ ڊେextΑΓ΋CVJME4SDʹ͢Δͱศར apply͸஗Ԇͤ͞ΒΕΔ େ͖ͳεΫϦϓτ͸੾Γग़ͤΔ Α͋͘Δهड़ͷॻ͖׵͑ύλʔϯΛ೺Ѳ

Slide 96

Slide 96 text

େମ͜͜·ͰཧղͰ͖ͯΕ͹ ΄ͱΜͲͷbuild.gradleΛ,PUMJOԽͰ͖Δ͸ͣ Ͳ͏ͯ͠΋μϝͳ෺͸(SPPWZʹ࢒͢

Slide 97

Slide 97 text

͓·͚ෆ۩߹ͬΆ͍΋ͷରԠࡦ ಥવkaptౖ͕Γग़͢ 'BCSJD1MVHJOͷalwaysUpdateBuildId্͕ख͘ಈ͔ͳ͍

Slide 98

Slide 98 text

ಥવLBQUౖ͕Γग़͢ ݱ৅4ZOD͸Ͱ͖͕ͨɺΞϓϦΛϏϧυ͢ΔͱLBQUౖ͕Γग़͠ ͯϏϧυ͕௨Βͳ͍ error: incompatible types: NonExistentClass cannot be converted to Annotation @error.NonExistentClass() ^ ݪҼandroid-extensionsͷઃఆ͕൓ө͞Εͳ͍ isExperimental = trueͬͯॻ͍ͯΔͷʹ൓ө͞Εͯͳ͍

Slide 99

Slide 99 text

ճආࡦ configure(delegateClosureOf {}) Ͱғ͏

Slide 100

Slide 100 text

,5 IUUQTHJUIVCDPNHSBEMFLPUMJOETMJTTVFT LPUMJOBOESPJEͷઃఆ஋มߋϋϯυϦϯάपΓͷෆ۩߹

Slide 101

Slide 101 text

'BCSJDͷalwaysUpdateBuildId্͕ख͘ಈ͔ͳ͍ Ϗϧυߴ଎Խͷ5JQTͰग़ͯ͘Δ΍ͭ buildTypes { debug { ext.alwaysUpdateBuildId = false } } by extraͰઃఆͯ͠΋൓ө͞Εͳ͍

Slide 102

Slide 102 text

ճආࡦʮͲ͏ͯ͠΋μϝͳ΋ͷ͸ʯύλʔϯ ͜ͷߦ͚ͩผϑΝΠϧʹ੾Γग़ͯ͠BQQMZGSPN͢Δ // fabric.gradle android.buildTypes.debug.ext.alwaysUpdateBuildId = false // build.gradle.kts apply(file="fabric.gradle") BuildTypeʹઃఆ͞Εͨextͷ஋Λݟ͍ͯΔ͕ɺ ,PUMJO%4-͔ΒΞΫηεͰ͖ͳ͍

Slide 103

Slide 103 text

·ͱΊ

Slide 104

Slide 104 text

࿩ͨ͜͠ͱ ,PUMJOԽͷϝϦοτ ! ଈ࠲ͷϑΟʔυόοΫɺ ϝϯςφϯεੑ޲্ build.gradle.ktsʹҠߦ͢Δ࠶ݱՄೳͳखॱ ڞ௨ͷखॱ Α͋͘Δ໰୊ͱରԠࡦ

Slide 105

Slide 105 text

෭࣍తޮՌ ! ϏϧυεΫϦϓτʹखΛೖΕΔ৺ཧతোนͷ௿Լ (SBEMFŧŔŕŪũƄŝſײ

Slide 106

Slide 106 text

ࢀߟࢿྉ ,PUMJO$POG5ZQF4BGF#VJME-PHJDXJUI(SBEMF,PUMJO %4-CZ1BVM.FSMJO .JHSBUJOHCVJMEMPHJDGSPN(SPPWZUP,PUMJO (SBEMF,PUMJO%4-1SJNFS ެࣜͷ(SBEMF,PUMJO%4-ೖ໳υΩϡϝϯτ ެࣜͷҠߦΨΠυɺ(SPPWZͱ,PUMJO྆ํͰهड़͞ΕͯͯࢀߟʹͳΔ ,PUMJO%4-ͷதͷਓͷηογϣϯɺεϥΠυ