android - Dagger2 在应用 ProGuard 规则后提示

标签 android proguard dagger-2 android-proguard dagger

官方上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/

相关文章:

android - 如何设置位图图像的高度和宽度?

android - 在android中使AlertActivity全屏

java - 在 Android 数据库中获取 SQLiteContraintException

maven - Proguard 与 JDK 10/JDK 11 和 maven pugin

android - Dagger 2 : Cannot resolve symbol for dagger component

Android Dagger 2 和整洁的架构实现,范围错误

java - 导致创建注释的多个实例的逻辑问题

java - ProGuard 混淆、java、Google Gson 和通用集合——如何保留成员?

android - Proguard:保留动态声明的方法

java - Kodein 与 Dagger - 无法让 Dagger 使用多个模块工作