Skip to content

feat(android): 新增 Android/ 目录,为 TraeTools 增加 Android 端 - #52

Merged
star620 merged 1 commit into
star620:mainfrom
akexin:android-support
Oct 14, 2026
Merged

star620 merged 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 版的构建与发布流程不受影响(文末有 CI 实测记录)。

35 files changed, +2290 —— 34 个新增文件,外加 TraeTools.csproj 增加 3 行。

更新内容

路径 说明
Android/TraeTools.Android.csproj net10.0-android 独立工程。Models/ Services/ ViewModels/ Views/(六个页面)Styles/ Assets/ ViewLocator 以 <Compile Include="..\..."> / <AvaloniaResource Include="..\..."> 链接复用,单一真源仍在仓库根目录,不存在第二份拷贝
Android/Platform/ AndroidVault(Keystore RSA-2048 包裹 AES-256-GCM 数据密钥)、DpapiCompat(DPAPI 兼容层)、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/ 应用清单(INTERNET + 浏览器查询意图)、自适应图标、主题配色
Android/README.md 编译方式 / 平台差异 / 已知限制
.github/workflows/android.yml 新增:编译 Android 工程并上传 APK

对既有文件的唯一改动:TraeTools.csproj 增加 3 行

<ItemGroup>
  <Compile Remove="Android\**" />
  <None Remove="Android\**" />
  <AvaloniaXaml Remove="Android\**" />
</ItemGroup>

SDK 的 Compile(**/*.cs)、None(**/*)与 Avalonia 的 AvaloniaXaml(**/*.axaml)默认通配符都会向下递归,并不认「子目录里有自己的 csproj」。不排除的话主程序会把 Android 源码一并编译,实测报错:

Avalonia error AVLN2002: Duplicate x:Class directive,
  TraeTools.App is already used in /Android/App.axaml  [TraeTools.csproj]

(即使绕过这一条,Android/Platform/*.cs 依赖的 Android.App / Avalonia.Android 也无法在主程序里解析。)

补上这 3 行后 Windows 构建恢复正常。写法与仓库里既有的 <Compile Remove="TraeTools.LoginHost\**" /> 完全一致。

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

  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 等 10 个全局 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 数据密钥)
系统托盘 / 通知栏 ✅ 托盘图标 + 原生菜单 ❌ 无对应概念
应用内自动更新 ✅ 下载 zip 替换 exe ❌ 改为到 Releases 下载 APK 覆盖安装

验证

一次 CI 运行同时验证两端(build 为上游原作业未做修改,build-android 与新增的 android.yml 步骤逐字一致):

  • build(windows-latest):✅ 通过,产物 trae-tools-build 74.17 MB
  • build-android(ubuntu-latest):✅ 通过,产物 APK 129.54 MB

https://github.com/akexin/TraeTools-Android/actions/runs/38590116158

说明:该验证跑在我的临时分支上,仅比本 PR 多一行 workflow_dispatch(便于手动触发),本 PR 不含该行。本 PR 内的 .github/workflows/android.yml 会在维护者批准 Action 后随 PR 自动运行。

已知限制

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

许可

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

@akexin akexin changed the title feat(android): 新增 Android/ 目录,把 TraeTools 移植到 Android(纯新增,根目录零改动) feat(android): 新增 Android/ 目录,为 TraeTools 增加 Android 端 Oct 14, 2026
Android/ 是独立工程(net10.0-android),Models/Services/ViewModels/Views/Styles/Assets
以 <Compile Include="..\..."> / <AvaloniaResource Include="..\..."> 链接复用,
单一真源仍在仓库根目录,不存在第二份拷贝。

同时给根工程 TraeTools.csproj 增补 3 行 Remove:
SDK 的 Compile(**/*.cs)、None(**/*)与 Avalonia 的 AvaloniaXaml(**/*.axaml)
默认通配符都会向下递归,若不排除 Android/,主程序会把 Android 源码一并编译,
实测报 AVLN2002(x:Class "TraeTools.App" 重复)并因 Android 命名空间无法解析而失败。
写法与既有的 <Compile Remove="TraeTools.LoginHost\**" /> 保持一致。

新增 .github/workflows/android.yml,在 CI 中编译 Android 工程并产出 APK。

Windows 版的构建与发布流程不受影响:dotnet build TraeTools.csproj -c Release 仍通过,
产物 trae-tools-build 正常上传。
@star620

star620 commented Oct 14, 2026

Copy link
Copy Markdown
Owner

感谢喵

@star620
star620 merged commit 40c3777 into star620:main Oct 14, 2026
2 checks passed
@akexin
akexin deleted the android-support branch October 14, 2026 16:25
star620 added a commit that referenced this pull request Oct 15, 2026
This reverts commit 40c3777, reversing
changes made to 4da8bf7.
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.

2 participants