Tauri MSIX 开机启动适配
最近将基于Tauri v2
开发的产品上线微软商店后, 用户反馈开机启动不生效, 这里记录一下复现和解决方案。
复现问题
我们在不同环境测试开机启动都是正常的, 唯独在转换成MSIX
之后, 安装需要完整签名, 无法进行完整测试。猜测应该和MSIX
有关。
于是我们尝试了以下步骤:
- 创建自签名证书;
- 签名并打包成
MSIX
; - 安装到系统中。
测试结果发现, 确实在MSIX
中, 开机启动不生效的问题复现了。
查找问题
在Tauri
项目中, 使用tauri-plugin-startup
插件实现开机启动, 但是在转换成MSIX
之后, 开机启动并不生效了。
tauri-plugin-startup
内部使用auto-launch
实现开机启动的功能, 查看 Windows
平台特定的实现得知是通过winreg
库修改注册表实现开机启动的。
以下是auto-launch
的Windows
平台的部分实现:
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
通过修改注册表来配置开机启动不生效原因。
检查
MSI
和MSIX
配置开启启动之后查询注册表项也可以看到(MSIX
的修改对系统来说并不可见)。
解决方案
目前有两种解决方案:
1. 关闭灵活虚拟化
在MSIX
打包时, 可以选择关闭全部或者部分灵活虚拟化
, 这样应用的注册表内容会真正写入到系统注册表中, 从而实现开机启动。
2. 适配灵活虚拟化
如果需要保持灵活虚拟化
并适配最新特性, 可以通过MSIX
的StartupTask
来实现开机启动。
-
修改
auto-launch
crate 的实现并适配MSIX
的StartupTask
。这个部分我已实现, 你可以查看这个feature/msix -
修改
tauri-plugin-startup
的auto-launch
的依赖。这个部分我已实现, 你可以查看这个feature/msix -
打包同时修改
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>
重新签名打包并安装测试, 开机启动就可以正常工作了。