android - 为什么 dagger 2 生成的组件在项目重建时被删除?

标签 android gradle android-gradle-plugin build.gradle dagger-2

当在组件上使用生成的“Dagger”前缀的代码没有被注释掉时,就会出现问题。如果将其注释掉,则会生成生成的 Dagger 2 文件。

图书模块

@Module
public class BookModule {

    @Provides
    public Book providesBook(){
        return new Book();
    }

}

图书组件
@Component(modules = BookModule.class)
public interface BookComponent {

    void inject(MainActivity activity);

    public Book getBook();

}

主要应用
public class MainApplication extends Application {

    public static BookComponent mBookComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        mBookComponent = DaggerBookComponent.builder().bookModule(new BookModule()).build();
    }
}

Build.gradle(应用程序)
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'

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

allprojects {
    repositories {
        jcenter()
    }
}

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

构建.gradle(项目)
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "com.example.bryan.myapplication"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        jackOptions{
            enabled = true
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.0'
    compile 'com.android.support:support-v4:24.2.0'
    compile group: 'com.google.dagger', name: 'dagger', version: '2.10-rc1'
    apt group: 'com.google.dagger', name: 'dagger-compiler', version: '2.10-rc1'
    compile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3'

}

错误堆栈跟踪
ERROR: C:\bin\AndroidProjects\MyApplication\app\src\main\java\com\example\lloyd\myapplication\MainApplication.java:12.26: DaggerBookComponent cannot be resolved

com.android.jack.api.v01.CompilationException: Failed to compile
    at com.android.jack.api.v01.impl.Api01ConfigImpl$Api01CompilationTaskImpl.run(Api01ConfigImpl.java:144)
    at com.android.builder.core.AndroidBuilder.convertByteCodeUsingJackApis(AndroidBuilder.java:1931)
    at com.android.build.gradle.tasks.JackTask.doMinification(JackTask.java:148)
    at com.android.build.gradle.tasks.JackTask.access$000(JackTask.java:73)
    at com.android.build.gradle.tasks.JackTask$1.run(JackTask.java:112)
    at com.android.builder.tasks.Job.runTask(Job.java:51)
    at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41)
    at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:223)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.android.jack.frontend.FrontendCompilationException: Failed to compile
    at com.android.jack.Jack.buildSession(Jack.java:1053)
    at com.android.jack.Jack.run(Jack.java:540)
    at com.android.jack.api.v01.impl.Api01ConfigImpl$Api01CompilationTaskImpl.run(Api01ConfigImpl.java:124)
    ... 8 more
mBookComponent = DaggerBookComponent.builder().bookModule(new BookModule()).build();

上面的代码在 MainApplication 中,这就是问题所在,如果我将其注释掉,它会完全重建。但是当我保持原样时,它得到一个错误,说“DaggerBookComponent”无法解析,此时生成的 DaggerBookComponent 被删除,导致无法解析

最佳答案

当您进行重建时,构建系统会查看 Dagger 模块和组件类并生成使所有 dagger 工作的实际类。当您进行正常的增量构建时,它不会(它假设旧版本仍然很好)。这意味着当你重建时,如果你的程序或你的 Dagger 组件/模块中有一些错误,它将无法重建这些文件。

所以基本上,你的 Dagger 设置中可能(尽管不一定)有一个错误。当您修复它时,您将不再遇到问题。

关于android - 为什么 dagger 2 生成的组件在项目重建时被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477625/

相关文章:

gradle - Gradle以编程方式获取依赖项而无需配置

java - Gradle,并行任务执行

Android Studio Canary 3.4 Canary 4 : ERROR: variant. 功能插件不支持getApplicationId()

android - 改造无法访问 HttpUrl

android - 使用gradle将jar库发布到bintray

java - Android - 视频文件的缩略图

android - 使用已弃用的方法解决 GoogleAccountCredential.RequestHandler

android - 构建我的Flutter应用程序时,GradleExeption失败

java - Android webview输入类型文件

Android 加速移动项目