MethodLifeCycleVisitor.groovy 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package com.gradle.ares
  2. import org.objectweb.asm.ClassVisitor
  3. import org.objectweb.asm.ClassWriter
  4. import org.objectweb.asm.Label
  5. import org.objectweb.asm.MethodVisitor
  6. import org.objectweb.asm.Opcodes
  7. import org.objectweb.asm.commons.GeneratorAdapter
  8. /**
  9. * Created by Glen on 2017/2/8.
  10. */
  11. public class MethodLifeCycleVisitor extends GeneratorAdapter {
  12. public final static String LifeClass = "com/uddream/plugin/LifeCycleDelegate";
  13. public final static String[] SuperClass = [
  14. "android/app/Activity",
  15. "android/support/v4/app/FragmentActivity",
  16. "android/support/v7/app/AppCompatActivity",
  17. "android/support/v4/app/Fragment",
  18. "android/support/v4/app/ListFragment",
  19. "android/support/v4/app/DialogFragment",
  20. "android/app/Fragment",
  21. "android/app/ListFragment",
  22. "android/app/DialogFragment"
  23. ] as String[]
  24. public final static Agent[] Modify = [
  25. new Agent("\$getLifeCycleAresDelegate", "()L" + LifeClass + ";"),
  26. new Agent("onCreate", "(Landroid/os/Bundle;)V"),
  27. new Agent("onResume", "()V"),
  28. new Agent("onPause", "()V"),
  29. new Agent("onDestroy", "()V"),
  30. new Agent("onSaveInstanceState", "(Landroid/os/Bundle;)V"),
  31. new Agent("onRestoreInstanceState", "(Landroid/os/Bundle;)V"),
  32. new Agent("setUserVisibleHint", "(Z)V"),
  33. new Agent("onHiddenChanged", "(Z)V")
  34. ] as Agent[]
  35. public final static Agent getAgent(String superName, int access, String name, String desc) {
  36. for (String s : SuperClass) {
  37. if (s.equals(superName)) {
  38. for (Agent item : Modify) {
  39. if (item.name.equals(name) && item.desc.equals(desc)) {
  40. item.access = access
  41. return item
  42. }
  43. }
  44. break
  45. }
  46. }
  47. return null
  48. }
  49. public final static void addMethods(Set<Agent> agentSet, ClassVisitor cv) {
  50. cv.visitField(Opcodes.ACC_PUBLIC, "\$lifeCycleAresDelegate", "L" + MethodLifeCycleVisitor.LifeClass + ";", null, null)
  51. MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC, "\$getLifeCycleAresDelegate", "()Lcom/uddream/plugin/LifeCycleDelegate;", null, null)
  52. mv.visitCode()
  53. mv.visitVarInsn(Opcodes.ALOAD, 0)
  54. mv.visitFieldInsn(Opcodes.GETFIELD, "com/uddream/plugin/LifeCycleDelegate", "\$lifeCycleAresDelegate", "Lcom/uddream/plugin/LifeCycleDelegate;")
  55. Label label = new Label()
  56. mv.visitJumpInsn(Opcodes.IFNONNULL, label)
  57. mv.visitVarInsn(Opcodes.ALOAD, 0)
  58. mv.visitVarInsn(Opcodes.ALOAD, 0)
  59. mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/uddream/plugin/LifeCycleDelegate", "create", "(Ljava/lang/Object;)Lcom/uddream/plugin/LifeCycleDelegate;", false)
  60. mv.visitFieldInsn(Opcodes.PUTFIELD, "com/uddream/plugin/LifeCycleDelegate", "\$lifeCycleAresDelegate", "Lcom/uddream/plugin/LifeCycleDelegate;")
  61. mv.visitLabel(label)
  62. mv.visitVarInsn(Opcodes.ALOAD, 0)
  63. mv.visitFieldInsn(Opcodes.GETFIELD, "com/uddream/plugin/LifeCycleDelegate", "\$lifeCycleAresDelegate", "Lcom/uddream/plugin/LifeCycleDelegate;")
  64. mv.visitInsn(Opcodes.ARETURN)
  65. mv.visitMaxs(0, 0)
  66. mv.visitEnd()
  67. }
  68. private int pCount;
  69. private Agent agent;
  70. MethodLifeCycleVisitor(MethodVisitor mv, Agent agent) {
  71. super(Opcodes.ASM5, mv, agent.access, agent.name, agent.desc)
  72. this.agent = agent
  73. for (def item : agent.desc.substring(1, agent.desc.indexOf(")")).split(";")) {
  74. if (!item.equals("")) this.pCount++
  75. }
  76. }
  77. @Override
  78. void visitCode() {
  79. super.visitCode()
  80. //for (int i = 0; i < pCount; i++) loadArg(i)
  81. //visitMethodInsn(Opcodes.INVOKESTATIC, LifeClass, agent.name, agent.desc, false)
  82. }
  83. @Override
  84. public void visitInsn(int opcode) {
  85. if (opcode == Opcodes.RETURN) {
  86. //for (int i = 0; i < pCount; i++) loadArg(i)
  87. //visitMethodInsn(Opcodes.INVOKESTATIC, LifeClass, agent.name, agent.desc, false)
  88. }
  89. super.visitInsn(opcode);
  90. }
  91. }