Skip to content

feat(android): 新增 Android/ 目录,把 TraeTools 移植到 Android(纯新增,根目录零改动) - #51

Closed
akexin wants to merge 1 commit into
star620:mainfrom
akexin:android-support
Closed

akexin wants to merge 1 commit into
star620:mainfrom
akexin:android-support

Conversation

@akexin

@akexin akexin commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

给 TraeTools 加上 Android 端:新增 Android/ 独立工程,仓库根目录下的文件一个都没有改动,Windows 版的构建与发布流程完全不受影响。33 files changed, +2240(全为新增)。

更新内容

  • Android/TraeTools.Android.csproj —— net10.0-android 独立工程。共享代码用 <Compile Include="..\..."> 链接复用(Models/ Services/ ViewModels/ Views/ 六个页面 / Styles/ / Assets/ / ViewLocator),单一真源仍在根目录,不存在第二份拷贝。
  • Android/Platform/ —— AndroidVault(Keystore RSA-2048 包裹 AES-256-GCM 数据密钥)、DpapiCompat、BrowserLauncher、CrashLog + CrashReportActivity、MainActivity、PlatformLog。
  • Android/Views/ —— MainView(品牌顶栏 + 横向标签导航 + 覆盖层对话框宿主)、OverlayDialog、5 个对话框(PromptWindow / InputWindow / PatInputWindow / LoginWindow / EulaWindow)。
  • Android/Services/ + Android/ViewModels/UiHost.cs —— DataPaths / AutoStartManager / UiHost 三个 Windows 实现的 Android 版。
  • Android/Properties/ Android/Resources/ —— 清单、自适应图标、主题配色。
  • Android/README.md —— 功能差异、编译方式、已知限制。

为什么上游代码一行都不用改

  1. 对话框:单视图平台 new Window() 会抛 NotSupportedException,故全部改写为 UserControl,由 OverlayDialog 挂到主视图覆盖层并用 TaskCompletionSource 模拟模态。上游 VM 调用的是 Window.ShowDialog<T>(owner) —— Android 的对话框类提供了同名、同参数形态、同返回类型的方法,调用点无需改动。
  2. 宿主:UiHost.MainWindow 的返回类型放宽为 TopLevel?(Window 只是它的子类)。上游 VM 一律用 var 接收,而它的四种用法 —— ShowDialog(owner) / owner != null 守卫 / top?.Clipboard / win.StorageProvider —— 在 TopLevel 上全部成立。于是 Android 也能拿到非 null 宿主,那些 owner != null ? await … : false 的确认框照常弹出(若沿用 Window? 会恒为 null,确认框会被整体跳过)。
  3. 隐式 using:摘掉 .NET Android SDK 注入的 Android.App / Android.Widget 等全局 using,否则会与 Avalonia 类型在共享源码里制造 CS0104(Button / Notification / Application 二义性),而共享源码是不允许改的。
  4. 加密:AppConfig 用的 ProtectedData(DPAPI)是 Windows 专属包,Android 上没有该类型。新增同名同签名的 DpapiCompat,把语义映射到 Keystore + AES-256-GCM,上游加密代码原样通过编译。
  5. 版本号:versionName 仍取自根目录 version.json(求值期读取),保证 APK 清单与 App 内「关于」显示一致。

平台差异

能力 Windows Android
签到 / 自动签到 / 云端签到 / 用量统计 / 仪表盘 ✅ ✅
账号切换(vault 建档 / 冷切换) ✅ 直接操作本地客户端 ⚠️ 手机端无本地 Trae 客户端,页面仅作展示
登录方式 ✅ 内嵌浏览器(WebView2 宿主)自动取凭证 ✅ 手动粘贴 Cloud-IDE-Token
开机自启 ✅ 注册表 Run ❌ 无等价机制,降级为无操作
凭证加密 DPAPI(当前用户) Android Keystore(RSA-2048 包裹 AES-256-GCM 数据密钥)
系统托盘 / 通知栏 ✅ 托盘图标 + 原生菜单 ❌ 无对应概念

验证

  • 已在 ubuntu-latest 上 dotnet build Android/TraeTools.Android.csproj -c Release 编译并产出 APK。
  • Android/ 之外的仓库文件零改动(git status 为空),因此 Windows 版构建与 release.yml 发布流程不受影响。

已知限制

  • 应用内自动更新不可用:上游流程是下载 zip 替换 exe,手机上无法执行;改为到 Releases 下载 APK 覆盖安装。
  • 部分「打开网页」入口点了没反应:上游 CloudViewModel / SettingsViewModel 打开浏览器走 Process.Start(...),该调用在 Android 上不可用(失败已被 try/catch 捕获并写日志)。设备码授权流程仍可用 —— 授权码会自动复制到剪贴板,按日志提示手动访问授权页即可。要彻底修好需要给上游 VM 加一个平台跳转抽象(约 7 处调用点),那会改到共享文件,故本次未做。
  • ApplicationId 暂定 com.traetools.android、ApplicationVersion(versionCode)为 1,正式发布前请自行定夺;Release APK 目前用调试密钥签名。

许可

与上游同为 GPL-3.0,改动基于上游 main(4da8bf7)新增,可随时 rebase。

把 Windows 专属实现下沉到 Platform/ 与 TFM 条件编译,业务层零分叉:

- TraeTools.csproj 改为双目标 net10.0-windows;net10.0-android。Windows 侧的
  AOT / 裁剪 / 单文件 / RuntimeIdentifier 全部保留在 windows 条件组内,现有
  Windows 发布流程零改动(release.yml 仅追加 -f net10.0-windows 消除多目标歧义)
- 新增 Platform/:Secrets(DPAPI ↔ Keystore+AES-GCM 双实现)、DataPaths、
  CrashLog、CrashReportActivity、BrowserLauncher、PlatformLog、MainActivity
- 弹窗一律由 Window 改为 UserControl:Android 走 ISingleViewApplicationLifetime
  时 new Window() 会抛 NotSupportedException;新增 OverlayDialog 双模宿主
  (桌面端包 DialogHostWindow,Android 端挂全屏覆盖层并用 TCS 模拟模态)
- 新增 MainView 单视图外壳(品牌头 + 胶囊导航 + 全屏弹窗层);MainWindow 精简为
  桌面壳,仅保留托盘、原生菜单与最小化到托盘
- Android 侧降级:开机自启→无操作;内嵌浏览器登录→手动粘贴 Token;
  应用内更新→引导至 Release 页下载 APK 覆盖安装
- android TFM 显式关闭 AOT / 裁剪 / 链接器:.NET for Android 在 Release 下默认
  开启 LLVM AOT,会因 SQLitePCLRaw 等反射路径抛 MissingRuntimeArtifactException
- version.json 的读取从 Target 上移到求值期 PropertyGroup,否则 AndroidManifest
  的 versionName 会停在静态兜底值,与 App 内「关于」显示的版本互相矛盾
- ci.yml 拆分为 build-windows / build-android 两个作业,并新增 workflow_dispatch
- README 补充 Android 章节(功能差异表 / 构建方式 / 实现要点)

Windows Debug/Release 编译 0 警告 0 错误。
@akexin akexin closed this Oct 14, 2026
@akexin akexin changed the title feat(android): 新增 net10.0-android 目标,一套代码同时产出 Windows 与 Android 客户端 feat(android): 新增 Android/ 目录,把 TraeTools 移植到 Android(纯新增,根目录零改动) Oct 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant