Android 性能优化——ANR监控与解决_waited 5000ms for focusevent(1)

本文详细探讨了Android应用性能优化中的ANR(Application Not Responding)问题,介绍了系统如何处理ANR,包括AnrHelper类中的核心逻辑以及"AnrConsumer"线程的作用。同时,讨论了应用层监控ANR的两种方法:WatchDog方案和监听SIGQUIT信号,分析了它们的优缺点。最后,讨论了ANR信息采集的挑战和消息调度监控策略,为准确诊断和解决ANR问题提供了思路。
摘要由CSDN通过智能技术生成

setBroadcastTimeoutLocked(timeoutTime);

performReceiveLocked(…);//内部最终会调用BroadcastReceiver的onReceiver

cancelBroadcastTimeoutLocked();//解除超时

}

// 设置超时
final void setBroadcastTimeoutLocked(long timeoutTime) {
if (!mPendingBroadcastTimeoutMessage) {
Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG, this);
mHandler.sendMessageAtTime(msg, timeoutTime);
mPendingBroadcastTimeoutMessage = true;
}
}

//解除超时
final void cancelBroadcastTimeoutLocked() {
if (mPendingBroadcastTimeoutMessage) {
mHandler.removeMessages(BROADCAST_TIMEOUT_MSG, this);
mPendingBroadcastTimeoutMessage = false;
}
}

以上是广播结束者设置、解除、触发ANR的核心逻辑。通过handler机制延迟发送一个【ANR 任务】,在规定时间内完成了你广播接收者任务移除ANR任务。否则触发。

1.2.1 系统处理ANR

实际无论何种条件触发了ANR最终都交给AnrHelper处理,这个类中核心处理ANR的逻辑开启一个名为“AnrConsumer”的线程。执行在ProcessErrorStateRecord中appNotResponding()的方法。

void appNotResponding(String activityShortComponentName, ApplicationInfo aInfo,
String parentShortComponentName, WindowProcessController parentProcess,
boolean aboveSystem, String annotation, boolean onlyDumpSelf) {
ArrayList firstPids = new ArrayList<>(5);
SparseArray lastPids = new SparseArray<>(20);

setNotResponding(true);//标记ANR标识

firstPids.add(pid);

isSilentAnr = isSilentAnr();//后台的应用发生ANR
if (!isSilentAnr && !onlyDumpSelf) {//前台进程和不仅仅dump自身时
mService.mProcessList.forEachLruProcessesLOSP(false, r -> {

firstPids.add(pid);//添加其他进程
}
});

StringBuilder report = new StringBuilder();
report.append(MemoryPressureUtil.currentPsiState());//内存信息
ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true);//cup信息

nativePids.add(…); //添加native进程

File tracesFile = …
report.append(tracesFileException.getBuffer());
info.append(processCpuTracker.printCurrentState(anrTime));

if (tracesF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值