Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin Nativeでクロスプラットフォーム開発 / Cross-platform development with Kotlin Native

satsukies
November 17, 2018

Kotlin Nativeでクロスプラットフォーム開発 / Cross-platform development with Kotlin Native

satsukies

November 17, 2018
Tweet

More Decks by satsukies

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 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

    View Slide

  8. Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ
    α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ
    Kotlin/Native
    • Kotlin͔Βλʔήοτ؀ڥͰಈ࡞͢ΔωΠςΟϒ

    όΠφϦΛੜ੒͢ΔίϯύΠϥ
    • ಺෦Ͱ͸LLVMΛܦ༝͍ͯ͠Δ
    • αϙʔτͯ͠ΔϓϥοτϑΥʔϜ͸ҎԼͷ௨Γ
    • iOS, Android, Windows, MacOS, Linux, WebAssembly

    View Slide

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

    View Slide

  10. Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ
    α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ
    Kotlin/Native
    • Kotlin͔Βλʔήοτ؀ڥͰಈ࡞͢ΔωΠςΟϒ

    όΠφϦΛੜ੒͢ΔίϯύΠϥ
    • ಺෦Ͱ͸LLVMΛܦ༝͍ͯ͠Δ
    • αϙʔτͯ͠ΔϓϥοτϑΥʔϜ͸ҎԼͷ௨Γ
    • iOS, Android, Windows, MacOS, Linux, WebAssembly

    View Slide

  11. Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ
    α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ
    Kotlin/Native
    • Kotlin͔Βλʔήοτ؀ڥͰಈ࡞͢ΔωΠςΟϒ

    όΠφϦΛੜ੒͢ΔίϯύΠϥ
    • ಺෦Ͱ͸LLVMΛܦ༝͍ͯ͠Δ
    • αϙʔτͯ͠ΔϓϥοτϑΥʔϜ͸ҎԼͷ௨Γ
    • iOS, Android, Windows, MacOS, Linux, WebAssembly

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. 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()}"
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. 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
    }

    View Slide

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

    View Slide

  30. 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
    }

    View Slide

  31. 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λʔήοτͷઃఆ

    View Slide

  32. 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λʔήοτͷઃఆ

    View Slide

  33. 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
    }
    ϥΠϒϥϦͷಡΈࠐΈઃఆ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. 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

    View Slide

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

    View Slide

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

    }

    View Slide

  40. Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ
    α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ
    Implement
    Android App
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
    activity_main.xmlΛमਖ਼
    TextViewʹίʔυ͔ΒΞΫηεͰ͖ΔΑ͏ʹ͢Δ

    View Slide

  41. Kotlin/NativeͰΫϩεϓϥοτϑΥʔϜ։ൃ
    α Πό ʔ Τ ʔ δ Σ ϯ τ / ະ དྷ େ L T େ ձ @ വ ؗ ະ དྷ େ
    Implement
    Android App
    activity_main.xmlΛमਖ਼
    TextViewʹίʔυ͔ΒΞΫηεͰ͖ΔΑ͏ʹ͢Δ
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
    IDΛׂΓ౰͍ͯͯ͋͛ͯΔ

    View Slide

  42. 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
    }

    View Slide

  43. 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ͰදࣔจࣈྻͱจࣈαΠζΛηοτ

    View Slide

  44. 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
    }
    จࣈྻͱจࣈαΠζΛηοτ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. 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 \[email protected]\n"
    setExecutable(true)
    }
    }
    }
    tasks.build.dependsOn packForXCode

    View Slide

  52. 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 \[email protected]\n"
    setExecutable(true)
    }
    }
    }
    tasks.build.dependsOn packForXCode
    iOSͰඞཁͳϑΝΠϧͷੜ੒λεΫ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    iOS App
    Androidͱಉ༷ʹɺจࣈྻΛදࣔͤͯ͞Έ·͢

    View Slide

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

    iOS App
    Androidͱಉ༷ʹɺจࣈྻΛදࣔͤͯ͞Έ·͢
    ViewController.swift΁ίʔυΛ࣮૷

    View Slide

  63. 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)
    }
    }

    View Slide

  64. 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

    View Slide

  65. 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)
    }
    }
    ڞ௨Ϟδϡʔϧͷ࣮૷Λݺͼग़͠

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  71. Thank you!

    View Slide