官方上Dagger2 documentation据说没有特定的 ProGuard 设置,应该遵循使用 Dagger 相关的设置。
启用 ProGuard Dagger2 后开始提示找不到要注入(inject)的类等。如果没有 @Inject 构造函数或 @Provides 注释的方法,则无法提供 lt.setkus.myapp.data.rest.b.c。
那么,我应该让 Dagger2 用于 DI 的 ProGuard 不影响所有类吗?
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>(...);
}
最佳答案
因为 Dagger 2 使用 codegen,并且(与 Dagger 1 不同)不在任何地方使用类名或其他字符串键,所以您不需要任何 Dagger 1.x 规则。您将需要标准的 Android 规则来保留反射创建的 Activity 和 Fragment 实例(等),但据我所知,从 Dagger 2 的初始版本开始,Dagger 不需要任何特殊的东西。
这里奇怪的事情是,看起来 Dagger 编译器是在 ProGuard 的收缩和混淆步骤之后运行的,您确实希望先运行 Dagger,然后再运行 ProGuard。这确保了 Dagger 可以使用它需要的字段和构造函数,并且 ProGuard 可以缩小 Dagger 的输出。
检查您的build设置,确保 Proguard 在 deshing 和 APK 创建之前立即运行,并且 Dagger 在 ProGuarding 之前而不是之后运行。
关于android - Dagger2 在应用 ProGuard 规则后提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42747947/