Kotlin + IntelliJでAndroid開発を始めてみる(とりあえず動作させてみる)

先日の続きで、IntelliJ上でKotlinを動作させられるようにした後からです。

現在では、Android + Gradleでプロジェクトを作成した場合、何か知りませんが色々と足りないようで、そのままだとKotlinにしたところで動作しません。なので、その辺を対処していきます。
なお、この対処は調べたりなんだりしてやっと動作するようになったものなので、本当に正しいのかは不明とします。

AndroidManifest.xml

AndroidManifest.xmlがなんなのかもよくわからない、というくらいではありますが、初期状態ではここにActivityの記述が無いため、まったく動作させられません。なので、以下のように書き換えました。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gpstracking.app"
        android:versionCode="1"
        android:versionName="1.0">
    <uses-sdk android:minSdkVersion="15"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity"
                android:label="@string/app_name">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

こんな感じにします。packageとかは自分の環境に合わせてください。

build.gradle

次に、Kotlin対応したと思しきbuild.gradleですが、実はこのままではエミュレーターで起動させたときとかに、

Unable to instantiate activity...

とか出て怒られます。エラーメッセージをちゃんと読むと、kotlinのライブラリとリンク出来ない・・・という感じのエラーが出ています。


デフォルトでは、libディレクトリ内にkotlinのランタイムが用意されるわけですが、これとは別に、コンパイル時にこれらとリンクするライブラリを依存に追加する必要があります。
ということで、以下のようになりました。

buildscript {
    ext.kotlin_version = '0.7.270'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
apply plugin: 'android'
apply plugin: 'kotlin-android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin' // 無かったらここも追加
    }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$ext.kotlin_version"  // デフォルトからここを追加
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

デフォルトで定義されるものも含めた定義になります。肝はkotlin-stdlibをcompileの依存関係に含めた部分になります。これが大事。

上手くいけば

Clean / Rebuild すれば、多分ちゃんと動作するようになります。Intel x86エミュレータで動作させてみましょう。ちゃんとHAXMが効いていないと、死ぬほど待ちますので、ちゃんと効かせましょう。

これから

とりあえず作ってみたいものがあるので、それができるまでは調べながら作ってみます。問題はAndroidのトレンドの移り変りが激しいことですね。さすがに系統立てて勉強しないときついかもしれません。