前言
先看下各个平台自动化埋点支持
平台 |
特点 |
自动化埋点方案 |
---|---|---|
Android |
Java支持编译器静态代理/运行期动态代理 |
有成熟方案和产品,例如GrowingIO、神策、友盟 |
iOS |
OC提供了强大的运行时和动态性 |
有成熟方案和产品,例如GrowingIO、神策、友盟 |
Flutter |
Dart反射支持很弱,Flutter禁用了反射机制,考虑从编译期代码插桩实现 |
无成熟方案和产品 |
从编译期进行代码插桩,则需要修改编译期的中间件文件。
Dart文件
编译会先编译成Dill文件
,然后再编译成二进制代码。
如果能在编译器拿到Dill
文件,然后进行修改插桩,再进行编译成Binary Code
就可以达到AOP埋点的效果
flutter_tool
是flutter的编译工具,其并没有提供接口供开发者hook,以及修改编译流程,那么要实现这个步骤,我们就需要修改flutter_tool
这个工具。
闲鱼的AspectD
就使用了这个思想GitHub - XianyuTech/aspectd: AOP for Flutter(Dart)
基于闲鱼的ApectD来开展后续的工作,这里的 Flutter SDK 完全依赖于原生 SDK,不具有单独运行的能力。
AspectD的使用
首先配置好flutter
环境(flutter sdk、dart sdk、fvm、环境变量等),这里使用版本信息如下:
• Flutter version 2.2.2 at /Users/sheng/GrowIO/flutter
• Framework revision d79295af24 (4 months ago), 2021-06-11 08:56:01 -0700
• Engine revision 91c9fc8fe0
• Dart version 2.13.3
• Pub download mirror https://pub.flutter-io.cn
• Flutter download mirror https://storage.flutter-io.cn
1. 下拉aspectd仓库
这里我们对aspectd进行了部分修改,以满足我们的无埋点要求。
git clone https://github.com/growingio/aspectd.git
2. 修改build_tool,通过git patch方式
-
git patch
cd path-for-flutter-git-repo
git apply --3way path-for-aspectd-package/0001-aspectd.patch
rm bin/cache/flutter_tools.stamp
path-for-flutter-git-repo表示flutter的路径
path-for-aspectd-package表示aspectd的路径
这里可能会存在git apply
错误的情况,可以打开0001-aspectd.patch
文件,根据变动自行添加修改。
AspectD
通过改写Flutter
中的flutter_tools
进行修改Dill文件
,变动了两个文件:
-
flutter/packages/flutter_tools/lib/src/aspectd.dart
添加 -
flutter/packages/flutter_tools/lib/src/build_system/targets/common.dart
修改
AspectD
通过git patch
方式,给flutter的分支添加了这些变动。
-
环境设置
在 ~/.bash_profile
文件中添加
export PUB_HOSTED_URL=https://pub.flutter-io.cn //国内用户需要设置
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn //国内用户需要设置
注:git@github.com: Permission denied 问题,需要你设置ssl证书
然后在aspectd
根目录执行 flutter pub get
sheng@chengpengdeMacBook-Pro aspectd % flutter pub get
[KWLM]:pub get
Warning: You are using these overridden dependencies:
! kernel 0.0.0 from git git@github.com:XianyuTech/sdk.git