Классы Kotlin, содержащие расширения Android, не построенные на последующих сборках

Недавно я решил перенести приложение Android нашей компании в kotlin. Однако это работает хорошо, когда я использую любое из расширений kotlin, я получаю странное поведение. Я заметил, что любой из классов, использующих расширения (будь то анко, или самообъявленные расширения) собирается только в первый раз, и при каждой последующей сборке его нет среди других классов. Классы Kotlin, которые не используют расширения, всегда строятся правильно. Это приводит к NoClassDefFoundError всякий раз, когда я запускаю программу (при последующих сборках первая выполняется без проблем). Я все перепробовал и начинаю немного отчаиваться... Вот мой build.gradle для всего проекта:

    buildscript {
    ext.kotlin_version = '1.0.1-2'
    ext.support_version = '23.3.0'
    ext.anko_version = '0.8.3'
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'com.google.gms:google-services:2.0.0-alpha6'
        classpath 'org.codehaus.groovy:gradle-groovy-android-plugin:0.3.7'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
}

Вот build.gradle для модуля, в котором я пытаюсь использовать kotlin.

buildscript {
    repositories {
        jcenter()
        mavenCentral()
        maven {
            url 'http://repo.spring.io/milestone'
        }
        maven {
            url "http://repo.bodar.com/"
        }
    }

    dependencies {
        classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
        classpath 'me.tatarka:gradle-retrolambda:3.2.4'
    }
}

apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'groovyx.grooid.groovy-android'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    productFlavors {
        dev {
            minSdkVersion 21
        }
        prod {
            minSdkVersion 19
        }
    }

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

    lintOptions {
        disable 'InvalidPackage'
    }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/services/javax.annotation.processing.Processor'
        exclude 'META-INF/services/org.codehaus.groovy.transform.ASTTransformation'
        exclude 'LICENSE.txt'
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId "com.example.name"
        minSdkVersion 16
        targetSdkVersion 23
        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        resValue "string", "tray__authority", "${applicationId}.tray"
    }


    dexOptions {
        javaMaxHeapSize "4g"
    }

    retrolambda {
        jvmArgs '-noverify'
    }



    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            testCoverageEnabled = true
        }
    }
}

kapt {
    generateStubs = true
}

repositories {
    jcenter()
    mavenCentral()
    maven {
        url "http://repo.bodar.com/"
    }
    maven {
        url "https://clojars.org/repo/"
    }
    maven { url "http://oss.sonatype.org/content/repositories/snapshots/" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.anko:anko-common:$anko_version"
    androidTestCompile 'org.codehaus.groovy:groovy:2.4.2:grooid'
    androidTestCompile 'com.andrewreitz:spock-android:1.2.2'
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    androidTestCompile('org.spockframework:spock-core:1.0-groovy-2.4') {
        exclude group: 'org.codehaus.groovy'
        exclude group: 'junit'
    }
    // Optional, needed for mocking
    androidTestCompile 'com.google.dexmaker:dexmaker:1.2'

    compile files('libs/nineoldandroids-2.4.0.jar')
    compile files('libs/guava-18.0.jar')
    provided 'org.projectlombok:lombok:1.16.4'
    compile files('libs/icepick-2.3.6.jar')
    compile files('libs/icepick-processor-2.3.6.jar')
    compile files('libs/FlurryAnalytics-5.5.0.jar')
    compile project(':fliclib')
    compile "com.android.support:support-annotations:$support_version"
    compile "com.android.support:recyclerview-v7:$support_version"
    compile "com.android.support:appcompat-v7:$support_version"
    compile "com.android.support:design:$support_version"
    compile "com.android.support:support-v4:$support_version"
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.androidplot:androidplot-core:0.9.6'
    compile 'com.google.android.gms:play-services-analytics:8.4.0'
    compile 'com.google.android.gms:play-services-gcm:8.4.0'
    compile 'com.nhaarman.listviewanimations:lib-core:3.1.0@aar'
    compile 'com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar'
    compile 'com.nhaarman.listviewanimations:lib-core-slh:3.1.0@aar'
    compile 'com.jakewharton:butterknife:7.0.1'
    compile 'org.springframework.android:spring-android-rest-template:2.0.0.M1'
    compile 'com.google.code.gson:gson:2.4'
    compile 'com.joooonho:selectableroundedimageview:1.0.1'
    compile 'com.googlecode.totallylazy:totallylazy:1.73'
    compile 'net.grandcentrix.tray:tray:0.9.2'
    compile 'org.solovyev.android.views:linear-layout-manager:0.5@aar'
    compile 'jp.wasabeef:recyclerview-animators:2.1.0'
    compile 'com.soundcloud.android:android-crop:1.0.1@aar'
    compile 'com.github.castorflex.verticalviewpager:library:19.0.1'
    compile 'com.github.traex.expandablelayout:library:1.3'
}

apply plugin: 'com.google.gms.google-services'

Вот манифест этого модуля (точнее, его заголовок, так как код является проприетарным)

<manifest package="com.package.name"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:versionCode="23"
          android:versionName="0.9.1">

person antaranin    schedule 02.05.2016    source источник


Ответы (1)


Итак, мне удалось разобраться, может быть, это поможет кому-то еще. Судя по всему, проблема была с аннотациями java (@DebugLog, @NonNull, @Icicle и т. д.), если бы они присутствовали в каком-либо из классов kotlin, он бы компилировался полуслучайно. После их удаления работает без нареканий.

person antaranin    schedule 09.05.2016
comment
Я вижу, вы используете флаг тестового покрытия — похоже, там есть ошибка, которая может вызывать много странного поведения :) youtrack.jetbrains.com/issue/KT-11333 - person daemontus; 16.09.2016