前言
先看下各个平台自动化埋点支持
| 平台 |
特点 |
自动化埋点方案 |
|---|---|---|
| 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 at c9f1a5 in pkg/kernel
! meta 1.3
Flutter 无埋点SDK实战

本文介绍了如何在Flutter中实现无埋点SDK,详细阐述了利用AspectD进行编译期代码插桩,包括配置环境、修改build_tool、运行example、实现自动化埋点(点击事件、元素内容改变、页面曝光)以及可视化埋点。文章还提到了面临的问题和后续开发计划。
最低0.47元/天 解锁文章
1470

被折叠的 条评论
为什么被折叠?



