Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Matrix v2.0.2 #660

Merged
merged 77 commits into from
Nov 1, 2021
Merged
Changes from 10 commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
1805ff5
Add battery test with power metrics
kaedea Jun 23, 2021
5e4d36d
Update battery metrics test
kaedea Jun 23, 2021
876bdc5
Update battery tests for thread polling
kaedea Jun 25, 2021
345f9aa
Update battery test with app stat
kaedea Jun 28, 2021
6819b0a
Merge branch 'feature/dev-battery-canary' into feature/dev-battery-ca…
kaedea Sep 6, 2021
4ac51b2
Add battery metrics test
kaedea Sep 8, 2021
c737f7c
Add battery PowerProfile
kaedea Sep 9, 2021
cdedcba
Update battery metric test with cpu load
kaedea Sep 10, 2021
5da4ba5
Update power profile
kaedea Sep 10, 2021
062e0a9
Add battery cpu stat feature
kaedea Sep 10, 2021
049b19b
Update cpuStats feature impl
kaedea Sep 10, 2021
a2e2f8e
Add battery cpu sipping test
kaedea Sep 10, 2021
6b63a62
Update battery metrics test
kaedea Sep 13, 2021
ec59808
Add battery metrics: kernel cpu pid times reader
kaedea Sep 13, 2021
b694fae
Update battery cpu stat impl
kaedea Sep 13, 2021
cd2c459
Update battery cpuStat compat check
kaedea Sep 13, 2021
823bb36
Make clean-up cycle shorter
gryamy Sep 15, 2021
9b91f03
Update battery cpuStat compat check
kaedea Sep 16, 2021
50bfc4e
Add battery composite monitors
kaedea Sep 18, 2021
8a895e2
Polish deprecated codes
kaedea Sep 18, 2021
f9a1ace
Update battery callback
kaedea Sep 18, 2021
73d8b2a
Introduce MemGuard.
tys282000 Sep 23, 2021
f293e6d
Update battery metrics with powprofile init
kaedea Sep 26, 2021
6af67af
Merge branch 'feature/dev' into feature/dev-battery-canary-metrics
kaedea Sep 28, 2021
7007e51
Try lock free array
gryamy Sep 29, 2021
73293fa
Remove lock free queue
gryamy Sep 29, 2021
2b14de9
Add lock_free_array_queue.h
gryamy Sep 29, 2021
0e0f66e
MemoryHook refactor
gryamy Sep 30, 2021
e08c899
MemoryHook remove deprecated flags
gryamy Sep 30, 2021
1a2ffe6
Merge branch 'feature/dev-2021-sep' into 'feature/dev' (merge request…
gryamy Sep 30, 2021
2793bac
Merge branch 'feature/dev-battery-canary-metrics' into 'feature/dev' …
gryamy Sep 30, 2021
41bdb77
Merge branch 'feature/dev-memhook-chore' into 'feature/dev' (merge re…
gryamy Sep 30, 2021
f866ad8
v2.0.2
gryamy Sep 30, 2021
76cfb3b
Merge branch 'feature/memguard' into 'feature/dev' (merge request !104)
gryamy Sep 30, 2021
89f4428
MemGuard: Block MTE utils so far to avoid issues in ndk r21.
tys282000 Oct 9, 2021
59b6959
Merge branch 'feature/tomys_block_mte_utils' into 'feature/dev' (merg…
Oct 9, 2021
2c15fe7
Fix battery powerprofile npe
kaedea Oct 9, 2021
811a5f9
compat with APG7
Yves0 Oct 9, 2021
03365d5
Fix leak misjudgement while returning same ptr by realloc()
gryamy Oct 11, 2021
11f0c8f
Merge branch 'feature/dev-battery-canary-metrics' into 'feature/dev' …
gryamy Oct 12, 2021
d05d060
Merge branch 'feature/dev-agp7-compat' into 'feature/dev' (merge requ…
gryamy Oct 12, 2021
84ccf5a
History Messages Recorder & Dense Messages Tracer
Oct 12, 2021
c5ddab1
Merge branch 'feature/dev_leafjia_history_msg' into 'feature/dev' (me…
gryamy Oct 13, 2021
4656832
ASM: upgrade ASM to 7.0
Yves0 Oct 14, 2021
d0eedfa
trace: pass twice to fix stack frame
Yves0 Oct 14, 2021
dd895d4
trace: add class check
Yves0 Oct 14, 2021
1a1274d
trace: try to fix stack frame
Yves0 Oct 14, 2021
67020e9
trace: verify again
Yves0 Oct 15, 2021
038456f
SignalAnrTracer: add printTraceFilePath setter
Yves0 Oct 15, 2021
9e44d93
Merge branch 'feature/dev-signal-tracer' into 'feature/dev' (merge re…
gryamy Oct 15, 2021
b68bed6
Revert Merge branch 'feature/dev-signal-tracer' into 'feature/dev' (m…
gryamy Oct 15, 2021
0a95a7c
Merge branch 'revert-9e44d939' into 'feature/dev' (merge request !110)
gryamy Oct 15, 2021
bdbcce0
trace: asm - use COMPUTE_FRAMES flag
Yves0 Oct 15, 2021
cdbf1f1
trace: fix TypeNotPresentException
Yves0 Oct 18, 2021
10f7f7c
trace-debug: enable input check
Yves0 Oct 18, 2021
b836f14
trace: disable input check, throw exception when error occurs
Yves0 Oct 19, 2021
ace86ba
Merge branch 'feature/dev-trace-fix' into 'feature/dev' (merge reques…
gryamy Oct 19, 2021
d7aa7b9
filter system by thread name
Sep 16, 2021
6098e59
Fix battery power profile anr issue
kaedea Oct 20, 2021
717627e
Merge branch 'feature/dev-battery-canary-metrics' into 'feature/dev' …
gryamy Oct 20, 2021
19097b9
Merge branch 'feature/dev-opengl-filter-by-thread-name' into 'feature…
gryamy Oct 20, 2021
d02bc15
trace: add ErrorMsg log
Yves0 Oct 22, 2021
d180e26
Merge branch 'feature/dev' of http://git.code.oa.com/matrix/matrix in…
Yves0 Oct 22, 2021
dedfccc
tracer: fix AGP-asm compat issue
Yves0 Oct 25, 2021
8200955
Merge branch 'feature/dev-trace-fix' into 'feature/dev' (merge reques…
gryamy Oct 25, 2021
cb96800
tracer: add extension param - skipCheckClass
Yves0 Oct 25, 2021
a6ca302
Merge branch 'feature/dev-trace-fix' into 'feature/dev' (merge reques…
gryamy Oct 28, 2021
6667017
v2.0.2
gryamy Oct 28, 2021
b6917a6
Merge branch 'feature/dev' of http://git.code.oa.com/matrix/matrix in…
gryamy Oct 28, 2021
e918817
trace: skip checking class by default
Yves0 Oct 28, 2021
12473dc
Merge branch 'feature/dev-trace-fix' into 'feature/dev' (merge reques…
gryamy Oct 28, 2021
8765add
MemoryHook: realloc bugfix
gryamy Oct 28, 2021
f784ece
[memguard] Add ReadMe.
tys282000 Oct 28, 2021
fa82ce1
Fix ZipSlip vulnerability
gryamy Oct 29, 2021
4184982
Add 039/040 dex version check
gryamy Oct 29, 2021
e6df151
Merge branch 'feature/memguard' into 'feature/dev' (merge request !117)
gryamy Oct 29, 2021
e836bbc
Fix checkstyle
gryamy Oct 29, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions matrix/matrix-android/matrix-gradle-plugin/build.gradle
Original file line number Diff line number Diff line change
@@ -5,8 +5,8 @@ dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation gradleApi()
implementation project(':matrix-commons')
implementation group: 'org.ow2.asm', name: 'asm', version: '5.1'
implementation group: 'org.ow2.asm', name: 'asm-commons', version: '5.1'
implementation group: 'org.ow2.asm', name: 'asm', version: '7.0'
implementation group: 'org.ow2.asm', name: 'asm-commons', version: '7.0'
implementation 'com.android.tools.build:gradle:4.0.0'
implementation project(':matrix-arscutil')
implementation "org.jetbrains.kotlin:kotlin-stdlib:${gradle.KOTLIN_VERSION}"
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.AdviceAdapter;
import org.objectweb.asm.util.CheckClassAdapter;

import java.io.ByteArrayInputStream;
import java.io.File;
@@ -67,6 +68,8 @@ public class MethodTracer {
private final ExecutorService executor;
private MappingCollector mappingCollector;

private volatile boolean traceError = false;

public MethodTracer(ExecutorService executor, MappingCollector mappingCollector, Configuration config, ConcurrentHashMap<String, TraceMethod> collectedMap, ConcurrentHashMap<String, String> collectedClassExtendMap) {
this.configuration = config;
this.mappingCollector = mappingCollector;
@@ -75,44 +78,46 @@ public MethodTracer(ExecutorService executor, MappingCollector mappingCollector,
this.collectedMethodMap = collectedMap;
}


public void trace(Map<File, File> srcFolderList, Map<File, File> dependencyJarList) throws ExecutionException, InterruptedException {
public void trace(Map<File, File> srcFolderList, Map<File, File> dependencyJarList, ClassLoader classLoader) throws ExecutionException, InterruptedException {
List<Future> futures = new LinkedList<>();
traceMethodFromSrc(srcFolderList, futures);
traceMethodFromJar(dependencyJarList, futures);
traceMethodFromSrc(srcFolderList, futures, classLoader);
traceMethodFromJar(dependencyJarList, futures, classLoader);
for (Future future : futures) {
future.get();
}
if (traceError) {
throw new IllegalArgumentException("something wrong with trace, see detail log before");
}
futures.clear();
}

private void traceMethodFromSrc(Map<File, File> srcMap, List<Future> futures) {
private void traceMethodFromSrc(Map<File, File> srcMap, List<Future> futures, final ClassLoader classLoader) {
if (null != srcMap) {
for (Map.Entry<File, File> entry : srcMap.entrySet()) {
futures.add(executor.submit(new Runnable() {
@Override
public void run() {
innerTraceMethodFromSrc(entry.getKey(), entry.getValue());
innerTraceMethodFromSrc(entry.getKey(), entry.getValue(), classLoader);
}
}));
}
}
}

private void traceMethodFromJar(Map<File, File> dependencyMap, List<Future> futures) {
private void traceMethodFromJar(Map<File, File> dependencyMap, List<Future> futures, final ClassLoader classLoader) {
if (null != dependencyMap) {
for (Map.Entry<File, File> entry : dependencyMap.entrySet()) {
futures.add(executor.submit(new Runnable() {
@Override
public void run() {
innerTraceMethodFromJar(entry.getKey(), entry.getValue());
innerTraceMethodFromJar(entry.getKey(), entry.getValue(), classLoader);
}
}));
}
}
}

private void innerTraceMethodFromSrc(File input, File output) {
private void innerTraceMethodFromSrc(File input, File output, ClassLoader classLoader) {

ArrayList<File> classFileList = new ArrayList<>();
if (input.isDirectory()) {
@@ -133,19 +138,32 @@ private void innerTraceMethodFromSrc(File input, File output) {
changedFileOutput.createNewFile();

if (MethodCollector.isNeedTraceFile(classFile.getName())) {

is = new FileInputStream(classFile);
ClassReader classReader = new ClassReader(is);
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassVisitor classVisitor = new TraceClassAdapter(Opcodes.ASM5, classWriter);
ClassWriter classWriter = new TraceClassWriter(ClassWriter.COMPUTE_FRAMES, classLoader);
ClassVisitor classVisitor = new TraceClassAdapter(Opcodes.ASM6, classWriter);
classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES);
is.close();

byte[] data = classWriter.toByteArray();

try {
ClassReader cr = new ClassReader(data);
ClassWriter cw = new ClassWriter(0);
ClassVisitor check = new CheckClassAdapter(cw);
cr.accept(check, ClassReader.EXPAND_FRAMES);
} catch (Throwable e) {
System.err.println("trace output ERROR : " + e.getMessage() + ", " + classFile);
traceError = true;
}

if (output.isDirectory()) {
os = new FileOutputStream(changedFileOutput);
} else {
os = new FileOutputStream(output);
}
os.write(classWriter.toByteArray());
os.write(data);
os.close();
} else {
FileUtil.copyFileUsingStream(classFile, changedFileOutput);
@@ -168,7 +186,7 @@ private void innerTraceMethodFromSrc(File input, File output) {
}
}

private void innerTraceMethodFromJar(File input, File output) {
private void innerTraceMethodFromJar(File input, File output, final ClassLoader classLoader) {
ZipOutputStream zipOutputStream = null;
ZipFile zipFile = null;
try {
@@ -179,12 +197,25 @@ private void innerTraceMethodFromJar(File input, File output) {
ZipEntry zipEntry = enumeration.nextElement();
String zipEntryName = zipEntry.getName();
if (MethodCollector.isNeedTraceFile(zipEntryName)) {

InputStream inputStream = zipFile.getInputStream(zipEntry);
ClassReader classReader = new ClassReader(inputStream);
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassVisitor classVisitor = new TraceClassAdapter(Opcodes.ASM5, classWriter);
ClassWriter classWriter = new TraceClassWriter(ClassWriter.COMPUTE_FRAMES, classLoader);
ClassVisitor classVisitor = new TraceClassAdapter(Opcodes.ASM6, classWriter);
classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES);
byte[] data = classWriter.toByteArray();
//
try {
ClassReader r = new ClassReader(data);
ClassWriter w = new ClassWriter(0);
ClassVisitor v = new CheckClassAdapter(w);
r.accept(v, ClassReader.EXPAND_FRAMES);
} catch (Throwable e) {
System.err.println("trace jar output ERROR: " + e.getMessage() + ", "+ zipEntryName);
// e.printStackTrace();
traceError = true;
}

InputStream byteArrayInputStream = new ByteArrayInputStream(data);
ZipEntry newZipEntry = new ZipEntry(zipEntryName);
FileUtil.addZipEntry(zipOutputStream, newZipEntry, byteArrayInputStream);
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.tencent.matrix.trace;

import com.android.build.gradle.AppExtension;
import com.android.build.gradle.BaseExtension;
import com.android.build.gradle.LibraryExtension;
import com.google.common.collect.ImmutableList;

import org.gradle.api.Project;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;

/**
* Created by habbyge on 2019/4/24.
*/
public class TraceClassLoader {

public static URLClassLoader getClassLoader(Project project, Collection<File> inputFiles)
throws MalformedURLException {

ImmutableList.Builder<URL> urls = new ImmutableList.Builder<>();
File androidJar = getAndroidJar(project);
if (androidJar != null) {
urls.add(androidJar.toURI().toURL());
}

for (File inputFile : inputFiles) {
urls.add(inputFile.toURI().toURL());
}

// for (TransformInput inputs : Iterables.concat(invocation.getInputs(), invocation.getReferencedInputs())) {
// for (DirectoryInput directoryInput : inputs.getDirectoryInputs()) {
// if (directoryInput.getFile().isDirectory()) {
// urls.add(directoryInput.getFile().toURI().toURL());
// }
// }
// for (JarInput jarInput : inputs.getJarInputs()) {
// if (jarInput.getFile().isFile()) {
// urls.add(jarInput.getFile().toURI().toURL());
// }
// }
// }

ImmutableList<URL> urlImmutableList = urls.build();
URL[] classLoaderUrls = urlImmutableList.toArray(new URL[urlImmutableList.size()]);
return new URLClassLoader(classLoaderUrls);
}

private static File getAndroidJar(Project project) {
BaseExtension extension = null;
if (project.getPlugins().hasPlugin("com.android.application")) {
extension = project.getExtensions().findByType(AppExtension.class);
} else if (project.getPlugins().hasPlugin("com.android.library")) {
extension = project.getExtensions().findByType(LibraryExtension.class);
}
if (extension == null) {
return null;
}

String sdkDirectory = extension.getSdkDirectory().getAbsolutePath();
String compileSdkVersion = extension.getCompileSdkVersion();
sdkDirectory = sdkDirectory + File.separator + "platforms" + File.separator;
String androidJarPath = sdkDirectory + compileSdkVersion + File.separator + "android.jar";
File androidJar = new File(androidJarPath);
return androidJar.exists() ? androidJar : null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package com.tencent.matrix.trace;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;

/**
* Created by habbyge on 2019/4/25.
*
* fix:
* java.lang.TypeNotPresentException: Type android/content/res/TypedArray not present
* at org.objectweb.asm.ClassWriter.getCommonSuperClass(ClassWriter.java:1025)
* at org.objectweb.asm.SymbolTable.addMergedType(SymbolTable.java:1202)
* at org.objectweb.asm.Frame.merge(Frame.java:1299)
* at org.objectweb.asm.Frame.merge(Frame.java:1197)
* at org.objectweb.asm.MethodWriter.computeAllFrames(MethodWriter.java:1610)
* at org.objectweb.asm.MethodWriter.visitMaxs(MethodWriter.java:1546)
* at org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:769)
* at org.objectweb.asm.util.CheckMethodAdapter$1.visitEnd(CheckMethodAdapter.java:465)
* at org.objectweb.asm.MethodVisitor.visitEnd(MethodVisitor.java:783)
* at org.objectweb.asm.util.CheckMethodAdapter.visitEnd(CheckMethodAdapter.java:1036)
* at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1495)
* at org.objectweb.asm.ClassReader.accept(ClassReader.java:721)
*
*/
class TraceClassWriter extends ClassWriter {
private ClassLoader mClassLoader;
public TraceClassWriter(int flags, ClassLoader classLoader) {
super(flags);
mClassLoader = classLoader;
}

public TraceClassWriter(ClassReader classReader, int flags, ClassLoader classLoader) {
super(classReader, flags);
mClassLoader = classLoader;
}

@Override
protected String getCommonSuperClass(String type1, String type2) {
try {
return super.getCommonSuperClass(type1, type2);
} catch (Exception e) {
try {
return getCommonSuperClassV1(type1, type2);
} catch (Exception e1) {
try {
return getCommonSuperClassV2(type1, type2);
} catch (Exception e2) {
return getCommonSuperClassV3(type1, type2);
}
}
}
}

private String getCommonSuperClassV1(String type1, String type2) {
ClassLoader curClassLoader = getClass().getClassLoader();

Class clazz1, clazz2;
try {
clazz1 = Class.forName(type1.replace('/', '.'), false, mClassLoader);
clazz2 = Class.forName(type2.replace('/', '.'), false, mClassLoader);
} catch (Exception e) {
/*throw new RuntimeException(e.toString());*/
/*e.printStackTrace();*/
return "java/lang/Object";
} catch (LinkageError error) {
return "java/lang/Object";
}
//noinspection unchecked
if (clazz1.isAssignableFrom(clazz2)) {
return type1;
}
//noinspection unchecked
if (clazz2.isAssignableFrom(clazz1)) {
return type2;
}
if (clazz1.isInterface() || clazz2.isInterface()) {
return "java/lang/Object";
} else {
//noinspection unchecked
do {
clazz1 = clazz1.getSuperclass();
} while (!clazz1.isAssignableFrom(clazz2));
return clazz1.getName().replace('.', '/');
}
}

private String getCommonSuperClassV2(String type1, String type2) {
ClassLoader curClassLoader = getClass().getClassLoader();

Class clazz1, clazz2;
try {
clazz1 = Class.forName(type1.replace('/', '.'), false, curClassLoader);
clazz2 = Class.forName(type2.replace('/', '.'), false, mClassLoader);
} catch (Exception e) {
/*throw new RuntimeException(e.toString());*/
/*e.printStackTrace();*/
return "java/lang/Object";
} catch (LinkageError error) {
return "java/lang/Object";
}
//noinspection unchecked
if (clazz1.isAssignableFrom(clazz2)) {
return type1;
}
//noinspection unchecked
if (clazz2.isAssignableFrom(clazz1)) {
return type2;
}
if (clazz1.isInterface() || clazz2.isInterface()) {
return "java/lang/Object";
} else {
//noinspection unchecked
do {
clazz1 = clazz1.getSuperclass();
} while (!clazz1.isAssignableFrom(clazz2));
return clazz1.getName().replace('.', '/');
}
}

private String getCommonSuperClassV3(String type1, String type2) {
ClassLoader curClassLoader = getClass().getClassLoader();

Class clazz1, clazz2;
try {
clazz1 = Class.forName(type1.replace('/', '.'), false, mClassLoader);
clazz2 = Class.forName(type2.replace('/', '.'), false, curClassLoader);
} catch (Exception e) {
/*e.printStackTrace();*/
/*throw new RuntimeException(e.toString());*/
return "java/lang/Object";
} catch (LinkageError error) {
return "java/lang/Object";
}
//noinspection unchecked
if (clazz1.isAssignableFrom(clazz2)) {
return type1;
}
//noinspection unchecked
if (clazz2.isAssignableFrom(clazz1)) {
return type2;
}
if (clazz1.isInterface() || clazz2.isInterface()) {
return "java/lang/Object";
} else {
//noinspection unchecked
do {
clazz1 = clazz1.getSuperclass();
} while (!clazz1.isAssignableFrom(clazz2));
return clazz1.getName().replace('.', '/');
}
}
}
Original file line number Diff line number Diff line change
@@ -107,7 +107,8 @@ abstract class MatrixTraceTask : DefaultTask() {
methodMapFilePath = methodMapFileOutput.asFile.get().absolutePath,
baseMethodMapPath = baseMethodMapFile.asFile.orNull?.absolutePath,
blockListFilePath = blockListFile.asFile.orNull?.absolutePath,
mappingDir = mappingDir.get()
mappingDir = mappingDir.get(),
project = project
).doTransform(
classInputs = classInputs.files,
changedFiles = changedFiles,
Loading