在官方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>(...);
}
答案 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之前运行,而不是在之后运行。