Slide 1

Slide 1 text

Kotlin/NativeͰ ΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ

Slide 2

Slide 2 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Who is? ౎ཱ࢈ۀٕज़ߴઐ(ຊՊ/ઐ߈Պ) ిؾ௨৴େֶେֶӃ CAʹ2017೥৽ଔͰೖࣾ AbemaTV ։ൃہ/AndroidνʔϜ ஛ా ஐʢ͚ͨͩ ͞ͱ͠ʣ satsukies satsukies Takeda Satoshi

Slide 3

Slide 3 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ ΨδΣοτ ΫϧϚ εϙʔπ My hobby

Slide 4

Slide 4 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Try Kotlin/Native What’s Kotlin Agenda Conclusion

Slide 5

Slide 5 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Try Kotlin/Native What’s Kotlin Agenda Conclusion 5

Slide 6

Slide 6 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ What’s • JetBrains͕։ൃͨ͠੩తܕ෇͚ݴޠ • JavaΛΑΓ؆ܿɾ҆શʹ • Null҆શ / ֦ுؔ਺ / Ϋϩʔδϟ / etc.. • OSඇґଘɺJVM্Ͱಈ࡞ • Javaͱͷ૬ޓӡ༻ੑ͕֬อ͞Ε͍ͯΔ • Javaͷࢿ࢈͕׆͔ͤΔ

Slide 7

Slide 7 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Kotlin 1.3 Kotlin/Native Beta release Google I/O 2017 Android Official Support Kotlin 1.0 Feb 2016 May 2017 Oct 2018 History

Slide 8

Slide 8 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Kotlin/Native • Kotlin͔Βλʔήοτ؀ڥͰಈ࡞͢ΔωΠςΟϒ
 όΠφϦΛੜ੒͢ΔίϯύΠϥ • ಺෦Ͱ͸LLVMΛܦ༝͍ͯ͠Δ • αϙʔτͯ͠ΔϓϥοτϑΥʔϜ͸ҎԼͷ௨Γ • iOS, Android, Windows, MacOS, Linux, WebAssembly

Slide 9

Slide 9 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Μʁ

Slide 10

Slide 10 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Kotlin/Native • Kotlin͔Βλʔήοτ؀ڥͰಈ࡞͢ΔωΠςΟϒ
 όΠφϦΛੜ੒͢ΔίϯύΠϥ • ಺෦Ͱ͸LLVMΛܦ༝͍ͯ͠Δ • αϙʔτͯ͠ΔϓϥοτϑΥʔϜ͸ҎԼͷ௨Γ • iOS, Android, Windows, MacOS, Linux, WebAssembly

Slide 11

Slide 11 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Kotlin/Native • Kotlin͔Βλʔήοτ؀ڥͰಈ࡞͢ΔωΠςΟϒ
 όΠφϦΛੜ੒͢ΔίϯύΠϥ • ಺෦Ͱ͸LLVMΛܦ༝͍ͯ͠Δ • αϙʔτͯ͠ΔϓϥοτϑΥʔϜ͸ҎԼͷ௨Γ • iOS, Android, Windows, MacOS, Linux, WebAssembly

Slide 12

Slide 12 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ KotlinͰiOSΞϓϦ͕ ࡞ΕΔʂ

Slide 13

Slide 13 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ ૣ଎ೖ໳ͯ͠ΈΔ

Slide 14

Slide 14 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Try Kotlin/Native What’s Kotlin Agenda Conclusion

Slide 15

Slide 15 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Task Overview • ϕʔεϓϩδΣΫτͷ࡞੒ / ઃఆ • ڞ༗͢Δίʔυͷ࣮૷ • AndroidΞϓϦͷઃఆ / ࣮૷ • iOSΞϓϦͷઃఆ / ࣮૷

Slide 16

Slide 16 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Preparing • MacOS͕ಈ࡞͢ΔPC • Android Studioʢ3.4 Preview Canary 3ʣ • ϕʔεͱͳΔProjectΛੜ੒ͨ͠Γ͠·͢ • Xcodeʢ10.1 10B61ʣ • iOSΞϓϦͷͨΊͷઃఆ΍࣮૷ʹ࢖͍·͢ • Τϥʔʹෛ͚ͳ͍΍Δؾ΍޷ح৺

Slide 17

Slide 17 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Generating base project Android StudioΛ࢖ͬͯϕʔεϓϩδΣΫτΛ࡞੒ ීஈͷΞϓϦ৽ن࡞੒ͱಉ͡

Slide 18

Slide 18 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Generating base project Android StudioΛ࢖ͬͯϕʔεϓϩδΣΫτΛ࡞੒ ීஈͷΞϓϦ৽ن࡞੒ͱಉ͡

