googleads-mobile-flutter: Fatal Exception: java.lang.LinkageError

Firebase crash analytics is reporting the following error on android devices

Fatal Exception: java.lang.LinkageError: Method java.lang.Object com.google.android.gms.internal.ads.jo3.zzb() overrides final method in class Lcom/google/android/gms/internal/ads/bo3; (declaration of 'com.google.android.gms.internal.ads.jo3' appears in base.apk)
       at com.google.android.gms.internal.ads.zzcpr.<init>(zzcpr.java:310)
       at com.google.android.gms.internal.ads.zzcpq.zza(zzcpq.java:103)
       at com.google.android.gms.internal.ads.zzevk.zza(zzevk.java:365)
       at com.google.android.gms.internal.ads.zzeke.zzN(zzeke.java:58)
       at com.google.android.gms.internal.ads.zzeke.zze(zzeke.java:6)
       at com.google.android.gms.internal.ads.zzbhd.zzg(zzbhd.java:203)
       at com.google.android.gms.ads.BaseAdView.loadAd(BaseAdView.java:6)
       at io.flutter.plugins.googlemobileads.FlutterBannerAd.load(FlutterBannerAd.java:60)
       at io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.onMethodCall(GoogleMobileAdsPlugin.java:737)
       at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:17)
       at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:18)
       at io.flutter.embedding.engine.dart.DartMessenger.lambda$handleMessageFromDart$0(DartMessenger.java:20)
       at io.flutter.embedding.engine.dart.DartMessenger.lambda$handleMessageFromDart$0$DartMessenger(DartMessenger.java)
       at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$6ZD1MYkhaLxyPjtoFDxe45u43DI.run(-.java:12)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:246)
       at android.app.ActivityThread.main(ActivityThread.java:8550)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

This is the line it errors on

at io.flutter.plugins.googlemobileads.FlutterBannerAd.load(FlutterBannerAd.java:60)

on the following devices

image

Im am using google_mobile_ads google_mobile_ads: ^1.0.1

and Flutter 2.8.0

Edit:

This is our statefull widget

class MyBannerAd extends StatefulWidget {
  const MyBannerAd();

  @override
  _MyBannerAdState createState() => _MyBannerAdState();
}

class _MyBannerAdState extends State<MyBannerAd> {
  late AdSize adSize;
  late AdMobRepository adRepository;
  late AnalyticsRepository analyticsRepository;
  bool adLoaded = false;
  BannerAd? anchoredBanner;

  @override
  void initState() {
    super.initState();
    adRepository = context.read<AdMobRepository>();
    analyticsRepository = context.read<AnalyticsRepository>();

    if (SizerUtil.deviceType != DeviceType.mobile && SizerUtil.orientation == Orientation.portrait) {
      adSize = AdSize.leaderboard;
    } else {
      adSize = AdSize.largeBanner;
    }

    final bannerAd = adRepository.getBannerAd(
      size: adSize,
      onFailedLoad: (ad, error) {
        print('banner ad failed to load: $error');
        ad.dispose();
      },
      onLoad: (ad) {
        setState(() {
          adLoaded = true;
          anchoredBanner = ad as BannerAd?;
        });
      },
      onAdImpression: (_) {
        analyticsRepository.sendBannerAdShownEvent();
      },
      onAdOpened: (_) {
        analyticsRepository.sendBannerAdClickEvent();
      },
    );

    bannerAd.load();
  }

  @override
  void dispose() {
    super.dispose();
    anchoredBanner?.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<SubscriptionBloc, SubscriptionState>(
      builder: (context, state) {
        final isLoaded = !adLoaded;

        if (isLoaded || state.hasSubscribed || anchoredBanner == null) return SizedBox.shrink();

        return Container(
          color: Colors.transparent,
          width: anchoredBanner!.size.width.toDouble(),
          height: anchoredBanner!.size.height.toDouble(),
          child: Center(
            child: Container(
              color: Colors.white,
              child: AdWidget(
                ad: anchoredBanner!,
              ),
            ),
          ),
        );
      },
    );
  }
}

