闲鱼团队近日开源分享了一款 flutter aop 框架 AspectD,使得在 flutter 应用 AOP (面向切面编程) 成为可能。
笔者对 AOP 的理解是,在做日志、埋点追踪、安全检查时使用 AOP 可以在不扰乱正常业务代码的情况下添加想要的功能。
另外,在闲鱼团队的介绍文章中也提到,基于 AOP 可以对 flutter 执行非侵入式框架改造,这样可以实现例如自动化录制回放的功能。
本文将基于官方 repo 和官方微信推送文章《重磅开源|AOP for Flutter开发利器——AspectD》以及笔者实际上手运行的体验介绍对其的理解。
AspectD 通过在编译期操纵 AST 抽象语法树,达到对指定函数、方法添加调用监视和增加额外逻辑的目的。
引入 AspectD 将对项目结构产生一定改变,同时也要修改 flutter_tools 的少量源码。引入完成后,
运行项目的方式及入口与引入前一致。
假设引入前项目结构是
└─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 主要是通过在 build 环节增加对 AST 的操作所实现,所以在我们使用 flutter 编译项目时需要添加额外步骤。
这通过修改 flutter_tools 包来实现。主要在这个包中的 build 函数中增加了 AspectD 编译相关的调用(hook)。
笔者觉得这样对标准工具的相关的修改算是比较小,可以接受。
闲鱼团队提供的这款工具可以实现 AOP 编程,有利于保持业务逻辑的清晰。
目前框架引入的门槛略高,需要打 git patch 到 flutter_tools 上,相应版本的配合指定得也还不明确。
总体上是一个很实用的框架。