Skip to content

Commit 0995dc6

Browse files
hehonghuitxfelixzhou
authored andcommitted
fix TraceConfig#getSplashActivities method's NullPointException on Android. fix Tencent#238 (Tencent#239)
1 parent 58cf0df commit 0995dc6

File tree

4 files changed

+157
-5
lines changed

4 files changed

+157
-5
lines changed

matrix/matrix-android/matrix-io-canary/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ android {
1515
cppFlags "-std=gnu++11 -frtti -fexceptions"
1616
}
1717
ndk {
18-
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
18+
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
1919
}
2020
}
2121
}

matrix/matrix-android/matrix-sqlite-lint/matrix-sqlite-lint-android-sdk/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ android {
1616
arguments "-Dplatform=android"
1717
}
1818
ndk {
19-
abiFilters "armeabi", "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
19+
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
2020
}
2121
}
2222
}

matrix/matrix-android/matrix-trace-canary/src/main/java/com/tencent/matrix/trace/config/TraceConfig.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616

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

19+
import android.text.TextUtils;
20+
1921
import com.tencent.matrix.trace.constants.Constants;
2022
import com.tencent.matrix.trace.listeners.IDefaultConfig;
2123
import com.tencent.mrs.plugin.IDynamicConfig;
2224

2325
import java.util.Arrays;
26+
import java.util.Collections;
2427
import java.util.HashSet;
2528
import java.util.Set;
2629

