【问题标题】:Dagger2 complains after ProGuard rules are applied应用 ProGuard 规则后 Dagger2 抱怨
【发布时间】:2017-03-12 13:23:48
【问题描述】:

官方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. 那么,我应该让 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>(...);
}

【问题讨论】:

  • 你不需要 Dagger2 的规则。但是你是否保留你的 pojo 或者是混淆了
  • lt.setkus.myapp.data.rest.b.c.你在包下有什么,只需使用 -keep class lt.setkus.myapp.data.**.rest.** {*; } 然后再试一次
  • 这是许多错误样本之一。看起来我必须保留 Dagger2 构建对象图所涉及的所有类和接口。这样做是常见的做法吗?
  • 可能。我已经在 dagger2 中使用了改造和其他 3 个方库,因此为它们提供规则并且它工作正常。

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


【解决方案1】:

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

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

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

【讨论】:

  • 嗨@Jeff Bowman。我已将应用程序逻辑分成不同的子模块。一些依赖项在子模块中定义。此外,所有这些 Dagger 因混淆而找不到的类都在子模块中。这可能是问题的原因吗?如果是,我怎么可能更改设置以确保 ProGuard 在 Dagger2 之后运行?
  • @RobertasSetkus 听起来您是在每个子模块上运行 ProGuard,而不是在整个应用程序上运行。这是故意的吗?
  • 首先,我启用并开始仅向应用程序模块添加规则。不记得我正在处理什么问题,但只是注意到如果我启用 ProGuard 并添加必要的规则,它会产生效果。现在我完全禁用并将一些规则移动到应用程序模块,它似乎有效。成功通过混淆阶段。谢谢!
  • @JeffBowman 如何检查您的构建设置以确保 Proguard 在 dexing 和 APK 创建之前立即运行
  • @yousef 取决于您的构建配置(Ant?Gradle?等),这显然不适合这些 cmets。请提出一个新问题,链接到此答案,并包含构建文件的相关部分。 (如果需要,您还可以包含错误消息的文本,以便读者确保您解决了正确的问题。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2020-11-16
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多