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

Kotlin_2FNative__使ってみた_の一歩先へ.pdf

Takaki Hoshikawa
November 07, 2018
47

 Kotlin_2FNative__使ってみた_の一歩先へ.pdf

Takaki Hoshikawa

November 07, 2018
Tweet

More Decks by Takaki Hoshikawa

Transcript

  1. Profile - 星川 貴樹 ◦ @oboenikui - FY17新卒入社 (2年目) -

    Androidエンジニア, セキュリティエンジニア? - Kotlin/Native歴 1年2ヶ月 - 業務ではまだ使ってません……
  2. Kotlin/Nativeの歩み v0.7 実用面の強化 - ObjC, Swfitの相互運用改善 - Maven artifacts対応 -

    AppCode, iOSシミュレータ対応 06 11~12 04~05 2017 04 2018 02~03 11
  3. Kotlin stdlib外のライブラリ(公式) - Coroutines, Serialization - 既にNative対応済み - Network I/O

    - Ktor ClientがMPPとしてJVM, JS, iOSに対応 ↪ JVMはOkHttpをラップしたものを用いる https://github.com/ktorio/ktor - File I/O - kotlinx-ioが進行中 https://github.com/Kotlin/kotlinx-io
  4. Kotlin stdlib外のライブラリ(非公式) - DI - Kodeinが対応済み https://github.com/Kodein-Framework/Kodein-DI/ - Date, Loggerなど

    - Korlibsというプロジェクトで提供中 https://korlibs.soywiz.com/ 基本的なものは出揃ってきた?
  5. kotlinconf-app (iOS) の変化 2017/04 2018/11 06 11~12 02~03 04~05 06~08

    iOSアプリをKotlinで書けるように なった! - Kotlinの文法で書けない部分の みObjC - 他はフルKotlinでゴリゴリ実装 - MPPは当時JVM, JSのみの対応
  6. kotlinconf-app (iOS) の変化 2017/04 2018/11 06 11~12 02~03 04~05 06~08

    MVPで実装し全てをKotlinでは書か ない - AndroidとModel, Presenter を共通化、 ViewはSwift - iOS固有のKotlinコードは
  7. Gradleの設定 plugins { id 'org.jetbrains.kotlin.multiplatform' version '1.3.0' } repositories {

    mavenCentral() } kotlin { /* ... */ } http://kotl.in/multiplatform
  8. Gradleの設定 (kotlinブロック) kotlin { targets { fromPreset(presets.jvm, 'android') fromPreset(presets.iosArm64, 'ios')

    } sourceSets { commonMain { /* ... */ } commonTest { /* ... */ } androidMain { /* ... */ } androidTest { /* ... */ } iosMain { /* ... */ } iosTest { /* ... */ } } } http://kotl.in/multiplatform
  9. Gradleの設定 (kotlinブロック) kotlin { targets { fromPreset(presets.jvm, 'android') fromPreset(presets.iosArm64, 'ios')

    } sourceSets { commonMain { /* ... */ } commonTest { /* ... */ } androidMain { /* ... */ } androidTest { /* ... */ } iosMain { /* ... */ } iosTest { /* ... */ } } } 他に android js macosX64 mingwX64 linuxX64 wasm32 など http://kotl.in/multiplatform
  10. Gradleの設定 (kotlinブロック) kotlin { targets { fromPreset(presets.jvm, 'android') fromPreset(presets.iosArm64, 'ios')

    } sourceSets { commonMain { /* ... */ } commonTest { /* ... */ } androidMain { /* ... */ } androidTest { /* ... */ } iosMain { /* ... */ } iosTest { /* ... */ } } } 名前が対応 http://kotl.in/multiplatform
  11. Gradleの設定 (sourceSetsブロック) commonMain { implementation 'org.jetbrains.kotlin:kotlin-stdlib' implementation "io.ktor:ktor-client-core:$ktor_version" } androidMain

    { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kt_version" implementation "io.ktor:ktor-client-core-jvm:$ktor_version" } iosMain { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kt_version" implementation "io.ktor:ktor-client-ios:$ktor_version" implementation "io.ktor:ktor-client-core-ios:$ktor_version" }
  12. ディレクトリ構造 └─ src/ ├─ commonMain/ │ └─ kotlin/ ├─ commonTest/

    │ └─ kotlin/ ├─ androidMain/ (Optional) │ └─ kotlin/ └─ iosMain/ (Optional) └─ kotlin/
  13. OSごとに別の実装をする場合 // commonMain/kotlin/Time.kt fun currentTimeSeconds() = currentTimeMillis() / 1000 expect

    fun currentTimeMillis(): Long // androidMain/koltin/Time.kt actual fun currentTimeMillis() = System.currentTimeMillis() // iosMain/koltin/Time.kt actual fun currentTimeMillis() { return (NSDate().timeIntervalSince1970 * 1000).toLong() }
  14. OSごとに別の実装をする場合 expect class LocalDateTime { /* ... */ } //

    JVM actual typealias LocalDateTime = java.time.LocalDateTime
  15. 速いの? - まだJVMより多分遅い - 最適化作業はまだこれからではないかと思う Kotlin/JVM Kotlin/Native 821ms 1961ms 参考:アッカーマン関数

    Ask(3, 11) の10回平均時間 (2GHz Core i5 / macOS 10.13.6 / kotlin-native 0.9.3) ※ VMのロード時間など考慮できていないので参考程度と捉えてください