跳至内容
开发

开发

源码树包含三个运行时组件:

  • 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 发布 bundledart_shell/build/linux/x64/release/bundle
Settings 发布 bundlesettings_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

默认设置会:

  1. 按软件包记录的源码修订版创建 ~/DenialUI
  2. 用打包的工具链准备匹配的 JIT bundle;
  3. 选择 ~/DenialUI/dart_shell 作为工作区;
  4. 用实时运行时替换优化后的桌面外壳。

如有需要,可向 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 桌面外壳是受信任的会话代码。它可以观察合成器状态,并调用官方桌面 外壳可用的每一个原生操作。请勿运行不受信任的桌面外壳源码。