开发
源码树包含三个运行时组件:
compositor/中的 Rust 合成器、控制客户端与 Portal;dart_shell/中的嵌入式 Flutter 桌面外壳;settings_app/中的独立 Flutter Settings 应用。
三者一起构建并使用同一个版本。
从源码构建
Denial 支持从源码构建 x86-64 和 ARM64 版本。下方命令和输出路径描述的是当前在 Arch 开发主机上的一键式 x86-64 参考构建。ARM64 使用相同的固定版本 Denial、Flutter 和 Skia 源码,并搭配架构匹配的 Flutter 引擎与桌面外壳 bundle;目前尚未发布官方 ARM64 软件包。
先为固定版本的工具链和 Rust 依赖执行一次引导:
tools/denial-pc bootstrap然后检查主机、构建全部三个组件并运行测试套件:
tools/denial-pc doctor
tools/denial-pc build
tools/denial-pc test主要的 x86-64 参考输出如下:
| 构件 | 位置 |
|---|---|
| 合成器 | $XDG_CACHE_HOME/denial/pc-build/rust/release/deniald |
| 原生控制客户端 | $XDG_CACHE_HOME/denial/pc-build/rust/release/denialctl |
| Denial Portal | $XDG_CACHE_HOME/denial/pc-build/rust/release/denial-portal |
| Flutter 发布 bundle | dart_shell/build/linux/x64/release/bundle |
| Settings 发布 bundle | settings_app/build/linux/x64/release/bundle |
引导过程需要网络。后续构建会复用固定版本的缓存。请运行 tools/denial-pc doctor,不要
猜测缺少的是哪一个 Smithay、DRM、GBM、EGL、libinput、udev 或 Xwayland 开发依赖。
可以只构建 Settings 客户端,或运行与锁定版本匹配的 Flutter 测试;后续参数会转发给
flutter test:
tools/denial-pc settings
tools/denial-pc flutter-test
tools/denial-pc flutter-test test/settings/settings_application_test.dart当前耦合世代为 Flutter 3.44.7 与 Dart 3.12.2。精确的 Flutter、Skia、引擎与 ABI
修订版记录在 prebuilt/flutter-engine/SOURCE_LOCK.json;请勿混用其他世代或架构的
bundle 与引擎构件。
测试本地会话
安装一个单独的开发会话条目:
tools/denial-pc install-session退出登录并明确选择该条目。不再需要时将它删除:
tools/denial-pc remove-session开发条目与打包的 Denial 会话相互独立,不会替换正在运行的合成器。
实时编辑 Flutter 桌面外壳
实时编辑是可选功能,不需要重新构建 Rust 合成器。安装版本匹配的开发环境:
sudo pacman -S denial-ui-development
denialctl ui setup默认设置会:
- 按软件包记录的源码修订版创建
~/DenialUI; - 用打包的工具链准备匹配的 JIT bundle;
- 选择
~/DenialUI/dart_shell作为工作区; - 用实时运行时替换优化后的桌面外壳。
如有需要,可向 denialctl ui setup 传入另一个绝对目标路径。
在 VSCodium 中打开所创建的 dart_shell 目录,然后启动 Attach to Denial live UI。
保存更改过的 Dart 文件会请求热重载,Flutter Inspector 仍然可用。
该附加配置刻意不支持调试器暂停、断点、单步执行或表达式求值:暂停桌面外壳 isolate 也会暂停可交互的桌面。更改原生 Rust 代码或 Flutter 引擎仍需正常构建并重启会话。
分析 Flutter 桌面外壳性能
要进行有代表性的性能测量,请从 Denial 检出目录构建并激活优化后的 AOT profile 桌面 外壳:
denial-ui prepare-profile /absolute/path/to/denial/dart_shell
denialctl ui workspace /absolute/path/to/denial/dart_shell
denialctl ui profile这种模式保留优化后的 AOT 应用代码,同时启用 Flutter VM 服务、时间线事件、CPU 分析和 DevTools。它不同于 JIT 实时编辑模式。
使用以下命令启动浏览器 DevTools:
denial-ui attach-profile /absolute/path/to/denial/dart_shell分析期间请让该命令保持运行。结束后使用以下命令恢复打包的发布版桌面外壳:
denialctl ui restore安装或替换 denial-ui-development 后,请先重启一次 Denial 会话,再激活 profile 模式,
确保匹配的原生引擎被干净加载。
运行时控制
常用的开发命令如下:
denialctl ui status
denialctl ui setup [PATH]
denialctl ui workspace /absolute/path/to/dart_shell
denialctl ui live on
denialctl ui reload
denialctl ui restart
denialctl ui profile
denialctl ui restore某些保留操作可能会报告其原生能力尚未实现。被拒绝的命令会返回清晰的错误,而不会假装 成功。
请始终准备好恢复命令:
denialctl ui restore它会在不结束 Wayland 会话的情况下恢复打包的优化桌面外壳。
构建自定义桌面外壳
公共框架入口如下:
import 'package:denial_dart_shell/denial.dart';
import 'package:flutter/widgets.dart';
void main() {
runDenialShell(
shell: const DenialShell(
mobile: DenialShellScene(content: MyMobileShell()),
desktop: DenialShellScene(content: MyDesktopShell()),
),
);
}runDenialShell 会初始化原生桥接、生命周期、本地化、主题、安全锁屏、输入发布、光标、
软键盘、截图选择及覆盖层顺序。自定义桌面外壳提供功能场景,并可使用导出的桌面外壳
模型、操作、表面宿主、窗口构建器和可选本地应用。软件包外部代码不要导入 lib/src;
只有 package:denial_dart_shell/denial.dart 是受支持的框架边界。
经过检查的 dart_shell/example/custom_shell.dart 入口是最小完整示例。使用上文相同的
denialctl ui workspace 及 profile/实时命令准备并激活其工作区。
当心
自定义 Flutter 桌面外壳是受信任的会话代码。它可以观察合成器状态,并调用官方桌面 外壳可用的每一个原生操作。请勿运行不受信任的桌面外壳源码。