1- /* *Created by wangzhuozhou on 2015/08/01.
2- * Copyright © 2015-2019 Sensors Data Inc. All rights reserved. */
1+ /*
2+ * Created by wangzhuohou on 2015/08/01.
3+ * Copyright 2015-2019 Sensors Data Inc.
4+ *
5+ * Licensed under the Apache License, Version 2.0 (the "License");
6+ * you may not use this file except in compliance with the License.
7+ * You may obtain a copy of the License at
8+ *
9+ * http://www.apache.org/licenses/LICENSE-2.0
10+ *
11+ * Unless required by applicable law or agreed to in writing, software
12+ * distributed under the License is distributed on an "AS IS" BASIS,
13+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+ * See the License for the specific language governing permissions and
15+ * limitations under the License.
16+ */
317
418package com.sensorsdata.analytics.android.plugin
519
@@ -30,7 +44,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
3044 return super . clone()
3145 }
3246
33- SensorsAnalyticsClassVisitor (final ClassVisitor classVisitor ,ClassNameAnalytics classNameAnalytics ,SensorsAnalyticsTransformHelper transformHelper ) {
47+ SensorsAnalyticsClassVisitor (final ClassVisitor classVisitor , ClassNameAnalytics classNameAnalytics , SensorsAnalyticsTransformHelper transformHelper ) {
3448 super (Opcodes . ASM5 , classVisitor)
3549 this . classVisitor = classVisitor
3650 this . classNameAnalytics = classNameAnalytics
@@ -102,7 +116,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
102116 }
103117
104118 for (cell in methodCells) {
105- transformHelper. sensorsAnalyticsHookConfig. " ${ cell.agentName} " (classVisitor,cell)
119+ transformHelper. sensorsAnalyticsHookConfig. " ${ cell.agentName} " (classVisitor, cell)
106120 }
107121
108122 Logger . info(" 结束扫描类:${ mClassName} \n " )
@@ -113,14 +127,14 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
113127 FieldVisitor visitField (int access , String name , String descriptor , String signature , Object value ) {
114128 if (classNameAnalytics. isSensorsDataAPI) {
115129 if (' VERSION' == name) {
116- String version = (String )value
130+ String version = (String ) value
117131 if (SensorsAnalyticsTransform . MIN_SDK_VERSION > version) {
118132 String errMessage = " 你目前集成的神策埋点 SDK 版本号为 v${ version} ,请升级到 v${ SensorsAnalyticsTransform.MIN_SDK_VERSION} 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android"
119133 Logger . error(errMessage)
120134 throw new Error (errMessage)
121135 }
122136 } else if (' MIN_PLUGIN_VERSION' == name) {
123- String minPluginVersion = (String )value
137+ String minPluginVersion = (String ) value
124138 if (minPluginVersion != " " && minPluginVersion != null ) {
125139 if (SensorsAnalyticsTransform . VERSION < minPluginVersion) {
126140 String errMessage = " 你目前集成的神策插件版本号为 v${ SensorsAnalyticsTransform.VERSION} ,请升级到 v${ minPluginVersion} 及以上的版本。详情请参考:https://github.com/sensorsdata/sa-sdk-android-plugin2"
@@ -132,8 +146,8 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
132146 }
133147 return super . visitField(access, name, descriptor, signature, value)
134148 }
135- /**
136- * 该方法是当扫描器扫描到类的方法时进行调用
149+ /**
150+ * 该方法是当扫描器扫描到类的方法时进行调用
137151 * @param access 表示方法的修饰符
138152 * @param name 表示方法名,在 ASM 中 “visitMethod” 方法会处理(构造方法、静态代码块、私有方法、受保护的方法、共有方法、native类型方法)。
139153 * 在这些范畴中构造方法的方法名为 “<init>”,静态代码块的方法名为 “<clinit>”。
@@ -162,6 +176,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
162176 int variableID = 0
163177 // nameDesc是'onClick(Landroid/view/View;)V'字符串
164178 boolean isOnClickMethod = false
179+ boolean isOnItemClickMethod = false
165180 // name + desc
166181 String nameDesc
167182
@@ -188,6 +203,11 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
188203 variableID = newLocal(Type . getObjectType(" java/lang/Integer" ))
189204 methodVisitor. visitVarInsn(ALOAD , 1 )
190205 methodVisitor. visitVarInsn(ASTORE , variableID)
206+ } else if (nameDesc == ' onItemClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)V' && pubAndNoStaticAccess) {
207+ isOnItemClickMethod = true
208+ variableID = newLocal(Type . getObjectType(" java/lang/Integer" ))
209+ methodVisitor. visitVarInsn(ALOAD , 1 )
210+ methodVisitor. visitVarInsn(ASTORE , variableID)
191211 }
192212 }
193213
@@ -319,11 +339,20 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
319339 }
320340
321341 if (mInterfaces != null && mInterfaces. length > 0 ) {
322- SensorsAnalyticsMethodCell sensorsAnalyticsMethodCell = SensorsAnalyticsHookConfig . sInterfaceMethods. get(nameDesc)
323- if (sensorsAnalyticsMethodCell != null && mInterfaces. contains(sensorsAnalyticsMethodCell. parent)) {
324- visitMethodWithLoadedParams(methodVisitor, Opcodes . INVOKESTATIC , SensorsAnalyticsHookConfig . sSensorsAnalyticsAPI, sensorsAnalyticsMethodCell. agentName, sensorsAnalyticsMethodCell. agentDesc, sensorsAnalyticsMethodCell. paramsStart, sensorsAnalyticsMethodCell. paramsCount, sensorsAnalyticsMethodCell. opcodes)
342+ if (isOnItemClickMethod && mInterfaces. contains(' android/widget/AdapterView$OnItemClickListener' )) {
343+ methodVisitor. visitVarInsn(ALOAD , variableID)
344+ methodVisitor. visitVarInsn(ALOAD , 2 )
345+ methodVisitor. visitVarInsn(ILOAD , 3 )
346+ methodVisitor. visitMethodInsn(INVOKESTATIC , SensorsAnalyticsHookConfig . sSensorsAnalyticsAPI, " trackListView" , " (Landroid/widget/AdapterView;Landroid/view/View;I)V" , false )
325347 isHasTracked = true
326348 return
349+ } else {
350+ SensorsAnalyticsMethodCell sensorsAnalyticsMethodCell = SensorsAnalyticsHookConfig . sInterfaceMethods. get(nameDesc)
351+ if (sensorsAnalyticsMethodCell != null && mInterfaces. contains(sensorsAnalyticsMethodCell. parent)) {
352+ visitMethodWithLoadedParams(methodVisitor, INVOKESTATIC , SensorsAnalyticsHookConfig . sSensorsAnalyticsAPI, sensorsAnalyticsMethodCell. agentName, sensorsAnalyticsMethodCell. agentDesc, sensorsAnalyticsMethodCell. paramsStart, sensorsAnalyticsMethodCell. paramsCount, sensorsAnalyticsMethodCell. opcodes)
353+ isHasTracked = true
354+ return
355+ }
327356 }
328357 }
329358
@@ -363,7 +392,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
363392 void visit (String key , Object value ) {
364393 super . visit(key, value)
365394 if (" eventName" == key) {
366- eventName = (String )value
395+ eventName = (String ) value
367396 } else if (" properties" == key) {
368397 eventProperties = value. toString()
369398 }
0 commit comments