react-native: Fatal Exception: parameter must be a descendant of this view - ReactScrollView.java line 218

Description

I’m having a lot of crashes on Crashlytics related to ReactScrollView.java line 218 on Android. The crashes appears first time on Nov 15, but I didn’t changes on my app.

Happen on Android: 8, 9, 10, 11 and 12. Samsung, Motorola, Google, LGE, OnePlus, etc.

Fatal Exception: java.lang.IllegalArgumentException: parameter must be a descendant of this view
       at android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:6272)
       at android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:6201)
       at android.widget.ScrollView.isWithinDeltaOfScreen(ScrollView.java:1289)
       at android.widget.ScrollView.onSizeChanged(ScrollView.java:1704)
       at com.facebook.react.views.scroll.ReactScrollView.onSizeChanged(ReactScrollView.java:218)
       at android.view.View.sizeChange(View.java:23088)
       at android.view.View.setFrame(View.java:23040)
       at android.view.View.layout(View.java:22897)
       at android.view.ViewGroup.layout(ViewGroup.java:6389)
       at com.facebook.react.uimanager.NativeViewHierarchyManager.updateLayout(NativeViewHierarchyManager.java:243)
       at com.facebook.react.uimanager.NativeViewHierarchyManager.updateLayout(NativeViewHierarchyManager.java:211)
       at com.facebook.react.uimanager.UIViewOperationQueue$UpdateLayoutOperation.execute(UIViewOperationQueue.java:161)
       at com.facebook.react.uimanager.UIViewOperationQueue$1.run(UIViewOperationQueue.java:917)
       at com.facebook.react.uimanager.UIViewOperationQueue.flushPendingBatches(UIViewOperationQueue.java:1028)
       at com.facebook.react.uimanager.UIViewOperationQueue.access$2600(UIViewOperationQueue.java:48)
       at com.facebook.react.uimanager.UIViewOperationQueue$2.runGuarded(UIViewOperationQueue.java:986)
       at com.facebook.react.bridge.GuardedRunnable.run(GuardedRunnable.java:31)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:250)
       at android.app.ActivityThread.main(ActivityThread.java:7803)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)

Version

0.63.4

Output of react-native info

System:
    OS: macOS 12.0.1
    CPU: (8) x64 Apple M1
    Memory: 20.08 MB / 16.00 GB
    Shell: 5.8 - /bin/zsh
  Binaries:
    Node: 14.18.1 - /usr/local/bin/node
    Yarn: Not Found
    npm: 6.14.15 - /usr/local/bin/npm
    Watchman: 4.9.0 - /opt/homebrew/bin/watchman
  Managers:
    CocoaPods: 1.11.2 - /usr/local/bin/pod
  SDKs:
    iOS SDK:
      Platforms: DriverKit 21.0.1, iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0
    Android SDK:
      API Levels: 28, 29, 30
      Build Tools: 28.0.3, 29.0.2, 29.0.3, 30.0.3
      System Images: android-30 | Google APIs Intel x86 Atom
      Android NDK: Not Found
  IDEs:
    Android Studio: 2020.3 AI-203.7717.56.2031.7784292
    Xcode: 13.1/13A1030d - /usr/bin/xcodebuild
  Languages:
    Java: 1.8.0_282 - /usr/bin/javac
    Python: 2.7.18 - /usr/bin/python
  npmPackages:
    @react-native-community/cli: Not Found
    react: 16.13.1 => 16.13.1
    react-native: ~0.63.4 => 0.63.4
    react-native-macos: Not Found
  npmGlobalPackages:
    *react-native*: Not Found

Steps to reproduce

I don’t know, I’m seeing them on Crashlytics.

Snack, code example, screenshot, or link to a repository

No response

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Reactions: 5
  • Comments: 27 (7 by maintainers)

Commits related to this issue

Most upvoted comments

I can confirm this problem happen because sometimes the Ad displayed is a WebView under the hood, and WebView itself will trigger a focus request.

If you are using the last version of https://github.com/react-native-admob/admob here’s a small patch fixing this bug :