Slide 19

Slide 19 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Creating common module ڞ௨ͷίʔυΛ࣮૷͢Δ৔ॴΛ࡞੒ File > New > New Module

Slide 20

Slide 20 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Creating common module ڞ௨ͷίʔυΛ࣮૷͢Δ৔ॴΛ࡞੒ Java LibraryΛબ୒

Slide 21

Slide 21 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Creating common module ڞ௨ͷίʔυΛ࣮૷͢Δ৔ॴΛ࡞੒ Java LibraryΛબ୒ > Α͠ͳʹ໊લΛ͚ͭΔ Class໊͸ద౰ͰOK

Slide 22

Slide 22 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Creating common module moduleͱඞཁͳϑΝΠϧ͕௥Ճ͞Ε settings.gradleʹԿ΍Β௥ه͞Ε͍ͯΔ ɹɹɹɹɹɹɹɹ ௥Ճͨ͠moduleΛgradleʹೝࣝͤ͞ΔͨΊʹඞཁ include ':app', ':ShareCode'

Slide 23

Slide 23 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement common codes srcʹڞ௨ίʔυ༻ͷσΟϨΫτϦΛ࡞੒ commonMain/kotlin/{ύοέʔδ໊}/common

Slide 24

Slide 24 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement common codes ੜ੒ͨ͠σΟϨΫτϦʹ ڞ௨ίʔυΛهड़͢ΔΫϥεΛ௥Ճ࣮͠૷ package net.ddns.satsukies.diveintokotlinnative.common expect fun platformName(): String fun createApplicationScreenMessage(): String { return "Kotlin Rocks on ${platformName()}" }

Slide 25

Slide 25 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement common codes (android) ઌͱಉ͡खॱͰandroid޲͚ͷσΟϨΫτϦΛ௥Ճ androidMain/kotlin/{ύοέʔδ໊}/common

Slide 26

Slide 26 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement common codes (android) ੜ੒ͨ͠σΟϨΫτϦʹΫϥεΛ࡞੒͠ Android޲͚ͷίʔυΛ࣮૷ package net.ddns.satsukies.diveintokotlinnative.common actual fun platformName(): String = "android"

Slide 27

Slide 27 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement common codes (iOS) ઌͱಉ͡खॱͰiOS޲͚ͷσΟϨΫτϦΛ௥Ճ iosMain/kotlin/{ύοέʔδ໊}/common

Slide 28

Slide 28 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement common codes (iOS) ੜ੒ͨ͠σΟϨΫτϦʹΫϥεΛ࡞੒͠ iOS޲͚ͷίʔυΛ࣮૷ package net.ddns.satsukies.diveintokotlinnative.common actual fun platformName(): String { return UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion }

Slide 29

Slide 29 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Fix build.gradle CommonϞδϡʔϧ಺ʹ͋Δbuild.gradleΛमਖ਼͠ ෳ਺ͷϓϥοτϑΥʔϜʹରԠͤ͞Δ

Slide 30

Slide 30 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Fix build.gradle CommonϞδϡʔϧ಺ʹ͋Δbuild.gradleΛमਖ਼͠ ෳ਺ͷϓϥοτϑΥʔϜʹରԠͤ͞Δ apply plugin: ‘kotlin-multiplatform' kotlin { targets { final def iOSTarget = System.getenv('SDK_NAME') ?.startsWith("iphoneos")\ ? presets.iosArm64 : presets.iosX64 fromPreset(iOSTarget, 'iOS') { compilations.main.outputKinds('FRAMEWORK') } fromPreset(presets.jvm, 'android') } sourceSets { commonMain.dependencies { api 'org.jetbrains.kotlin:kotlin-stdlib-common' } androidMain.dependencies { api 'org.jetbrains.kotlin:kotlin-stdlib' } } } // workaround for https: //youtrack.jetbrains.com/issue/KT-27170 configurations { compileClasspath }

Slide 31

Slide 31 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Fix build.gradle CommonϞδϡʔϧ಺ʹ͋Δbuild.gradleΛमਖ਼͠ ෳ਺ͷϓϥοτϑΥʔϜʹରԠͤ͞Δ apply plugin: ‘kotlin-multiplatform' kotlin { targets { final def iOSTarget = System.getenv('SDK_NAME') ?.startsWith("iphoneos")\ ? presets.iosArm64 : presets.iosX64 fromPreset(iOSTarget, 'iOS') { compilations.main.outputKinds('FRAMEWORK') } fromPreset(presets.jvm, 'android') } sourceSets { commonMain.dependencies { api 'org.jetbrains.kotlin:kotlin-stdlib-common' } androidMain.dependencies { api 'org.jetbrains.kotlin:kotlin-stdlib' } } } // workaround for https: //youtrack.jetbrains.com/issue/KT-27170 configurations { compileClasspath } iOSλʔήοτͷઃఆ

