Skip to content

Commit 192eac9

Browse files
committed
Release 3.1.2
1 parent 9ac728d commit 192eac9

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

aop/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.1.1'
2+
pluginVersion = '3.1.2'
33
Properties properties = new Properties()
44
if (project.file('local.properties').exists()) {
55
properties.load(project.file('local.properties').newDataInputStream())

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

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
186186
boolean isOnItemClickMethod = false
187187
//name + desc
188188
String nameDesc
189+
boolean isSetUserVisibleHint = false
189190

190191
//访问权限是public并且非静态
191192
boolean pubAndNoStaticAccess
@@ -236,6 +237,11 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
236237
variableID = newLocal(Type.getObjectType("java/lang/Integer"))
237238
methodVisitor.visitVarInsn(ALOAD, 1)
238239
methodVisitor.visitVarInsn(ASTORE, variableID)
240+
} else if (nameDesc == 'setUserVisibleHint(Z)V' && pubAndNoStaticAccess) {
241+
isSetUserVisibleHint = true
242+
variableID = newLocal(Type.getObjectType("java/lang/Integer"))
243+
methodVisitor.visitVarInsn(ILOAD, 1)
244+
methodVisitor.visitVarInsn(ISTORE, variableID)
239245
}
240246
}
241247

@@ -256,6 +262,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
256262
Type[] types = Type.getArgumentTypes(lambdaMethodCell.desc)
257263
int length = types.length
258264
Type[] lambdaTypes = Type.getArgumentTypes(desc)
265+
// paramStart 为访问的方法参数的下标,从 0 开始
259266
int paramStart = lambdaTypes.length - length
260267
if (paramStart < 0) {
261268
return
@@ -266,19 +273,20 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
266273
}
267274
}
268275
}
269-
if (!SensorsAnalyticsUtil.isStatic(access)) {
270-
paramStart++
276+
boolean isStaticMethod = SensorsAnalyticsUtil.isStatic(access)
277+
if (!isStaticMethod) {
271278
if (lambdaMethodCell.desc == '(Landroid/view/MenuItem;)Z') {
272279
methodVisitor.visitVarInsn(Opcodes.ALOAD, 0)
273-
methodVisitor.visitVarInsn(Opcodes.ALOAD, paramStart)
280+
methodVisitor.visitVarInsn(Opcodes.ALOAD, getVisitPosition(lambdaTypes, paramStart, isStaticMethod))
274281
methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, lambdaMethodCell.agentName, '(Ljava/lang/Object;Landroid/view/MenuItem;)V', false)
275282
isHasTracked = true
276283
return
277284
}
278285
}
279-
visitMethodWithLoadedParams(methodVisitor, Opcodes.INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API,
280-
lambdaMethodCell.agentName, lambdaMethodCell.agentDesc,
281-
paramStart, lambdaMethodCell.paramsCount, lambdaMethodCell.opcodes)
286+
for (int i = paramStart; i < paramStart + lambdaMethodCell.paramsCount; i++) {
287+
methodVisitor.visitVarInsn(lambdaMethodCell.opcodes.get(i - paramStart), getVisitPosition(lambdaTypes, i, isStaticMethod))
288+
}
289+
methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, lambdaMethodCell.agentName, lambdaMethodCell.agentDesc, false)
282290
isHasTracked = true
283291
return
284292
}
@@ -312,7 +320,13 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
312320
SensorsAnalyticsMethodCell sensorsAnalyticsMethodCell = SensorsAnalyticsHookConfig.FRAGMENT_METHODS.get(nameDesc)
313321
if (sensorsAnalyticsMethodCell != null) {
314322
visitedFragMethods.add(nameDesc)
315-
visitMethodWithLoadedParams(methodVisitor, Opcodes.INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, sensorsAnalyticsMethodCell.agentName, sensorsAnalyticsMethodCell.agentDesc, sensorsAnalyticsMethodCell.paramsStart, sensorsAnalyticsMethodCell.paramsCount, sensorsAnalyticsMethodCell.opcodes)
323+
if (isSetUserVisibleHint){
324+
methodVisitor.visitVarInsn(ALOAD, 0)
325+
methodVisitor.visitVarInsn(ILOAD, variableID)
326+
methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, sensorsAnalyticsMethodCell.agentName, sensorsAnalyticsMethodCell.agentDesc, false)
327+
} else {
328+
visitMethodWithLoadedParams(methodVisitor, Opcodes.INVOKESTATIC, SensorsAnalyticsHookConfig.SENSORS_ANALYTICS_API, sensorsAnalyticsMethodCell.agentName, sensorsAnalyticsMethodCell.agentDesc, sensorsAnalyticsMethodCell.paramsStart, sensorsAnalyticsMethodCell.paramsCount, sensorsAnalyticsMethodCell.opcodes)
329+
}
316330
isHasTracked = true
317331
}
318332
}
@@ -447,4 +461,21 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
447461
return sensorsAnalyticsDefaultMethodVisitor
448462
}
449463

464+
/**
465+
* 获取方法参数下标为 index 的对应 ASM index
466+
* @param types 方法参数类型数组
467+
* @param index 方法中参数下标,从 0 开始
468+
* @param isStaticMethod 该方法是否为静态方法
469+
* @return 访问该方法的 index 位参数的 ASM index
470+
*/
471+
int getVisitPosition(Type[] types, int index, boolean isStaticMethod) {
472+
if (types == null || index < 0 || index >= types.length) {
473+
throw new Error("getVisitPosition error")
474+
}
475+
if (index == 0) {
476+
return isStaticMethod ? 0 : 1
477+
} else {
478+
return getVisitPosition(types, index - 1, isStaticMethod) + types[index - 1].getSize()
479+
}
480+
}
450481
}

aop/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.zip.ZipEntry
4646

4747
class SensorsAnalyticsTransform extends Transform {
4848
private SensorsAnalyticsTransformHelper transformHelper
49-
public static final String VERSION = "3.1.1"
49+
public static final String VERSION = "3.1.2"
5050
public static final String MIN_SDK_VERSION = "3.0.0"
5151
private WaitableExecutor waitableExecutor
5252

0 commit comments

Comments
 (0)