Unity-Technologies/com.unity.mobile.notifications

[Android] java.lang.OutOfMemoryError on Android 12

artyom-v opened this issue · 13 comments

Unity: v2020.3.26f1
Plugin: 19a3d9d4f064d1f814138aedc5dc1ffa061cb3a8

java.lang.OutOfMemoryError: 
  at android.os.Parcel.createString8Array (Parcel.java:1489)
  at android.content.pm.ApplicationInfo.<init> (ApplicationInfo.java:1999)
  at android.content.pm.ApplicationInfo.<init> (ApplicationInfo.java:62)
  at android.content.pm.ApplicationInfo$1.lambda$createFromParcel$0 (ApplicationInfo.java:1968)
  at android.content.pm.ApplicationInfo$1$$ExternalSyntheticLambda0.readRawParceled (Unknown Source)
  at android.os.Parcel.readSquashed (Parcel.java:2134)
  at android.content.pm.ApplicationInfo$1.createFromParcel (ApplicationInfo.java:1968)
  at android.content.pm.ApplicationInfo$1.createFromParcel (ApplicationInfo.java:1965)
  at android.os.Parcel.readParcelable (Parcel.java:3345)
  at android.os.Parcel.readValue (Parcel.java:3238)
  at android.os.Parcel.readArrayMapInternal (Parcel.java:3635)
  at android.os.BaseBundle.initializeFromParcelLocked (BaseBundle.java:292)
  at android.os.BaseBundle.unparcel (BaseBundle.java:236)
  at android.os.BaseBundle.getString (BaseBundle.java:1196)
  at com.unity.androidnotifications.UnityNotificationUtilities.deserializeNotificationCustom (UnityNotificationUtilities.java:300)
  at com.unity.androidnotifications.UnityNotificationUtilities.deserializeNotificationIntent (UnityNotificationUtilities.java:219)
  at com.unity.androidnotifications.UnityNotificationUtilities.deserializeNotificationIntent (UnityNotificationUtilities.java:206)
  at com.unity.androidnotifications.UnityNotificationManager.loadNotificationIntents (UnityNotificationManager.java:429)
  at com.unity.androidnotifications.UnityNotificationRestartOnBootReceiver.onReceive (UnityNotificationRestartOnBootReceiver.java:23)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:4763)
  at android.app.ActivityThread.access$1700 (ActivityThread.java:310)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2294)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loopOnce (Looper.java:226)
  at android.os.Looper.loop (Looper.java:313)
  at android.app.ActivityThread.main (ActivityThread.java:8641)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:567)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1133)

The exception occurred on different user devices with Android 12 only

The big icon size used for the notification is 256x256 32bpp

Could you provide the image itself?

Here is it.
android_notification_large

We have pretty much exact crash stack trace after testing out 2.0.0

Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 4929737064 byte allocation with 2097152 free bytes and 506MB until OOM, target footprint 7867904, growth limit 536870912
       at android.os.Parcel.createString8Array(Parcel.java:1489)
       at android.content.pm.ApplicationInfo.<init>(ApplicationInfo.java:1999)
       at android.content.pm.ApplicationInfo.<init>(ApplicationInfo.java:62)
       at android.content.pm.ApplicationInfo$1.lambda$createFromParcel$0(ApplicationInfo.java:1968)
       at android.content.pm.ApplicationInfo$1$$ExternalSyntheticLambda0.readRawParceled()
       at android.os.Parcel.readSquashed(Parcel.java:2134)
       at android.content.pm.ApplicationInfo$1.createFromParcel(ApplicationInfo.java:1968)
       at android.content.pm.ApplicationInfo$1.createFromParcel(ApplicationInfo.java:1965)
       at android.os.Parcel.readParcelable(Parcel.java:3345)
       at android.os.Parcel.readValue(Parcel.java:3238)
       at android.os.Parcel.readArrayMapInternal(Parcel.java:3635)
       at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
       at android.os.BaseBundle.unparcel(BaseBundle.java:236)
       at android.os.BaseBundle.getString(BaseBundle.java:1196)
       at com.unity.androidnotifications.UnityNotificationUtilities.deserializeNotificationCustom(SourceFile:300)
       at com.unity.androidnotifications.UnityNotificationUtilities.deserializeNotificationIntent(SourceFile:219)
       at com.unity.androidnotifications.UnityNotificationUtilities.deserializeNotificationIntent(SourceFile:206)
       at com.unity.androidnotifications.UnityNotificationManager.loadNotificationIntents(SourceFile:429)
       at com.unity.androidnotifications.UnityNotificationRestartOnBootReceiver.onReceive(SourceFile:23)
       at android.app.ActivityThread.handleReceiver(ActivityThread.java:4763)
       at android.app.ActivityThread.access$1800(ActivityThread.java:310)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2294)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8641)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)

Should be fixed in latest.

Will that be 2.0.2 and higher?

No, it should be fixed in 2.0.1.

I don't see it in the changelog for 2.0.1 and the 2.0.1 tag was created on the commit before this was merged. Just to make sure, I've downloaded 2.0.1 and I don't see the changes in UnityNotificationUtilities.java. Should I be looking somewhere else?

Missed when writing notes :(

To be clear , I don't see the changes from pull request #179 in tag 2.0.1 and I don't see the changes from that pull request in the UnityNotificationUtilities.java file inside the 2.0.1 package I just grabbed from the Unity Package Manager. If the changes are in there, am I looking at the wrong file? This is the file I'm checking:

AppData\Local\Unity\cache\packages\packages.unity.com\com.unity.mobile.notifications@2.0.1\Runtime\Android\Plugins\com\unity\androidnotifications\UnityNotificationUtilities.java

Ah, got confused by how git shows commit history. It did land after commit that is 2.0.1, so it will be out with next one.

Great, thanks for confirming!

@aurimasc facing the same issue. Do you now when the fix will be published?

@aurimasc Guys, why you think that catching OutOfMemoryError fixes the problem?

In my Crashlytics the error looks like this:

Fatal Exception: java.lang.OutOfMemoryError
Failed to allocate a 4792046832 byte allocation with 2097152 free bytes and 253MB until OOM, target footprint 4961960, growth limit 268435456

So it looks like the data layout is broken and some random binary (4792046832) is read like a string length in bytes.