退出主Activity崩溃:尝试移除未添加的OnFrameMetricsAvailableListener
问题背景
你遇到的情况很明确:
- 进入其他Activity后退出主Activity时,应用必然崩溃;但直接启动主界面后立即退出则完全正常
- 崩溃触发在主Activity的
super.onStop();代码行,错误提示为:attempt to remove OnFrameMetricsAvailableListener that was never added - 最后一次修改仅改动了根目录build.gradle的classpath,改为
com.android.tools.build:gradle:3.1.2和com.google.gms:google-services:3.3.1,项目中完全没有使用过FrameMetrics相关对象
相关代码片段
@Override public void onStop() { super.onStop(); StateManager mgr = new StateManager(this); if (mMap != null) { mgr.saveMapState(mMap); } }
完整崩溃日志
Process: com.example.nabeth.youandi, PID: 24034 java.lang.RuntimeException: Unable to stop activity {com.example.nabeth.youandi/com.example.nabeth.youandi.MapsActivity}: java.lang.IllegalArgumentException: attempt to remove OnFrameMetricsAvailableListener that was never added at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4209) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4265) at android.app.ActivityThread.-wrap6(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1565) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6247) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) at android.os.ZygoteInit.main(ZygoteInit.java:762) Caused by: java.lang.IllegalArgumentException: attempt to remove OnFrameMetricsAvailableListener that was never added** at android.view.View.removeFrameMetricsListener(View.java:5573) at android.view.Window.removeOnFrameMetricsAvailableListener(Window.java:865) at android.support.v4.app.FrameMetricsAggregator$FrameMetricsApi24Impl.remove(FrameMetricsAggregator.java:432) at android.support.v4.app.FrameMetricsAggregator.remove(FrameMetricsAggregator.java:245) at com.google.android.gms.internal.firebase-perf.zzd.onActivityStopped(Unknown Source) at android.app.Application.dispatchActivityStopped(Application.java:234) at android.app.Activity.onStop(Activity.java:1815) at android.support.v4.app.FragmentActivity.onStop(FragmentActivity.java:613) at com.example.nabeth.youandi.MapsActivity.onStop(MapsActivity.java:2684) at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1290) at android.app.Activity.performStop(Activity.java:6932) at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4204) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4265) at android.app.ActivityThread.-wrap6(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1565) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6247) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) at android.os.ZygoteInit.main(ZygoteInit.java:762)
问题根源
从崩溃栈可以定位到,问题出在Firebase Performance的内部逻辑中:com.google.android.gms.internal.firebase-perf.zzd.onActivityStopped。它尝试移除一个从未被添加的FrameMetrics监听器,这是Firebase Performance与你当前使用的Gradle插件版本、Support库版本不兼容导致的已知bug。
可行的解决办法
匹配Google Services与Firebase Performance版本
确保google-services和firebase-perf的版本兼容。如果使用google-services:3.3.1,可以尝试将Firebase Performance依赖升级到16.2.0或更高版本(在app级build.gradle中):implementation 'com.google.firebase:firebase-perf:16.2.0'降级Google Services版本
把google-services改回之前能正常运行的版本,比如:classpath 'com.google.gms:google-services:3.2.1'暂时禁用Firebase Performance
如果不需要性能监控功能,可以直接在AndroidManifest.xml中关闭它:<meta-data android:name="firebase_performance_collection_enabled" android:value="false" />或者移除app级build.gradle中的Firebase Performance依赖。
升级Gradle插件到更稳定版本
尝试将Gradle插件升级到3.2.1或更高稳定版,同时搭配对应的google-services版本(比如google-services:4.2.0),兼容性会更好:classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.google.gms:google-services:4.2.0'
最后记得执行Clean Project再Rebuild Project,清理缓存避免残留问题。
内容的提问来源于stack exchange,提问作者Neria Nabeth