diff --git a/node_modules/@react-native-admob/admob/android/src/main/java/com/rnadmob/admob/ads/banner/RNAdMobBannerView.java b/node_modules/@react-native-admob/admob/android/src/main/java/com/rnadmob/admob/ads/banner/RNAdMobBannerView.java
index 573e3d8..c372d51 100644
--- a/node_modules/@react-native-admob/admob/android/src/main/java/com/rnadmob/admob/ads/banner/RNAdMobBannerView.java
+++ b/node_modules/@react-native-admob/admob/android/src/main/java/com/rnadmob/admob/ads/banner/RNAdMobBannerView.java
@@ -8,6 +8,7 @@ import static com.rnadmob.admob.ads.banner.RNAdMobBannerViewManager.EVENT_APP_EV
 import static com.rnadmob.admob.ads.banner.RNAdMobBannerViewManager.EVENT_SIZE_CHANGE;
 
 import android.content.Context;
+import android.view.ViewGroup;
 
 import com.facebook.react.bridge.Arguments;
 import com.facebook.react.bridge.ReadableArray;
@@ -49,6 +50,7 @@ public class RNAdMobBannerView extends ReactViewGroup implements AppEventListene
             adView.destroy();
         }
         adView = new AdManagerAdView(getContext());
+        adView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
         adView.setAdListener(new AdListener() {
             @Override
             public void onAdLoaded() {

Thanks so much @manuhook and @RodolfoGS - using the patch described above has prevented this crash for us in our latest release.

There is an update too in the Google Ads SDK forum that might be useful to anyone who isn’t easily able to update or patch their Ads SDK native Android code. It seems disabling the specific autopromotion campaign(s?) setup for backfill may also prevent the crash.

Hello, I have found the cause of the bug. It turns out that the bug started to appear when I created an autopromotion campaign for backfill. It must be a bug.

Thanks for the help and it was hard to find the bug. I found it by chance. As soon as I deleted the campaign, it started showing ads again.

Yes @julianD77, no more crashes related to this error after applying the patch.

Thank you so much @manuhook! Here is the patch for @react-native-firebase/admob: 11.5.0. Note: I’m not tested yet!

File: patches/@react-native-firebase+admob+11.5.0.patch

diff --git a/node_modules/@react-native-firebase/admob/android/src/main/java/io/invertase/firebase/admob/ReactNativeFirebaseAdMobBannerAdViewManager.java b/node_modules/@react-native-firebase/admob/android/src/main/java/io/invertase/firebase/admob/ReactNativeFirebaseAdMobBannerAdViewManager.java
index 5faee1b..58b61c0 100644
--- a/node_modules/@react-native-firebase/admob/android/src/main/java/io/invertase/firebase/admob/ReactNativeFirebaseAdMobBannerAdViewManager.java
+++ b/node_modules/@react-native-firebase/admob/android/src/main/java/io/invertase/firebase/admob/ReactNativeFirebaseAdMobBannerAdViewManager.java
@@ -32,6 +32,7 @@ import com.google.android.gms.ads.AdRequest;
 import com.google.android.gms.ads.AdSize;
 import com.google.android.gms.ads.AdView;
 
+import android.view.ViewGroup;
 import javax.annotation.Nonnull;
 import java.util.Map;
 
@@ -121,7 +122,7 @@ public class ReactNativeFirebaseAdMobBannerAdViewManager extends SimpleViewManag
 
   private void setAdListener(ReactViewGroup reactViewGroup) {
     final AdView adView = getAdView(reactViewGroup);
-
+    adView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
     adView.setAdListener(new AdListener() {
       @Override
       public void onAdLoaded() {

Thanks for this @manuhook - have you confirmed that this does reduce the crash for users of your App? We are going to try and release an update with this workaround today

We dont yet have the data for App usage with the updated Google Ads SDK but do now have data for a period when Ads have been fully disabled (from around 1am) and not served to the App, and can see from this chart that it does have an effect on the frequency of this crash:

Screenshot 2021-12-01 at 09 20 40

We are still trying to verify this and aiming to get a new release out with just an update to use v20.5.0 the Ads SDK today. Will update as soon as I can.

@mqueiroz1995 See facebook.react.uimanager.NativeViewHierarchyManager.updateLayout in the call stack above. This just ends up triggering method calls on the ViewGroup class which is as you say native Android code. The issue I think is how the view hierarchy is getting modified to lead to the case where parameter must be a descendant of this view is no longer true.

Hey @julianD77 , we are facing the same issue in our production app. Was updating Google Ads effective?

Id definitely suggest trying a release with updated -ads dependencies. I’ll update here if we determine that disabling Android Ads / updating the SDKs has affected the frequency of this crash for us.