当前位置: 首页 > news >正文

Rust 实战五 | 配置 Tauri 应用图标及解决 exe 被识别为威胁的问题

封面

往期回顾

  • Rust 实战四 | Traui2+Vue3+Rspack 开发桌面应用:通配符掩码计算器
  • Rust 实战三 | HTTP 服务开发及 Web 框架推荐
  • Rust 实战二 | 开发简易版命令行工具 grep
  • Rust 实战一 | 用 RustRover 开发猜数字游戏
  • Rust 安装与版本更新

代码开源地址:https://github.com/0604hx/rust-journey、通配符掩码计算器


🛠️ 完善功能

在上一篇博文,我们还有发送到记事本功能没有实现。该功能完成的操作内容有:

  • 将用户输入的IP、掩码以及计算的结果写入到 txt 文件
  • 调用系统默认程序打开上述文件
use tauri_plugin_opener::OpenerExt;#[tauri::command]
fn save_txt(ip:String, mask:String, ips:Vec<String>, filename: Option<String>, app: tauri::AppHandle)-> Result<String, String> {// 获取当前 exe 路径let exe_path = std::env::current_exe().map_err(|e| e.to_string())?;// 获取 exe 所在目录let exe_dir = exe_path.parent().ok_or("无法获取程序所在目录")?;let filename = filename.unwrap_or_else(|| "temp.txt".to_string());let file_path = exe_dir.join(&filename);let mut lines = String::new();lines.push_str(&format!("{}\n\n", app.package_info().name.clone()));lines.push_str(&format!("程序作者\t{}\n", app.package_info().authors));lines.push_str("开源代码\thttps://gitcode.com/ssrc0604hx/tauri-wildcard-mask\n");lines.push_str("\n");lines.push_str(&format!("IP地址\t{}\n", ip));lines.push_str(&format!("掩码地址\t{}\n", mask));lines.push_str("匹配地址\n");for row in ips {lines.push_str(&format!("\t\t{}\n", row));}fs::write(&file_path, lines).map_err(|e| e.to_string())?;if let Err(e) = app.opener().open_path(file_path.to_string_lossy().to_string(), None::<&str>) {eprintln!("打开文件{}失败:{}", file_path.display(), e);}Ok(filename)
}

执行后的,在 exe 同级目录下自动创建temp.txt文件,内容如下:

🏷️ 配置图标

我们的程序写好后,就可以打包给更多人使用。不过,在此之前,我们应该考虑配置应用的图标。应用图标作为用户与应用交互的 “第一印象”,其重要性远超单纯的视觉标识,它在用户体验、品牌传播、市场竞争等多个维度都扮演着关键角色。

当然,你也可以直接用 Tauri 默认的图标😄。

我的图标源自iconfont(关键词计算),可参考以下步骤下载不同尺寸的 PNG 图片。


打包时用到的图标尺寸在src-tauri\tauri.conf.json文件中可以查到:

"bundle": {"active": true,"targets": ["app"],"icon": ["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"]
}

然后可以到www.aconvert.com将 PNG 转换为 ico、icns 格式的文件。最后,我们将用到的图标文件放置在icons目录下。

☠️ build 后被识别为威胁

通过pnpm tauri build打包(我本地耗时3分半左右)后,在release内运行没有问题,可是拷贝到其他目录再次运行,就会被识别为威胁,程序被自动清理😂。

经排查,发现是 src-tauri\Cargo.toml 开启了opt-level = "z"极限压缩 exe 体积导致(个人主观判定),将配置换成s后,没有被拦截(此时体积增大 450KB 左右)。

ChatGPT 给出的建议有:

  1. 换优化级
    • opt-level = "3""s",避免 "z" 的极限压缩
  2. 给 exe 签名
    • 使用 signtool 或第三方证书签名,SmartScreen 和 Defender 都会降低误报概率
  3. 改变嵌入资源方式
    • 部分前端资源外置(减少 exe 中的高熵数据块)
  4. 提交误报
    • 上传到微软误报申诉:https://www.microsoft.com/en-us/wdsi/filesubmission
http://www.dtcms.com/a/325276.html

相关文章:

  • 新人该如何将不同的HTML、CSS、Javascript等文件转化为Vue3文件架构
  • 零基础学习jQuery第三天
  • 探秘华为:松山湖的科技与浪漫之旅
  • SQL 基础查询语句详解
  • DDIA第五章:分布式数据复制中的一致性与冲突处理
  • 基于STM32设计的矿山环境监测系统(NBIOT)_262
  • (25.08)Ubuntu20.04复现KISS-ICP
  • 【TensorRT踩坑记录】安装与使用
  • 软考 系统架构设计师系列知识点之杂项集萃(121)
  • 数据变而界面僵:Vue/React/Angular渲染失效解析与修复指南
  • leetcode-hot-100 (图论)
  • 算法训练营DAY57 第十一章:图论part07
  • 基于Qt Property Browser的通用属性系统:Any类与向量/颜色属性的完美结合
  • CVE-2019-0708复刻
  • react+vite-plugin-react-router-generator自动化生成路由
  • OBOO鸥柏丨115寸商用屏/工业液晶显示器招标投标核心标底参数要求
  • 【JAVA】使用系统音频设置播放音频
  • MyBatis执行器与ORM特性深度解析
  • React18 Transition特性详解
  • ARM汇编
  • Apache IoTDB 全场景部署:跨「端-边-云」的时序数据库 DB+AI 实战
  • 一维码+二维码+字符识别
  • 【数据结构】深入理解顺序表与通讯录项目的实现
  • 第十六届蓝桥杯大赛青少组 C++ 省赛真题解析(2025年8月10日)
  • 动态创建可变对象:Python类工厂函数深度解析
  • 云原生环境 Prometheus 企业级监控实战
  • 本地文件夹与 GitHub 远程仓库绑定并进行日常操作的完整命令流程
  • 时序数据库选型指南:Apache IoTDB为何成为工业物联网首选?
  • 精读:《DEEP OC-SORT: MULTI-PEDESTRIAN TRACKING BY ADAPTIVE RE-IDENTIFICATION》
  • 网安-安全加固