@@ -96,14 +99,25 @@ public boolean isAnrTraceEnable() {
9699

97100
public Set<String> getSplashActivities() {
98101
if (null == splashActivitiesSet) {
99-
splashActivitiesSet = (null == dynamicConfig
100-
? new HashSet<>(Arrays.asList(splashActivities))
101-
: new HashSet<>(Arrays.asList(dynamicConfig.get(IDynamicConfig.ExptEnum.clicfg_matrix_trace_care_scene_set.name(), splashActivities).split(";"))));
102+
splashActivitiesSet = (dynamicConfig == null)
103+
? createSplashHashSet(splashActivities)
104+
: createSplashHashSet(dynamicConfig.get(IDynamicConfig.ExptEnum.clicfg_matrix_trace_care_scene_set.name(), splashActivities)) ;
102105
}
103106
return splashActivitiesSet;
104107
}
105108

106109

110+
private static Set<String> createSplashHashSet(String rawString) {
111+
Set<String> splashHashSet ;
112+
if ( rawString != null ) {
113+
splashHashSet = new HashSet<>(Arrays.asList(rawString.split(";")) ) ;
114+
} else {
115+
splashHashSet = new HashSet<>(Collections.<String>emptyList()) ;
116+
}
117+
return splashHashSet;
118+
}
119+
120+
107121
public int getEvilThresholdMs() {
108122
return null == dynamicConfig
109123
? Constants.DEFAULT_EVIL_METHOD_THRESHOLD_MS
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package com.tencent.matrix.trace.config;
2+
3+
import com.tencent.mrs.plugin.IDynamicConfig;
4+
5+
import junit.framework.TestCase;
6+
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
10+
import java.util.Set;
11+
12+
public class TraceConfigTestCase extends TestCase {
13+
14+
private IDynamicConfig dynamicConfig ;
15+
16+
@Before
17+
@Override
18+
public void setUp() throws Exception {
19+
super.setUp();
20+
dynamicConfig = new MockDynamicConfig() ;
21+
}
22+
23+
/**
24+
* 测试设置了 dynamicConfig, 但是没有设置 splash activities的场景
25+
*/
26+
@Test
27+
public void testNotSetSplashActivities() {
28+
TraceConfig config = new TraceConfig.Builder().dynamicConfig(dynamicConfig).build() ;
29+
30+
Set<String> activities = config.getSplashActivities() ;
31+
assertNotNull(activities);
32+
assertFalse( activities.contains("SplashActivity"));
33+
}
34+
35+
/**
36+
* 测试 dynamicConfig 和 splashActivities 都为 null的场景不会产生crash
37+
*/
38+
@Test
39+
public void testNotSetDynamicConfig() {
40+
TraceConfig config = new TraceConfig.Builder().build() ;
41+
Set<String> activities = config.getSplashActivities() ;
42+
assertNotNull(activities);
43+
assertEquals(0, activities.size());
44+
assertFalse( activities.contains("SplashActivity"));
45+
}
46+
47+
/**
48+
* 模拟通过 dynamicConfig 设置 splashActivities
49+
*/
50+
@Test
51+
public void testSetSplashActivities() {
52+
final String splashActivities = "com.tencent.matrix.SplashActivity1;com.tencent.matrix.SplashActivity2";
53+
// 设置
54+
TraceConfig config = new TraceConfig.Builder().dynamicConfig(new MockDynamicConfig() {
55+
@Override
56+
public String get(String key, String defStr) {
57+
if ( IDynamicConfig.ExptEnum.clicfg_matrix_trace_care_scene_set.name().equalsIgnoreCase(key) ) {
58+
return splashActivities ;
59+
}
60+
return super.get(key, defStr);
61+
}
62+
}).build() ;
63+
64+
Set<String> activities = config.getSplashActivities() ;
65+
assertNotNull(activities);
66+
assertEquals(2, activities.size());
67+
assertTrue( activities.contains("com.tencent.matrix.SplashActivity1"));
68+
assertTrue( activities.contains("com.tencent.matrix.SplashActivity2"));
69+
}
70+
71+
72+
/**
73+
* 模拟dynamicConfig为null, 通过 TraceConfig 设置 splashActivities
74+
*/
75+
@Test
76+
public void testSetSplashActivitiesWithTraceConfig() {
77+
final String splashActivities = "com.tencent.matrix.SplashActivity1;com.tencent.matrix.SplashActivity2";
78+
TraceConfig config = new TraceConfig.Builder().build() ;
79+
// 设置 splashActivities
80+
config.splashActivities = splashActivities ;
81+
82+
Set<String> activities = config.getSplashActivities() ;
83+
assertNotNull(activities);
84+
assertEquals(2, activities.size());
85+
assertTrue( activities.contains("com.tencent.matrix.SplashActivity1"));
86+
assertTrue( activities.contains("com.tencent.matrix.SplashActivity2"));
87+
}
88+
89+
/**
90+
* 测试只设置了一个SplashActivity的场景
91+
*/
92+
@Test
93+
public void testOneSplashActivity() {
94+
final String splashActivities = "com.tencent.matrix.SplashActivity1";
95+
TraceConfig config = new TraceConfig.Builder().build() ;
96+
// 设置 splashActivities
97+
config.splashActivities = splashActivities ;
98+
99+
Set<String> activities = config.getSplashActivities() ;
100+
assertNotNull(activities);
101+
assertEquals(1, activities.size());
102+
assertTrue( activities.contains("com.tencent.matrix.SplashActivity1"));
103+
assertFalse( activities.contains("com.tencent.matrix.SplashActivity2"));
104+
}
105+
106+
/**
107+
* null empty impl IDynamicConfig
108+
*/
109+
private static class MockDynamicConfig implements IDynamicConfig {
110+
111+
@Override
112+
public String get(String key, String defStr) {
113+
// return null to mock null value to test case
114+
return null;
115+
// return defStr;
116+
}
117+
118+
@Override
119+
public int get(String key, int defInt) {
120+
return 0;
121+
}
122+
123+
@Override
124+
public long get(String key, long defLong) {
125+
return 0;
126+
}
127+
128+
@Override
129+
public boolean get(String key, boolean defBool) {
130+
return false;
131+
}
132+
133+
@Override
134+
public float get(String key, float defFloat) {
135+
return 0;
136+
}
137+
} // end of MockDynamicConfig
138+
}

0 commit comments

Comments
 (0)