And this is the repo

class AdMobRepository {
  late String _releaseBannerAdId;
  late String _releaseInterstitualAdId;
  late String _releaseRewardedAdId;

  AdMobRepository() {
    if (Platform.isAndroid) {
      _releaseBannerAdId = Constants.androidBannedAdId;
      _releaseInterstitualAdId = Constants.androidInterstitualAdId;
      _releaseRewardedAdId = Constants.androidRewardedAdId;
    } else if (Platform.isIOS) {
      _releaseBannerAdId = Constants.iosBannerAdId;
      _releaseInterstitualAdId = Constants.iosInterstitualAdId;
      _releaseRewardedAdId = Constants.iosRewardedAdId;
    } else {
      _releaseBannerAdId = "";
      _releaseInterstitualAdId = "";
      _releaseRewardedAdId = "";
    }
  }

  BannerAd getBannerAd({
    required AdSize size,
    void Function(Ad, LoadAdError)? onFailedLoad,
    void Function(Ad)? onLoad,
    void Function(Ad)? onAdOpened,
    void Function(Ad)? onAdImpression,
  }) {
    return BannerAd(
      adUnitId: kReleaseMode ? _releaseBannerAdId : BannerAd.testAdUnitId,
      request: AdRequest(),
      size: size,
      listener: BannerAdListener(
        onAdFailedToLoad: onFailedLoad ?? onFailedLoadFallback,
        onAdLoaded: onLoad,
        onAdImpression: onAdImpression,
        onAdOpened: onAdOpened,
      ),
    );
  }

  void onFailedLoadFallback(Ad ad, LoadAdError error) {
    ad.dispose();
  }

  void getInterstitualAd({required void Function(LoadAdError) onFailedLoad, void Function(InterstitialAd)? onLoad}) {
    InterstitialAd.load(
      adUnitId: kReleaseMode ? _releaseInterstitualAdId : InterstitialAd.testAdUnitId,
      request: AdRequest(),
      adLoadCallback: InterstitialAdLoadCallback(
        onAdLoaded: onLoad ?? onInterstitialAdLoadedFallback,
        onAdFailedToLoad: onFailedLoad,
      ),
    );
  }

  void onInterstitialAdLoadedFallback(InterstitialAd ad) {
    ad.fullScreenContentCallback = FullScreenContentCallback(
      onAdDismissedFullScreenContent: (ad) => ad.dispose(),
      onAdFailedToShowFullScreenContent: (ad, error) => ad.dispose(),
    );
  }

  void getRewardAd({required String userId, required void Function(LoadAdError) onFailedLoad, void Function(RewardedAd)? onLoad}) {
    RewardedAd.load(
      adUnitId: kReleaseMode ? _releaseRewardedAdId : RewardedAd.testAdUnitId,
      request: AdRequest(),
      rewardedAdLoadCallback: RewardedAdLoadCallback(
        onAdLoaded: onLoad ?? onRewardedAdLoadedFallback,
        onAdFailedToLoad: onFailedLoad,
      ),
      serverSideVerificationOptions: ServerSideVerificationOptions(userId: userId),
    );
  }

  void onRewardedAdLoadedFallback(RewardedAd ad) {
    ad.fullScreenContentCallback = FullScreenContentCallback(
      onAdDismissedFullScreenContent: (ad) => ad.dispose(),
      onAdFailedToShowFullScreenContent: (ad, error) => ad.dispose(),
    );
  }
}

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Reactions: 26
  • Comments: 56

Most upvoted comments

I fixed it ! For me the solution was to update app/build.gradle and explicitly this line :

classpath 'com.android.tools.build:gradle:4.1.1' to classpath 'com.android.tools.build:gradle:4.2.2'

