feat(android): 集成 #704 安卓自动更新 + 同步 PC updater 修复(#705 公钥 / #708 安装失败兜底)到安卓#712
Conversation
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
下载完成后若 install() 抛错,旧代码把 status 置成 'error',而 UpdateDialog 不渲染 error 态 → 弹框消失、错误只 console.error,用户表现为「下载后无反应、重启仍旧版」(#706)。 - 新增独立状态 installError:仅下载/安装失败用它;'error' 仍表示「检查失败」,行为不变(CheckUpdateButton 按钮内轻提示、后台自动检查都不弹框,零回归)。 - 失败弹框留在原地显示真实错误 + 「手动下载」按钮直达 GitHub Releases 兜底。 - 新增 Rust IPC log_client_error,把前端更新错误写进 openless.log(webview console 不入文件日志),便于用户「导出日志」后定位真因。 - 5 个 i18n 文件补 updateDialog.installError / manualDownload。 注意:这是兜底(失败可见 + 可诊断),不解决 ad-hoc/quarantine 机器自动更新真正成功的问题——那需要 Apple Developer ID 签名 + 公证(本次暂缓)。
…xes to Android Merge pr704 (Android in-app auto-update + JNI release-crash fixes) onto beta+#708, re-syncing PC-side updater fixes that pr704 predated. - Android minisign pubkey reverted to the trusted 1DEAA803 (pr704's new updater_logic.rs reintroduced the broken 6F4B5994; #705 had only fixed the desktop tauri.conf.json key). Repairs "downloads but never updates" on Android. - installAndroidUpdate() now surfaces install failures via the 'installError' status + logClientError + manual-download fallback (pr704's refactor carried the pre-#708 'error' status, a wrong "check failed" log label, and a re-throw that leaked an unhandled rejection on the manual install path). - Restored #708's logClientError on the desktop check-failure path that the textual auto-merge had silently dropped (mis-grafted into the Android helper). - UpdateDialog unions pr704's androidInstalled title/desc with #708's installError desc + pre-wrap long-error styling. Desktop updater mechanism unchanged: tauri.conf.json + lib.rs zero diff, plugin-updater path byte-identical. Verified: npm frontend build green, desktop cargo check clean, host cargo test green (incl. updater_pubkey_matches_tauri_conf), tsc clean, check:android-updater-pubkey OK. Supersedes the Android part of #694; #704 was the beta-rebased clean port.
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
|
@claude 请审核本 PR。重点核对:(1) 桌面 updater 是否对 beta 零变更(tauri.conf.json/lib.rs 零 diff、plugin-updater 路径不变);(2) 安卓 minisign 公钥是否已是 1DEAA803(非 6F4B5994)、与 tauri.conf.json 一致;(3) 安卓安装失败是否正确走 installError + 手动下载兜底、且无 unhandled rejection。无阻断性问题请说明可合并。 |
|
Claude finished @appergb's task in 3m 24s —— View job PR #712 代码审核结果审核任务列表:
(1) 桌面 updater 零变更核查tauri.conf.json — ✅ 零 diff(文件未在变更列表中出现) 桌面签名公钥、manifest endpoints、plugin-updater 注册路径均未变动:
lib.rs — 变更内容为
(2) Android minisign 公钥核查✅ 已确认为 1DEAA803,与 tauri.conf.json 完全一致
pub const UPDATER_PUBKEY_B64: &str =
"dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDFERUFBODAzNTY0QzMyM0YK...";字符串与 三重保障均在位:
(3) installError + 手动下载兜底 + unhandled rejection✅ 全部正确
try {
await appDownloadAndInstallAndroidUpdate(payload);
androidUpdateRef.current = null;
setStatus('downloaded');
} catch (error) {
const msg = error instanceof Error ? error.message : String(error);
void logClientError(`[updater] android install failed (v${payload.version}): ${msg}`);
setErrorMessage(msg);
setStatus('installError'); // ✅ 正确
} finally {
androidDownloadActiveRef.current = false;
}
CI 自动审查指出的
|
| 审核项 | 结论 |
|---|---|
| tauri.conf.json 桌面公钥/endpoints | ✅ 零 diff |
| lib.rs 桌面 updater 路径 | ✅ 无变更(+22 仅为 #708 的日志命令,安全) |
| Android pubkey = 1DEAA803 | ✅ 与 tauri.conf.json 完全一致,三重验证 |
| installError 状态机 | ✅ 正确设置,无 throw 泄漏 |
| 手动下载兜底 | ✅ installError 时显示 |
| nativeCancelDictation JNI | ✅ 已定义且已实现 |
无阻断性问题,可合并。
唯一值得记录的小事项:PR 正文说"lib.rs 零 diff",实际对 beta 有 +22(#708 的 log_client_error),但维护者已知情且在 PR 正文明确说明。若先合 #708 再 rebase 本分支,该 diff 会归零。
User description
摘要
把安卓修复 PR #704(Android 应用内自动更新 + JNI 释放崩溃修复)合入,并把 PC 端的 updater 修复同步到安卓路径。在不改动桌面 updater 机制的前提下集成。
三处同步修正(PC → Android)
android/updater_logic.rs::UPDATER_PUBKEY_B64把安卓 minisign 公钥退回到了已损坏的6F4B5994。fix(updater): revert signing pubkey to 1DEAA803 to repair auto-update #705 当时只修了桌面tauri.conf.json的公钥(1DEAA803)。若直接合 feat(android): Android 应用内自动更新与 release JNI 修复(基于 beta 重迁) #704,安卓会复现"下载成功但签名校验失败、永远装不上"的问题。已改回1DEAA803,与桌面tauri.conf.json及 CI 签名密钥一致。installAndroidUpdate()辅助函数,但该函数带的是 fix(updater): 安装失败可见化 + 手动下载兜底 + 错误写日志 (#706) #708 之前的旧错误处理:setStatus('error')(应为installError,否则失败弹框被自动消失)、错误日志标签写成check failed、并且throw会在手动安装路径上泄漏 unhandled rejection。已改为installError+ 正确日志标签 + 去掉 throw(辅助函数全权处理错误,gate 的 try/catch 退化为无害空操作)。checkForUpdatescatch 里的logClientError('check failed')弄丢了(错位嫁接进了安卓 helper)。这是桌面回归,已还原,桌面/安卓检查失败都会写进 openless.log。另:
UpdateDialog的标题/描述冲突取并集——pr704 的androidInstalled标题 + #708 的installError描述(含{{error}}插值 +pre-wrap长错误换行)。PC 端安全(证明级别零变更)
src-tauri/tauri.conf.json与src-tauri/src/lib.rs对 beta 零 diff(桌面公钥/IPC 未变)。installUpdate/checkForUpdates/UpdateDialog逐字节一致于 beta+fix(updater): 安装失败可见化 + 手动下载兜底 + 错误写日志 (#706) #708。src-tauri改动仅限android/*(target_os=android 门控)+types.rs(仅注释)。CheckUpdateButton标签按渠道区分、BetaChannelSection布局重排、新增仅安卓的AutoUpdateSection(桌面return null)。测试计划
npm run build(tsc + vite 前端门禁)→ 通过(✓ built)cargo check --manifest-path src-tauri/Cargo.toml(桌面/host)→ 通过(仅既有 dead-code 警告)cargo test --lib android::updater_logic(host)→ 6/6 通过,含updater_pubkey_matches_tauri_confnpx tsc --noEmit(×2 独立运行)→ 0 错误npm run check:android-updater-pubkey→ OKcargo metadata --filter-platform aarch64-linux-android --locked→ OKandroid-apk.yml(本机无 NDK)adb install -r+ Stable/Beta 手动检查 + Gate 进度隔离 → 待 reviewer 真机复测审查方式
本集成由多 Agent(Opus 4.8 最高思考模式)完成:4 Agent 并行审计 + 1 Agent 落地 + 3 Agent 对抗式复审(PC安全 / 安卓正确性 / 构建门禁),全部 pass。
Fixes #677. Supersedes #704(及 #694 的安卓部分)。
PR Type
Bug fix, Enhancement, Tests
Description
Extract Android updater helpers into updater_logic.rs with tests
Add auto-install on Android, installError status via IPC log_client_error
Fix JNI crashes for Build.SUPPORTED_ABIS and accessibility detection
Add Android auto-update UI and dispatch release signing
File Walkthrough
4 files
Refactor accessibility detection to use Settings.Secure directlyUse shared updater_logic helpers and fix SUPPORTED_ABIS field accessAdd log_client_error IPC command to both desktop and mobileImplement logClientError with invokeOrMock9 files
Register updater_logic moduleNew module for manifest URLs, version compare, pubkey constImplement installError status, auto-install for Android, manualdownloadPass autoInstallAndroid option on AndroidExport logClientError functionNew Android auto-update toggle sectionRefactor layout with SettingRow and separate beta check buttonShow channel-specific button labels and pass errorMessage to dialogInclude AutoUpdateSection in AdvancedTab7 files
Update UpdateChannel and autoUpdateCheck documentationAdd new translation strings for Android auto-updateAdd Japanese translation for Android auto-updateAdd Korean translation for Android auto-updateAdd Chinese translation for Android auto-updateAdd Traditional Chinese translation for Android auto-updateUpdate UserPreferences docs for Android auto-update behavior11 files