生产上的 FirebaseRemoteConfigClientException (Android)

Posted

技术标签:

【中文标题】生产上的 FirebaseRemoteConfigClientException (Android)【英文标题】:FirebaseRemoteConfigClientException on production (Android) 【发布时间】:2020-06-21 01:44:25 【问题描述】:

到目前为止我做了什么...

我在工作线程中使用Tasks.await blocking 机制进行firebase 调用以避免回调。

我正在使用工作线程 (JobIntentService) 进行一些初始化进程。 JobIntentService 在应用打开时启动并且只运行一次。下面是我的工作线程代码

    if (isDeviceConnectedToInternet()) 
        Tasks.await(FirebaseConfigHelper.getRemoteConfig().fetchAndActivate()); //error here
        initFirebaseConfigVariables();
        // other codes
    

//FirebaseConfigHelper.java
public static FirebaseRemoteConfig getRemoteConfig() 
    FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
    mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);
    return mFirebaseRemoteConfig;

我正在使用

implementation 'com.google.firebase:firebase-config:19.0.4'

关于错误

它在测试设备时运行良好。我在Firebase Test Lab 的另外 15 个设备中进行了测试。完全没有问题。但是当我发布到生产中时,这个错误发生在某些特定的 Mi 和三星设备中。

错误日志

我只能得到这个日志,因为生产中发生错误

java.util.concurrent.ExecutionException:
com.google.firebase.remoteconfig.FirebaseRemoteConfigClientException:
The client had an error while calling the backend!  at
com.google.android.gms.tasks.Tasks.zzb(Unknown Source:61)   at
com.google.android.gms.tasks.Tasks.await(Unknown Source:23) at
com.maju.myapp.service.SyncWithFirebaseJobIntentService.syncWithFirebaseConfig(SyncWithFirebaseJobIntentService.java:207)   at
com.maju.myapp.service.SyncWithFirebaseJobIntentService.onHandleWork(SyncWithFirebaseJobIntentService.java:55)  at
androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:392)   at
androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:383)   at
android.os.AsyncTask$3.call(AsyncTask.java:378) at
java.util.concurrent.FutureTask.run(FutureTask.java:266)    at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at
java.lang.Thread.run(Thread.java:919)Caused by:
com.google.firebase.remoteconfig.FirebaseRemoteConfigClientException:
The client had an error while calling the backend!  at
com.google.firebase.remoteconfig.internal.ConfigFetchHttpClient.fetch(com.google.firebase:firebase-config@@19.0.4:194)  at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler.fetchFromBackend(com.google.firebase:firebase-config@@19.0.4:278)  at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler.fetchFromBackendAndCacheResponse(com.google.firebase:firebase-config@@19.0.4:251)  at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler.fetchIfCacheExpiredAndNotThrottled(com.google.firebase:firebase-config@@19.0.4:191)    at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler.lambda$fetch$0(com.google.firebase:firebase-config@@19.0.4:160)    at
com.google.firebase.remoteconfig.internal.ConfigFetchHandler$$Lambda$1.then(Unknown
Source:4)   at com.google.android.gms.tasks.zzf.run(Unknown
Source:2)   ... 3 moreCaused by: java.net.ConnectException: Failed to
connect to
firebaseremoteconfig.googleapis.com/2404:6800:4007:809::200a:443    at
com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:147)    at
com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)  at
com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186) at
com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)  at
com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)   at
com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)    at
com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)    at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)   at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)   at
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262)   at
com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:219) at
com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:30)  at
com.google.firebase.remoteconfig.internal.ConfigFetchHttpClient.setFetchRequestBody(com.google.firebase:firebase-config@@19.0.4:321)    at
com.google.firebase.remoteconfig.internal.ConfigFetchHttpClient.fetch(com.google.firebase:firebase-config@@19.0.4:182)  ...
9 more
    为什么会这样? 如何避免?

(回调使代码变得丑陋和混乱,为了制作干净的代码我更喜欢Tasks.await)

【问题讨论】:

检查这个:***.com/a/54603795/1318946 @PratikButani 已经启用 互联网连接可能不好? @TashPemhiwa 可能是,但我在调用 firebase config fetch 之前检查了连接到 Internet 的设备 这可能与互联网连接的质量有关,而不是根本没有连接。 【参考方案1】:

我就这个问题联系了 Firebase 支持

他们说

如果设备用户的连接出现问题,因为我们的 SDK尝试调用获取数据,会导致“客户端 调用后端时出错!”错误。有了它,它看起来 就像您在验证连接性时所做的正确 获取远程配置数据之前的最新更新。你可以 检查我们的实现here 你可以想象我们的电话 这会触发这个问题。

您可以使用Android network debugger 来模拟 网络调用,因此您可以捕获处理机制以确保 您的实际设备在进行提取时具有正确的连接。

所以问题可能是设备的网络连接。我在最近的更新中检查网络连接。但我仍然在某些设备中收到此错误。原因可能是设备当时的互联网连接质量差(@Tash Pemhiwa 在评论中建议)

【讨论】:

以上是关于生产上的 FirebaseRemoteConfigClientException (Android)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上的 Firebase Analytics 事件 - 测试和生产

生产上的 FirebaseRemoteConfigClientException (Android)

为啥我们不应该在生产服务器上的 mysql 查询中使用 Select *?

生产 SPA 上的 Angular 应用程序 Http 解析错误

NodeJS 上的 Aurelia 捆绑和生产部署

Windows 上的 Node.js 生产就绪了吗? [关闭]