Getting the same crashes with Flutter (Channel stable, 3.3.0) and google_mobile_ads 2.0.1

@EArminjon I have tried to use Gradle 7.0.4 because it was the Gradle version used by new project in Android Studio Arctic Fox | 2020.3.1 Patch 4

If i create a new project in Android Studio Bumblebee | 2021.1.1 Patch 1 i can see the current Gradle version is 7.1.1 and i can find the lines i need to manually upgrade flutter project to current gradle version in build.gradle and gradle-wrapper.properties

Release notes: https://developer.android.com/studio/releases/gradle-plugin#7-1-0

To upgrade gradle to current version in flutter project

in android\build.gradle :

`buildscript {

dependencies {
    classpath 'com.android.tools.build:gradle:7.1.1'

}

}`

in android\gradle\wrapper\gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip

To avoid this warning:

w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath: C:/Users/User/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.5.30/5fd47535cc85f9e24996f939c2de6583991481b0/kotlin-stdlib-jdk8-1.5.30.jar (version 1.5) C:/Users/User/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.6.10/e1c380673654a089c4f0c9f83d0ddfdc1efdb498/kotlin-stdlib-jdk7-1.6.10.jar (version 1.6) C:/Users/User/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.6.10/b8af3fe6f1ca88526914929add63cf5e7c5049af/kotlin-stdlib-1.6.10.jar (version 1.6) C:/Users/User/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.6.10/c118700e3a33c8a0d9adc920e9dec0831171925/kotlin-stdlib-common-1.6.10.jar (version 1.6) w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath: C:/Users/User/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.5.30/5fd47535cc85f9e24996f939c2de6583991481b0/kotlin-stdlib-jdk8-1.5.30.jar (version 1.5) C:/Users/User/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.6.10/e1c380673654a089c4f0c9f83d0ddfdc1efdb498/kotlin-stdlib-jdk7-1.6.10.jar (version 1.6) C:/Users/User/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.6.10/b8af3fe6f1ca88526914929add63cf5e7c5049af/kotlin-stdlib-1.6.10.jar (version 1.6) C:/Users/User/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.6.10/c118700e3a33c8a0d9adc920e9dec0831171925/kotlin-stdlib-common-1.6.10.jar (version 1.6) w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath

change in android\app\build.gradle

dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" }

to

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

If i open the Android folder of the flutter project in Android Studio Bumblebee | 2021.1.1 Patch 1 it suggest to update the gradle plugin

image

image

image

Can’t reproduce locally, but it’s happens on the release builds in 2 variants:

  1. Android 11, 12, 7.1, 8
java.lang.LinkageError: 
  at com.google.android.gms.internal.ads.zzcqd.<init> (zzcqd.java:307)
  at com.google.android.gms.internal.ads.zzcqc.zza (zzcqc.java:66)
  at com.google.android.gms.internal.ads.zzexc.zza (zzexc.java:297)
  at com.google.android.gms.internal.ads.zzelg.zze (zzelg.java:75)
  at com.google.android.gms.internal.ads.zzelg.zzP (zzelg.java:5)
  at com.google.android.gms.internal.ads.zzbrw.zza (zzbrw.java:28)
  at com.google.android.gms.ads.interstitial.InterstitialAd.load (InterstitialAd.java:29)
  at io.flutter.plugins.googlemobileads.FlutterAdLoader.loadInterstitial (FlutterAdLoader.java:2)
  at io.flutter.plugins.googlemobileads.FlutterInterstitialAd.load (FlutterInterstitialAd.java:23)
  at io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.onMethodCall (GoogleMobileAdsPlugin.java:1362)
  at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage (MethodChannel.java:17)
  at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart (DartMessenger.java:49)
  at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage (FlutterJNI.java:4)
  at android.os.MessageQueue.nativePollOnce (Native Method)
  at android.os.MessageQueue.next (MessageQueue.java:335)
  at android.os.Looper.loop (Looper.java:194)
  at android.app.ActivityThread.main (ActivityThread.java:8126)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:656)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:967)

