Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

最初に

これから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

https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html

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

https://tech.mercari.com/entry/2018/12/18/114010

  • Qiita記事

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

ryo12882
アメリカのスタートアップで、バックエンド全般を担当しています。深層生成モデルに興味があり、勉強中です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした