Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
lancexin opened this issue Nov 8, 2021 · 7 comments
Open

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

lancexin opened this issue Nov 8, 2021 · 7 comments

Comments

@lancexin
Copy link

lancexin commented Nov 8, 2021

项目地址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
Copy link

只要设置一下 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
Copy link

只要设置一下 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
Copy link

GvcZhang commented Nov 8, 2021

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

@littlezhuang
Copy link

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

@littlezhuang
Copy link

项目地址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
Copy link
Author

项目地址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
Copy link

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

朋友,二维码 过期了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants