Kapt not generating classes in Instant app feature module

末鹿安然 提交于 2019-12-07 03:38:40

问题


I am using dagger2 in my android application. It is not generating dagger component classes even though there is no errors.

I have enabled the annotation processors in the setttings and restart my android studio but that didn't work for me. I read this thread too Dagger2 not generating Daggercomponent classes and read on one thread that apt is deprecated so I am using annotationProcessor

Base Module build.gradle

apply plugin: 'com.android.feature'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    baseFeature true
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 26
        versionCode 1
        versionName "0.0.1"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    application project(':app')
    feature project(":main")
    feature project(":tv")  

    api 'com.android.support:appcompat-v7:26.0.2'
    api 'com.android.support.constraint:constraint-layout:1.0.2'
    api 'com.android.support:design:26.0.2'

    api "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    api "org.jetbrains.anko:anko-commons:$anko_version"

    api "android.arch.lifecycle:runtime:1.0.0-alpha9"
    api "android.arch.lifecycle:extensions:1.0.0-alpha9"
    kapt "android.arch.lifecycle:compiler:1.0.0-alpha9"

    api 'com.squareup.retrofit2:retrofit:2.3.0'
    api "com.squareup.retrofit2:converter-moshi:2.0.0"

    api 'com.google.dagger:dagger:2.11'
    kapt 'com.google.dagger:dagger-compiler:2.11'

    api 'com.github.bumptech.glide:glide:4.0.0'
    kapt 'com.github.bumptech.glide:compiler:4.0.0'

    // new version 1.5.2 has some multi dex issue
    debugApi 'com.squareup.leakcanary:leakcanary-android:1.5.1'
    releaseApi 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
}

repositories {
    mavenCentral()
}

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

tv feature build.gradle

apply plugin: 'com.android.feature'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"


    defaultConfig {
        minSdkVersion 23
        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 project(':base')
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.0'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.0'
}

Project build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.1.3-2'
    ext.anko_version = '0.10.1'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-beta4'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:3.1.0'

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

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

NetComponent.kt

@Component(modules = arrayOf(AppModule::class, NetModule::class))
interface NetComponent {
    fun inject(activity: MainActivity)
}

apt generates dagger classes inside apt directory but there is no such dagger generated classes now even though I searched in entire project directory.

I see that its not generating DaggerNetComponent class, as there is no errors too on compilation. Does anyone know what could be the issue ?


回答1:


Your module is an instant app feature module. And it looks like kapt doesn't support those yet.

I cannot back this with a source but this should work:

  • feature module
    • library module + dagger + kapt

Move everything from your feature module to a library module. Then make the feature module depend on the library module.

Library modules do support kapt.

This sample project uses Dagger and Kapt in Instant App Feature modules and it works out-of-the-box. There must be some other issue with your project setup, which is not related to Dagger or annotation processing.

Go through the Instant App Codelab and make sure you didn't misunderstand anything.

The original answer should then work.

Original answer

Use kapt instead of annotationProcessor configuration. As in:

kapt "android.arch.lifecycle:compiler:1.0.0-alpha9"
kapt 'com.google.dagger:dagger-compiler:2.11'
kapt 'com.github.bumptech.glide:compiler:4.0.0'

If you're using databinding add this as well:

kapt "com.android.databinding:compiler:3.0.0-beta4"

Don't forget to update the version when you use different build plugin version.

Kotlin plugin doesn't pick up annotationProcessor dependencies, we have to use kapt dependencies instead.

Finally, to use latest version of Kotlin annotation processor put this at the top of your module's build.gradle:

apply plugin: 'kotlin-kapt'

Kotlin support for com.android.feature modules was added in Kotlin 1.1.4, make sure you use at least that.




回答2:


I literally just had this issue.

Try removing 'jre7' from the Kotlin stdlib dependency.




回答3:


In your base module build.gradle you have

dependencies {
    // some other stuff        

    api 'com.google.dagger:dagger:2.11'
    kapt 'com.google.dagger:dagger-compiler:2.11'
}

While com.google.dagger:dagger:2.11 is transitively available to your feature module due to api keyword, kapt does not make com.google.dagger:dagger-compiler:2.11 transitively available to your feature module.

Therefore you need to add com.google.dagger:dagger-compiler:2.11 to all your feature module for dagger to generate classes

In feature module build.gradle

dependencies {
    // some other stuff        

    // add kapt 
    kapt 'com.google.dagger:dagger-compiler:2.11'
}


来源:https://stackoverflow.com/questions/46080018/kapt-not-generating-classes-in-instant-app-feature-module

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!