Flutter aspectd (二)源码解析

本文深入解析Flutter插件aspectd的源码,包括检查aspectd_impl目录、生成frontend_server.dart.snapshot、运行buildDillCommand。aspectd主要任务是根据注解将额外代码插入到dart编译的dill文件中,通过替换flutter SDK中的frontend_server.dart.snapshot实现。
摘要由CSDN通过智能技术生成

引导

在上一篇文章中,我们进行了apply patch文件,那么我们来看看apply的文件,具体做了哪些事情。可以看到是在common.dart文件做了更改,和新加了一个aspectd.dart文件

common.dart文件

该文件所在目录:

packages/flutter_tools/lib/build_system/targets/common.dart

可以看到在build方法新增了如下代码:

 @override
  Future<void> build(Environment environment) async {
    // 这是原来的代码
    await buildImpl(environment);
    // 这是新增代码
    if (await AspectdHook.isAspectdEnabled()) {
        await AspectdHook().runBuildDillCommand(environment);
    }
  }

AspectdHook.isAspectdEnabled()

上面代码调用了AspectdHook.isAspectdEnabled(),看看这里面做了什么

  static Future<bool> isAspectdEnabled() async {
    final Directory currentDirectory = globals.fs.currentDirectory;
    
    // 获取到aspectd_impl对应的目录,详情见下面
    final Directory aspectdDirectory = getAspectdImplDirectory(currentDirectory);
    // 如果该目录不存在,返回false,不走aspectd逻辑
    if (!aspectdDirectory.existsSync()) {
      return false;
    }
    
    // 拿到aspectd_imple项目下的.packages文件,因为要取该文件,所以我们需要先执行 pub get
    final String aspectdImplPackagesPath = globals.fs.path.join(aspectdDirectory.absolute.path, '.packages');
    // 通过.package文件中的数据,得到aspectd目录,从而得到frontend_server.dart.snapshot所在的目录,具体见下方
    final Directory flutterFrontendServerDirectory = await getFlutterFrontendServerDirectory(aspectdImplPackagesPath);
    
    // 判断如果aspectd_impl项目不存在或frontend_server.dart.snapshot对应目录不存在 及 对应的文件不存在的话返回false
    if (!(aspectdDirectory.existsSync() &&
        flutterFrontendServerDirectory.existsSync() &&
        currentDirectory.absolute.path != aspectdDirectory.absolute.path &&
        globals.fs
            .file(globals.fs.path.join(aspectdDirectory.path, 'pubspec.yaml'))
            .existsSync() &&
        globals.fs
            .file(
            globals.fs.path.join(aspectdDirectory.path, '.packages'))
            .existsSync() &&
        globals.fs
            .file(globals.fs.path.join(
            aspectdDirectory.path, 'lib', aspectdImplPackageName + '.dart'))
            .existsSync())) {
      return false;
    }
    // 生成frontend_server.dart.snapshot,具体见下方
    return await checkAspectdFlutterFrontendServerSnapshot(aspectdImplPackagesPath);
  }
下面就是获取到aspectd_impl目录的具体方法

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值