Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@ryo12882

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

最初に

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

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
6
Help us understand the problem. What are the problem?