Slide 32

Slide 32 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Fix build.gradle CommonϞδϡʔϧ಺ʹ͋Δbuild.gradleΛमਖ਼͠ ෳ਺ͷϓϥοτϑΥʔϜʹରԠͤ͞Δ apply plugin: ‘kotlin-multiplatform' kotlin { targets { final def iOSTarget = System.getenv('SDK_NAME') ?.startsWith("iphoneos")\ ? presets.iosArm64 : presets.iosX64 fromPreset(iOSTarget, 'iOS') { compilations.main.outputKinds('FRAMEWORK') } fromPreset(presets.jvm, 'android') } sourceSets { commonMain.dependencies { api 'org.jetbrains.kotlin:kotlin-stdlib-common' } androidMain.dependencies { api 'org.jetbrains.kotlin:kotlin-stdlib' } } } // workaround for https: //youtrack.jetbrains.com/issue/KT-27170 configurations { compileClasspath } Androidλʔήοτͷઃఆ

Slide 33

Slide 33 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Fix build.gradle CommonϞδϡʔϧ಺ʹ͋Δbuild.gradleΛमਖ਼͠ ෳ਺ͷϓϥοτϑΥʔϜʹରԠͤ͞Δ apply plugin: ‘kotlin-multiplatform' kotlin { targets { final def iOSTarget = System.getenv('SDK_NAME') ?.startsWith("iphoneos")\ ? presets.iosArm64 : presets.iosX64 fromPreset(iOSTarget, 'iOS') { compilations.main.outputKinds('FRAMEWORK') } fromPreset(presets.jvm, 'android') } sourceSets { commonMain.dependencies { api 'org.jetbrains.kotlin:kotlin-stdlib-common' } androidMain.dependencies { api 'org.jetbrains.kotlin:kotlin-stdlib' } } } // workaround for https: //youtrack.jetbrains.com/issue/KT-27170 configurations { compileClasspath } ϥΠϒϥϦͷಡΈࠐΈઃఆ

Slide 34

Slide 34 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ What’s happen? commonϞδϡʔϧʹ͸ڞ௨ར༻͢ΔίʔυΛ࣮૷ Common fun platformName(): String

Slide 35

Slide 35 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ What’s happen? Common fun platformName(): String Android iOS 12.1 λʔήοτຖʹ݁ՌΛม͍͑ͨͱ͖͸Ͳ͏͠Α͏

Slide 36

Slide 36 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ expected, actual ͪΐ͏ͲabstractͱoverrideΈ͍ͨͳؔ܎[1] • ڞ௨ίʔυͰ͸ϝιουʹexpectedΛ෇༩ • ֤λʔήοτσΟϨΫτϦͷίʔυͰactualΛ࣮૷ [1]https://aakira.app/blog/2018/10/kotlin-native/

Slide 37

Slide 37 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ expected, actual [1]https://aakira.app/blog/2018/10/kotlin-native/ expect fun platformName(): String actual fun platformName(): String { return UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion } actual fun platformName(): String = "android" Android iOS Common

Slide 38

Slide 38 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement Android App AndroidΞϓϦͷίʔυ͔Βڞ௨࣮૷Λ࢖ͬͯΈΔ ※AndroidΞϓϦͷ࣮૷͸appϞδϡʔϧ಺Ͱ͢

Slide 39

Slide 39 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement Android App app/build.gradleʹڞ௨Ϟδϡʔϧͷݺग़Λ௥ه dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) // ڞ௨Ϟδϡʔϧ implementation project(':ShareCode') … }

Slide 40

Slide 40 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement Android App activity_main.xmlΛमਖ਼ TextViewʹίʔυ͔ΒΞΫηεͰ͖ΔΑ͏ʹ͢Δ

Slide 41

Slide 41 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement Android App activity_main.xmlΛमਖ਼ TextViewʹίʔυ͔ΒΞΫηεͰ͖ΔΑ͏ʹ͢Δ IDΛׂΓ౰͍ͯͯ͋͛ͯΔ

Slide 42

Slide 42 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement Android App MainActivity.ktͰදࣔจࣈྻͱจࣈαΠζΛηοτ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById(R.id.text_view) textView.text = createApplicationScreenMessage() textView.textSize = 24f }

Slide 43

