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

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
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'toclasspath '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 {
}`
in android\gradle\wrapper\gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zipTo 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 classpathchange in android\app\build.gradle
dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" }to
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
Can’t reproduce locally, but it’s happens on the release builds in 2 variants:
Total
Totally about 1% of DAU gets the error. As a result - app crashes.
I’m having this error on release build on a Huawei gr5 2017 and on Google plays testing device Nokia Nokia 1
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 todistributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zipand kotlin toimplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"solved it for me
I’m using different, and working on PROD:
https://github.com/flutter/flutter/issues/98362
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:
Samsung:
HUAWEI:
Same crash for me also , we only use one banner ad in the entire app
Crashlytics log