diff --git a/Ink Canvas/Helpers/TelemetryUploader.cs b/Ink Canvas/Helpers/TelemetryUploader.cs
new file mode 100644
index 00000000..2a728e7a
--- /dev/null
+++ b/Ink Canvas/Helpers/TelemetryUploader.cs
@@ -0,0 +1,149 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Threading.Tasks;
+using Sentry;
+
+namespace Ink_Canvas.Helpers
+{
+ ///
+ /// 遥测上传辅助类:根据用户设置,通过 Sentry 上传 usage_stats.enc 和 Crashes 目录的摘要信息。
+ ///
+ internal static class TelemetryUploader
+ {
+ ///
+ /// 根据当前设置决定是否上传遥测数据。
+ /// 在主窗口加载完成后调用一次即可。
+ ///
+ public static Task UploadTelemetryIfNeededAsync()
+ {
+ return Task.Run(() =>
+ {
+ try
+ {
+ var settings = MainWindow.Settings;
+ if (settings == null || settings.Startup == null)
+ {
+ return;
+ }
+
+ var level = settings.Startup.TelemetryUploadLevel;
+ if (level == TelemetryUploadLevel.None)
+ {
+ return; // 用户未开启
+ }
+
+ // 获取并校验设备ID
+ string deviceId = DeviceIdentifier.GetDeviceId();
+ if (string.IsNullOrWhiteSpace(deviceId) || deviceId.Length < 5)
+ {
+ LogHelper.WriteLogToFile("TelemetryUploader | 设备ID无效,取消遥测上传", LogHelper.LogType.Warning);
+ return;
+ }
+
+ // 读取 usage_stats.enc 作为基础数据
+ string usageStatsPath = Path.Combine(App.RootPath, "usage_stats.enc");
+ string usageStatsContent = null;
+ if (File.Exists(usageStatsPath))
+ {
+ try
+ {
+ usageStatsContent = File.ReadAllText(usageStatsPath);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile(
+ $"TelemetryUploader | 读取 usage_stats.enc 失败: {ex.Message}",
+ LogHelper.LogType.Warning);
+ }
+ }
+
+ // 可选:读取 Crashes 目录下的崩溃日志(仅在扩展模式时上传)
+ List