Slide 43 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement Android App override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById(R.id.text_view) textView.text = createApplicationScreenMessage() textView.textSize = 24f } viewΛ͖ͬ͞ͷID͔Βݟ͚ͭग़͍ͯ͠Δ MainActivity.ktͰදࣔจࣈྻͱจࣈαΠζΛηοτ

Slide 44

Slide 44 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ MainActivity.ktͰදࣔจࣈྻͱจࣈαΠζΛηοτ Implement Android App override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById(R.id.text_view) textView.text = createApplicationScreenMessage() textView.textSize = 24f } จࣈྻͱจࣈαΠζΛηοτ

Slide 45

Slide 45 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Run Android App ࣮ߦͯ͠ΈΔͱ ʮKotlin Rocks on Androidʯ ͱදࣔ͞Ε·͢ʂ

Slide 46

Slide 46 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement iOS App XcodeΛ࢖ͬͯiOSΞϓϦΛ࡞੒͍͖ͯ͠·͢

Slide 47

Slide 47 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Generating Xcode project Xcodeͷॳظը໘͔Β Create a new Xcode project

Slide 48

Slide 48 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Generating Xcode project Single View AppΛબ୒

Slide 49

Slide 49 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Generating Xcode project ໊લΛܾΊɺอଘઌ͸rootϑΥϧμ௚ԼΛࢦఆ

Slide 50

Slide 50 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Fix build.gradle iOS޲͚ͷϑΝΠϧ͕ੜ੒͞ΕΔΑ͏ʹमਖ਼͢Δ

Slide 51

Slide 51 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Fix build.gradle CommonϞδϡʔϧ಺ʹ͋Δbuild.gradleΛमਖ਼͠ ෳ਺ͷϓϥοτϑΥʔϜʹରԠͤ͞Δ apply plugin: 'kotlin-multiplatform' kotlin { … } // workaround for https: //youtrack.jetbrains.com/issue/KT-27170 configurations { compileClasspath } task packForXCode(type: Sync) { final File frameworkDir = new File(buildDir, "xcode-frameworks") final String mode = project.findProperty("XCODE_CONFIGURATION") ?.toUpperCase() ?: 'DEBUG' inputs.property "mode", mode dependsOn kotlin.targets.iOS.compilations.main.linkTaskName("FRAMEWORK", mode) from { kotlin.targets.iOS.compilations.main.getBinary("FRAMEWORK", mode).parentFile } into frameworkDir doLast { new File(frameworkDir, 'gradlew').with { text = " #!/bin/bash\nexport 'JAVA_HOME=${System.getProperty("java.home")}'\ncd '$ {rootProject.rootDir}'\n./gradlew \$@\n" setExecutable(true) } } } tasks.build.dependsOn packForXCode

Slide 52

Slide 52 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Fix build.gradle CommonϞδϡʔϧ಺ʹ͋Δbuild.gradleΛमਖ਼͠ ෳ਺ͷϓϥοτϑΥʔϜʹରԠͤ͞Δ apply plugin: 'kotlin-multiplatform' kotlin { … } // workaround for https: //youtrack.jetbrains.com/issue/KT-27170 configurations { compileClasspath } task packForXCode(type: Sync) { final File frameworkDir = new File(buildDir, "xcode-frameworks") final String mode = project.findProperty("XCODE_CONFIGURATION") ?.toUpperCase() ?: 'DEBUG' inputs.property "mode", mode dependsOn kotlin.targets.iOS.compilations.main.linkTaskName("FRAMEWORK", mode) from { kotlin.targets.iOS.compilations.main.getBinary("FRAMEWORK", mode).parentFile } into frameworkDir doLast { new File(frameworkDir, 'gradlew').with { text = " #!/bin/bash\nexport 'JAVA_HOME=${System.getProperty("java.home")}'\ncd '$ {rootProject.rootDir}'\n./gradlew \$@\n" setExecutable(true) } } } tasks.build.dependsOn packForXCode iOSͰඞཁͳϑΝΠϧͷੜ੒λεΫ

Slide 53

Slide 53 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Build from terminal iOS༻ͷϑΝΠϧΛੜ੒ͤ͞ΔͨΊʹbuild 1. terminalͳͲͰϓϩδΣΫτϧʔτ΁Ҡಈ 2. ./gradlew build Λ࣮ߦ 3. ੒ޭ͢Δͱxcode-frameworks͕ੜ੒͞ΕΔ

Slide 54

Slide 54 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Project setting .frameworkϑΝΠϧΛಡΈࠐΉઃఆΛߦ͏ General > Embedded Binaries

Slide 55

