Firebase 云消息在后台崩溃

Posted

技术标签:

【中文标题】Firebase 云消息在后台崩溃【英文标题】:Firebase Cloud Message crash in background 【发布时间】:2019-12-12 13:58:59 【问题描述】:

最近遇到一个奇怪的崩溃,当接收到firebase云消息时发生,不确定崩溃是由于应用程序在后台时从firebase控制台发送通知引起的,这里是日志

Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'int com.android.okhttp.okio.Segment.limit' on a null object reference
   at com.android.okhttp.okio.Buffer.write + 1182(Buffer.java:1182)
   at com.android.okhttp.okio.Buffer.read + 1221(Buffer.java:1221)
   at com.android.okhttp.okio.RealBufferedSource.read + 55(RealBufferedSource.java:55)
   at com.android.okhttp.internal.http.HttpConnection$FixedLengthSource.read + 418(HttpConnection.java:418)
   at com.android.okhttp.internal.Util.skipAll + 176(Util.java:176)
   at com.android.okhttp.internal.Util.discard + 158(Util.java:158)
   at com.android.okhttp.internal.http.HttpConnection$FixedLengthSource.close + 435(HttpConnection.java:435)
   at com.android.okhttp.okio.RealBufferedSource.close + 374(RealBufferedSource.java:374)
   at com.android.okhttp.okio.RealBufferedSource$1.close + 362(RealBufferedSource.java:362)
   at com.google.android.gms.internal.firebase_messaging.zzk.zza + 4(com.google.firebase:firebase-messaging@@19.0.1:4)
   at com.google.firebase.messaging.zzi.close + 37(com.google.firebase:firebase-messaging@@19.0.1:37)
   at com.google.firebase.messaging.zzb.zza + 51(com.google.firebase:firebase-messaging@@19.0.1:51)
   at com.google.firebase.messaging.FirebaseMessagingService.zzc + 59(com.google.firebase:firebase-messaging@@19.0.1:59)
   at com.google.firebase.messaging.zzg.run + 2(com.google.firebase:firebase-messaging@@19.0.1:2)
   at java.util.concurrent.ThreadPoolExecutor.runWorker + 1113(ThreadPoolExecutor.java:1113)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run + 588(ThreadPoolExecutor.java:588)
   at com.google.android.gms.common.util.concurrent.zza.run + 6(:6)
   at java.lang.Thread.run + 818(Thread.java:818)

在收到消息期间我没有做任何网络行为,但一直在 Fabric 上收到此崩溃并且无法自己重现它,这是我的 firebase 依赖项

implementation 'com.google.firebase:firebase-core:17.0.0'
implementation 'com.google.firebase:firebase-messaging:19.0.1'

有人遇到同样的问题吗?

-------------------------------------------- 编辑代码 sn -p 在 FirebaseMessagingService 中

/* ------------------------------ Override */

override fun onMessageReceived(p0: RemoteMessage?) 
    super.onMessageReceived(p0)
    p0?.also  handleFcm(it.data) 


/* ------------------------------ Handle FCM by Type */

/**
 * Handle FCM action by type
 *
 * @param dataMap data from FCM
 */
private fun handleFcm(dataMap: Map<String, String>) 
    // Fetch data from FCM data map
    val fcmModel = FcmModel(dataMap)

    // GA
    if (fcmModel.name.isNotEmpty()) 
        GAManager.getInstance().event(
                GAEventCategory.PUSH_NOTIFICATION,
                GAEventAction.RECEIVE,
                fcmModel.name)
    

    // create intent for PendingIntent
    val intent = FcmUtils.createIntent(this, fcmModel)

    // create channel for Android O
    FcmUtils.createChannelForAndroidO(this, fcmModel)
    buildNotification(intent, fcmModel)

基本上,当接收数据时,对每个字段进行解析,并根据字段创建相应的intent,然后创建NotificationCompat。

-------------------------------------------- 编辑代码 sn -p 在 GAManager 中

public class GAManager 

// Instance
private static GAManager GAManager;

// GA tracker
private Tracker tracker;

/* ---------------------------------- Instance & initial */

@NonNull
public static GAManager getInstance() 
    if (GAManager == null) 
        GAManager = new GAManager();
    
    return GAManager;


/**
 * Get tracker id from current market
 *
 * @param context the context
 */
public void initial(@NonNull Context context) 
    // Default GA
    int trackerEnvironment = getGAbyMarketSource();
    tracker = GoogleAnalytics.getInstance(context).newTracker(trackerEnvironment);

    // Enable Advertising Features.
    tracker.enableAdvertisingIdCollection(true);

在应用程序onCreate时调用GAManager里面的函数initial,是这个原因吗?

-------------------------------------------- 发现问题

经过实验,发现问题是在firebase云消息控制台上添加图像引起的,当应用程序处于后台时会随机崩溃一些设备

【问题讨论】:

你能在你使用 firebase 的地方分享你的代码吗? 这个 NPE 很可能是由您的代码中的并发问题引起的。如果你分享你的代码,我会审查它。 @NoBody 添加代码 sn-p 我也有同样的错误影响我的应用程序的大约 600 个用户。从过去 10 天开始,此错误开始出现在 Crashlytics 中。 目前有任何更新吗? 【参考方案1】:

您使用了一个可能在另一个线程中初始化的单例类。 您必须使用服务上下文获取它的实例。

GoogleAnalytics mGaInstance = GoogleAnalytics.getInstance(serviceContext);

【讨论】:

嗨,我已经添加了代码 sn-p 和GAManager 的描述,但是最近开始发生崩溃,GAManager 是几年前添加的。 在发送事件之前,您必须在服务内部调用 initial()。【参考方案2】:

这是 Firebase 库中的一个已知问题。 (Issue1 和 Issue2)

目前两者都开放。将不得不等待 firebase 团队修复它。

解决方法:

它与从 Firebase 控制台发送的图像的正确大小、宽度、高度和分辨率有关。

This 也很有用。

【讨论】:

以上是关于Firebase 云消息在后台崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase 云消息传递的 Ionic Native Push 崩溃

用于 Flutter 的 Firebase 云消息传递 - 可选择处理后台消息错误

Firebase 云消息传递的 AbstractMethodError

Firebase 云消息传递前台通知在 Vue 中不起作用

Firebase 云消息传递不会创建推送通知,但会获取信息

React-Native - Firebase 云消息传递 - 如果从托盘打开则没有事件