Dart - dill文件序列化为可读文本(续)

news2025/1/12 3:55:13

文章目录

  • 前言
  • 开发环境
  • app.dill文件
  • DEPS文件
  • 最后


前言

对前文Dart - dill文件序列化为可读文本做一些补充。

开发环境

  • macOS: 13.4
  • Dart: 3.0.5
  • Flutter: 3.10.5

app.dill文件

因为Flutter项目编译后会自动生成app.dill文件(位于项目根目录下的.dart_tool/flutter_build/xxx/app.dill路径),同时自动生成的app.dill文件能正常序列化为文本,所以不手动生成是没问题的。如果非要按照以下命令手动生成app.dill文件:

dart compile kernel lib/main.dart --output lib/app.dill

一般会报这样的错:

/xxx/flutter/packages/flutter/lib/src/material/animated_icons.dart:9:8: Error: Dart library 'dart:ui' is not available on this platform.
import 'dart:ui' as ui show Canvas, Paint, Path;
       ^
Context: The unavailable library 'dart:ui' is imported through these packages:

    package:untitled => package:flutter => dart:ui
    ...

Detailed import paths for (some of) the these imports:

    package:untitled/main.dart => package:flutter/material.dart => package:flutter/src/material/about.dart => package:flutter/foundation.dart => package:flutter/src/foundation/assertions.dart => package:flutter/src/foundation/diagnostics.dart => package:flutter/src/foundation/debug.dart => dart:ui
    ...

从报错信息看,似乎是因为使用了Flutter相关的库导致的。执行dart compile kernel -h命令看输出结果也没几个参数可以设置,难道Flutter编译项目时用的是其他命令?

在Flutter项目根目录路径下执行运行命令:

flutter run -v

-v参数的作用是打印执行命令过程中的日志。虽然日志很长,但是可以用app.dill为关键词搜索找到关键日志:

[   +1 ms] /xxx/flutter/bin/cache/dart-sdk/bin/dart --disable-dart-dev
/xxx/flutter/bin/cache/dart-sdk/bin/snapshots/frontend_server.dart.snapshot --sdk-root
/xxx/flutter/bin/cache/artifacts/engine/common/flutter_patched_sdk/ --incremental --target=flutter --experimental-emit-debug-metadata
-DFLUTTER_WEB_AUTO_DETECT=true -DFLUTTER_WEB_CANVASKIT_URL=https://www.gstatic.com/flutter-canvaskit/45f6e009110df4f34ec2cf99f63cf73b71b7a420/ --output-dill
/var/folders/_p/n8w3bslx2qg8sh057tm1hcmw0000gn/T/flutter_tools.pCnbY1/flutter_tool.BWP10J/app.dill --packages /xxx/untitled/.dart_tool/package_config.json
-Ddart.vm.profile=false -Ddart.vm.product=false --enable-asserts --track-widget-creation --filesystem-scheme org-dartlang-root --initialize-from-dill
build/4d25a1cda3833f76c80232d3b1a3704b.cache.dill.track.dill --verbosity=error --enable-experiment=alternative-invalidation-strategy

咦?竟然用的是frontend_server.dart.snapshot,这是Dart前端编译的快照文件。相比于dart compile kernel命令,可设置的参数就丰富多了。实测必须要指定的关键参数有两个,分别是--sdk-root--target

  • --sdk-root

指定SDK根路径,如果不设置会报一堆关于找不到库的错误,虽然最后能生成dill文件,但是序列化为文本后会出现很多Problems in library

screenshot1

  • --target

参数用于确定可用核心库的目标模型,默认是vm,必须设置为flutter。如果不设置会报这样的错:

Unhandled exception:
Null check operator used on a null value
#0      DillLoader.read (package:front_end/src/fasta/dill/dill_loader.dart:123:38)
#1      DillTarget.loadExtraRequiredLibraries (package:front_end/src/fasta/dill/dill_target.dart:60:14)
#2      DillLoader.read (package:front_end/src/fasta/dill/dill_loader.dart:138:16)
#3      DillLoader.appendLibraries (package:front_end/src/fasta/dill/dill_loader.dart:290:18)
#4      generateKernelInternal.<anonymous closure> (package:front_end/src/kernel_generator_impl.dart:84:27)
<asynchronous suspension>
#5      withCrashReporting (package:front_end/src/fasta/crash.dart:136:12)
<asynchronous suspension>
#6      kernelForProgramInternal.<anonymous closure> (package:front_end/src/api_prototype/kernel_generator.dart:62:29)
<asynchronous suspension>
#7      kernelForProgramInternal (package:front_end/src/api_prototype/kernel_generator.dart:61:10)
<asynchronous suspension>
#8      kernelForProgram (package:front_end/src/api_prototype/kernel_generator.dart:50:11)
<asynchronous suspension>
#9      compileToKernel (package:vm/kernel_front_end.dart:452:22)
<asynchronous suspension>
#10     FrontendCompiler.compile (package:frontend_server/frontend_server.dart:620:17)
<asynchronous suspension>
#11     starter (package:frontend_server/starter.dart:99:12)
<asynchronous suspension>
#12     main (file:///opt/s/w/ir/x/w/sdk/pkg/frontend_server/bin/frontend_server_starter.dart:13:14)
<asynchronous suspension>

