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是zzb
(public 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();
我最近尝试将我正在处理的应用程序从 GCM
迁移到 FCM
。在这样做的同时,我发现我以前使用 Dagger 2 (2.0.2)
来提供我的 Retrofit
API 和服务内其他用户数据管理器的实例(没有问题),对于 FirebaseMessagingService
,我不能再这样做了。
每当我尝试使用 Dagger 2 Component
界面中列出的 FirebaseMessagingService
的子 class 进行编译时,我都会得到一个 IllegalArgumentException
。在深入研究了一些代码之后,似乎当 Dagger 2
尝试验证 class 名称并发现第一个字母不是大写时会抛出异常。 FirebaseMessagingService
,至少在我这边,继承自一个丑化/缩小的代码库,它的直接超级class是zzb
(public 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();