@@ -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}
0 commit comments