最终得到的可用命令:

dart /xxx/flutter/bin/cache/dart-sdk/bin/snapshots/frontend_server.dart.snapshot --sdk-root /xxx/flutter/bin/cache/artifacts/engine/common/flutter_patched_sdk/ --target=flutter xxx.dart --output-dill xxx.dill

请根据实际需要替换命令中的Flutter SDK等路径。由于参数有所精简,所以用以上命令生成的app.dill文件(左侧)和Flutter编译自动生成的app.dill文件(右侧)有所差异,不过差别不大:

screenshot2

DEPS文件

前文中提到了DEPS文件,和pubspec.yaml文件相比,除了指定了项目的依赖项,还配置了hook用于在.dart_tool目录下生成package_config.json文件,而pubspec.yaml文件只是配置文件,package_config.json文件的生成需要借助dart pub get命令。

打开Dart SDK目录下的sdk/DEPS文件,脚本拉到最后面就是hook数组:

hooks = [
  {
    # Generate the .dart_tool/package_confg.json file.
    'name': 'Generate .dart_tool/package_confg.json',
    'pattern': '.',
    'action': ['python3', 'sdk/tools/generate_package_config.py'],
  },
  ...
]

当用于同步依赖项的gclient sync命令执行结束后会执行这些hook。首个hook就是用于生成package_confg.json文件,执行的是generate_package_config.py脚本,最终执行到位于同目录下的generate_package_config.dart文件。

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PyQt5的桌面图像调试仿真平台开发(9)去噪

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

Detect-SLAM论文翻译

Detect-SLAM:实现目标检测与SLAM的互利共赢 摘要 - 尽管近年来在SLAM和目标检测方面取得了重大进展&#xff0c;但这两项任务仍然存在一系列挑战&#xff0c;例如动态环境中的SLAM和复杂环境中的目标检测。为了解决这些挑战&#xff0c;我们提出了一种新的机器人视觉系统&…

UE使用UnLua(一)

一、概述 Unlua是个功能丰富的插件&#xff0c;可以在UE中进行蓝图绑定&#xff0c;在Lua中进行逻辑开发&#xff0c;使用Lua热更新的特性&#xff0c;可以快速开发迭代表层逻辑 二、UnLua环境 首先下载UnLua的插件包&#xff0c;点击下载&#xff0c;不会吧不会吧还有人打不…

基于simulink使用前景检测跟踪汽车(附源码)

一、前言 此示例基于simulink演示如何使用高斯混合模型 &#xff08;GMM&#xff09; 检测和计数视频序列中的汽车。 二、模型 下图显示了使用前景检测跟踪汽车模型&#xff1a; 三、检测和跟踪结果 检测和计数汽车可用于分析交通模式。检测也是执行更复杂的任务&#xff0…

【Linux】C++项目实战-实际应用

目录 典型IO的两个阶段(网络IO)Linux上的五种IO模型1.阻塞 blocking2、非阻塞3、IO复用4、信号驱动5、异步 Web ServerHTTP协议&#xff08;应用层的协议&#xff09;简介概述工作原理HTTP请求格式HTTP响应报文格式HTTP请求方法&#xff08;仅作了解&#xff09;HTTP状态码 服务…

【Java|多线程与高并发】死锁以及哲学家吃饭问题

文章目录 1. 什么是死锁2. 哲学家吃饭问题3.如何解决死锁 1. 什么是死锁 死锁&#xff08;Deadlock&#xff09;是多线程编程中的一个常见问题&#xff0c;指的是两个或多个线程相互等待对方释放资源&#xff0c;导致程序无法继续执行的状态。 在一种典型的死锁情况中&#x…

建立点到多点的IPSec隧道(IKE安全策略方式)

