在Application中初始化AdMob SDK时报AndroidManifest元数据缺失错误如何解决
问题现象
在应用Application实例中初始化AdMob SDK时触发崩溃,该问题在AndroidManifest.xml的<application>标签添加android:name=".MyApplication"配置后出现,崩溃点代码如下:
MobileAds.initialize( this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete( @NonNull InitializationStatus initializationStatus) {} });
注:相同初始化逻辑放在Activity层执行无异常。
错误日志
W/System.err: com.google.android.gms.common.GooglePlayServicesMissingManifestValueException: A required meta-data tag in your app's AndroidManifest.xml does not exist. You must have the following declaration within the <application> element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> E/MetadataValueReader: This should never happen. android.content.pm.PackageManager$NameNotFoundException: at android.app.ApplicationPackageManager.getApplicationInfoAsUser(ApplicationPackageManager.java:461) at android.app.ApplicationPackageManager.getApplicationInfo(ApplicationPackageManager.java:450) at com.google.android.gms.common.wrappers.PackageManagerWrapper.getApplicationInfo(com.google.android.gms:play-services-basement@@17.6.0:1) at com.google.android.gms.common.internal.zzaf.zzc(com.google.android.gms:play-services-basement@@17.6.0:4) at com.google.android.gms.common.internal.zzaf.zzb(com.google.android.gms:play-services-basement@@17.6.0:1) at com.google.android.gms.common.GooglePlayServicesUtilLight.isGooglePlayServicesAvailable(com.google.android.gms:play-services-basement@@17.6.0:7) at com.google.android.gms.common.GoogleApiAvailabilityLight.isGooglePlayServicesAvailable(com.google.android.gms:play-services-basement@@17.6.0:2) at com.google.android.gms.internal.ads.zzcfz.zzn(com.google.android.gms:play-services-ads-lite@@20.4.0:2) at com.google.android.gms.internal.ads.zzbei.zzd(com.google.android.gms:play-services-ads-lite@@20.4.0:2) at com.google.android.gms.internal.ads.zzbhj.zzw(com.google.android.gms:play-services-ads-lite@@20.4.0:3) at com.google.android.gms.internal.ads.zzbhj.zzb(com.google.android.gms:play-services-ads-lite@@20.4.0:8) at com.google.android.gms.ads.MobileAds.initialize(com.google.android.gms:play-services-ads-lite@@20.4.0:3) at com.example.MyApplication.onCreate(MyApplication.java:31) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7249) at android.app.ActivityThread.access$1600(ActivityThread.java:294) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2168) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:264) at android.app.ActivityThread.main(ActivityThread.java:8245) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049) 2021-10-18 20:10:04.690 27613-27640/com.example E/AndroidRuntime: FATAL EXCEPTION: pool-3-thread-1 Process: com.example, PID: 27613 java.lang.SecurityException: Permission Denial: getIntentSender() from pid=27613, uid=11251, (need uid=-1) is not allowed to send as package at android.os.Parcel.createExceptionOrNull(Parcel.java:2389) at android.os.Parcel.createException(Parcel.java:2373) at android.os.Parcel.readException(Parcel.java:2356) at android.os.Parcel.readException(Parcel.java:2298) at android.app.IActivityManager$Stub$Proxy.getIntentSenderWithFeature(IActivityManager.java:6832) at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:584) at android.app.PendingIntent.getBroadcast(PendingIntent.java:567) at androidx.work.impl.utils.ForceStopRunnable.getPendingIntent(ForceStopRunnable.java:174) at androidx.work.impl.utils.ForceStopRunnable.isForceStopped(ForceStopRunnable.java:108) at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:86) at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:75) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923) 2021-10-18 20:10:05.895 27661-27661/? E/weather.servic: Unknown bits set in runtime_flags: 0x40000000 2021-10-18 20:10:05.900 27661-27661/? E/weather.servic: Not starting debugger since process cannot load the jdwp agent. 2021-10-18 20:10:05.910 27661-27661/? E/RefClass: java.lang.reflect.InvocationTargetException
修复方案
- 第一步:补全Manifest配置
在AndroidManifest.xml的<application>节点内添加缺失的Google Play服务元数据配置:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
- 第二步:调整AdMob初始化时机
Application的onCreate执行时,系统核心服务(如PackageManager)尚未完全就绪,AdMob初始化需要依赖这些服务读取应用配置,所以会触发NameNotFoundException。需要将初始化逻辑延迟到Application绑定流程结束后执行,修改MyApplication的代码如下:
@Override public void onCreate() { super.onCreate(); // 将AdMob初始化任务投递到主线程消息队列尾部,等待系统服务就绪后再执行 new Handler(Looper.getMainLooper()).post(() -> { MobileAds.initialize(this, initializationStatus -> {}); }); }
如果无特殊要求,也可以直接将初始化逻辑放在主Activity的onCreate中执行,和之前测试的正常场景一致。
- 第三步:修复WorkManager异常
日志中的SecurityException是WorkManager低版本的兼容问题,和AdMob崩溃为独立的并发异常,将WorkManager依赖升级到最新稳定版即可解决;如果未主动使用WorkManager,也可以在AdMob依赖中排除WorkManager的传递依赖。
内容的提问来源于stack exchange,提问作者kirandani
相关产品推荐
相关产品推荐

