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

KotlinなAndroidプロジェクトがBreakpointで止められない問題

More than 1 year has passed since last update.

Kotlin な Android プロジェクトで Breakpoint が止まらない状況

Kotlin な Android プロジェクトを大幅にリファクタリングしていたところ、いつのまにか Breakpoint で停止することができなくなっていました。

アプリがデバッグモードにならない場合は設定ミスや buildTypes の設定間違いなどはよくありますが、今回は Logcat で以下の表示が出ているため、デバッグモードで起動しており Debugger アタッチまでできているはずです。

12-01 13:59:19.447 19095-19101/net.irgaly.myapplication I/art: Debugger is active
12-01 13:59:19.633 19095-19095/net.irgaly.myapplication I/System.out: Debugger has connected
12-01 13:59:19.633 19095-19095/net.irgaly.myapplication I/System.out: waiting for debugger to settle...
12-01 13:59:19.834 19095-19095/net.irgaly.myapplication I/System.out: waiting for debugger to settle...
12-01 13:59:20.035 19095-19095/net.irgaly.myapplication I/System.out: waiting for debugger to settle...
12-01 13:59:20.235 19095-19095/net.irgaly.myapplication I/System.out: waiting for debugger to settle...
12-01 13:59:20.436 19095-19095/net.irgaly.myapplication I/System.out: waiting for debugger to settle...
12-01 13:59:20.636 19095-19095/net.irgaly.myapplication I/System.out: waiting for debugger to settle...
12-01 13:59:20.837 19095-19095/net.irgaly.myapplication I/System.out: waiting for debugger to settle...
12-01 13:59:21.037 19095-19095/net.irgaly.myapplication I/System.out: debugger has settled (1390)

プロジェクトの状態

Android Studio 3.0.1 で、Android Kotlinプロジェクトを新規で作成し、以下の状態にすると再現します。

.kt ファイルのソースコードディレクトリは新規作成時点では src/main/java/**/*.kt と配置されているが、これを src/main/kotlin/**/*.kt へと変更しています。
build.gradle の内容は新規作成からそのままです。

image.png

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "net.irgaly.myapplication"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

このとき、デバッグ実行すると Breakpoint が以下の表示となり、実行を停止することができない状態になります。

Breakpoint does not belong to any class

image.png

解決方法

build.gradle に sourceSets 設定を追加すると Breakpoint が使えるようになります。

android {
  ...
  sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
  }
}

sourceSets 指定がなくてもアプリはビルドして実行できてしまううえに、Logcat にも原因を特定できそうなエラー表示もないため、ハマると気づきにくいトラブルです。sourceSets のリファレンスを見ても Breakpoint との関係は読み取れませんでしたが、実行時にデバッグアタッチ用ソースコードの参照先としているようです。

src/main/kotlin も標準で参照先に入れてくれればこの設定もいらなくなるのに...

irgaly
スマホアプリエンジニア。Kotlin/Swift/Xamarin。Kotlin/Nativeでマルチプラットフォームアプリ開発している。
o-inc
「新しい時間を作る」をミッションに据える睡眠ベンチャー。体内時計に注目し、睡眠領域で組織改善を促すネイティブアプリとウェブアプリ「O:SLEEP」を提供中。
https://o-inc.jp/
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
ユーザーは見つかりませんでした