Skip to content

Commit afd1798

Browse files
author
weiqiangliu
committed
Release 3.2.10
1 parent a774625 commit afd1798

File tree

7 files changed

+119
-12
lines changed

7 files changed

+119
-12
lines changed

plugin/ext.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
project.ext {
2-
pluginVersion = '3.2.9'
2+
pluginVersion = '3.2.10'
33
Properties properties = new Properties()
44
if (project.file('local.properties').exists()) {
55
properties.load(project.file('local.properties').newDataInputStream())

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsClassVisitor.groovy

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,10 +298,48 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
298298
methodVisitor.visitVarInsn(ALOAD, 1)
299299
methodVisitor.visitVarInsn(ASTORE, secondLocalId)
300300
localIds.add(secondLocalId)
301+
} else if (!transformHelper.isHookOnMethodEnter && nameDesc == "onMenuItemClick(Landroid/view/MenuItem;)Z" && pubAndNoStaticAccess) {
302+
localIds = new ArrayList<>()
303+
int firstLocalId = newLocal(Type.getObjectType("android/view/MenuItem"))
304+
methodVisitor.visitVarInsn(ALOAD, 1)
305+
methodVisitor.visitVarInsn(ASTORE, firstLocalId)
306+
localIds.add(firstLocalId)
301307
}
302308
if (transformHelper.isHookOnMethodEnter) {
303309
handleCode()
304310
}
311+
312+
// Lambda 参数优化部分,对现有参数进行复制
313+
if (!transformHelper.isHookOnMethodEnter && transformHelper.extension.lambdaEnabled) {
314+
SensorsAnalyticsMethodCell lambdaMethodCell = mLambdaMethodCells.get(nameDesc)
315+
if (lambdaMethodCell != null) {
316+
//判断是否是在采样中,在采样中才会处理或者开关打开也统一处理
317+
if (transformHelper.extension.lambdaParamOptimize || SensorsAnalyticsHookConfig.SAMPLING_LAMBDA_METHODS.contains(lambdaMethodCell)) {
318+
Type[] types = Type.getArgumentTypes(lambdaMethodCell.desc)
319+
int length = types.length
320+
Type[] lambdaTypes = Type.getArgumentTypes(desc)
321+
// paramStart 为访问的方法参数的下标,从 0 开始
322+
int paramStart = lambdaTypes.length - length
323+
if (paramStart < 0) {
324+
return
325+
} else {
326+
for (int i = 0; i < length; i++) {
327+
if (lambdaTypes[paramStart + i].descriptor != types[i].descriptor) {
328+
return
329+
}
330+
}
331+
}
332+
boolean isStaticMethod = SensorsAnalyticsUtil.isStatic(access)
333+
localIds = new ArrayList<>()
334+
for (int i = paramStart; i < paramStart + lambdaMethodCell.paramsCount; i++) {
335+
int localId = newLocal(types[i - paramStart])
336+
methodVisitor.visitVarInsn(lambdaMethodCell.opcodes.get(i - paramStart), getVisitPosition(lambdaTypes, i, isStaticMethod))
337+
methodVisitor.visitVarInsn(SensorsAnalyticsUtil.convertOpcodes(lambdaMethodCell.opcodes.get(i - paramStart)), localId)
338+
localIds.add(localId)
339+
}
340+
}
341+
}
342+
}
305343
}
306344

