public List getHardwareList() {
synchronized (mLock) {
return Collections.unmodifiableList(mHardwareList);
}
}
那这个锁被谁持有呢?现在只看Android log已经无能为力了,需要分析trace文件,做过app开发的应该都经常遇到anr,遇到anr一般都需要分析trace文件, 这个trace文件在/data/anr/目录下。我们知道触发ANR,dump trace文件的场景如下:
Service Timeout:比如前台服务在20s内未执行完成
BroadcastQueue Timeout:比如前台广播在10s内未执行完成
ContentProvider Timeout:内容提供者,在publish过超时10s
InputDispatching Timeout: 输入事件分发超时5s,包括按键和触摸事件
其实还有一种情况也会生成trace文件,那就是触发Framework的Watchdog的时候。看一下Watchdog.java的run方法,符合条件时,会触发dump trace的操作。
//frameworks/base/services/core/java/com/android/server/Watchdog.java
@Override
public void run() {
···
if (!fdLimitTriggered) {
final int waitState = evaluateCheckerCompletionLocked();
if (waitState == COMPLETED) {
// The monitors have returned; reset
waitedHalf = false;
continue;
} else if (waitState == WAITING) {
// still waiting but within their configured intervals; back off and recheck
continue;
} else if (waitState == WAITED_HALF) {
if (!waitedHalf) {
Slog.i(TAG, "WAITED_HALF");
// We've waited half the deadlock-detection interval. Pull a stack
// trace and wait another half.
ArrayList<Integer> pids = new ArrayList<>(mInterestingJavaPids);
//dump trace文件
ActivityManagerService.dumpStackTraces(pids, null, null,
getInterestingNativePids(), null);