如何同时使用 Realm.io 和 Dagger(或任何需要注释处理的多个依赖项)?

How can I use both Realm.io and Dagger (or any multiple dependencies that need annotation processing)?

我正在尝试在我的 android 应用程序中同时使用 Realm.io and Dagger,但我似乎遇到了与 META-INF/services/javax.annotation.processing.Processor 文件的冲突问题。

我尝试将以下内容添加到我的 build.gradle 文件中:

packagingOptions {
    pickFirst 'META-INF/services/javax.annotation.processing.Processor'
}

也尝试过使用 exclude,但我收到错误消息,例如注解处理器在两个项目中都没有 运行。

我一直 运行 犯的错误是标准 Module adapter for class could not be loaded.

我认为正在发生的事情是,由于两个 AnnotationProcessor 都没有被保留,一个或另一个包的处理器不会发生,但我可能会偏离。

您的 AnnotationProcessors 不应在您的 compile 依赖范围内,它们应该在 provided 内,或者,如果您使用 android-aptapt.

看起来 Realm 并没有像他们应该的那样分离出他们的注解处理器,所以需要留在你的编译类路径中,但匕首编译器可以移动到提供。

最终看起来像这样:

compile 'com.squareup.dagger:dagger:1.2.2'
provided 'com.squareup.dagger:dagger-compiler:1.2.2'

compile 'io.realm:realm-android:0.87.1'

provided(或 apt)范围使依赖项可用于您的编译器,但不会将它们包含在最终产品中,因为它们不需要。您 运行 遇到的冲突是在 dex 进程中,但在那些范围内,这些 类 永远不会走那么远。

这还有一个额外的好处,就是可以缩减最终 APK 的大小。