应用ProGuard规则后,Dagger2会抱怨

时间:2017-03-12 13:23:48

标签: android proguard dagger-2 android-proguard dagger

在官方Dagger2 documentation上写道,没有特定的ProGuard设置,应遵循使用Dagger的相关设置。

启用ProGuard后,Dagger2开始抱怨无法找到要注入的类等。lt.setkus.myapp.data.rest.b.c cannot be provided without an @Inject constructor or from an @Provides-annotated method.那么,我应该保持所有类都不受ProGuard的影响吗?Dagger2使用哪个类进行DI?

Dagger 1.x的规则适用于项目:

-keep class dagger.** { *; }
-keep interface dagger.** { *; }

-keep class **$$ModuleAdapter { *; }
-keepnames class **$$InjectAdapter { *; }

-keepclassmembers class * {
    @javax.inject.Inject <fields>;
    @javax.inject.Inject <init>(...);
}

1 个答案:

答案 0 :(得分:1)

因为Dagger 2使用codegen,并且(与Dagger 1不同)在任何地方都不使用类名或其他字符串键,所以你不应该那些Dagger 1.x中的任何规则。您需要标准的Android规则来保留反射创建的Activity和Fragment实例(等),但据我所知,Dagger并不需要Dagger 2初始版本中的任何特殊内容。< / p>

奇怪的是,看起来Dagger编译器在 ProGuard的缩小和混淆步骤之后运行,你真的想先运行Dagger,然后再运行ProGuard。这确保了Dagger可以使用它所需的字段和构造函数,并且ProGuard可以缩小Dagger的输出。

检查您的构建设置,以确保在dexing和APK创建之前立即运行Proguard,并且Dagger在ProGuarding之前运行,而不是在之后运行。