XianyuTech / aspectd

AOP for Flutter(Dart)
MIT License
1.1k stars 123 forks source link

我适配了2.5.4,大大简化了注入逻辑 #136

Open lancexin opened 2 years ago

lancexin commented 2 years ago

项目地址https://github.com/lancexin/aspect_frontend_server 现在暂时只支持execute模式

该方法和aspectd的区别

  1. aspectd不支持flutter 2.5.3,本项目是基于flutter 2.5.3测试
  2. aspectd的编译需要对dart sdk中的vm进行修改,本项目不需要
  3. aspectd使用前需要对flutter tools的代码进行修改,本项目只需要替换flutter sdk对应的frontend_server.dart.snapshot即可
  4. aspectd的实现原理过于复杂,本项目去掉了Call,Inject等用法保留了Execute用法的同时对注入逻辑进行了简化
  5. aspectd还需要aspect_impl等,本项目可以直接在主程序代码中添加注入代码,也可以用plugin的方式添加
  6. 本项目不需要引入任何第三方包,用pragma注解完成对应插桩
  7. 可以有限制支持hot reload,完全支持hot restart,免去了冷重启的烦恼
  8. 为了性能优化inject方法限制必须是static的

为什么用pragma注解,而不是自定义注解?

本项目是在aot优化后再对字节码进行修改,aot优化后只有白名单中的注解才能被识别到,pragma是在白名单中的注解.

AugustToko commented 2 years ago

只要设置一下 Procedure 的 parent 然后 将对应的 Procedure 传到 InstanceInvocation 即可完成转换, 具体可以参考我的fork

    // ...

    //目标新建stub函数,方便完成目标->aopstub->目标stub链路
    final Procedure originalStubProcedure = AopUtils.createStubProcedure(
        Name(originalProcedure.name.text + '_' + stubKey, originalProcedure.name.library),
        aopItemInfo,
        originalProcedure,
        body,
        shouldReturn,
    )..parent = originalProcedure.parent;

    // ...

    final mockedInvocation = InstanceInvocation(
        InstanceAccessKind.Instance,
        AsExpression(
          AopUtils.getPointCutClassInstanceGet(pointcutClass, 'target'),
          InterfaceType(originalClass, Nullability.nonNullable),
        ),
        originalStubProcedure.name,
        AopUtils.concatArguments4PointcutStubCall(originalProcedure),
        interfaceTarget: originalStubProcedure,
        functionType: originalStubProcedure.getterType as FunctionType
    );

    //...
AugustToko commented 2 years ago

只要设置一下 Procedure 的 parent 然后 将对应的 Procedure 传到 InstanceInvocation 即可完成转换, 具体可以参考我的fork

    // ...

    //目标新建stub函数,方便完成目标->aopstub->目标stub链路
    final Procedure originalStubProcedure = AopUtils.createStubProcedure(
        Name(originalProcedure.name.text + '_' + stubKey, originalProcedure.name.library),
        aopItemInfo,
        originalProcedure,
        body,
        shouldReturn,
    )..parent = originalProcedure.parent;

    // ...

    final mockedInvocation = InstanceInvocation(
        InstanceAccessKind.Instance,
        AsExpression(
          AopUtils.getPointCutClassInstanceGet(pointcutClass, 'target'),
          InterfaceType(originalClass, Nullability.nonNullable),
        ),
        originalStubProcedure.name,
        AopUtils.concatArguments4PointcutStubCall(originalProcedure),
        interfaceTarget: originalStubProcedure,
        functionType: originalStubProcedure.getterType as FunctionType
    );

    //...

目前已经迁移了 call execute (构造器 hook 没搞,暂时用不到, 实例方法和静态方法简单测了 可以用)

GvcZhang commented 2 years ago

WechatIMG2 感兴趣的同学,加群,以上都在群里。

littlezhuang commented 2 years ago

2.5.4版本在哪里下的?我看flutter最新版本只支持到了2.5.3呀

littlezhuang commented 2 years ago

项目地址https://github.com/lancexin/aspect_frontend_server 现在暂时只支持execute模式

该方法和aspectd的区别

  1. aspectd不支持flutter 2.5.4,本项目是基于flutter 2.5.4测试
  2. aspectd的编译需要对dart sdk中的vm进行修改,本项目不需要
  3. aspectd使用前需要对flutter tools的代码进行修改,本项目只需要替换flutter sdk对应的frontend_server.dart.snapshot即可
  4. aspectd的实现原理过于复杂,本项目去掉了Call,Inject等用法保留了Execute用法的同时对注入逻辑进行了简化
  5. aspectd还需要aspect_impl等,本项目可以直接在主程序代码中添加注入代码,也可以用plugin的方式添加
  6. 本项目不需要引入任何第三方包,用pragma注解完成对应插桩
  7. 可以有限制支持hot reload,完全支持hot restart,免去了冷重启的烦恼
  8. 为了性能优化inject方法限制必须是static的

为什么用pragma注解,而不是自定义注解?

本项目是在aot优化后再对字节码进行修改,aot优化后只有白名单中的注解才能被识别到,pragma是在白名单中的注解.

2.5.4版本在哪里下的呀,我看最新版本只支持到了2.5.3呀

lancexin commented 2 years ago

项目地址https://github.com/lancexin/aspect_frontend_server 现在暂时只支持execute模式

该方法和aspectd的区别

  1. aspectd不支持flutter 2.5.4,本项目是基于flutter 2.5.4测试
  2. aspectd的编译需要对dart sdk中的vm进行修改,本项目不需要
  3. aspectd使用前需要对flutter tools的代码进行修改,本项目只需要替换flutter sdk对应的frontend_server.dart.snapshot即可
  4. aspectd的实现原理过于复杂,本项目去掉了Call,Inject等用法保留了Execute用法的同时对注入逻辑进行了简化
  5. aspectd还需要aspect_impl等,本项目可以直接在主程序代码中添加注入代码,也可以用plugin的方式添加
  6. 本项目不需要引入任何第三方包,用pragma注解完成对应插桩
  7. 可以有限制支持hot reload,完全支持hot restart,免去了冷重启的烦恼
  8. 为了性能优化inject方法限制必须是static的

为什么用pragma注解,而不是自定义注解?

本项目是在aot优化后再对字节码进行修改,aot优化后只有白名单中的注解才能被识别到,pragma是在白名单中的注解.

2.5.4版本在哪里下的呀,我看最新版本只支持到了2.5.3呀

flutter是 2.5.3

bladeofgod commented 2 years ago

WechatIMG2 感兴趣的同学,加群,以上都在群里。

朋友,二维码 过期了