LoginSignup
4
5

More than 5 years have passed since last update.

Kotlin MultiplatformでAndroidアプリを作ってみる

Last updated at Posted at 2019-03-31

最初に

これからHotになっていくんじゃないかと思っているKotlin MultiplatformでAndroidアプリを作ってみました。最初の設定で少し躓いたのでまとめようと思いました。

Screen Shot 2019-04-01 at 0.07.36.png

ちょっとずつ来てる・・・?だがしかし、

Screen Shot 2019-04-01 at 0.14.26.png

他強すぎワロタwww
だがやっていきます。。。

Kotlin Multiplatformとは

Kotlinでcross platform開発しましょうというためのツール。似たようなのだとXamarin、React Native、Flutterなど。他のツールは詳しく知らないので、比較は出来ないが自分が思うメリットは

  • Android開発者なので、Kotlinベースで何かができるのが嬉しい。(最大の強み)
  • そもそもcross platformのために、新しい言語を覚えるのが嫌。(Swiftは少し書けるので、新しい言語学習には当たらなかった。)
  • UI部分は、iOS/Androidでテイストがそもそも違うので、そこを一つにする意味をあまり感じてなかった。
  • APIを繋ぐ式のcross platformはネイティブのアップデートにすぐ追いつけない気がして、最新のAPIが使えないのは嫌だった。(これどうなんだろう)

です。
こんな感じで、Kotlin Multiplatformに手を出してみました。

環境

Kotlinの公式だと、Android Studio 3.2、Gradle 4.7、Kotlin 1.3.21でやってました。
Kotlinは、1.3.21以上じゃないとダメらしい。AndroidのPreferencesからupdate出来ます。

Android Studio
Screen Shot 2019-04-01 at 0.37.09.png

Gradle/Kotlin
Screen Shot 2019-04-01 at 0.45.00.png

手順

  1. Android StudioでNew Projectする。
  2. アプリの初期設定は、こんな感じ。 Screen Shot 2019-04-01 at 0.39.47.png
  3. File -> New -> New ModuleでJava Libraryを選択。Library nameは、SharedCodeで、Class nameは、デフォルトのMyClassにしました。
  4. Moduleが生成されたあと、SharedCode/build.gradleを下記のように編集。(JavaからKotlinに変更)
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
}

5.<プロジェクトのルートディレクトリ>/SharedCode/src以下に
- androidMain/kotlin
- commonMain/kotlin
- iosMain/kotlin
というディレクトリを作ります。その後、すでにあるmainディレクトリを削除します。
6. actual.ktとcommon.ktを以下のように作成します。
こんな感じ。
Screen Shot 2019-04-01 at 2.52.47.png
それぞれ以下の様に編集。

androidMain/kotlin/actual.kt
package com.example.sharedcode

actual fun platformName(): String {
    return "Android"
}
commonMain/kotlin/common.kt
package com.example.sharedcode

expect fun platformName(): String

fun createApplicationScreenMessage() : String {
    return "Kotlin Rocks on ${platformName()}"
}
iosMain/kotlin/actual.kt
package com.example.sharedcode

actual fun platformName(): String {
    return "iOS"
}

7.プロジェクトビューのappディレクトリ上で右クリック->Open Module SettingsからSharedCodeをimportする。(この図は入れた後なので:SharedCodeがすでに一覧に追加されています。)
Screen Shot 2019-04-01 at 2.58.52.png

8.activity_main.xmlのTextViewにid(main_text)を振って、MainActivity.ktを以下の様に編集。

MainActivity.kt
package com.example.kotlin_multiplatform

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import com.example.sharedcode.createApplicationScreenMessage

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        findViewById<TextView>(R.id.main_text).text = createApplicationScreenMessage()
    }
}

Lintエラーが出ないはず。
9. これでBuildすれば完成!

結論

一応動かせるところまでは出来たけど、プロジェクトビュー を綺麗に展開出来なかったり、ライブラリの問題があったりなど、まだまだ発展途上な感じがすごい。
けど引き続き使っていきたいと思います。今度iOS版も出来たらいいかなと思います。

参考

  • Kotlinの公式Tutorial

  • Mercariのエンジニアさんの記事

  • Qiita記事

https://qiita.com/takahirom/items/4df7bfca17928a40922e
https://qiita.com/irgaly/items/eebd1273b38e1e671fcf

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5