当前位置: 首页 > 工具软件 > AspectD > 使用案例 >

Flutter AOP 框架 AspectD 理念介绍

缪英锐
2023-12-01

Flutter AOP 框架 AspectD 理念介绍

引子

闲鱼团队近日开源分享了一款 flutter aop 框架 AspectD,使得在 flutter 应用 AOP (面向切面编程) 成为可能。

笔者对 AOP 的理解是,在做日志、埋点追踪、安全检查时使用 AOP 可以在不扰乱正常业务代码的情况下添加想要的功能。

另外,在闲鱼团队的介绍文章中也提到,基于 AOP 可以对 flutter 执行非侵入式框架改造,这样可以实现例如自动化录制回放的功能。

本文将基于官方 repo 和官方微信推送文章《重磅开源|AOP for Flutter开发利器——AspectD》以及笔者实际上手运行的体验介绍对其的理解。

框架整体理念

AspectD 通过在编译期操纵 AST 抽象语法树,达到对指定函数、方法添加调用监视和增加额外逻辑的目的。

引入 AspectD 将对项目结构产生一定改变,同时也要修改 flutter_tools 的少量源码。引入完成后,
运行项目的方式及入口与引入前一致。

AspectD 对项目结构的具体影响

假设引入前项目结构是

└─example
    │  pubspec.yaml
    │
    ├─android
    ├─ios
    └─lib
            main.dart  // 这是项目原有的入口

引入 AOP 之后的结构是

└─example
    │  pubspec.yaml
    │
    ├─android
    ├─aop
    │  │  pubspec.yaml
    │  │
    │  ├─android
    │  ├─ios
    │  └─lib
    │          aop.dart
    │
    ├─ios
    └─lib
            main.dart // 这依然是项目的入口

可以看到,引入 aop 相当于新引入了一个包(package)。AspectD 约定此包名为 aop(也支持自定义),此包的入口约定为 aop.dart

这样实际上就把 aop 中的 logging 或者其他各种逻辑与业务逻辑不光从逻辑上,而且从物理上隔离开了。

AspectD 对 flutter_tools 的影响

AspectD 主要是通过在 build 环节增加对 AST 的操作所实现,所以在我们使用 flutter 编译项目时需要添加额外步骤。
这通过修改 flutter_tools 包来实现。主要在这个包中的 build 函数中增加了 AspectD 编译相关的调用(hook)。

笔者觉得这样对标准工具的相关的修改算是比较小,可以接受。

小结

闲鱼团队提供的这款工具可以实现 AOP 编程,有利于保持业务逻辑的清晰。

目前框架引入的门槛略高,需要打 git patch 到 flutter_tools 上,相应版本的配合指定得也还不明确。

总体上是一个很实用的框架。

 类似资料: