Repository navigation
Releases
v11.6
What's Changed
- build(deps): bump com.github.luben:zstd-jni from 1.5.2-3 to 1.5.7-24 by @dependabot[bot] in #33
- build(deps): bump gradle-wrapper from 8.14.5 to 9.8.2 by @dependabot[bot] in #32
- chore(governance): 同步 Agent 契约 v2 by @ReSerendipity in #65
- feat(about): 关于弹窗补充 7 个社交平台入口 by @ReSerendipity in #67
- fix(ci): 补齐零改例外登记并修 SCA 的 NVD 429(含 11.6 版本位) by @ReSerendipity in #69
Full Changelog: v11.5.1...v11.6
v11.5.1
v11.5.1 摘要
这是一次纯文档修复 — CHANGELOG 里属于 11.5 的六条变更(批量 / 扫描导入、自定义封面 + exe 图标提取修复、FilterTest 扩例、封面回列表重绑、「继续游玩」真排序 + 三维组合过滤、多选条与删除确认)此前写在 ## [11.4] 段落下面,读起来像 11.4 已经包含它们。现在拆出独立的 ## [11.5] - 2026-10-26 段(Added 三条 / Fixed 三条),顺带把 FilterTest 例数按实测改成 33 例(含 IconCodec 6 例)、[Unreleased] 比对基线改指 v11.5 并补 [11.5] 链接引用。见 PR #64。
代码与 v11.5 完全同一份 — git diff v11.5..v11.5.1 只有 CHANGELOG.md 一个文件(34 insertions / 25 deletions,全是段落移动)。versionCode 36 / versionName 11.5 未变,也没有重跑构建:已经装上 11.5 的机器不需要做任何事,这个 tag 的作用只在于源码归档里的变更历史与实际发布内容对齐(v11.5 的 source archive 早于这次文档修复)。
功能、真机验收与已知限制见 v11.5。
What's Changed
- docs(changelog):把 11.5 的六条变更从 [11.4] 段落拆出 by @ReSerendipity in #64
Full Changelog: v11.5...v11.5.1
v11.5
v11.5 摘要
批量 / 扫描导入 — 导入向导第一步新增「批量扫描导入(多选)」:选一个目录(例如 Download),用 SAF 扫出候选——顶层带 .exe / .rpy / .rpyc / .xp3 / .rpa / .ypf / .wolf / .rgssad / .nsa 之一,或是 Ren'Py 的 game/ 目录;套娃目录只下探一层,跳过隐藏目录与运行时目录。勾选后串行导入,每条独立汇报「等待 / 复制中 / 导入中 / 已导入 / 失败」,失败项复用单条导入的回滚(删已建容器根目录 + 清暂存)。批量不自动拉起内置引擎,导完统一回游戏库自己点。
分类过滤由「单选」升级为「三维组合」 — 引擎 + 品类 + 标签可同时生效(AND),同一维度再点一次取消;筛空时空态文案改为「没有匹配的游戏」。「继续游玩」改为按最后启动时间倒序且只收真启动过的(lastPlayedAt > 0)——此前是「列表前 3 个」,名不副实;没玩过任何游戏时整段隐藏。
封面(提取修复 + 用户自定义) — ①BitmapFactory 解不了 PE 资源里的原始 DIB,所以卡片封面一直是占位图;新增 IconCodec 兜底(补 14 字节 BITMAPFILEHEADER、biHeight 减半剥掉 AND 掩码层、按 8bpp 调色板算偏移),组内候选按字节数降序逐个重试——真机上那款 Unity 游戏的 exe 图标首次正常显示。②详情页「维护 → 封面」可从相册选图或恢复自动,优先级 自定义 > 目录图 > exe 图标;选图先落 .tmp 并实际解码一次,解不开的不落盘。③修「换完封面回列表仍显示占位图」:解码完成前同一位置可能已被重绑到另一个 View,旧逻辑只贴给回调持有者;现在解码完成后让列表按缓存位图重画一次。
UI 修正(真机实测出来的) — 多选条加「品类 / 标签」后,六个动作把「已选 N 项」挤成 0 宽、「完成」被截断:标签简化为「删除 / 移除」、收紧边距、计数给最小宽度,全部回到一行内。「彻底删除 / 仅移除」确认弹窗从只报数量改为列出游戏名,并写明原生游戏的收纳副本同样会被删(真机复验时因只报数量误删过一批,当场从仍在的源目录重新导入恢复)。
测试与门禁 — JVM 回归 69 例全绿:DetectTest 21 + LanguageDetectorTest 15 + FilterTest 33(含 IconCodec 6 例)。gameId 派生与避碰、标签规范化(去空白 / 截断 12 字 / 换行)、三维过滤判定、DIB→BMP 边界这些纯逻辑都从 UI 里抽到 GalgameIds / GalgameFilter / IconCodec,界面与测试共用同一实现。ci/stubs 类型门禁三步(stubs → com.winlator.galgame 全树 → 热点入口清单)与 rebase-guard、Secret Scan 通过;零改动铁律未被触碰。
真机验收 — Realme RMX5010 / Adreno 830 / Android 16,release 包 versionName 11.5(versionCode 36):隔离目录里 Unity / Ren'Py / 套娃三个候选全部被扫出并导入,非游戏目录不入候选;再用 750MB 真实游戏走单候选路径(复制 → 检测 UNITY → 导入 → 启动);三维组合过滤逐维核对;封面提取与「详情页换封面 → 回列表」重绑核对(用临时 logcat 证实 bind/post 的 tagMatch,随后移除日志);多选条一行内显示与删除确认列名核对。未覆盖:批量导入中途杀进程的续传(TD-19 同源)未测;自定义封面未测超大图的降采样表现;引擎 chips 只在多于一种引擎时出现,单库环境靠注入第二条索引条目验证后已清理。
已知限制 — 走 DirectShow 的引擎(SystemNNN / YU-RIS 等)过场动画仍黑屏(TD-09,已坐实到 Wine 内建 quartz 的消息级死锁,现收窄为「自建 wine-9.2-custom 后 A/B」,本机无 WSL/Docker 未执行);AdvHD 仍未可玩(TD-17,改 wined3d 后引擎窗口能渲染,点 OK 自报 Direct3D Initialize failed (6))。本轮登记且仍在的债:TD-18(详情页「改用 Wine 容器运行」失败不回滚)、TD-19(原生收纳半拷贝被当成品)、TD-22(点卡片在主线程深扫目录)、TD-23(日文标题被弱信号误判为 zh_CN)、TD-25(显示标题只存在索引里)。逐条见 docs/tech-debt-register.md。
升级说明 — 覆盖安装即可,自有索引向后兼容:旧索引缺 genre / tags / cover 字段一律按「未设置」处理,不需要重新导入。安装 11.5 后首次进详情页/刷新列表会重新尝试 exe 图标提取,之前显示占位图的卡片应直接出图。
逐条变更见 CHANGELOG.md 的 [11.5] 段。下面的自动生成列表只覆盖经 PR 合并的条目。
What's Changed
- feat:批量/扫描导入 + 多选条与删除确认修正 by @ReSerendipity in #60
- feat:继续游玩真排序 + 分类三维组合 + 分类逻辑 JVM 回归 by @ReSerendipity in #61
- feat:自定义封面 + 修 exe 图标提取(DIB 兜底) by @ReSerendipity in #62
- chore(release):版本位升到 11.5(未打 tag) by @ReSerendipity in #63
Full Changelog: v11.4...v11.5
v11.4
v11.4 摘要
导入重做 — 第一步从「手输路径」换成系统文件夹选择器(ACTION_OPEN_DOCUMENT_TREE + persistable 授权),授权跟目录走、不随卸载重装重置;所选目录先复制进应用私有暂存(带进度、失败清半成品、可用空间 <128MB 硬失败、6h 残骸清扫)再走原管线。
导入假成功链(真机事故 D1–D5) — 重装后「所有文件访问」被系统重置时 listFiles() 为 null,旧行为一路「成功」到启动才报「启动文件缺失」:现 step0 fail-fast 并带用户去授权页。同批修复:解压套娃目录归一(resolveGameRoot,JVM 回归 E15–E21)、库条目回填标题/引擎、CJK 目录名塌缩改附哈希后缀、容器名恒等 galgame-<gameId>(避让上移到 id 派生)、导入失败回滚已建容器、复制完成无 exe 当场告警、重复导入先确认。
游戏库分类 — 顶部 chips 单选过滤:引擎自动归类(多于一种才出现)、预置内容品类(视觉小说 / 文字冒险 / 其他)、自定义标签;长按多选后「品类 / 标签」可一次给多张卡归类,标签可内联新建。
数据安全三件 — ①「彻底删除」补删 files/galgame-native 收纳副本(此前数 GB 静默泄漏)并校验结果;②索引改 .tmp+fsync+rename 原子写,解析失败先隔离 .corrupt-<ts> 再重建;③存档管理器拒绝空 gameId(跨游戏串档),便携存档「先搬后链」改为合并不完整就不删源、链接失败把档拷回、同名冲突留 .bak。
运维事实(重要) — 卸载重装 / 清数据会重置全部文件权限(含「所有文件访问」),ColorOS/Android 16 上 shell 无法代授,只能用户手动开;新的导入流程不依赖该权限。
真机验收 — RMX5010 / Adreno 830 / Android 16,release 包 11.4:选择器全链路(Download → 游戏目录 → 使用此文件夹)→ 检测 UNITY / 5 个文件 → 导入 → 单卡启动 → 标题菜单 → 正片连续推进对白 100s+;分类三条链路(品类/标签/引擎 chips,筛选取值 1/1/2);把索引写成非法 JSON 后改一次分类 → 旧文件留档、新索引字段正确;注入 2MB 收纳副本后彻底删除 → 目录归空。
已知限制 — 走 DirectShow 的引擎(SystemNNN / YU-RIS 等)过场动画仍黑屏(TD-09,Wine 侧 quartz 死锁);AdvHD 仍未可玩(TD-17);本次新登记 TD-25(显示标题只存在索引里,索引损坏后退化成 ASCII gameId)。
逐条变更见 CHANGELOG.md。下面的自动生成列表只覆盖经 PR 合并的条目。
What's Changed
- docs: 新增真机验证报告(2026-10-22~10-24 三轮汇总) by @ReSerendipity in #23
- test(docs): 逐游戏实际游玩验证 —— 17 个样本、8 个可玩 by @ReSerendipity in #24
- fix(launch): 桌面模式补 DOS 路径;记录虚拟桌面路线不可用 by @ReSerendipity in #25
- docs: 两项绕过实验——YU-RIS 片头不可跳过、KiriKiri 走容器可行 by @ReSerendipity in #26
- feat(launch): 原生引擎可一键改用 Wine 容器运行 by @ReSerendipity in #27
- fix(detail): 转换后本页能自己找回容器与运行方式 by @ReSerendipity in #28
- docs: 完整流程验证通过,记录「分辨率大于容器屏幕」陷阱 by @ReSerendipity in #29
- feat(detail): 运行环境分辨率可调(1280x720 / 1600x900 / 1920x1080) by @ReSerendipity in #30
- docs(td12): 三项已排除 + 更正「窗口被裁切」模型 by @ReSerendipity in #31
- feat(engine): preset KiriKiri virtual screen to 1920x1080 (TD-14) by @ReSerendipity in #34
- chore(governance): finish AGENTS migration, README and doc hygiene by @ReSerendipity in #35
- fix(galgame): Wine 路线窗口画面铺满(画面只占一小块的全屏修复) by @ReSerendipity in #36
- fix(services): 通知落地页统一到游戏库 + 全屏修复复盘文档 by @ReSerendipity in #37
- docs(governance): 项目身份重构——独立项目 + 内嵌 Winlator 组件(决策 A8) by @ReSerendipity in #38
- docs(readme): bilingual showcase with real screenshots by @ReSerendipity in #39
- feat(galgame): 启动链自愈(AdvHD icu 桩 / BGI ASCII 别名 / S: 目录)+ 对话框自动应答(教学-回放) by @ReSerendipity in #40
- docs(readme): serve images via jsDelivr CDN by @ReSerendipity in #41
- 游戏内 UX:返回键改派 ESC + 菜单浮钮 + 性能显示开关;组件版本登记表 by @ReSerendipity in #42
- 第五轮:随机启动闪退修复(indexOf 越界)+ 加载 UI 品牌化 + 性能显示 13 项多选 by @ReSerendipity in #43
- docs(readme): add real emulator screenshots by @ReSerendipity in #44
- 第六轮:HUD 重复修复 + 长按管理/桌面快捷方式/导入进度/菜单开关/外接控制器闪退 by @ReSerendipity in #45
- 第七轮:原生游戏收入应用内部(收纳库)+ 导入后源目录清理选项 by @ReSerendipity in #46
- 第八轮:性能监控 0/N/A 三根因修复 + 游戏库多选模式 by @ReSerendipity in #47
- 第九轮(上):多选操作栏 Swiss 化重设计;「更多设置」黑框排查登记 by @ReSerendipity in #48
- 第九轮(下):「更多设置」大黑框取证修复(完成条纸面化)+ 全站 UI 一致性扫描 by @ReSerendipity in #49
- 第十轮:引擎预设 dxwrapper 分化 + 按引擎 Wine 版本机制(任务一/二) by @ReSerendipity in #50
- docs:社区 wine-9.2 预编译包路线实测关闭 by @ReSerendipity in #51
- docs:TD-09 片头绕过实验负结果,修正因果模型 by @ReSerendipity in #52
- docs:TD-09 主渲染面正交对照收口,zink 供 GL 实验负 by @ReSerendipity in #53
- docs:第十轮收口与设备交接(release 装机、数据清空事实) by @ReSerendipity in #54
- fix:导入改系统文件夹选择器,修导入假成功链(D1–D5) by @ReSerendipity in #55
- fix:真机复验补三处(标题取索引名、文件数按游戏根、取消清暂存) by @ReSerendipity in #56
- feat:游戏库分类(引擎自动 / 预置品类 / 自定义标签) by @ReSerendipity in #57
- fix:数据安全三件(TD-20 收纳副本 / TD-21 索引原子写 / TD-24 存档串档) by @ReSerendipity in #58
- chore(release):11.4 版本位与 CHANGELOG 收口 by @ReSerendipity in #59
Full Changelog: v11.3...v11.4
v11.3
v11.3 摘要
界面 — Swiss 单首页 IA 与全站视觉重构:内页与游戏内 UI 收进同一套视觉语言;明暗双档走同一套主题 token(values-night 反相,状态栏图标随档位切换);「设置 → 输入控制」从死路接成真入口;运行环境可管理(详情 / 重新注入语言字体 / 删除)。
引擎 — 指纹扩展到 19 个(Siglus / YU-RIS / Artemis / CatSystem2 / AdvHD / SystemNNN / BGI / CMVS / Unity 等);新增 detectDeep() 有限深度下钻(深度 ≤3、预算 4000 项),修子目录 .xp3 被判 UNKNOWN 后无法升级路由的问题。
稳定性 — 修复 X server 输出流的静默截断与 SIGPIPE:XOutputStream_send 由裸阻塞 write() 改为 send(MSG_NOSIGNAL) 循环写满,EINTR 重试、EAGAIN 时 poll 上限 2 秒。
工程 — box64 自建变成可复现资产(私有补丁导出 + 双向校验 + 构建脚本 + 打包器入库,版本不再写死);类型门禁修绿(热点清单 3 → 6 条、R 桩 100 → 183 符号);运行时资源 SHA-256 清单补齐 assets 子目录(34 → 57 个文件)。
已知限制 — 走 DirectShow 的引擎(SystemNNN / YU-RIS 等)过场动画仍黑屏。根因已定位到 Wine 内建 quartz 的 IVideoWindow::put_WindowStyle → SetWindowPos 跨线程 SendMessage 永不返回(IMediaControl::Run 从未被调用),属 Wine 侧问题、应用层不可改,登记为 TD-09。
真机验收 — RMX5010 / Adreno 830 / Android 16,release 包:库页 19 条正常、详情页与设置页正常、版本号显示 11.3、锚点《花瓣!》HANA9cn.EXE 经 UI 完整路径启动并渲染标题画面。
逐条变更与提交号见仓库 CHANGELOG.md。下面自动生成的 PR 列表只覆盖经过 PR 合并的条目,直接推送到 main 的提交不在其中。
What's Changed
- build(deps): bump androidx.appcompat:appcompat from 1.4.0 to 1.8.0 by @dependabot[bot] in #2
- build(deps): bump com.google.android.material:material from 1.4.0 to 1.14.0 by @dependabot[bot] in #3
- build(deps): bump actions/setup-java from 4 to 6 by @dependabot[bot] in #4
- build(deps): bump actions/checkout from 4 to 7 by @dependabot[bot] in #5
- build(deps): bump org.apache.commons:commons-compress from 1.26.0 to 1.28.0 by @dependabot[bot] in #6
- build(deps): bump actions/upload-artifact from 4 to 7 by @dependabot[bot] in #7
- build(deps): bump org.tukaani:xz from 1.7 to 1.12 by @dependabot[bot] in #9
- build(deps): bump com.github.luben:zstd-jni from 1.5.2-3 to 1.5.7-23 by @dependabot[bot] in #8
- docs: 发布规范文档 + release 链补 SHA256SUMS(§10,阶段 D-01) by @ReSerendipity in #10
- docs: 补根级 CHANGELOG.md(Keep a Changelog) by @ReSerendipity in #11
- chore(structure): 项目结构收敛(§12.2) by @ReSerendipity in #12
- docs: 引擎等价方案系列文档 + §12.2 结构收敛收尾(含 §8 内部 README 迁移) by @ReSerendipity in #13
- chore: 规范符合性修复(20261020 审计:§2 master 残留 + §9 ignore 补齐) by @ReSerendipity in #14
- docs(readme): 增加治理规范引用 by @ReSerendipity in #15
- chore(governance): 落地 agent 契约与公开精简版 AGENTS.md by @ReSerendipity in #16
- Swiss UI 单首页 + 引擎识别扩展 + box64 自建可复现 + 门禁补桩 by @ReSerendipity in #17
- docs(video-chain): 把黑屏坐实到 put_WindowStyle 的跨线程 SetWindowPos 死锁 by @ReSerendipity in #18
- fix(xserver): X 流写入改为有界循环写满,不再裸阻塞写或静默截断 by @ReSerendipity in #19
- docs(readme): 补 Gradle wrapper 拉不下来时的离线构建路线 by @ReSerendipity in #20
- docs(tech-debt): TD-02 永久跳过并解除其发布门禁作用 by @ReSerendipity in #21
- release: v11.3 by @ReSerendipity in #22
New Contributors
- @dependabot[bot] made their first contribution in #2
Full Changelog: v11.2...v11.3
v11.2
Full Changelog: https://github.com/ReSerendipity/GalgameShell/commits/v11.2