目录 1. 组网需求1.1 网络拓扑1.2 配置思路1.3 版本 2. 配置USG5500 A2.1 基本配置2.2 配置域间包过滤规则2.3 配置到达分支的静态路由2.4 定义被保护的数据流2.5 配置名称为tran1的IPSec安全提议2.6 配置序号为10的IKE安全提议2.7 配置IKE Peer2.8 配置IPSec安全策略组map12.9…

哈工大计算机网络课程数据链路层协议详解之:多路访问控制(MAC)协议

哈工大计算机网络课程数据链路层协议详解之&#xff1a;多路访问控制&#xff08;MAC&#xff09;协议 在上一小节介绍完数据链路层功能和所提供的服务后&#xff0c;接下来我们介绍一个在数据链路层非常重要的一个协议&#xff1a;多路访问控制MAC协议。 多路访问控制主要是…

简易登录页面实现

导言 本文将介绍一个简单的登录页面的实现&#xff0c;使用HTML、CSS和JavaScript完成。该登录页面具有选项卡切换和表单提交功能。 HTML基础知识 首先&#xff0c;我们来了解一下HTML文档的基本结构&#xff1a; <!DOCTYPE html> <html> <head><titl…

python创建多个logging日志文件

为每一个计算过程创建一个单独的日志文件&#xff0c;并写入对应的结果&#xff0c;同时保留控制台输出的功能&#xff0c;控制台输出与日志文件记录可以分开单独控制。 import os import loggingdef creat_logger(log_path,logging_name,suf_name):if not os.path.exists(log…

NC65 输出打印模板设置流程

NC65 输出打印模板设置流程 一、添加打印模板 1、可以在单据模板初始化设置中生成打印模板&#xff08;这里以结算单为例&#xff09; 输入模板编码和名称&#xff0c;然后按确定即可。 此时&#xff0c;去输出模板初始化节点查看&#xff0c;就可以查看到刚才生成的打印模…

第五章 中央处理器 第六节指令流水线

5.6.1 指令流水线的概念 5.6.2 指令流水线的影响因素和分类

MySQL基础(五)视图、存储过程和存储函数、变量

目录 常见的数据库对象 ​编辑 视图 创建视图 改变视图 优缺点 存储过程与存储函数 创建存储过程 创建存储函数 存储过程和存储函数的区别 存储过程和函数的查看、修改、删除 查看 修改 删除 存储过程的优缺点 优点 缺点 变量 系统变量 查看系统变量 修改…

h5页面如何与原生交互

本文讲述h5页面跟原生通信&#xff0c;比如在app内&#xff0c;调用相机&#xff0c;获取相册内的图片&#xff0c;在app内拉起微信小程序等等&#xff0c;h5页面没有这么多权限能够直接调用移动端的原生能力&#xff0c;这个时候就需要与原生进行通讯&#xff0c;传递一个信号…

链表、列表、列表项

链表、列表、列表项 FreeRTOS 列表与列表项 List_t //List_t 列表typedef struct xLIST{listFIRST_LIST_INTEGRITY_CHECK_VALUE //校验值volatile UBaseType_t uxNumberOfItems; // 列表中的列表项数量:用于记录列表中列表项的个数&#xff08;不包含 xListEnd&#xff0…

AcWing 1497:树的遍历

【题目来源】https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805485033603072https://www.acwing.com/problem/content/description/1499/【题目描述】 一个二叉树&#xff0c;树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历&#xff0c;…

Verilog 基础知识(一) Verilog 基础语法与注意事项

基础知识 0.1 模块(Module) Verilog中的module可以看成一个具有输入输出端口的黑盒子&#xff0c;该黑盒子有输入和输出接口(信号)&#xff0c;通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数) 图1 模块示意图 0.1.1 模块描述 图1 所示的顶层模块(top…

1.Git使用技巧-常用命令2

1.Git使用技巧-常用命令2 文章目录 1.Git使用技巧-常用命令2一、本地仓库整理二、查看本地仓库查看过滤 二、逆向操作1. 检出覆盖本地文件 workspace -> NULL1.1 删除workspace 文件 2. 本地仓库回滚3. 远程仓库1. 远程仓库未基于代码做修改 逆操作总结 三、删除1. 删除远程…

基于 Jieba 和 Word2vec 的关键词词库构建

最近有空&#xff0c;把论文中用到的技术和大家分享一下&#xff08;以组件化的形式&#xff09;&#xff0c;本篇将讲述如何从大量的语料中获取诸多关键词和构建关键词词库或 xx 关键词词库&#xff08;细分领域&#xff09;。举例以购物网站的在线评论作为语料库&#xff0c;…

Python实现PSO粒子群优化算法优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…