Slide 55 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Project setting .frameworkϑΝΠϧΛಡΈࠐΉઃఆΛߦ͏ + > Add Other… > .frameworks΁ͷύεΛࢦఆ

Slide 56

Slide 56 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Project setting XcodeͷBitcodeػೳΛOFFʹ͢Δ Kotlin/Native͸ωΠςΟϒίʔυΛੜ੒ͯ͠Δ͔Β

Slide 57

Slide 57 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Project setting FrameworkݕࡧύεΛ௥Ճ͢Δ BuildSettings > Framework Search Path > +

Slide 58

Slide 58 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Project setting XcodeͰͷbuild࣌ʹgradle buildΛ࣮ߦ͢Δઃఆ Build Phase > + > New Run Script Phase

Slide 59

Slide 59 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Project setting XcodeͰͷbuild࣌ʹgradle buildΛ࣮ߦ͢Δઃఆ cd {.frameworksͷpath} , gradlewϏϧυίϚϯυ

Slide 60

Slide 60 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Project setting XcodeͰͷbuild࣌ʹgradle buildΛ࣮ߦ͢Δઃఆ Run ScriptΛCompile SourcesΑΓલʹฒͼସ͑

Slide 61

Slide 61 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement 
 iOS App Androidͱಉ༷ʹɺจࣈྻΛදࣔͤͯ͞Έ·͢

Slide 62

Slide 62 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement 
 iOS App Androidͱಉ༷ʹɺจࣈྻΛදࣔͤͯ͞Έ·͢ ViewController.swift΁ίʔυΛ࣮૷

Slide 63

Slide 63 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement 
 iOS App Androidͱಉ༷ʹɺจࣈྻΛදࣔͤͯ͞Έ·͢ import UIKit import ShareCode class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let label = UILabel(frame: CGRect(x: 0, y: 0, width: 300, height: 21)) label.center = CGPoint(x: 160, y: 285) label.textAlignment = .center label.font = label.font.withSize(24) // ڞ௨Ϟδϡʔϧʹ࣮૷ͨ͠function͕ݺͼग़͍ͤͯΔ label.text = CommonKt.createApplicationScreenMessage() view.addSubview(label) } }

Slide 64

Slide 64 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement 
 iOS App Androidͱಉ༷ʹɺจࣈྻΛදࣔͤͯ͞Έ·͢ import UIKit import ShareCode class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let label = UILabel(frame: CGRect(x: 0, y: 0, width: 300, height: 21)) label.center = CGPoint(x: 160, y: 285) label.textAlignment = .center label.font = label.font.withSize(24) // ڞ௨Ϟδϡʔϧʹ࣮૷ͨ͠function͕ݺͼग़͍ͤͯΔ label.text = CommonKt.createApplicationScreenMessage() view.addSubview(label) } } ࠷ॳʹ࡞੒ͨ͠ڞ௨ϞδϡʔϧΛimport

Slide 65

Slide 65 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Implement 
 iOS App Androidͱಉ༷ʹɺจࣈྻΛදࣔͤͯ͞Έ·͢ import UIKit import ShareCode class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let label = UILabel(frame: CGRect(x: 0, y: 0, width: 300, height: 21)) label.center = CGPoint(x: 160, y: 285) label.textAlignment = .center label.font = label.font.withSize(24) // ڞ௨Ϟδϡʔϧʹ࣮૷ͨ͠function͕ݺͼग़͍ͤͯΔ label.text = CommonKt.createApplicationScreenMessage() view.addSubview(label) } } ڞ௨Ϟδϡʔϧͷ࣮૷Λݺͼग़͠

Slide 66

Slide 66 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Run iOS App ࣮ߦͯ͠ΈΔͱ ʮKotlin Rocks on iOS 12.1ʯ ͱදࣔ͞Ε·͢ʂ

Slide 67

Slide 67 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Compare App iOS Android

Slide 68

Slide 68 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Try Kotlin/Native What’s Kotlin Agenda Conclusion

Slide 69

Slide 69 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Conclusion • Kotlin/Native͸λʔήοτຖͷωΠςΟϒόΠφ ϦΛు͖ग़͢ίϯύΠϥ • αϙʔτ͍ͯ͠Δλʔήοτ͸෯޿͍ • ڞ௨෦෼ΛKotlinͰॻ͚Δͱ͍͏രΞυ㽉 • ·ͩϕʔλͳͷͰࠓޙͷൃలʹظ଴

Slide 70

Slide 70 text

Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ Slide, Sample Codes satsukies/DiveIntoKotlinNative TwitterϑΥϩʔͯ͠Ͷ Slideshare GitHub

Slide 71

Slide 71 text

Thank you!