Skip to content

Commit 90a23cf

Browse files
authored
Merge pull request #631 from Tencent/feature/dev
2.0.0-beta to 2.0.0
2 parents 6a81584 + 48c6914 commit 90a23cf

File tree

14 files changed

+87
-83
lines changed

14 files changed

+87
-83
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ At this point, Matrix has been integrated into the app and is beginning to colle
208208

209209
1. Configure `MATRIX_VERSION` in gradle.properties.
210210
``` gradle
211-
MATRIX_VERSION=2.0.0-beta
211+
MATRIX_VERSION=2.0.0
212212
```
213213

214214
2. Add `matrix-gradle-plugin` in your build.gradle:
@@ -357,11 +357,11 @@ Then other components in Matrix could use Quikcen Backtrace to unwind stacktrace
357357

358358
#### APK Checker Usage
359359

360-
APK Checker can run independently in Jar ([matrix-apk-canary-2.0.0-beta.jar](https://repo.maven.apache.org/maven2/com/tencent/matrix/matrix-apk-canary/2.0.0-beta/matrix-apk-canary-2.0.0-beta.jar)) mode, usage:
360+
APK Checker can run independently in Jar ([matrix-apk-canary-2.0.0.jar](https://repo.maven.apache.org/maven2/com/tencent/matrix/matrix-apk-canary/2.0.0/matrix-apk-canary-2.0.0.jar)) mode, usage:
361361

362362

363363
```shell
364-
java -jar matrix-apk-canary-2.0.0-beta.jar
364+
java -jar matrix-apk-canary-2.0.0.jar
365365
Usages:
366366
--config CONFIG-FILE-PATH
367367
or
@@ -420,7 +420,7 @@ Matrix is under the BSD license. See the [LICENSE](https://github.com/Tencent/Ma
420420
421421
# <a name="matrix_cn">Matrix</a>
422422
![Matrix-icon](assets/img/readme/header.png)
423-
[![license](http://img.shields.io/badge/license-BSD3-brightgreen.svg?style=flat)](https://github.com/Tencent/matrix/blob/master/LICENSE)[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/Tencent/matrix/pulls) [![WeChat Approved](https://img.shields.io/badge/Wechat%20Approved-2.0.0-beta-red.svg)](https://github.com/Tencent/matrix/wiki)
423+
[![license](http://img.shields.io/badge/license-BSD3-brightgreen.svg?style=flat)](https://github.com/Tencent/matrix/blob/master/LICENSE)[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/Tencent/matrix/pulls) [![WeChat Approved](https://img.shields.io/badge/Wechat%20Approved-2.0.0-red.svg)](https://github.com/Tencent/matrix/wiki)
424424
425425
**Matrix** 是一款微信研发并日常使用的应用性能接入框架,支持iOS, macOS和Android。
426426
Matrix 通过接入各种性能监控方案,对性能监控项的异常数据进行采集和分析,输出相应的问题分析、定位与优化建议,从而帮助开发者开发出更高质量的应用。
@@ -608,7 +608,7 @@ Matrix-android 当前监控范围包括:应用安装包大小,帧率变化
608608

609609
1. 在你项目根目录下的 gradle.properties 中配置要依赖的 Matrix 版本号,如:
610610
``` gradle
611-
MATRIX_VERSION=2.0.0-beta
611+
MATRIX_VERSION=2.0.0
612612
```
613613

614614
2. 在你项目根目录下的 build.gradle 文件添加 Matrix 依赖,如:
@@ -754,10 +754,10 @@ WeChatBacktrace.instance().configure(getApplicationContext()).commit();
754754
755755
#### APK Checker
756756
757-
APK Check 以独立的 jar 包提供 ([matrix-apk-canary-2.0.0-beta.jar](https://repo.maven.apache.org/maven2/com/tencent/matrix/matrix-apk-canary/2.0.0-beta/matrix-apk-canary-2.0.0-beta.jar)),你可以运行:
757+
APK Check 以独立的 jar 包提供 ([matrix-apk-canary-2.0.0.jar](https://repo.maven.apache.org/maven2/com/tencent/matrix/matrix-apk-canary/2.0.0/matrix-apk-canary-2.0.0.jar)),你可以运行:
758758
759759
```cmd
760-
java -jar matrix-apk-canary-2.0.0-beta.jar
760+
java -jar matrix-apk-canary-2.0.0.jar
761761
```
762762
763763
查看 Usages 来使用它。

matrix/matrix-android/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryErro
1414
# org.gradle.parallel=true
1515
#Tue Jun 20 10:24:33 CST 2017
1616

17-
VERSION_NAME_PREFIX=2.0.0-beta
17+
VERSION_NAME_PREFIX=2.0.0
1818
VERSION_NAME_SUFFIX=
1919
## two options: Internal (for wechat), External (for public repo)
2020
PUBLISH_CHANNEL=Internal

matrix/matrix-android/matrix-android-commons/src/main/cpp/libxhook/xh_elf.c

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -365,12 +365,9 @@ static int xh_elf_hash_lookup(xh_elf_t *self, const char *symbol, uint32_t *symi
365365

366366
if(0 == strcmp(symbol, symbol_cur))
367367
{
368-
ElfW(Sym)* sym = self->symtab + i;
369-
if (ELF_ST_TYPE(sym->st_info) == STT_FUNC) {
370-
*symidx = i;
371-
XH_LOG_INFO("found %s at symidx: %u (ELF_HASH)\n", symbol, *symidx);
372-
return 0;
373-
}
368+
*symidx = i;
369+
XH_LOG_INFO("found %s at symidx: %u (ELF_HASH)\n", symbol, *symidx);
370+
return 0;
374371
}
375372
}
376373

@@ -402,12 +399,9 @@ static int xh_elf_gnu_hash_lookup_def(xh_elf_t *self, const char *symbol, uint32
402399

403400
if((hash | (uint32_t)1) == (symhash | (uint32_t)1) && 0 == strcmp(symbol, symname))
404401
{
405-
ElfW(Sym)* sym = self->symtab + i;
406-
if (ELF_ST_TYPE(sym->st_info) == STT_FUNC) {
407-
*symidx = i;
408-
XH_LOG_INFO("found %s at symidx: %u (GNU_HASH DEF)\n", symbol, *symidx);
409-
return 0;
410-
}
402+
*symidx = i;
403+
XH_LOG_INFO("found %s at symidx: %u (GNU_HASH DEF)\n", symbol, *symidx);
404+
return 0;
411405
}
412406

413407
//chain ends with an element with the lowest bit set to 1
@@ -428,12 +422,9 @@ static int xh_elf_gnu_hash_lookup_undef(xh_elf_t *self, const char *symbol, uint
428422
const char *symname = self->strtab + self->symtab[i].st_name;
429423
if(0 == strcmp(symname, symbol))
430424
{
431-
ElfW(Sym)* sym = self->symtab + i;
432-
if (ELF_ST_TYPE(sym->st_info) == STT_FUNC) {
433-
*symidx = i;
434-
XH_LOG_INFO("found %s at symidx: %u (GNU_HASH UNDEF)\n", symbol, *symidx);
435-
return 0;
436-
}
425+
*symidx = i;
426+
XH_LOG_INFO("found %s at symidx: %u (GNU_HASH UNDEF)\n", symbol, *symidx);
427+
return 0;
437428
}
438429
}
439430
return XH_ERRNO_NOTFND;
@@ -1039,29 +1030,25 @@ int xh_elf_hook(xh_elf_t *self, const char *symbol, void *new_func, void **old_f
10391030
if(0 != self->reldyn)
10401031
{
10411032
xh_elf_plain_reloc_iterator_init(&plain_iter, self->reldyn, self->reldyn_sz, self->is_use_rela);
1042-
found = 0;
10431033
while(NULL != (rel_common = xh_elf_plain_reloc_iterator_next(&plain_iter)))
10441034
{
10451035
if(0 != (r = xh_elf_find_and_replace_func(self,
10461036
(self->is_use_rela ? ".rela.dyn" : ".rel.dyn"), 0,
10471037
symbol, new_func, old_func,
10481038
symidx, rel_common, &found))) return r;
1049-
if (found) break;
10501039
}
10511040
}
10521041

10531042
//replace for .rel(a).android
10541043
if(0 != self->relandroid)
10551044
{
10561045
xh_elf_packed_reloc_iterator_init(&packed_iter, self->relandroid, self->relandroid_sz, self->is_use_rela);
1057-
found = 0;
10581046
while(NULL != (rel_common = xh_elf_packed_reloc_iterator_next(&packed_iter)))
10591047
{
10601048
if(0 != (r = xh_elf_find_and_replace_func(self,
10611049
(self->is_use_rela ? ".rela.android" : ".rel.android"), 0,
10621050
symbol, new_func, old_func,
10631051
symidx, rel_common, &found))) return r;
1064-
if (found) break;
10651052
}
10661053
}
10671054

matrix/matrix-android/matrix-android-commons/src/main/cpp/libxhook/xhook_ext.c

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -160,28 +160,4 @@ int xhook_export_symtable_hook(const char* owner_lib_name, const char* symbol_na
160160
} else {
161161
return XH_ERRNO_NOTFND;
162162
}
163-
}
164-
165-
void* xhook_find_symbol(const char* owner_lib_name, const char* symbol_name) {
166-
char path_name[PATH_MAX + 1] = {};
167-
const void* base_addr = NULL;
168-
if (xhook_find_library_base_addr(owner_lib_name, path_name, &base_addr) == 0) {
169-
xh_elf_t self = {};
170-
{
171-
int error = xh_elf_init(&self, (uintptr_t) base_addr, path_name);
172-
if (error != 0) return NULL;
173-
}
174-
175-
//find symbol index by symbol name
176-
uint32_t symidx = 0;
177-
{
178-
int error = xh_elf_find_symidx_by_name(&self, symbol_name, &symidx);
179-
if (error != 0) return NULL;
180-
}
181-
182-
ElfW(Sym)* target_sym = self.symtab + symidx;
183-
return (void*) (self.bias_addr + target_sym->st_value);
184-
} else {
185-
return NULL;
186-
}
187163
}

matrix/matrix-android/matrix-android-commons/src/main/cpp/libxhook/xhook_ext.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ extern "C" {
1515
extern int xhook_export_symtable_hook(const char* owner_lib_name, const char* symbol_name, void* handler,
1616
void** original_address) XHOOK_EXPORT;
1717

18-
extern void* xhook_find_symbol(const char* owner_lib_name, const char* symbol_name);
19-
20-
2118
#ifdef __cplusplus
2219
}
2320
#endif

matrix/matrix-android/matrix-commons/src/main/java/com/android/dexdeps/DexData.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ void loadStrings() throws IOException {
149149

150150
mStrings = new String[count];
151151

152-
seek(stringOffsets[0]);
153152
for (int i = 0; i < count; i++) {
154153
seek(stringOffsets[i]); // should be a no-op
155154
mStrings[i] = readString();

matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/MethodTracer.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ private void listClassFiles(ArrayList<File> classFiles, File folder) {
248248
private class TraceClassAdapter extends ClassVisitor {
249249

250250
private String className;
251+
private String superName;
251252
private boolean isABSClass = false;
252253
private boolean hasWindowFocusMethod = false;
253254
private boolean isActivityOrSubClass;
@@ -261,6 +262,7 @@ private class TraceClassAdapter extends ClassVisitor {
261262
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
262263
super.visit(version, access, name, signature, superName, interfaces);
263264
this.className = name;
265+
this.superName = superName;
264266
this.isActivityOrSubClass = isActivityOrSubClass(className, collectedClassExtendMap);
265267
this.isNeedTrace = MethodCollector.isNeedTrace(configuration, className, mappingCollector);
266268
if ((access & Opcodes.ACC_ABSTRACT) > 0 || (access & Opcodes.ACC_INTERFACE) > 0) {
@@ -288,7 +290,7 @@ public MethodVisitor visitMethod(int access, String name, String desc,
288290
@Override
289291
public void visitEnd() {
290292
if (!hasWindowFocusMethod && isActivityOrSubClass && isNeedTrace) {
291-
insertWindowFocusChangeMethod(cv, className);
293+
insertWindowFocusChangeMethod(cv, className, superName);
292294
}
293295
super.visitEnd();
294296
}
@@ -393,13 +395,13 @@ private void traceWindowFocusChangeMethod(MethodVisitor mv, String classname) {
393395
mv.visitMethodInsn(Opcodes.INVOKESTATIC, TraceBuildConstants.MATRIX_TRACE_CLASS, "at", "(Landroid/app/Activity;Z)V", false);
394396
}
395397

396-
private void insertWindowFocusChangeMethod(ClassVisitor cv, String classname) {
398+
private void insertWindowFocusChangeMethod(ClassVisitor cv, String classname, String superClassName) {
397399
MethodVisitor methodVisitor = cv.visitMethod(Opcodes.ACC_PUBLIC, TraceBuildConstants.MATRIX_TRACE_ON_WINDOW_FOCUS_METHOD,
398400
TraceBuildConstants.MATRIX_TRACE_ON_WINDOW_FOCUS_METHOD_ARGS, null, null);
399401
methodVisitor.visitCode();
400402
methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
401403
methodVisitor.visitVarInsn(Opcodes.ILOAD, 1);
402-
methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, TraceBuildConstants.MATRIX_TRACE_ACTIVITY_CLASS, TraceBuildConstants.MATRIX_TRACE_ON_WINDOW_FOCUS_METHOD,
404+
methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, superClassName, TraceBuildConstants.MATRIX_TRACE_ON_WINDOW_FOCUS_METHOD,
403405
TraceBuildConstants.MATRIX_TRACE_ON_WINDOW_FOCUS_METHOD_ARGS, false);
404406
traceWindowFocusChangeMethod(methodVisitor, classname);
405407
methodVisitor.visitInsn(Opcodes.RETURN);

matrix/matrix-android/matrix-gradle-plugin/src/main/java/com/tencent/matrix/trace/retrace/MappingCollector.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.tencent.matrix.trace.retrace;
1818

19+
import com.tencent.matrix.javalib.util.Log;
20+
1921
import org.objectweb.asm.Type;
2022

2123
import java.util.HashMap;
@@ -40,7 +42,13 @@ public class MappingCollector implements MappingProcessor {
4042
public boolean processClassMapping(String className, String newClassName) {
4143
this.mObfuscatedRawClassMap.put(newClassName, className);
4244
this.mRawObfuscatedClassMap.put(className, newClassName);
43-
this.mRawObfuscatedPackageMap.put(className.substring(0, className.lastIndexOf('.')), newClassName.substring(0, newClassName.lastIndexOf('.')));
45+
int classNameLen = className.lastIndexOf('.');
46+
int newClassNameLen = newClassName.lastIndexOf('.');
47+
if (classNameLen > 0 && newClassNameLen > 0) {
48+
this.mRawObfuscatedPackageMap.put(className.substring(0, classNameLen), newClassName.substring(0, newClassNameLen));
49+
} else {
50+
Log.e(TAG, "class without package name: %s -> %s, pls check input mapping", className, newClassName);
51+
}
4452
return true;
4553
}
4654

matrix/matrix-android/matrix-hooks/src/main/cpp/common/SemiDlfcn.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "SemiDlfcn.h"
1717
#include "ScopedCleaner.h"
1818
#include "Log.h"
19+
#include "Maps.h"
1920

2021

2122
#define LOG_TAG "Matrix.SemiDlfcn"
@@ -222,15 +223,24 @@ namespace matrix {
222223
if (hLinker == nullptr) {
223224
return nullptr;
224225
}
226+
auto hLinkerCleaner = MakeScopedCleaner([&hLinker]() {
227+
if (hLinker != nullptr) {
228+
SemiDlClose(hLinker);
229+
}
230+
});
225231
sDlIterateMutexPtr = reinterpret_cast<pthread_mutex_t*>(SemiDlSym(hLinker, LINKER_DL_MUTEX_SYMNAME));
226232
return sDlIterateMutexPtr;
227233
}
228234

229235
static int DlIteratePhdrCompat(const std::function<int(const char*, const void*, void*)>& cb, void* data) {
230236
int sdk = android_get_device_api_level();
231237
if (sdk <= 20) {
232-
// TODO support by parsing maps.
233-
return 0;
238+
int ret = 0;
239+
IterateMaps([&cb, &ret](uintptr_t start, uintptr_t end, char perms[4], const char* pathname, void* data) -> bool {
240+
ret = cb(pathname, reinterpret_cast<const void*>(start), data);
241+
return (ret != 0);
242+
}, data);
243+
return ret;
234244
} else {
235245
struct IterData {
236246
decltype(cb) cb;

matrix/matrix-android/matrix-hooks/src/main/cpp/common/SoLoadMonitor.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ namespace matrix {
181181
if (sdkVer >= 26 /* O */) {
182182
orig__loader_dlopen = reinterpret_cast<decltype(orig__loader_dlopen)>(
183183
matrix::SemiDlSym(hLinker, "__dl___loader_dlopen"));
184+
if (UNLIKELY(orig__loader_dlopen == nullptr)) {
185+
orig__loader_dlopen = reinterpret_cast<decltype(orig__loader_dlopen)>(
186+
matrix::SemiDlSym(hLinker, "__dl__Z8__dlopenPKciPKv"));
187+
}
184188
if (UNLIKELY(orig__loader_dlopen == nullptr)) {
185189
LOGE(LOG_TAG, "Fail to find original __loader_dlopen.");
186190
return false;
@@ -193,6 +197,10 @@ namespace matrix {
193197

194198
orig__loader_android_dlopen_ext = reinterpret_cast<decltype(orig__loader_android_dlopen_ext)>(
195199
matrix::SemiDlSym(hLinker, "__dl___loader_android_dlopen_ext"));
200+
if (UNLIKELY(orig__loader_android_dlopen_ext == nullptr)) {
201+
orig__loader_android_dlopen_ext = reinterpret_cast<decltype(orig__loader_android_dlopen_ext)>(
202+
matrix::SemiDlSym(hLinker, "__dl__Z20__android_dlopen_extPKciPK17android_dlextinfoPKv"));
203+
}
196204
if (UNLIKELY(orig__loader_android_dlopen_ext == nullptr)) {
197205
LOGE(LOG_TAG, "Fail to find original __loader_android_dlopen_ext.");
198206
return false;

0 commit comments

Comments
 (0)