最近将基于Tauri v2 开发的产品上线微软商店后, 用户反馈开机启动不生效, 这里记录一下复现和解决方案。

复现问题

我们在不同环境测试开机启动都是正常的, 唯独在转换成MSIX 之后, 安装需要完整签名, 无法进行完整测试。猜测应该和MSIX 有关。

于是我们尝试了以下步骤:

  1. 创建自签名证书;
  2. 签名并打包成MSIX;
  3. 安装到系统中。

测试结果发现, 确实在MSIX 中, 开机启动不生效的问题复现了。

查找问题

Tauri 项目中, 使用tauri-plugin-startup 插件实现开机启动, 但是在转换成MSIX 之后, 开机启动并不生效了。

tauri-plugin-startup 内部使用auto-launch 实现开机启动的功能, 查看 Windows 平台特定的实现得知是通过winreg 库修改注册表实现开机启动的。

以下是auto-launchWindows 平台的部分实现:

use crate::{AutoLaunch, Result};
use winreg::enums::RegType::REG_BINARY;
use winreg::enums::{
    HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS, KEY_READ, KEY_SET_VALUE,
};
use winreg::{RegKey, RegValue};


static ADMIN_AL_REGKEY: &str = "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run";
static AL_REGKEY: &str = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
static ADMIN_TASK_MANAGER_OVERRIDE_REGKEY: &str =
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run32";
static TASK_MANAGER_OVERRIDE_REGKEY: &str =
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run";

GitHub permalink: https://github.com/zzzgydi/auto-launch/blob/2d94a103ca20652a3baf581ca2c296791c35c09b/src/windows.rs#L1-L13

查询资料得知, MSIX 默认开启灵活虚拟化, 开启之后在MSIX 应用容器中, 应用的注册表并不会真正写入到系统注册表中, 而是写入到虚拟注册表中, 所以这就是MSIX 通过修改注册表来配置开机启动不生效原因。

检查MSIMSIX 配置开启启动之后查询注册表项也可以看到(MSIX 的修改对系统来说并不可见)。

解决方案

目前有两种解决方案:

1. 关闭灵活虚拟化

MSIX 打包时, 可以选择关闭全部或者部分灵活虚拟化, 这样应用的注册表内容会真正写入到系统注册表中, 从而实现开机启动。

2. 适配灵活虚拟化

如果需要保持灵活虚拟化并适配最新特性, 可以通过MSIXStartupTask 来实现开机启动。

  1. 修改auto-launch crate 的实现并适配MSIXStartupTask。这个部分我已实现, 你可以查看这个feature/msix

  2. 修改tauri-plugin-startupauto-launch 的依赖。这个部分我已实现, 你可以查看这个feature/msix

  3. 打包同时修改MSIX 清单文件。

<Package
  ...
 xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" 
 xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" 
 xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" 
 xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
 xmlns:desktop7="http://schemas.microsoft.com/appx/manifest/desktop/windows10/7" 
 xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap uap10 desktop desktop7 rescap">
  ...
  <Applications>
    <Application Id="App" Executable="app.exe" EntryPoint="Windows.FullTrustApplication">
        ...
    </Application>
  </Applications>
  <Extensions>
    <desktop:Extension Category="windows.startupTask" Executable="VFS\ProgramFilesX64\App\app.exe" EntryPoint="Windows.FullTrustApplication">
          <desktop:StartupTask TaskId="AppStartupTaskId" Enabled="true" DisplayName="App" />
    </desktop:Extension>
  </Extensions>
</Package>

重新签名打包并安装测试, 开机启动就可以正常工作了。


参考和引用