1
+ package io.github.chao2zhang
2
+
3
+ import org.objectweb.asm.MethodVisitor
4
+ import org.objectweb.asm.Opcodes
5
+ import org.objectweb.asm.Opcodes.ASM9
6
+
7
+ /* *
8
+ * Add the following code after invoking `observer.onChanged`:
9
+ * ```
10
+ * Log.i("LiveData", "considerNotify() called with LiveData = " + this + " Observer = " + observer.mObserver + " Data = " + this.mData);
11
+ * ```
12
+ */
13
+ class LoggingLiveDataMethodVisitor (
14
+ private val methodVisitor : MethodVisitor
15
+ ) : MethodVisitor(ASM9 , methodVisitor) {
16
+
17
+ override fun visitMethodInsn (
18
+ opcode : Int ,
19
+ owner : String? ,
20
+ name : String? ,
21
+ descriptor : String? ,
22
+ isInterface : Boolean
23
+ ) {
24
+ methodVisitor.visitMethodInsn(opcode, owner, name, descriptor, isInterface)
25
+ if (opcode == Opcodes .INVOKEINTERFACE && owner == " androidx/lifecycle/Observer" && name == " onChanged" ) {
26
+ methodVisitor.visitLdcInsn(" LiveData" )
27
+ methodVisitor.visitTypeInsn(Opcodes .NEW , " java/lang/StringBuilder" )
28
+ methodVisitor.visitInsn(Opcodes .DUP )
29
+ methodVisitor.visitMethodInsn(Opcodes .INVOKESPECIAL , " java/lang/StringBuilder" , " <init>" , " ()V" , false )
30
+ methodVisitor.visitLdcInsn(" considerNotify() called with LiveData = " )
31
+ methodVisitor.visitMethodInsn(Opcodes .INVOKEVIRTUAL , " java/lang/StringBuilder" , " append" , " (Ljava/lang/String;)Ljava/lang/StringBuilder;" , false )
32
+ methodVisitor.visitVarInsn(Opcodes .ALOAD , 0 )
33
+ methodVisitor.visitMethodInsn(Opcodes .INVOKEVIRTUAL , " java/lang/StringBuilder" , " append" , " (Ljava/lang/Object;)Ljava/lang/StringBuilder;" , false )
34
+ methodVisitor.visitLdcInsn(" Observer = " )
35
+ methodVisitor.visitMethodInsn(Opcodes .INVOKEVIRTUAL , " java/lang/StringBuilder" , " append" , " (Ljava/lang/String;)Ljava/lang/StringBuilder;" , false )
36
+ methodVisitor.visitVarInsn(Opcodes .ALOAD , 1 )
37
+ methodVisitor.visitFieldInsn(Opcodes .GETFIELD , " androidx/lifecycle/LiveData\$ ObserverWrapper" , " mObserver" , " Landroidx/lifecycle/Observer;" )
38
+ methodVisitor.visitMethodInsn(Opcodes .INVOKEVIRTUAL , " java/lang/StringBuilder" , " append" , " (Ljava/lang/Object;)Ljava/lang/StringBuilder;" , false )
39
+ methodVisitor.visitLdcInsn(" Data = " )
40
+ methodVisitor.visitMethodInsn(Opcodes .INVOKEVIRTUAL , " java/lang/StringBuilder" , " append" , " (Ljava/lang/String;)Ljava/lang/StringBuilder;" , false )
41
+ methodVisitor.visitVarInsn(Opcodes .ALOAD , 0 )
42
+ methodVisitor.visitFieldInsn(Opcodes .GETFIELD , " androidx/lifecycle/LiveData" , " mData" , " Ljava/lang/Object;" )
43
+ methodVisitor.visitMethodInsn(Opcodes .INVOKEVIRTUAL , " java/lang/StringBuilder" , " append" , " (Ljava/lang/Object;)Ljava/lang/StringBuilder;" , false )
44
+ methodVisitor.visitMethodInsn(Opcodes .INVOKEVIRTUAL , " java/lang/StringBuilder" , " toString" , " ()Ljava/lang/String;" , false )
45
+ methodVisitor.visitMethodInsn(Opcodes .INVOKESTATIC , " android/util/Log" , " i" , " (Ljava/lang/String;Ljava/lang/String;)I" , false )
46
+ methodVisitor.visitInsn(Opcodes .POP )
47
+ }
48
+ }
49
+
50
+
51
+ override fun visitMaxs (maxStack : Int , maxLocals : Int ) {
52
+ methodVisitor.visitMaxs(3 , 2 )
53
+ }
54
+ }
0 commit comments