Screen Shot on 2022-01-10 at 11:26:44

  1. Android 10, 9, little 11
java.lang.LinkageError: 
  at com.google.android.gms.internal.ads.zzcqc.zza (zzcqc.java:23)
  at com.google.android.gms.internal.ads.zzexc.zza (zzexc.java:297)
  at com.google.android.gms.internal.ads.zzelg.zze (zzelg.java:75)
  at com.google.android.gms.internal.ads.zzelg.zzP (zzelg.java:5)
  at com.google.android.gms.internal.ads.zzbrw.zza (zzbrw.java:28)
  at com.google.android.gms.ads.interstitial.InterstitialAd.load (InterstitialAd.java:29)
  at io.flutter.plugins.googlemobileads.FlutterAdLoader.loadInterstitial (FlutterAdLoader.java:2)
  at io.flutter.plugins.googlemobileads.FlutterInterstitialAd.load (FlutterInterstitialAd.java:23)
  at io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.onMethodCall (GoogleMobileAdsPlugin.java:1362)
  at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage (MethodChannel.java:17)
  at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart (DartMessenger.java:49)
  at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage (FlutterJNI.java:4)
  at android.os.MessageQueue.nativePollOnce (Native Method)
  at android.os.MessageQueue.next (MessageQueue.java:363)
  at android.os.Looper.loop (Looper.java:173)
  at android.app.ActivityThread.main (ActivityThread.java:8178)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:513)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1101)

Screenshot 2022-01-10 at 11 28 06

Total

Totally about 1% of DAU gets the error. As a result - app crashes.

Screenshot 2022-01-10 at 11 29 14 Screenshot 2022-01-10 at 11 29 22

I’m having this error on release build on a Huawei gr5 2017 and on Google plays testing device Nokia Nokia 1 image

E/AndroidRuntime(21244): FATAL EXCEPTION: main E/AndroidRuntime(21244): Process: com.appname, PID: 21244 E/AndroidRuntime(21244): java.lang.LinkageError: Method java.lang.Object com.google.android.gms.internal.ads.jo3.a() overrides final method in class Lcom/google/android/gms/internal/ads/bo3; (declaration of 'com.google.android.gms.internal.ads.jo3' appears in /data/app/com.appname-1/base.apk) E/AndroidRuntime(21244): at com.google.android.gms.internal.ads.ru0.<init>() E/AndroidRuntime(21244): at com.google.android.gms.internal.ads.qu0.zza() E/AndroidRuntime(21244): at com.google.android.gms.internal.ads.ri2.b() E/AndroidRuntime(21244): at com.google.android.gms.internal.ads.b72.N5() E/AndroidRuntime(21244): at com.google.android.gms.internal.ads.b72.t0() E/AndroidRuntime(21244): at com.google.android.gms.internal.ads.uw.j() E/AndroidRuntime(21244): at com.google.android.gms.ads.k.b() E/AndroidRuntime(21244): at io.flutter.plugins.googlemobileads.q.e() E/AndroidRuntime(21244): at io.flutter.plugins.googlemobileads.f0.onMethodCall() E/AndroidRuntime(21244): at e.a.c.a.j$a.a() E/AndroidRuntime(21244): at io.flutter.embedding.engine.f.b.e() E/AndroidRuntime(21244): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage() E/AndroidRuntime(21244): at android.os.MessageQueue.nativePollOnce(Native Method) E/AndroidRuntime(21244): at android.os.MessageQueue.next(MessageQueue.java:359) E/AndroidRuntime(21244): at android.os.Looper.loop(Looper.java:138) E/AndroidRuntime(21244): at android.app.ActivityThread.main(ActivityThread.java:6531) E/AndroidRuntime(21244): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(21244): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941) E/AndroidRuntime(21244): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831)

so, did anyone find the problem, or a solution to it?