307345
@Override
@@ -380,8 +418,15 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
380418
return
381419
}
382420
}
383-
for (int i = paramStart; i < paramStart + lambdaMethodCell.paramsCount; i++) {
384-
methodVisitor.visitVarInsn(lambdaMethodCell.opcodes.get(i - paramStart), getVisitPosition(lambdaTypes, i, isStaticMethod))
421+
//如果在采样中,就按照最新的处理流程来操作
422+
if (transformHelper.extension.lambdaParamOptimize || SensorsAnalyticsHookConfig.SAMPLING_LAMBDA_METHODS.contains(lambdaMethodCell)) {
423+
for (int i = paramStart; i < paramStart + lambdaMethodCell.paramsCount; i++) {
424+
methodVisitor.visitVarInsn(lambdaMethodCell.opcodes.get(i - paramStart), localIds[i - paramStart])
425+
}
426+
} else {
427+
for (int i = paramStart; i < paramStart + lambdaMethodCell.paramsCount; i++) {
428+
methodVisitor.visitVarInsn(lambdaMethodCell.opcodes.get(i - paramStart), getVisitPosition(lambdaTypes, i, isStaticMethod))
429+
}
385430
}
386431
methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, lambdaMethodCell.agentName, lambdaMethodCell.agentDesc, false)
387432
isHasTracked = true
@@ -487,6 +532,16 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
487532
isHasTracked = true
488533
return
489534
}
535+
} else if (nameDesc == 'onMenuItemClick(Landroid/view/MenuItem;)Z') {
536+
for (interfaceName in mInterfaces) {
537+
SensorsAnalyticsMethodCell sensorsAnalyticsMethodCell = SensorsAnalyticsHookConfig.INTERFACE_METHODS.get(interfaceName + nameDesc)
538+
if (sensorsAnalyticsMethodCell != null) {
539+
methodVisitor.visitVarInsn(ALOAD, localIds.get(0))
540+
methodVisitor.visitMethodInsn(INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, sensorsAnalyticsMethodCell.agentName, sensorsAnalyticsMethodCell.agentDesc, false)
541+
isHasTracked = true
542+
return
543+
}
544+
}
490545
} else {
491546
for (interfaceName in mInterfaces) {
492547
SensorsAnalyticsMethodCell sensorsAnalyticsMethodCell = SensorsAnalyticsHookConfig.INTERFACE_METHODS.get(interfaceName + nameDesc)

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsExtension.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class SensorsAnalyticsExtension {
2626
public boolean useInclude = false
2727
public boolean lambdaEnabled = true
2828
public boolean autoHandleWebView = true
29+
public boolean lambdaParamOptimize = false
2930

3031
public ArrayList<String> exclude = []
3132
public ArrayList<String> include = []
@@ -63,6 +64,7 @@ class SensorsAnalyticsExtension {
6364
"\tdisableJar=" + disableJar + "\n" +
6465
"\tuseInclude=" + useInclude + "\n" +
6566
"\tautoHandleWebView=" + autoHandleWebView + "\n" +
67+
"\tlambdaParamOptimize=" + lambdaParamOptimize + "\n" +
6668
"\tlambdaEnabled=" + lambdaEnabled + "\n" +
6769
"\texclude=[" + excludeBuilder.toString() + "]" + "\n" +
6870
"\tinclude=[" + includeBuilder.toString() + "]" + "\n" +

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsHookConfig.groovy

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ class SensorsAnalyticsHookConfig {
288288
*/
289289

290290
public final static HashMap<String, SensorsAnalyticsMethodCell> LAMBDA_METHODS = new HashMap<>()
291+
//lambda 参数优化取样
292+
public final static ArrayList<SensorsAnalyticsMethodCell> SAMPLING_LAMBDA_METHODS = new ArrayList<>()
291293
static {
292294
addLambdaMethod(new SensorsAnalyticsMethodCell(
293295
'onClick',
@@ -313,14 +315,6 @@ class SensorsAnalyticsHookConfig {
313315
'(Landroid/view/View;)V',
314316
1, 1,
315317
[Opcodes.ALOAD]))
316-
addLambdaMethod(new SensorsAnalyticsMethodCell(
317-
'onStopTrackingTouch',
318-
'(Landroid/widget/SeekBar;)V',
319-
'Landroid/widget/SeekBar$OnSeekBarChangeListener;',
320-
'trackViewOnClick',
321-
'(Landroid/view/View;)V',
322-
1, 1,
323-
[Opcodes.ALOAD]))
324318
addLambdaMethod(new SensorsAnalyticsMethodCell(
325319
'onCheckedChanged',
326320
'(Landroid/widget/RadioGroup;I)V',
@@ -345,6 +339,14 @@ class SensorsAnalyticsHookConfig {
345339
'(Landroid/widget/AdapterView;Landroid/view/View;I)V',
346340
1, 3,
347341
[Opcodes.ALOAD, Opcodes.ALOAD, Opcodes.ILOAD]))
342+
SAMPLING_LAMBDA_METHODS.add(new SensorsAnalyticsMethodCell(
343+
'onItemClick',
344+
'(Landroid/widget/AdapterView;Landroid/view/View;IJ)V',
345+
'Landroid/widget/AdapterView$OnItemClickListener;',
346+
'trackListView',
347+
'(Landroid/widget/AdapterView;Landroid/view/View;I)V',
348+
1, 3,
349+
[Opcodes.ALOAD, Opcodes.ALOAD, Opcodes.ILOAD]))
348350
addLambdaMethod(new SensorsAnalyticsMethodCell(
349351
'onGroupClick',
350352
'(Landroid/widget/ExpandableListView;Landroid/view/View;IJ)Z',

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsMethodCell.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,9 @@ class SensorsAnalyticsMethodCell {
6666
this.paramsCount = paramsCount
6767
this.opcodes = opcodes
6868
}
69+
70+
@Override
71+
boolean equals(Object cell) {
72+
return this.name == cell.name && this.desc == cell.desc && this.parent == cell.parent
73+
}
6974
}

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsTransform.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import java.util.jar.JarOutputStream
4646

4747
class SensorsAnalyticsTransform extends Transform {
4848
private SensorsAnalyticsTransformHelper transformHelper
49-
public static final String VERSION = "3.2.9"
49+
public static final String VERSION = "3.2.10"
5050
public static final String MIN_SDK_VERSION = "4.0.7"
5151
private WaitableExecutor waitableExecutor
5252
private URLClassLoader urlClassLoader

plugin/src/main/groovy/com/sensorsdata/analytics/android/plugin/SensorsAnalyticsUtil.groovy

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,47 @@ class SensorsAnalyticsUtil {
139139
IOUtils.closeQuietly(input)
140140
}
141141
}
142+
143+
/**
144+
* 获取 LOAD 或 STORE 的相反指令,例如 ILOAD => ISTORE,ASTORE => ALOAD
145+
*
146+
* @param LOAD 或 STORE 指令
147+
* @return 返回相对应的指令
148+
*/
149+
static int convertOpcodes(int code) {
150+
int result = code
151+
switch (code) {
152+
case Opcodes.ILOAD:
153+
result = Opcodes.ISTORE
154+
break
155+
case Opcodes.ALOAD:
156+
result = Opcodes.ASTORE
157+
break
158+
case Opcodes.LLOAD:
159+
result = Opcodes.LSTORE
160+
break
161+
case Opcodes.FLOAD:
162+
result = Opcodes.FSTORE
163+
break
164+
case Opcodes.DLOAD:
165+
result = Opcodes.DSTORE
166+
break
167+
case Opcodes.ISTORE:
168+
result = Opcodes.ILOAD
169+
break
170+
case Opcodes.ASTORE:
171+
result = Opcodes.ALOAD
172+
break
173+
case Opcodes.LSTORE:
174+
result = Opcodes.LLOAD
175+
break
176+
case Opcodes.FSTORE:
177+
result = Opcodes.FLOAD
178+
break
179+
case Opcodes.DSTORE:
180+
result = Opcodes.DLOAD
181+
break
182+
}
183+
return result
184+
}
142185
}

0 commit comments

Comments
 (0)