本記事は、2015年 6月29日に作成しました。
2017年3月時点での最新の情報は、Kotlin 1.1 を始めようをご覧ください。

はじめに

Android開発では基本的にJavaで開発を行いますが、他にも色々な選択肢があります。 今回はその中でもにわかに注目を集めているKotlinでのAndroid開発について書いていきたいと思います。

Kotlinとは、Android StudioのベースとなるIntelliJ IDEA等を開発しているJetBrains社が2011年に発表したJVM上で動作する言語で、現在も活発に開発が続いています。

言語としては以下のことをゴールとして開発しているようです。

  • 完全なJavaとの相互運用性
  • Javaと遜色のないコンパイル速度
  • Javaより安全に
  • Javaより簡潔に
  • Scalaよりずっとシンプルに

引用: 2011 JVM Language Summit JetBrains社 発表資料 JVMLStalk2011.pdf

Design goals – Full Java interoperability – Compiles as fast as Java – Safer than Java – More concise than Java – Way simpler than Scala

また、Kotlinの公式サイトにアクセスすると以下のように記述されています。

Statically typed programming language for the JVM, Android and the browser

用途にはっきりとAndroidと明記されているのが凄いですね。

なお、今回試した開発環境は以下の通りです。

項目 バージョン
OS OS X Yosemite 10.10.3
IDE Android Studio 1.2.2
Android SDK Tools 24.3.3
Android SDK Platform-tools 22
Android SDK Build-tools 22.0.1
Kotlin Plugin ver 0.12.613.1.idea141.7

KotlinをAndroid Studioで利用できるようにする

Android Studio上でKotlinを利用したAndroidアプリを開発するためにIDE用のプラグインがJetBrains社がプラグインを出していますので、インストールを行います。

まずは、Android Studioを立ち上げ、Configure -> Plugins を選択します。

プラグインの管理画面が表示されますので、Install JetBrains pluginsを選択します。

左上の検索窓に、kotlinと入力して表示されたKotlinを選択し、Install pluginを選択してインストールして下さい。

インストールが完了すると先ほど、Install pluginと表示されていたボタンがRestart Android Studioと表示されているかと思いますので、そのボタンを選択し再起動してください。

Hello Kotlin

準備が整いましたので、早速KotlinでAndroidアプリを作成してみましょう。

Create New Projectを選択し、HelloKotlinという名前のプロジェクトを作成します。

Minimum SDKは、API 14を選択します。

今回プロジェクトの雛形は、Navigation Drawer Activityを選択します。

Activity名などは、デフォルトのまま作成します。

プロジェクトが作成たら、MainActivity.javaを選択してみてください。

当然今のままだと、Javaで記述されているので、これをKotlinにコンバートしてみましょう。

Kotlinプラグインには、JavaのソースコードからKotlinのソースコードへのコンバート機能が提供されていますので、その機能を利用してKotlinのソースコードへコンバートを行います。

ProjectビューでMainActivityを選択し、Code -> Convert Java File to Kotlin Fileを選択してください。

以下のようなダイアログが出てきたらOKを選択してください。

コンバートが完了しました。

コンバータでは解決出来なかった、幾つかのエラーが存在しているかと思います。 (Kotlinの文法については、本記事では詳しくは説明しませんのでここでは簡単な説明だけにとどめたいと思います)

35行目、76行目、90行目付近のsuperの箇所のエラーは多重継承に関わるエラーになります。

  • 修正前

Kotlinは多重継承を許容しているため、多重に継承した場合にはsuperの箇所で明示的に親のクラスを指定してあげる必要があります。

  • 修正後

同じように、76行目、90行目付近のエラーも解決して下さい。 (現在、Project Quick fixでは解決してくれないのが、少しじれったいですね)

参考: http://kotlinlang.org/docs/reference/classes.html#overriding-rules

105行目付近のエラーはNull Safety機構に関わるエラーになります。

KotlinではMainActivity?のように型に?が付いている場合、Nullになる可能性があるためそのままではメソッドの呼び出しが行えないために発生しています。

今回は、下記のいずれかのように修正して対処します。

?による解決

!!による解決

?の場合は、Nullの時に後続の処理を実行しない、!!の場合は、Nullの時にNullPointerExceptionが発生するといった違いがあります。

これでエラーがなくなりました。 次に、app/build.gradleファイルにKotlinのソースコードも解釈できるように記述します。 とはいっても、Kotlinプラグインにはbuild.gradleへKotlin用の記述を追加してくれる機能も存在していますので、Tools -> Kotlin -> Configure Kotlin Projectを選択すればいいです。

選択後、ダイアログが表示され以下の内容を選ぶことができます。

  • 適用するmoduleの設定
  • 適用するGradleのKotlinプラグインのバージョン
    • GradleのKotlinプラグインのバージョンはそのままKotlinのバージョンに相当しています。

今回は、そのままOKを選択してください。

以下のようにapp/build.gradleにKotlin用の記述が追加されました。

  • 修正前

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 22
        buildToolsVersion "22.0.1"
    
        defaultConfig {
            applicationId "jp.up_frontier.hellokotlin"
            minSdkVersion 14
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:22.2.0'
    }
    
    
  • 修正後

    apply plugin: 'com.android.application'
    // 追加コード
    apply plugin: 'kotlin-android'
    
    android {
        compileSdkVersion 22
        buildToolsVersion "22.0.1"
    
        defaultConfig {
            applicationId "jp.up_frontier.hellokotlin"
            minSdkVersion 14
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        // 追加コード
        sourceSets {
            main.java.srcDirs += 'src/main/kotlin'
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:22.2.0'
        // 追加コード
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    }
    // 追加コード
    buildscript {
        ext.kotlin_version = '0.12.613'
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    repositories {
        mavenCentral()
    }
    

これで、準備は整いましたので実行してみてください。 以下のように実行できるはずです。

このように、KotlinとJavaは相互運用が可能なため(いくつかの注意点は存在しますが)、Androidアプリケーションでも同時に記述することが可能です。 実行は出来たのですが、先ほど追加されたGradleのコードで以下のように、気になる箇所があります。

    // 追加コード
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

main.java.srcDirsはAndroidのソースコードの配置場所を指定しているプロパティで、配置場所にsrc/main/kotlinが追加されています。 Kotlinのドキュメントを参照すると以下のように記述されています。

Android Studio If using Android Studio, the following needs to be added under android: android { … sourceSets { main.java.srcDirs += ‘src/main/kotlin’ } } This lets Android Studio know that the kotlin directory is a source root, so when the project model is loaded into the IDE it will be properly re cognized.

そのため、現在Kotlinのソース(MainActivity.kt)とJavaのソース(NavigationDrawerFragment.java)がどちらもsrc/main/javaに存在していますが、Kotlinのソースはsrc/main/kotlinに置くことにします。

app/src/mainにkotlinディレクトリを作成します。

KotlinのソースをKotlinディレクトリに移動します。 MainActivity.kt -> Refactor -> Moveと選択してください。

Destination directoryの項目でkotlinを選択してください。

これで、MainActivity.ktをsrc/main/kotlinに移動出来ました。

同じように、NavigationDrawerFragment.javaもKotlinのソースに変換して、src/main/kotlinにソースを移動します。

それでは、実行してみます。

正常にKotlinにソースをコンバートして、実行できました。

おわりに

まだバージョン1.0は出ていないのですが、Androidアプリケーションを作成する選択肢として有力な候補になってきていると思います。 Javaより簡潔に書けることに加え、iOSの開発言語であるSwiftと言語仕様が似ているところも結構あるので、これを機会にKotlinに興味を持っていただければ幸いです。