问题描述
在APN Settings界面按返回键回到移动网络设置菜单的时候crash,Settings出现ANR。
日志分析
点击进入APN Settings界面,telephony_apn_key是APN菜单的KEY
06-07 17:03:49.474 1330 4629 I wm_create_activity: [0,179774007,11,com.android.settings/.Settings$ApnSettingsActivity,android.settings.APN_SETTINGS,NULL,NULL,0]
06-07 17:03:49.475 1330 4629 I wm_pause_activity: [0,156097406,com.android.settings/.SubSettings,userLeaving=true,resumeTopActivity]
06-07 17:03:49.481 16827 16827 I sysui_multi_action: [757,830,758,4,833,1571,854,telephony_apn_key]
06-07 17:03:49.482 16827 16827 I wm_on_top_resumed_lost_called: [156097406,com.android.settings.SubSettings,topStateChangedWhenResumed]06-07 17:03:49.621 1330 1522 I wm_activity_launch_time: [0,179774007,com.android.settings/.Settings$ApnSettingsActivity,145]
SubSettings是APN的上层界面信息
06-07 17:03:49.491 16827 16827 I wm_on_paused_called: [156097406,com.android.settings.SubSettings,performPause,8]
06-07 17:03:49.492 1330 4674 I wm_add_to_stopping: [0,156097406,com.android.settings/.SubSettings,makeInvisible]
重启APN界面
06-07 17:03:49.495 1330 4674 I wm_restart_activity: [0,179774007,11,com.android.settings/.Settings$ApnSettingsActivity]
06-07 17:03:49.500 1330 4674 I wm_set_resumed_activity: [0,com.android.settings/.Settings$ApnSettingsActivity,realStartActivityLocked - onActivityStateChanged]06-07 17:03:49.552 16827 16827 I wm_on_create_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,performCreate,40]
06-07 17:03:49.558 16827 16827 I wm_on_start_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,handleStartActivity,7]06-07 17:03:49.561 16827 16827 I wm_on_resume_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,RESUME_ACTIVITY,2]
退出APN Settings界面
06-07 17:03:57.271 1330 5477 I wm_finish_activity: [0,179774007,11,com.android.settings/.Settings$ApnSettingsActivity,app-request]
06-07 17:03:57.272 1330 5477 I wm_pause_activity: [0,179774007,com.android.settings/.Settings$ApnSettingsActivity,userLeaving=false,finish]
06-07 17:03:57.275 16827 16827 I wm_on_top_resumed_lost_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,topStateChangedWhenResumed]
06-07 17:03:57.277 1330 4629 V ActivityManager: Unregister receiver: android.content.IIntentReceiver$Stub$Proxy@d243000
06-07 17:03:57.277 16827 16827 I wm_on_paused_called: [179774007,com.android.settings.Settings$ApnSettingsActivity,performPause,1]
06-07 17:03:57.277 1330 4629 I wm_add_to_stopping: [0,179774007,com.android.settings/.Settings$ApnSettingsActivity,completeFinishing]06-07 17:03:57.491 1330 1526 I WindowManager: Win Window{d1f2507 u0 com.android.settings/com.android.settings.Settings$ApnSettingsActivity}: affectsSystemUi=true
06-07 17:03:57.709 1330 1525 V ActivityTaskManager: Removing activity from finish-imm:transit: token=ActivityRecord{ab72237 u0 com.android.settings/.Settings$ApnSettingsActivity t11 f}}, app=com.android.settings
06-07 17:03:57.709 1330 1525 I wm_destroy_activity: [0,179774007,11,com.android.settings/.Settings$ApnSettingsActivity,finish-imm:transit]06-07 17:03:57.794 16827 16827 D ApnSettings: onDestroy: mUnavailable=false06-07 17:03:57.794 16827 16827 D ApnSettings: onDestroy: mUnavailable=false
运行时错误,在界面销毁的时候无法取消监听,因为接收器没有注册。
--------- beginning of crash
06-07 17:03:57.795 16827 16827 E AndroidRuntime: FATAL EXCEPTION: main
06-07 17:03:57.795 16827 16827 E AndroidRuntime: Process: com.android.settings, PID: 16827
06-07 17:03:57.795 16827 16827 E AndroidRuntime: java.lang.RuntimeException: Unable to destroy activity {com.android.settings/com.android.settings.Settings$ApnSettingsActivity}: java.lang.IllegalArgumentException: Receiver not registered: com.android.settings.network.apn.ApnSettings$2@e89b29406-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:6030)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:6062)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:46)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:60)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeLifecycleItem(TransactionExecutor.java:282)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:256)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2689)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:107)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:232)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.os.Looper.loop(Looper.java:317)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8751)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:617)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)
具体的代码类和方法行数
06-07 17:03:57.795 16827 16827 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.android.settings.network.apn.ApnSettings$2@e89b294
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1695)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1898)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:822)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at com.android.settings.network.apn.ApnSettings.onDestroy(ApnSettings.java:428)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.Fragment.performDestroy(Fragment.java:3376)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:812)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:346)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.SpecialEffectsController$FragmentStateManagerOperation.complete(SpecialEffectsController.kt:664)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.SpecialEffectsController$Operation.cancel(SpecialEffectsController.kt:507)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.SpecialEffectsController.forceCompleteAllOperations(SpecialEffectsController.kt:293)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3037)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2988)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:346)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:258)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.Activity.performDestroy(Activity.java:9331)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1561)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:6017)
06-07 17:03:57.795 16827 16827 E AndroidRuntime: ... 14 more
系统强制关闭crash的应用
06-07 17:03:57.798 1330 4629 W ActivityTaskManager: Force finishing activity com.android.settings/.SubSettings
06-07 17:03:57.798 1330 4629 I wm_finish_activity: [0,156097406,11,com.android.settings/.SubSettings,force-crash]06-07 17:03:57.801 1330 16950 D AES : ExceptionLog: notify aed, process:com.android.settings pid:16827 cause:system_app_crash
06-07 17:03:57.804 1330 1523 I ActivityManager: Showing crash dialog for package com.android.settings u0
显示crash 弹窗
06-07 17:03:57.804 1330 1523 I ActivityManager: Showing crash dialog for package com.android.settings u0
出现ANR,关闭应用界面
06-07 17:04:02.859 1330 16958 I ActivityManager: Crashing app skipping ANR: com.android.server.am.ProcessErrorStateRecord@79fd407 Input dispatching timed out (ed1f18b com.android.settings/com.android.settings.SubSettings (server) is not responding. Waited 5002ms for FocusEvent(hasFocus=false)).
06-07 17:04:08.416 1330 4629 I ActivityManager: Killing 16827:com.android.settings/1000 (adj 0): crash
06-07 17:04:08.416 1330 4629 I ActivityManager: note: ProcessRecord{13b6c9b 16827:com.android.settings/1000} is being killed, reason: 4, sub-reason: 0, message: crash06-07 17:04:08.417 1330 4629 I am_kill : [0,16827,com.android.settings,0,crash,299636]
06-07 17:04:39.962 1330 4486 I am_crash:
[16962,0,com.android.settings,684441157,java.lang.IllegalArgumentException,Receiver not registered: com.android.settings.network.apn.ApnSettings$2@8e70e11,LoadedApk.java,1695,0]
06-07 17:04:39.966 1330 4486 I wm_finish_activity: [0,144324454,11,com.android.settings/.SubSettings,force-crash]
为什么一直找不到 Preference呢?(PreferenceControllerListHelper的报错 )
06-07 17:04:18.049 16962 16962 D PrefCtrlListHelper: Could not find Context-only controller for pref: com.android.settings.network.telephony.ApnPreferenceController
报错代码
ApnSettings
- 在onCreate和ResumeResume上都注册了
- 在Pause的时候取消注册,
- Destroy的时候判空,非空则再次取消注册。
或许是没走onCreate,但是Resume一定走的,那么就是Destroy的时候,为什么receiver非空,因为取消注册的时候是不会置为空的?
package com.android.settings.network.apn;
public class ApnSettings extends RestrictedSettingsFragment
implements Preference.OnPreferenceChangeListener {
//(全局变量)接收器
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//注册状态改变或飞行模式
if (intent.getAction().equals(
TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED)) {
fillList();//刷新APN界面
} else if (intent.getAction().equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
}
};
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
final Activity activity = getActivity();
mSubId = activity.getIntent().getIntExtra(SUB_ID,
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
mPhoneId = SubscriptionUtil.getPhoneId(activity, mSubId);
mIntentFilter = new IntentFilter(
TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED);
mIntentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
getActivity().registerReceiver(mReceiver, mIntentFilter);//已经注册了
}
@Override
public void onResume() {
super.onResume();
getActivity().registerReceiver(mReceiver, mIntentFilter,
Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(mReceiver);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mReceiver != null) {
getActivity().unregisterReceiver(mReceiver);//报错receiiver没有注册
}
}
ApnPreferenceController
都没执行创建的过程
PreferenceControllerListHelper
package com.android.settings.core;
/**
* Helper to load {@link BasePreferenceController} lists from Xml.
*/
public class PreferenceControllerListHelper {
private static final String TAG = "PrefCtrlListHelper";
/**
* Instantiates a list of controller based on xml definition.
*/
@NonNull
public static List<BasePreferenceController> getPreferenceControllersFromXml(Context context,
@XmlRes int xmlResId) {
final List<BasePreferenceController> controllers = new ArrayList<>();
List<Bundle> preferenceMetadata;
try {
preferenceMetadata = PreferenceXmlParserUtils.extractMetadata(context, xmlResId,
MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_PREF_CONTROLLER
| MetadataFlag.FLAG_INCLUDE_PREF_SCREEN | MetadataFlag.FLAG_FOR_WORK);
} catch (IOException | XmlPullParserException e) {
Log.e(TAG, "Failed to parse preference xml for getting controllers", e);
return controllers;
}
for (Bundle metadata : preferenceMetadata) {
final String controllerName = metadata.getString(METADATA_CONTROLLER);
if (TextUtils.isEmpty(controllerName)) {
continue;
}
BasePreferenceController controller;
try {
controller = BasePreferenceController.createInstance(context, controllerName);
} catch (IllegalStateException e) {
Log.d(TAG, "Could not find Context-only controller for pref: " + controllerName);
final String key = metadata.getString(METADATA_KEY);
final boolean isWorkProfile = metadata.getBoolean(METADATA_FOR_WORK, false);
if (TextUtils.isEmpty(key)) {
Log.w(TAG, "Controller requires key but it's not defined in xml: "
+ controllerName);
continue;
}
try {
controller = BasePreferenceController.createInstance(context, controllerName,
key, isWorkProfile);
} catch (IllegalStateException e2) {
Log.w(TAG, "Cannot instantiate controller from reflection: " + controllerName);
continue;
}
}
controllers.add(controller);
}
return controllers;
}
}