@@ -193,6 +193,7 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
193193
194194 // 访问权限是public并且非静态
195195 boolean pubAndNoStaticAccess
196+ boolean protectedAndNotStaticAccess
196197 ArrayList<Integer > localIds
197198 boolean shouldAddUCJS = false
198199
@@ -234,136 +235,157 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
234235 super . onMethodEnter()
235236 nameDesc = name + desc
236237 pubAndNoStaticAccess = SensorsAnalyticsUtil . isPublic(access) && ! SensorsAnalyticsUtil . isStatic(access)
237- if ((nameDesc == ' onClick(Landroid/view/View;)V' ) && pubAndNoStaticAccess) {
238- isOnClickMethod = true
239- variableID = newLocal(Type . getObjectType(" java/lang/Integer" ))
240- methodVisitor. visitVarInsn(ALOAD , 1 )
241- methodVisitor. visitVarInsn(ASTORE , variableID)
242- } else if (nameDesc == ' onItemClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)V' && pubAndNoStaticAccess) {
243- localIds = new ArrayList<> ()
244- isOnItemClickMethod = true
245-
246- int first = newLocal(Type . getObjectType(" android/widget/AdapterView" ))
247- methodVisitor. visitVarInsn(ALOAD , 1 )
248- methodVisitor. visitVarInsn(ASTORE , first)
249- localIds. add(first)
250-
251- int second = newLocal(Type . getObjectType(" android/view/View" ))
252- methodVisitor. visitVarInsn(ALOAD , 2 )
253- methodVisitor. visitVarInsn(ASTORE , second)
254- localIds. add(second)
255-
256- int third = newLocal(Type . INT_TYPE )
257- methodVisitor. visitVarInsn(ILOAD , 3 )
258- methodVisitor. visitVarInsn(ISTORE , third)
259- localIds. add(third)
260- } else if (pubAndNoStaticAccess && SensorsAnalyticsUtil . isInstanceOfFragment(mSuperName)
261- && SensorsAnalyticsHookConfig . FRAGMENT_METHODS . get(nameDesc) != null ) {
262- SensorsAnalyticsMethodCell sensorsAnalyticsMethodCell = SensorsAnalyticsHookConfig . FRAGMENT_METHODS . get(nameDesc)
263- localIds = new ArrayList<> ()
264- Type [] types = Type . getArgumentTypes(desc)
265- for (int i = 1 ; i < sensorsAnalyticsMethodCell. paramsCount; i++ ) {
266- int localId = newLocal(types[i - 1 ])
267- methodVisitor. visitVarInsn(sensorsAnalyticsMethodCell. opcodes. get(i), i)
268- methodVisitor. visitVarInsn(SensorsAnalyticsUtil . convertOpcodes(sensorsAnalyticsMethodCell. opcodes. get(i)), localId)
269- localIds. add(localId)
238+ protectedAndNotStaticAccess = SensorsAnalyticsUtil . isProtected(access) && ! SensorsAnalyticsUtil . isStatic(access)
239+ if (pubAndNoStaticAccess) {
240+ if ((nameDesc == ' onClick(Landroid/view/View;)V' )) {
241+ isOnClickMethod = true
242+ variableID = newLocal(Type . getObjectType(" java/lang/Integer" ))
243+ methodVisitor. visitVarInsn(ALOAD , 1 )
244+ methodVisitor. visitVarInsn(ASTORE , variableID)
245+ } else if (nameDesc == ' onItemClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)V' ) {
246+ localIds = new ArrayList<> ()
247+ isOnItemClickMethod = true
248+
249+ int first = newLocal(Type . getObjectType(" android/widget/AdapterView" ))
250+ methodVisitor. visitVarInsn(ALOAD , 1 )
251+ methodVisitor. visitVarInsn(ASTORE , first)
252+ localIds. add(first)
253+
254+ int second = newLocal(Type . getObjectType(" android/view/View" ))
255+ methodVisitor. visitVarInsn(ALOAD , 2 )
256+ methodVisitor. visitVarInsn(ASTORE , second)
257+ localIds. add(second)
258+
259+ int third = newLocal(Type . INT_TYPE )
260+ methodVisitor. visitVarInsn(ILOAD , 3 )
261+ methodVisitor. visitVarInsn(ISTORE , third)
262+ localIds. add(third)
263+ } else if (SensorsAnalyticsUtil . isInstanceOfFragment(mSuperName)
264+ && SensorsAnalyticsHookConfig . FRAGMENT_METHODS . get(nameDesc) != null ) {
265+ SensorsAnalyticsMethodCell sensorsAnalyticsMethodCell = SensorsAnalyticsHookConfig . FRAGMENT_METHODS . get(nameDesc)
266+ localIds = new ArrayList<> ()
267+ Type [] types = Type . getArgumentTypes(desc)
268+ for (int i = 1 ; i < sensorsAnalyticsMethodCell. paramsCount; i++ ) {
269+ int localId = newLocal(types[i - 1 ])
270+ methodVisitor. visitVarInsn(sensorsAnalyticsMethodCell. opcodes. get(i), i)
271+ methodVisitor. visitVarInsn(SensorsAnalyticsUtil . convertOpcodes(sensorsAnalyticsMethodCell. opcodes. get(i)), localId)
272+ localIds. add(localId)
273+ }
274+ } else if (nameDesc == " onCheckedChanged(Landroid/widget/RadioGroup;I)V" ) {
275+ localIds = new ArrayList<> ()
276+ int firstLocalId = newLocal(Type . getObjectType(" android/widget/RadioGroup" ))
277+ methodVisitor. visitVarInsn(ALOAD , 1 )
278+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
279+ localIds. add(firstLocalId)
280+ int secondLocalId = newLocal(Type . INT_TYPE )
281+ methodVisitor. visitVarInsn(ILOAD , 2 )
282+ methodVisitor. visitVarInsn(ISTORE , secondLocalId)
283+ localIds. add(secondLocalId)
284+ } else if (nameDesc == " onCheckedChanged(Landroid/widget/CompoundButton;Z)V" ) {
285+ localIds = new ArrayList<> ()
286+ int firstLocalId = newLocal(Type . getObjectType(" android/widget/CompoundButton" ))
287+ methodVisitor. visitVarInsn(ALOAD , 1 )
288+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
289+ localIds. add(firstLocalId)
290+ } else if (nameDesc == " onClick(Landroid/content/DialogInterface;I)V" ) {
291+ localIds = new ArrayList<> ()
292+ int firstLocalId = newLocal(Type . getObjectType(" android/content/DialogInterface" ))
293+ methodVisitor. visitVarInsn(ALOAD , 1 )
294+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
295+ localIds. add(firstLocalId)
296+ int secondLocalId = newLocal(Type . INT_TYPE )
297+ methodVisitor. visitVarInsn(ILOAD , 2 )
298+ methodVisitor. visitVarInsn(ISTORE , secondLocalId)
299+ localIds. add(secondLocalId)
300+ } else if (SensorsAnalyticsUtil . isTargetMenuMethodDesc(nameDesc)) {
301+ localIds = new ArrayList<> ()
302+ int firstLocalId = newLocal(Type . getObjectType(" java/lang/Object" ))
303+ methodVisitor. visitVarInsn(ALOAD , 0 )
304+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
305+ localIds. add(firstLocalId)
306+ int secondLocalId = newLocal(Type . getObjectType(" android/view/MenuItem" ))
307+ methodVisitor. visitVarInsn(ALOAD , 1 )
308+ methodVisitor. visitVarInsn(ASTORE , secondLocalId)
309+ localIds. add(secondLocalId)
310+ } else if (nameDesc == " onMenuItemClick(Landroid/view/MenuItem;)Z" ) {
311+ localIds = new ArrayList<> ()
312+ int firstLocalId = newLocal(Type . getObjectType(" android/view/MenuItem" ))
313+ methodVisitor. visitVarInsn(ALOAD , 1 )
314+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
315+ localIds. add(firstLocalId)
316+ } else if (nameDesc == " onGroupClick(Landroid/widget/ExpandableListView;Landroid/view/View;IJ)Z" ) {
317+ localIds = new ArrayList<> ()
318+ int firstLocalId = newLocal(Type . getObjectType(" android/widget/ExpandableListView" ))
319+ methodVisitor. visitVarInsn(ALOAD , 1 )
320+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
321+ localIds. add(firstLocalId)
322+
323+ int secondLocalId = newLocal(Type . getObjectType(" android/view/View" ))
324+ methodVisitor. visitVarInsn(ALOAD , 2 )
325+ methodVisitor. visitVarInsn(ASTORE , secondLocalId)
326+ localIds. add(secondLocalId)
327+
328+ int thirdLocalId = newLocal(Type . INT_TYPE )
329+ methodVisitor. visitVarInsn(ILOAD , 3 )
330+ methodVisitor. visitVarInsn(ISTORE , thirdLocalId)
331+ localIds. add(thirdLocalId)
332+ } else if (nameDesc == " onChildClick(Landroid/widget/ExpandableListView;Landroid/view/View;IIJ)Z" ) {
333+ localIds = new ArrayList<> ()
334+ int firstLocalId = newLocal(Type . getObjectType(" android/widget/ExpandableListView" ))
335+ methodVisitor. visitVarInsn(ALOAD , 1 )
336+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
337+ localIds. add(firstLocalId)
338+
339+ int secondLocalId = newLocal(Type . getObjectType(" android/view/View" ))
340+ methodVisitor. visitVarInsn(ALOAD , 2 )
341+ methodVisitor. visitVarInsn(ASTORE , secondLocalId)
342+ localIds. add(secondLocalId)
343+
344+ int thirdLocalId = newLocal(Type . INT_TYPE )
345+ methodVisitor. visitVarInsn(ILOAD , 3 )
346+ methodVisitor. visitVarInsn(ISTORE , thirdLocalId)
347+ localIds. add(thirdLocalId)
348+
349+ int fourthLocalId = newLocal(Type . INT_TYPE )
350+ methodVisitor. visitVarInsn(ILOAD , 4 )
351+ methodVisitor. visitVarInsn(ISTORE , fourthLocalId)
352+ localIds. add(fourthLocalId)
353+ } else if (nameDesc == " onItemSelected(Landroid/widget/AdapterView;Landroid/view/View;IJ)V"
354+ || nameDesc == " onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V" ) {
355+ localIds = new ArrayList<> ()
356+ int firstLocalId = newLocal(Type . getObjectType(" java/lang/Object" ))
357+ methodVisitor. visitVarInsn(ALOAD , 1 )
358+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
359+ localIds. add(firstLocalId)
360+
361+ int secondLocalId = newLocal(Type . getObjectType(" android/view/View" ))
362+ methodVisitor. visitVarInsn(ALOAD , 2 )
363+ methodVisitor. visitVarInsn(ASTORE , secondLocalId)
364+ localIds. add(secondLocalId)
365+
366+ int thirdLocalId = newLocal(Type . INT_TYPE )
367+ methodVisitor. visitVarInsn(ILOAD , 3 )
368+ methodVisitor. visitVarInsn(ISTORE , thirdLocalId)
369+ localIds. add(thirdLocalId)
370+ }
371+ } else if (protectedAndNotStaticAccess) {
372+ if (nameDesc == " onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V" ) {
373+ localIds = new ArrayList<> ()
374+ int firstLocalId = newLocal(Type . getObjectType(" java/lang/Object" ))
375+ methodVisitor. visitVarInsn(ALOAD , 1 )
376+ methodVisitor. visitVarInsn(ASTORE , firstLocalId)
377+ localIds. add(firstLocalId)
378+
379+ int secondLocalId = newLocal(Type . getObjectType(" android/view/View" ))
380+ methodVisitor. visitVarInsn(ALOAD , 2 )
381+ methodVisitor. visitVarInsn(ASTORE , secondLocalId)
382+ localIds. add(secondLocalId)
383+
384+ int thirdLocalId = newLocal(Type . INT_TYPE )
385+ methodVisitor. visitVarInsn(ILOAD , 3 )
386+ methodVisitor. visitVarInsn(ISTORE , thirdLocalId)
387+ localIds. add(thirdLocalId)
270388 }
271- } else if (nameDesc == " onCheckedChanged(Landroid/widget/RadioGroup;I)V" && pubAndNoStaticAccess) {
272- localIds = new ArrayList<> ()
273- int firstLocalId = newLocal(Type . getObjectType(" android/widget/RadioGroup" ))
274- methodVisitor. visitVarInsn(ALOAD , 1 )
275- methodVisitor. visitVarInsn(ASTORE , firstLocalId)
276- localIds. add(firstLocalId)
277- int secondLocalId = newLocal(Type . INT_TYPE )
278- methodVisitor. visitVarInsn(ILOAD , 2 )
279- methodVisitor. visitVarInsn(ISTORE , secondLocalId)
280- localIds. add(secondLocalId)
281- } else if (nameDesc == " onCheckedChanged(Landroid/widget/CompoundButton;Z)V" && pubAndNoStaticAccess) {
282- localIds = new ArrayList<> ()
283- int firstLocalId = newLocal(Type . getObjectType(" android/widget/CompoundButton" ))
284- methodVisitor. visitVarInsn(ALOAD , 1 )
285- methodVisitor. visitVarInsn(ASTORE , firstLocalId)
286- localIds. add(firstLocalId)
287- } else if (nameDesc == " onClick(Landroid/content/DialogInterface;I)V" && pubAndNoStaticAccess) {
288- localIds = new ArrayList<> ()
289- int firstLocalId = newLocal(Type . getObjectType(" android/content/DialogInterface" ))
290- methodVisitor. visitVarInsn(ALOAD , 1 )
291- methodVisitor. visitVarInsn(ASTORE , firstLocalId)
292- localIds. add(firstLocalId)
293- int secondLocalId = newLocal(Type . INT_TYPE )
294- methodVisitor. visitVarInsn(ILOAD , 2 )
295- methodVisitor. visitVarInsn(ISTORE , secondLocalId)
296- localIds. add(secondLocalId)
297- } else if (SensorsAnalyticsUtil . isTargetMenuMethodDesc(nameDesc) && pubAndNoStaticAccess) {
298- localIds = new ArrayList<> ()
299- int firstLocalId = newLocal(Type . getObjectType(" java/lang/Object" ))
300- methodVisitor. visitVarInsn(ALOAD , 0 )
301- methodVisitor. visitVarInsn(ASTORE , firstLocalId)
302- localIds. add(firstLocalId)
303- int secondLocalId = newLocal(Type . getObjectType(" android/view/MenuItem" ))
304- methodVisitor. visitVarInsn(ALOAD , 1 )
305- methodVisitor. visitVarInsn(ASTORE , secondLocalId)
306- localIds. add(secondLocalId)
307- } else if (nameDesc == " onMenuItemClick(Landroid/view/MenuItem;)Z" && pubAndNoStaticAccess) {
308- localIds = new ArrayList<> ()
309- int firstLocalId = newLocal(Type . getObjectType(" android/view/MenuItem" ))
310- methodVisitor. visitVarInsn(ALOAD , 1 )
311- methodVisitor. visitVarInsn(ASTORE , firstLocalId)
312- localIds. add(firstLocalId)
313- } else if (nameDesc == " onGroupClick(Landroid/widget/ExpandableListView;Landroid/view/View;IJ)Z" ) {
314- localIds = new ArrayList<> ()
315- int firstLocalId = newLocal(Type . getObjectType(" android/widget/ExpandableListView" ))
316- methodVisitor. visitVarInsn(ALOAD , 1 )
317- methodVisitor. visitVarInsn(ASTORE , firstLocalId)
318- localIds. add(firstLocalId)
319-
320- int secondLocalId = newLocal(Type . getObjectType(" android/view/View" ))
321- methodVisitor. visitVarInsn(ALOAD , 2 )
322- methodVisitor. visitVarInsn(ASTORE , secondLocalId)
323- localIds. add(secondLocalId)
324-
325- int thirdLocalId = newLocal(Type . INT_TYPE )
326- methodVisitor. visitVarInsn(ILOAD , 3 )
327- methodVisitor. visitVarInsn(ISTORE , thirdLocalId)
328- localIds. add(thirdLocalId)
329- } else if (nameDesc == " onChildClick(Landroid/widget/ExpandableListView;Landroid/view/View;IIJ)Z" ) {
330- localIds = new ArrayList<> ()
331- int firstLocalId = newLocal(Type . getObjectType(" android/widget/ExpandableListView" ))
332- methodVisitor. visitVarInsn(ALOAD , 1 )
333- methodVisitor. visitVarInsn(ASTORE , firstLocalId)
334- localIds. add(firstLocalId)
335-
336- int secondLocalId = newLocal(Type . getObjectType(" android/view/View" ))
337- methodVisitor. visitVarInsn(ALOAD , 2 )
338- methodVisitor. visitVarInsn(ASTORE , secondLocalId)
339- localIds. add(secondLocalId)
340-
341- int thirdLocalId = newLocal(Type . INT_TYPE )
342- methodVisitor. visitVarInsn(ILOAD , 3 )
343- methodVisitor. visitVarInsn(ISTORE , thirdLocalId)
344- localIds. add(thirdLocalId)
345-
346- int fourthLocalId = newLocal(Type . INT_TYPE )
347- methodVisitor. visitVarInsn(ILOAD , 4 )
348- methodVisitor. visitVarInsn(ISTORE , fourthLocalId)
349- localIds. add(fourthLocalId)
350- } else if (nameDesc == " onItemSelected(Landroid/widget/AdapterView;Landroid/view/View;IJ)V"
351- || nameDesc == " onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V" ) {
352- localIds = new ArrayList<> ()
353- int firstLocalId = newLocal(Type . getObjectType(" java/lang/Object" ))
354- methodVisitor. visitVarInsn(ALOAD , 1 )
355- methodVisitor. visitVarInsn(ASTORE , firstLocalId)
356- localIds. add(firstLocalId)
357-
358- int secondLocalId = newLocal(Type . getObjectType(" android/view/View" ))
359- methodVisitor. visitVarInsn(ALOAD , 2 )
360- methodVisitor. visitVarInsn(ASTORE , secondLocalId)
361- localIds. add(secondLocalId)
362-
363- int thirdLocalId = newLocal(Type . INT_TYPE )
364- methodVisitor. visitVarInsn(ILOAD , 3 )
365- methodVisitor. visitVarInsn(ISTORE , thirdLocalId)
366- localIds. add(thirdLocalId)
367389 }
368390
369391 // Lambda 参数优化部分,对现有参数进行复制
@@ -496,6 +518,17 @@ class SensorsAnalyticsClassVisitor extends ClassVisitor {
496518 }
497519
498520 if (! pubAndNoStaticAccess) {
521+ // 如果是 protected 那么也需要处理
522+ if (protectedAndNotStaticAccess) {
523+ if (nameDesc == " onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V" ) {
524+ methodVisitor. visitVarInsn(ALOAD , localIds. get(0 ))
525+ methodVisitor. visitVarInsn(ALOAD , localIds. get(1 ))
526+ methodVisitor. visitVarInsn(ILOAD , localIds. get(2 ))
527+ methodVisitor. visitMethodInsn(INVOKESTATIC , SensorsAnalyticsHookConfig . SENSORS_ANALYTICS_API , " trackListView" , " (Landroid/widget/AdapterView;Landroid/view/View;I)V" , false )
528+ isHasTracked = true
529+ return
530+ }
531+ }
499532 return
500533 }
501534
0 commit comments