Hi,

I too have hundreds of crash everyday Mostly for Android 9 and 10.

Upgrading kotlin to classpath 'com.android.tools.build:gradle:7.1.2' gradle to distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip and kotlin to implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

solved it for me

@EArminjon

I’m using different, and working on PROD:

distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
ext.kotlin_version = '1.6.10'

classpath 'com.android.tools.build:gradle:7.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.10'
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
    jvmTarget = '1.8'
}

Same chrash for me:

Fatal Exception: java.lang.LinkageError: Method java.lang.Object com.google.android.gms.internal.ads.jo3.zzb() overrides final method in class Lcom/google/android/gms/internal/ads/bo3; (declaration of 'com.google.android.gms.internal.ads.jo3' appears in /data/app/com.easypatente.quizpatente-xCeV0TKRrjeieZaKLyA7Vw==/base.apk) at com.google.android.gms.internal.ads.zzcpq.zza(zzcpq.java:44) at com.google.android.gms.internal.ads.zzevk.zza(zzevk.java:365) at com.google.android.gms.internal.ads.zzeke.zzN(zzeke.java:58) at com.google.android.gms.internal.ads.zzeke.zze(zzeke.java:6) at com.google.android.gms.internal.ads.zzbhd.zzg(zzbhd.java:203) at com.google.android.gms.ads.BaseAdView.loadAd(BaseAdView.java:6) at io.flutter.plugins.googlemobileads.FlutterBannerAd.load(FlutterBannerAd.java:60) at io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.onMethodCall(GoogleMobileAdsPlugin.java:737) at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:17) at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:18) at io.flutter.embedding.engine.dart.DartMessenger.lambda$handleMessageFromDart$0(DartMessenger.java:20) at io.flutter.embedding.engine.dart.DartMessenger.lambda$handleMessageFromDart$0$DartMessenger(DartMessenger.java) at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$6ZD1MYkhaLxyPjtoFDxe45u43DI.run(-.java:12) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:237) at android.app.ActivityThread.main(ActivityThread.java:7948) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)

using google_mobile_ads: ^1.0.1

on devices: Xiaomi:

  • Redmi 9T

Samsung:

  • Galaxy J3(2017)
  • Galaxy A01
  • Galaxy A10
  • Galaxy A12

HUAWEI:

  • SCM-W09

Same crash for me also , we only use one banner ad in the entire app

Crashlytics log

Fatal Exception: java.lang.LinkageError: Method java.lang.Object com.google.android.gms.internal.ads.jo3.a() overrides final method in class Lcom/google/android/gms/internal/ads/bo3; (declaration of ‘com.google.android.gms.internal.ads.jo3’ appears in /data/app/news.x.breaking.news.browser-M034RpcgCiyE4vf3Mg2xYg==/base.apk) at com.google.android.gms.internal.ads.zzcpr.<init>(zzcpr.java:310) at com.google.android.gms.internal.ads.zzcpq.zza(zzcpq.java:103) at com.google.android.gms.internal.ads.zzevk.zza(zzevk.java:365) at com.google.android.gms.internal.ads.zzeke.zzN(zzeke.java:58) at com.google.android.gms.internal.ads.zzeke.zze(zzeke.java:6) at com.google.android.gms.internal.ads.zzbhd.zzg(zzbhd.java:203) at com.google.android.gms.ads.BaseAdView.loadAd(BaseAdView.java:6) at io.flutter.plugins.googlemobileads.FlutterBannerAd.load(FlutterBannerAd.java:60) at io.flutter.plugins.googlemobileads.GoogleMobileAdsPlugin.onMethodCall(GoogleMobileAdsPlugin.java:737) at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:17) at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:49) at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:4) at android.os.MessageQueue.nativePollOnce(MessageQueue.java) at android.os.MessageQueue.next(MessageQueue.java:325) at android.os.Looper.loop(Looper.java:142) at android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)