Dagger 2 麻烦@Inject-ing FirebaseMessagingService

Dagger 2 trouble @Inject-ing FirebaseMessagingService

我最近尝试将我正在处理的应用程序从 GCM 迁移到 FCM。在这样做的同时,我发现我以前使用 Dagger 2 (2.0.2) 来提供我的 Retrofit API 和服务内其他用户数据管理器的实例(没有问题),对于 FirebaseMessagingService,我不能再这样做了。

每当我尝试使用 Dagger 2 Component 界面中列出的 FirebaseMessagingService 的子 class 进行编译时,我都会得到一个 IllegalArgumentException。在深入研究了一些代码之后,似乎当 Dagger 2 尝试验证 class 名称并发现第一个字母不是大写时会抛出异常。 FirebaseMessagingService,至少在我这边,继承自一个丑化/缩小的代码库,它的直接超级class是zzbpublic class FirebaseMessagingService extends com.google.firebase.iid.zzb)。

我最好的猜测是这就是罪魁祸首。如果这确实是问题所在,除了现在坚持 GCM 之外,我不知道该怎么做。有人对此有任何想法或类似经验吗?

编辑:我有机会就此问题询问一位 Firebase 开发人员:https://www.reddit.com/r/androiddev/comments/4upj1o/beware_of_the_new_firebase/d5tdbk3 - 无解决方案。我可能只是要避免直接注入并合并到静态 API 提供程序。

经过半天的努力,终于转向 Dagger 2.7 解决了这个问题。

compile "com.google.dagger:dagger:2.7"
apt "com.google.dagger:dagger-compiler:2.7"

我们遇到了同样的问题,Dagger 对 class 大写 class 名称做了一些愚蠢的验证并遇到了混淆的 class 名称,实际上看起来像

public class FirebaseService extends xxab {   

}

xxab 只是 proguard 在混淆过程中吐出的随机名称,我记得准确)

我们做了愚蠢的解决方法,不优雅,但有效:

public class FirebaseServiceProvider { //not real provider, though
   public FirebaseServiceProvider(...params){
      mInstance = ...
   }
  public FirebaseService getService(){
   return mInstance;
  }
}

@Module:

@Singleton
@Provides
public FirebaseServiceProvider providesFirebaseServiceProvider(){    
 return new FirebaseServiceProvider(.....);
}

注入:

@Inject
FirebaseServiceProvider mFirebaseServiceProvider;

用法:

mFirebaseServiceProvider.getService().doStuff();