From 82da4e474c203219291760e5900e07fe1f7d22b1 Mon Sep 17 00:00:00 2001 From: xuwakao Date: Wed, 13 May 2020 20:21:52 +0800 Subject: [PATCH 1/4] 0.6.6 snapshot; 1.support keep method; 2.fix issue that fail to hack ActivityThread on some devices/os; 3.fix nullpointer when Throwable.getCause is NULL; --- matrix/matrix-android/gradle.properties | 2 +- .../tencent/matrix/trace/Configuration.java | 18 +++++- .../tencent/matrix/trace/MethodCollector.java | 64 ++++++++++++++----- .../tencent/matrix/trace/MethodTracer.java | 2 +- .../trace/retrace/MappingCollector.java | 41 +++++++++++- .../matrix/trace/retrace/MethodInfo.java | 7 ++ .../trace/hacker/ActivityThreadHacker.java | 18 ++++-- 7 files changed, 128 insertions(+), 24 deletions(-) diff --git a/matrix/matrix-android/gradle.properties b/matrix/matrix-android/gradle.properties index 49af36849..076a5aee5 100644 --- a/matrix/matrix-android/gradle.properties +++ b/matrix/matrix-android/gradle.properties @@ -15,7 +15,7 @@ org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryErro #Tue Jun 20 10:24:33 CST 2017 -VERSION_NAME_PREFIX=0.6.5 +VERSION_NAME_PREFIX=0.6.6-SNAPSHOT VERSION_NAME_SUFFIX= ## two options: Internal (for wechat ), External (for outsize person) PUBLISH_CHANNEL=External \ No newline at end of file diff --git a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/Configuration.java b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/Configuration.java index 6202b0bb9..b9b4959d5 100644 --- a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/Configuration.java +++ b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/Configuration.java @@ -1,12 +1,15 @@ package com.tencent.matrix.trace; import com.tencent.matrix.javalib.util.FileUtil; +import com.tencent.matrix.javalib.util.Log; import com.tencent.matrix.javalib.util.Util; import com.tencent.matrix.trace.retrace.MappingCollector; +import com.tencent.matrix.trace.retrace.MethodInfo; import java.util.HashSet; public class Configuration { + public static final String TAG = "Matrix.Configuration"; public String packageName; public String mappingDir; @@ -16,6 +19,7 @@ public class Configuration { public String blackListFilePath; public String traceClassOut; public HashSet blackSet = new HashSet<>(); + public HashSet blackMethodSet = new HashSet<>(); Configuration(String packageName, String mappingDir, String baseMethodMapPath, String methodMapFilePath, String ignoreMethodMapFilePath, String blackListFilePath, String traceClassOut) { @@ -51,10 +55,22 @@ public int parseBlackFile(MappingCollector processor) { } else if (black.startsWith("-keeppackage ")) { black = black.replace("-keeppackage ", ""); blackSet.add(processor.proguardPackageName(black, black)); + } else if (black.startsWith("-keepmethod")) { + Log.i(TAG, black); + black = black.replace("-keepmethod", "").substring(1); + String[] keepMethod = black.split(" "); + String originalClass = keepMethod[0]; + String originalMethod = keepMethod[1]; + String originalMethodDesc = keepMethod[2]; + Log.i(TAG, "keepmethod [" + originalClass + "#" + originalMethod + " . desc = " + originalMethodDesc + " ] "); + MethodInfo methodInfo = processor.proguardMethodName(originalClass, originalMethod, originalMethodDesc); + if (methodInfo != null) { + blackMethodSet.add(methodInfo); + } } } } - return blackSet.size(); + return blackSet.size() + blackMethodSet.size(); } @Override diff --git a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodCollector.java b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodCollector.java index 7a1c83d7e..1777fb59d 100644 --- a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodCollector.java +++ b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodCollector.java @@ -3,6 +3,7 @@ import com.tencent.matrix.javalib.util.Log; import com.tencent.matrix.trace.item.TraceMethod; import com.tencent.matrix.trace.retrace.MappingCollector; +import com.tencent.matrix.trace.retrace.MethodInfo; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -23,6 +24,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; @@ -81,12 +83,12 @@ public void collect(Set srcFolderList, Set dependencyJarList) throws } for (File classFile : classFileList) { - futures.add(executor.submit(new CollectSrcTask(classFile))); + futures.add(executor.submit(new CollectSrcTask(classFile, mappingCollector))); } } for (File jarFile : dependencyJarList) { - futures.add(executor.submit(new CollectJarTask(jarFile))); + futures.add(executor.submit(new CollectJarTask(jarFile, mappingCollector))); } for (Future future : futures) { @@ -119,9 +121,11 @@ public void run() { class CollectSrcTask implements Runnable { File classFile; + MappingCollector mappingCollector; - CollectSrcTask(File classFile) { + CollectSrcTask(File classFile, MappingCollector mappingCollector) { this.classFile = classFile; + this.mappingCollector = mappingCollector; } @Override @@ -131,7 +135,7 @@ public void run() { is = new FileInputStream(classFile); ClassReader classReader = new ClassReader(is); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); - ClassVisitor visitor = new TraceClassAdapter(Opcodes.ASM5, classWriter); + ClassVisitor visitor = new TraceClassAdapter(Opcodes.ASM5, classWriter, mappingCollector); classReader.accept(visitor, 0); } catch (Exception e) { @@ -148,9 +152,11 @@ public void run() { class CollectJarTask implements Runnable { File fromJar; + MappingCollector mappingCollector; - CollectJarTask(File jarFile) { + CollectJarTask(File jarFile, MappingCollector mappingCollector) { this.fromJar = jarFile; + this.mappingCollector = mappingCollector; } @Override @@ -167,7 +173,7 @@ public void run() { InputStream inputStream = zipFile.getInputStream(zipEntry); ClassReader classReader = new ClassReader(inputStream); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); - ClassVisitor visitor = new TraceClassAdapter(Opcodes.ASM5, classWriter); + ClassVisitor visitor = new TraceClassAdapter(Opcodes.ASM5, classWriter, mappingCollector); classReader.accept(visitor, 0); } } @@ -269,9 +275,11 @@ private class TraceClassAdapter extends ClassVisitor { private String className; private boolean isABSClass = false; private boolean hasWindowFocusMethod = false; + private MappingCollector mappingCollector; - TraceClassAdapter(int i, ClassVisitor classVisitor) { + TraceClassAdapter(int i, ClassVisitor classVisitor, MappingCollector mappingCollector) { super(i, classVisitor); + this.mappingCollector = mappingCollector; } @Override @@ -293,7 +301,7 @@ public MethodVisitor visitMethod(int access, String name, String desc, if (!hasWindowFocusMethod) { hasWindowFocusMethod = isWindowFocusChangeMethod(name, desc); } - return new CollectMethodNode(className, access, name, desc, signature, exceptions); + return new CollectMethodNode(className, access, name, desc, signature, exceptions, mappingCollector); } } } @@ -301,12 +309,14 @@ public MethodVisitor visitMethod(int access, String name, String desc, private class CollectMethodNode extends MethodNode { private String className; private boolean isConstructor; + private MappingCollector mappingCollector; CollectMethodNode(String className, int access, String name, String desc, - String signature, String[] exceptions) { + String signature, String[] exceptions, MappingCollector mappingCollector) { super(Opcodes.ASM5, access, name, desc, signature, exceptions); this.className = className; + this.mappingCollector = mappingCollector; } @Override @@ -318,24 +328,32 @@ public void visitEnd() { isConstructor = true; } - boolean isNeedTrace = isNeedTrace(configuration, traceMethod.className, mappingCollector); + boolean isMethodNeedTrace = isMethodNeedTrace(configuration, mappingCollector, traceMethod.className, + traceMethod.methodName, traceMethod.desc); + if (!isMethodNeedTrace) { + Log.i(TAG, "keep method not trace [" + traceMethod.className + "#" + traceMethod.methodName + " . desc = " + traceMethod.desc + " ] "); + ignoreCount.incrementAndGet(); + collectedIgnoreMethodMap.put(traceMethod.getMethodName(), traceMethod); + return; + } + + boolean isClassNeedTrace = isClassNeedTrace(configuration, traceMethod.className, mappingCollector); // filter simple methods if ((isEmptyMethod() || isGetSetMethod() || isSingleMethod()) - && isNeedTrace) { + && isClassNeedTrace) { ignoreCount.incrementAndGet(); collectedIgnoreMethodMap.put(traceMethod.getMethodName(), traceMethod); return; } - if (isNeedTrace && !collectedMethodMap.containsKey(traceMethod.getMethodName())) { + if (isClassNeedTrace && !collectedMethodMap.containsKey(traceMethod.getMethodName())) { traceMethod.id = methodId.incrementAndGet(); collectedMethodMap.put(traceMethod.getMethodName(), traceMethod); incrementCount.incrementAndGet(); - } else if (!isNeedTrace && !collectedIgnoreMethodMap.containsKey(traceMethod.className)) { + } else if (!isClassNeedTrace && !collectedIgnoreMethodMap.containsKey(traceMethod.className)) { ignoreCount.incrementAndGet(); collectedIgnoreMethodMap.put(traceMethod.getMethodName(), traceMethod); } - } private boolean isGetSetMethod() { @@ -408,11 +426,27 @@ private boolean isEmptyMethod() { } + public static boolean isMethodNeedTrace(Configuration configuration, + MappingCollector mappingCollector, String className, String methodName, String desc) { + Iterator iterator = configuration.blackMethodSet.iterator(); + while (iterator.hasNext()) { + MethodInfo methodInfo = iterator.next(); + if (methodInfo.getOriginalClassName().equals(className) + && methodInfo.getOriginalName().equals(methodName)) { + MappingCollector.DescInfo descInfo = mappingCollector.parseMethodDesc(desc, true); + if (methodInfo.matches(descInfo.getReturnType(), descInfo.getArguments())) { + return false; + } + } + } + return true; + } + public static boolean isWindowFocusChangeMethod(String name, String desc) { return null != name && null != desc && name.equals(TraceBuildConstants.MATRIX_TRACE_ON_WINDOW_FOCUS_METHOD) && desc.equals(TraceBuildConstants.MATRIX_TRACE_ON_WINDOW_FOCUS_METHOD_ARGS); } - public static boolean isNeedTrace(Configuration configuration, String clsName, MappingCollector mappingCollector) { + public static boolean isClassNeedTrace(Configuration configuration, String clsName, MappingCollector mappingCollector) { boolean isNeed = true; if (configuration.blackSet.contains(clsName)) { isNeed = false; diff --git a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodTracer.java b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodTracer.java index 5a488f3da..0c78a12aa 100644 --- a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodTracer.java +++ b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodTracer.java @@ -254,7 +254,7 @@ public void visit(int version, int access, String name, String signature, String super.visit(version, access, name, signature, superName, interfaces); this.className = name; this.isActivityOrSubClass = isActivityOrSubClass(className, collectedClassExtendMap); - this.isNeedTrace = MethodCollector.isNeedTrace(configuration, className, mappingCollector); + this.isNeedTrace = MethodCollector.isClassNeedTrace(configuration, className, mappingCollector); if ((access & Opcodes.ACC_ABSTRACT) > 0 || (access & Opcodes.ACC_INTERFACE) > 0) { this.isABSClass = true; } diff --git a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MappingCollector.java b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MappingCollector.java index 6b25b1c68..a622e513e 100644 --- a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MappingCollector.java +++ b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MappingCollector.java @@ -98,6 +98,30 @@ public String proguardPackageName(String originalPackage, String defaultPackage) } } + public MethodInfo proguardMethodName(String originalClassName, String originalMethodName, String originalMethodDesc) { + MethodInfo findMethod = null; + DescInfo descInfo = parseMethodDesc(originalMethodDesc, true); +// Log.i(TAG, "proguardMethodName desc parse " + descInfo); + // Class name -> obfuscated method names. + Map> methodMap = mOriginalClassMethodMap.get(originalClassName); + if (methodMap != null) { + Set methodSet = methodMap.get(originalMethodName); + if (null != methodSet) { + // Find all matching methods. + Iterator methodInfoIterator = methodSet.iterator(); + while (methodInfoIterator.hasNext()) { + MethodInfo methodInfo = methodInfoIterator.next(); + if (methodInfo.matches(descInfo.returnType, descInfo.arguments)) { + findMethod = new MethodInfo(methodInfo); + findMethod.setDesc(methodInfo.desc); + break; + } + } + } + } + return findMethod; + } + /** * get original method info * @@ -200,7 +224,7 @@ private void obfuscatedMethodInfo(MethodInfo methodInfo) { * @param isRawToObfuscated * @return */ - private DescInfo parseMethodDesc(String desc, boolean isRawToObfuscated) { + public DescInfo parseMethodDesc(String desc, boolean isRawToObfuscated) { DescInfo descInfo = new DescInfo(); Type[] argsObj = Type.getArgumentTypes(desc); StringBuffer argumentsBuffer = new StringBuffer(); @@ -268,7 +292,7 @@ private DescInfo parseMethodDesc(String desc, boolean isRawToObfuscated) { /** * about method desc info */ - private static class DescInfo { + public static class DescInfo { private String desc; private String arguments; private String returnType; @@ -284,6 +308,19 @@ public void setReturnType(String returnType) { public void setDesc(String desc) { this.desc = desc; } + + public String getArguments() { + return arguments; + } + + public String getReturnType() { + return returnType; + } + + @Override + public String toString() { + return "DescInfo{" + "desc='" + desc + '\'' + ", arguments='" + arguments + '\'' + ", returnType='" + returnType + '\'' + '}'; + } } } diff --git a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MethodInfo.java b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MethodInfo.java index ef31d7c62..998b69e8c 100644 --- a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MethodInfo.java +++ b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MethodInfo.java @@ -92,4 +92,11 @@ public void setOriginalArguments(String originalArguments) { public void setOriginalType(String originalType) { this.originalType = originalType; } + + @Override + public String toString() { + return "MethodInfo{" + "originalClassName='" + originalClassName + '\'' + ", originalType='" + + originalType + '\'' + ", originalArguments='" + originalArguments + + '\'' + ", originalName='" + originalName + '\'' + '}'; + } } diff --git a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/hacker/ActivityThreadHacker.java b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/hacker/ActivityThreadHacker.java index 297e16a44..f9dcb570f 100644 --- a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/hacker/ActivityThreadHacker.java +++ b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/hacker/ActivityThreadHacker.java @@ -45,9 +45,19 @@ public static void hackSysHandlerCallback() { sApplicationCreateBeginTime = SystemClock.uptimeMillis(); sApplicationCreateBeginMethodIndex = AppMethodBeat.getInstance().maskIndex("ApplicationCreateBeginMethodIndex"); Class forName = Class.forName("android.app.ActivityThread"); - Field field = forName.getDeclaredField("sCurrentActivityThread"); - field.setAccessible(true); - Object activityThreadValue = field.get(forName); + Field field = null; + Object activityThreadValue = null; + try { + field = forName.getDeclaredField("sCurrentActivityThread"); + field.setAccessible(true); + activityThreadValue = field.get(forName); + } catch (NoSuchFieldException e) { + MatrixLog.w(TAG, "hook system handler but no ActivityThread target!"); + Method currentActivityThread = forName.getDeclaredMethod("currentActivityThread"); + currentActivityThread.setAccessible(true); + activityThreadValue = currentActivityThread.invoke(null); + } + Field mH = forName.getDeclaredField("mH"); mH.setAccessible(true); Object handler = mH.get(activityThreadValue); @@ -59,7 +69,7 @@ public static void hackSysHandlerCallback() { callbackField.set(handler, callback); MatrixLog.i(TAG, "hook system handler completed. start:%s SDK_INT:%s", sApplicationCreateBeginTime, Build.VERSION.SDK_INT); } catch (Exception e) { - MatrixLog.e(TAG, "hook system handler err! %s", e.getCause().toString()); + MatrixLog.e(TAG, "hook system handler err! %s", e.getCause() == null ? e.toString() : e.getCause().toString()); } } From d79c02e5c3e129eb118ebc8eb488aaf06c74d92b Mon Sep 17 00:00:00 2001 From: xuwakao Date: Mon, 8 Jun 2020 21:32:34 +0800 Subject: [PATCH 2/4] window file seperator; not support api < ICE_CREAM_SANDWICH --- .../tencent/matrix/trace/Configuration.java | 7 ++--- .../matrix/trace/TraceBuildConstants.java | 6 ++--- .../matrix/trace/core/AppMethodBeat.java | 26 ++++++++++++++----- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/Configuration.java b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/Configuration.java index b9b4959d5..982631264 100644 --- a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/Configuration.java +++ b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/Configuration.java @@ -34,8 +34,7 @@ public class Configuration { public int parseBlackFile(MappingCollector processor) { String blackStr = TraceBuildConstants.DEFAULT_BLACK_TRACE + FileUtil.readFileAsString(blackListFilePath); - - String[] blackArray = blackStr.trim().replace("/", ".").split("\n"); + String[] blackArray = blackStr.trim().replace("/", ".").split("\r\n"); if (blackArray != null) { for (String black : blackArray) { @@ -51,13 +50,15 @@ public int parseBlackFile(MappingCollector processor) { if (black.startsWith("-keepclass ")) { black = black.replace("-keepclass ", ""); + Log.i(TAG, "keepclass [" + black + " ] "); blackSet.add(processor.proguardClassName(black, black)); } else if (black.startsWith("-keeppackage ")) { black = black.replace("-keeppackage ", ""); + Log.i(TAG, "keeppackage [" + black + " ] "); blackSet.add(processor.proguardPackageName(black, black)); } else if (black.startsWith("-keepmethod")) { Log.i(TAG, black); - black = black.replace("-keepmethod", "").substring(1); + black = black.replace("-keepmethod ", ""); String[] keepMethod = black.split(" "); String originalClass = keepMethod[0]; String originalMethod = keepMethod[1]; diff --git a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/TraceBuildConstants.java b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/TraceBuildConstants.java index f83f9af7c..eef41dbb6 100644 --- a/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/TraceBuildConstants.java +++ b/matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/TraceBuildConstants.java @@ -35,9 +35,9 @@ public class TraceBuildConstants { public final static String MATRIX_TRACE_ON_WINDOW_FOCUS_METHOD_ARGS = "(Z)V"; public static final String[] UN_TRACE_CLASS = {"R.class", "R$", "Manifest", "BuildConfig"}; public final static String DEFAULT_BLACK_TRACE = - "[package]\n" - + "-keeppackage android/\n" - + "-keeppackage com/tencent/matrix/\n"; + "[package]\r\n" + + "-keeppackage android/\r\n" + + "-keeppackage com/tencent/matrix/\r\n"; private static final int METHOD_ID_MAX = 0xFFFFF; public static final int METHOD_ID_DISPATCH = METHOD_ID_MAX - 1; diff --git a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/AppMethodBeat.java b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/AppMethodBeat.java index 996cb36b8..a2217f9b4 100644 --- a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/AppMethodBeat.java +++ b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/AppMethodBeat.java @@ -1,6 +1,7 @@ package com.tencent.matrix.trace.core; import android.app.Activity; +import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; @@ -72,12 +73,14 @@ public void dispatchEnd() { }; static { - sHandler.postDelayed(new Runnable() { - @Override - public void run() { - realRelease(); - } - }, Constants.DEFAULT_RELEASE_BUFFER_DELAY); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + sHandler.postDelayed(new Runnable() { + @Override + public void run() { + realRelease(); + } + }, Constants.DEFAULT_RELEASE_BUFFER_DELAY); + } } /** @@ -199,6 +202,9 @@ private static void dispatchEnd() { * @param methodId */ public static void i(int methodId) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return; + } if (status <= STATUS_STOPPED) { return; @@ -244,6 +250,10 @@ public static void i(int methodId) { * @param methodId */ public static void o(int methodId) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return; + } + if (status <= STATUS_STOPPED) { return; } @@ -268,6 +278,10 @@ public static void o(int methodId) { * @param isFocus this window if has focus */ public static void at(Activity activity, boolean isFocus) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return; + } + String activityName = activity.getClass().getName(); if (isFocus) { if (sFocusActivitySet.add(activityName)) { From 567c22cef1976e10d5a91a62c76c06ffda73cc4a Mon Sep 17 00:00:00 2001 From: xuwakao Date: Mon, 8 Jun 2020 22:39:06 +0800 Subject: [PATCH 3/4] trace plugin support api 16 --- .../java/com/tencent/matrix/trace/core/AppMethodBeat.java | 8 ++++---- .../java/com/tencent/matrix/trace/core/LooperMonitor.java | 5 +++-- .../com/tencent/matrix/trace/util/TraceDataUtils.java | 7 ++++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/AppMethodBeat.java b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/AppMethodBeat.java index a2217f9b4..af63f392b 100644 --- a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/AppMethodBeat.java +++ b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/AppMethodBeat.java @@ -73,7 +73,7 @@ public void dispatchEnd() { }; static { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { sHandler.postDelayed(new Runnable() { @Override public void run() { @@ -202,7 +202,7 @@ private static void dispatchEnd() { * @param methodId */ public static void i(int methodId) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { return; } @@ -250,7 +250,7 @@ public static void i(int methodId) { * @param methodId */ public static void o(int methodId) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { return; } @@ -278,7 +278,7 @@ public static void o(int methodId) { * @param isFocus this window if has focus */ public static void at(Activity activity, boolean isFocus) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { return; } diff --git a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/LooperMonitor.java b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/LooperMonitor.java index 4a670b5fa..00bf6dc8d 100644 --- a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/LooperMonitor.java +++ b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/core/LooperMonitor.java @@ -12,7 +12,6 @@ import com.tencent.matrix.util.ReflectUtils; import java.util.HashSet; -import java.util.Objects; public class LooperMonitor implements MessageQueue.IdleHandler { @@ -80,7 +79,9 @@ public void removeListener(LooperDispatchListener listener) { } public LooperMonitor(Looper looper) { - Objects.requireNonNull(looper); + if (looper == null) { + throw new NullPointerException(); + } this.looper = looper; resetPrinter(); addIdleHandler(looper); diff --git a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/util/TraceDataUtils.java b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/util/TraceDataUtils.java index 26b88b65e..73d452d54 100644 --- a/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/util/TraceDataUtils.java +++ b/matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/util/TraceDataUtils.java @@ -357,9 +357,14 @@ public static String getTreeKey(List stack, long stackCost) { } Collections.sort(sortList, new Comparator() { + + private int compare(int x, int y) { + return (x < y) ? -1 : ((x == y) ? 0 : 1); + } + @Override public int compare(MethodItem o1, MethodItem o2) { - return Integer.compare((o2.depth + 1) * o2.durTime, (o1.depth + 1) * o1.durTime); + return compare((o2.depth + 1) * o2.durTime, (o1.depth + 1) * o1.durTime); } }); From 6f1830759e3c969b2c6860f155afefb303c10012 Mon Sep 17 00:00:00 2001 From: xuwakao Date: Mon, 8 Jun 2020 22:40:03 +0800 Subject: [PATCH 4/4] minsdk version api 16 --- matrix/matrix-android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix/matrix-android/build.gradle b/matrix/matrix-android/build.gradle index bfaf433cd..e638130d4 100644 --- a/matrix/matrix-android/build.gradle +++ b/matrix/matrix-android/build.gradle @@ -37,7 +37,7 @@ allprojects { ext { // For android sub-projects - minSdkVersion = 19 + minSdkVersion = 16 targetSdkVersion = 23 compileSdkVersion = 28 buildToolsVersion = '28.0.3'