From 2e346b6183592742597a5febe78af1b8606497e3 Mon Sep 17 00:00:00 2001 From: aceding Date: Tue, 28 Jul 2020 01:49:49 +0800 Subject: [PATCH] fix bug: Unabled to find destroy activity info class with name: com.tencent.matrix.resource.analyzer.model.DestroyedActivityInfo --- .../analyzer/ActivityLeakAnalyzer.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-analyzer/src/main/java/com/tencent/matrix/resource/analyzer/ActivityLeakAnalyzer.java b/matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-analyzer/src/main/java/com/tencent/matrix/resource/analyzer/ActivityLeakAnalyzer.java index fdee55354..91767db04 100644 --- a/matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-analyzer/src/main/java/com/tencent/matrix/resource/analyzer/ActivityLeakAnalyzer.java +++ b/matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-analyzer/src/main/java/com/tencent/matrix/resource/analyzer/ActivityLeakAnalyzer.java @@ -28,6 +28,7 @@ import com.tencent.matrix.resource.analyzer.utils.ShortestPathFinder; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import static com.squareup.haha.perflib.HahaHelper.asString; @@ -84,24 +85,31 @@ private ActivityLeakResult checkForLeak(HeapSnapshot heapSnapshot, String refKey } private Instance findLeakingReference(String key, Snapshot snapshot) { - final ClassObj infoClass = snapshot.findClass(DESTROYED_ACTIVITY_INFO_CLASSNAME); - if (infoClass == null) { + final Collection infoClassList = snapshot.findClasses(DESTROYED_ACTIVITY_INFO_CLASSNAME); + if (infoClassList == null || infoClassList.isEmpty()) { throw new IllegalStateException("Unabled to find destroy activity info class with name: " + DESTROYED_ACTIVITY_INFO_CLASSNAME); } List keysFound = new ArrayList<>(); - for (Instance infoInstance : infoClass.getInstancesList()) { - final List values = classInstanceValues(infoInstance); - final String keyCandidate = asString(fieldValue(values, ACTIVITY_REFERENCE_KEY_FIELDNAME)); - if (keyCandidate.equals(key)) { - final Instance weakRefObj = fieldValue(values, ACTIVITY_REFERENCE_FIELDNAME); - if (weakRefObj == null) { - continue; + for(ClassObj infoClass : infoClassList) { + for (Instance infoInstance : infoClass.getInstancesList()) { + final List values = classInstanceValues(infoInstance); + final String keyCandidate = asString(fieldValue(values, ACTIVITY_REFERENCE_KEY_FIELDNAME)); + if (keyCandidate.equals(key)) { + final Instance weakRefObj = fieldValue(values, ACTIVITY_REFERENCE_FIELDNAME); + if (weakRefObj == null) { + continue; + } + final List activityRefs = classInstanceValues(weakRefObj); + Instance instance = fieldValue(activityRefs, "referent"); + if(null != instance) { + return instance; + } else { + break; + } } - final List activityRefs = classInstanceValues(weakRefObj); - return fieldValue(activityRefs, "referent"); + keysFound.add(keyCandidate); } - keysFound.add(keyCandidate); } throw new IllegalStateException( "Could not find weak reference with key " + key + " in " + keysFound);