Skip to content

Google Play 商店:复制 GSF ID,装到一半失败时撤回 - #91

Merged
qiyinxi merged 1 commit into
ModAVD:mainfrom
qiyinxi:fix/playstore-gsfid-rollback
Nov 6, 2026
Merged

qiyinxi merged 1 commit into
ModAVD:mainfrom
qiyinxi:fix/playstore-gsfid-rollback

Conversation

@qiyinxi

@qiyinxi qiyinxi commented Nov 6, 2026

Copy link
Copy Markdown
Member

#89(Google Play 商店)审查留下的两条 P2,发 0.38.2 之前补上。

1. 取 GSF ID:复制 GSF ID

装完的提示原来让人照文档站第 6 步取 GSF ID,可文档里那条命令要用手动装法推进去的脚本,管理器装的实例上没有,跑不通。

  • 客体脚本 internal/guest/scripts/playstore.sh 加 gsfid:照文档站第 6 步的 sqlite3 查询,十进制和十六进制都给;还没有 ID(没有库、空、0、不是数字)时 RESULT no-id。
  • 命令行 modavd playstore <i> gsfid:--json 的 data 是 {index, decimal, hex};实例要开着;还没有 ID 时 not_ready,details.reason 为 no_gsf_id,建议开着网等一两分钟再试。十六进制由 modavd 按十进制算(负数按补码),不靠客体的 printf。
  • 管理器:GET /api/instances/{i}/playstore-gsfid(没开机或实例上有任务在跑是 409 busy,没有 ID 是 422 no_gsf_id);实例「更多操作」里装着商店时多一项「复制 GSF ID」,开机后可用:把十进制的复制到剪贴板,对话框里两种写法都列出来、各带复制按钮,再写登记的三步;还没有 ID 时提示开着网等一两分钟。
  • 装完的提示(命令行和管理器)改成指向「复制 GSF ID」/ playstore <i> gsfid 和 https://www.google.com/android/uncertified/ 。

2. 装到一半失败时撤回

原来装到一半失败不回滚,mas-avd.json 也不记,界面上只剩「补全」,没有「移除」。

  • 客体脚本的 install 先把要放的文件都拷成 <路径>.new,全拷好了才挪到位,这样覆盖层空间不够这类失败只留下 .new。已经是商店那份的文件不动(kept)。
  • 失败时撤回这次放进去的:.new、这次新建的目录、镜像里原来没有的文件走合并视图当场删;替换了镜像自带文件的和占位应用的 whiteout 从覆盖层上层删,下次冷启动生效(脚本会说 undone from the next boot,开着的实例会多一条警告)。都撤回了是 RESULT failed,撤不干净是 partial;最后一行写失败原因。status 发现残留的 .new 也报 partial。
  • modavd 在 partial(或者脚本没说完就断了)时把 instances.<i>.playStore 记成 "partial":InstanceInfo 多 play_store_partial,界面这时「补全」「移除」都给,设置抽屉写「只装了一部分」;bridge uninstall 照样拒绝;uninstall 成功后记 false。撤回干净的失败不改记录。
  • 顺带:原来关着的实例,装、卸失败后也尽力关机(取消了也关),关不掉的写进 warnings 和日志;开机时撞上另一次开机(busy)就不关。

文档:README(中英)、internal/ui/API.md。dev/mock.js:storefail=1 失败后记 partial,新增 nogsf=1。

测试

  • 客体脚本在假客体里跑(本机用 Git 的 sh;CI 的 Ubuntu、macOS 上有 sh 和 sha256sum 时也跑;桩出 chcon、mv、pm、sqlite3):拷贝失败、挪到位失败、拷完不对三种撤回;撤不干净是 partial,之后 status 也是 partial;残留 .new 时 status 是 partial;gsfid 的有 ID、没有库、空、0、不是数字。
  • emu(假执行器、临时根):撤回干净不改记录、partial 和脚本断了记 partial、InstanceInfo 和 bridge uninstall、卸载后清掉;失败后关机、关不掉的警告、取消后照样关、busy 不关、开着的实例只留警告;卸载失败也关;gsfid 的十进制、十六进制(含负数)、no-id、没有 decimal 行、0、不是数字、没开机、锁被占、PlayStore 不收 gsfid。
  • 命令行和接口:转发、--json 字段、错误码和 reason、没开机和忙时不问客体。
  • 界面(scripts/test_playstore_ui.mjs,24 项):菜单(装着时有「复制 GSF ID」、关机时灰掉;partial 两项都有)、复制和对话框、没有 ID 的提示、装完提示的文字。顺手修了这个文件模块加载器的一个竞态:两个模块同时引入同一个文件时会出两份 store.js,偶尔让「有任务时菜单灰掉」那条挂。
  • 本机:gofmt、go vet ./...(Windows、darwin/arm64、linux/amd64)、三平台 go build ./...、build.ps1、Windows go test ./...、scripts/test_*.mjs 全部 51 项、privacy.py 都过;用 dev mock 在浏览器里过了一遍补全后的提示、「复制 GSF ID」对话框和失败后的菜单。
  • 变异检查只做两处:失败时回滚(13 个变体:撤回里不删 .new / 挪到位的 / 新建目录、不恢复占位应用、三种失败不撤回、撤不干净也报 failed、status 不认 .new、不记 partial、脚本断了不记、InstanceInfo 不报、bridge uninstall 不认)和 gsfid 没有 ID 时报错(7 个:脚本不查 / 空 ID / 0,Go 把 no-id 当 ok / 没有 decimal 行回空结果 / 0 当 ID / 不带 reason),都被测试抓到。
  • 没在实例上实测:按发版流程放进 0.38.2 的回归里一起测(真实客体里的 sqlite3 查询、覆盖层上的撤回)。

Refs ModAVD/ModAVD#125

ModAVD#89 审查留下的两条 P2,发 0.38.2 前补上。

- 取 GSF ID:装完的提示原来让人照文档站第 6 步取,可那条命令要用手动装法推进去的脚本,管理器装的实例上没有。现在客体脚本 playstore.sh 有 gsfid(照第 6 步的 sqlite3 查询,十进制和十六进制都给;还没有 ID 时 RESULT no-id),命令行 modavd playstore <i> gsfid(--json 是 decimal、hex;没有 ID 时 not_ready,details.reason 为 no_gsf_id),管理器 GET /api/instances/{i}/playstore-gsfid 和实例菜单「复制 GSF ID」(装着商店、开着机时可用;把十进制的复制到剪贴板,对话框里两种写法都有、各带复制按钮,再写怎么登记;还没有 ID 时提示开着网等一两分钟)。命令行和管理器装完的提示改成指向它和 https://www.google.com/android/uncertified/ 。十六进制由 modavd 按十进制算,不靠客体的 printf。
- 装到一半失败时撤回:原来不回滚,mas-avd.json 也不记,界面只剩「补全」。现在客体脚本先把要放的文件都拷成 .new,全拷好了才挪到位;失败时撤回这次放进去的:.new、这次新建的目录、镜像里原来没有的文件走合并视图当场删,替换了镜像自带文件的和占位应用的 whiteout 从覆盖层上层删(下次冷启动生效,脚本会说);已经是商店那份的文件不动。都撤回了是 RESULT failed,撤不干净是 partial;status 发现残留的 .new 也报 partial。modavd 在 partial(或者脚本没说完就断了)时把 playStore 记成 "partial":InstanceInfo 多 play_store_partial,界面这时「补全」「移除」都给,bridge uninstall 照样拒绝;uninstall 成功后记 false。
- 原来关着的实例,装、卸失败后也尽力关机(取消了也关),关不掉记进 warnings 和日志;开机时撞上另一次开机(busy)就不关。开着的实例撤回的改动要冷启动才生效时给一条警告。
- 文档:README(中英)、API.md。dev/mock.js:storefail=1 失败后记 partial,新增 nogsf=1。
- 测试:客体脚本在假客体里跑拷贝失败(覆盖层空间不够)、挪到位失败、拷完不对三种撤回,撤不干净是 partial,status 认出残留的 .new,gsfid 的有 ID、没有库、空、0、不是数字;emu 的失败后记录、关机、关不掉的警告、取消后照样关、busy 不关、开着的实例的警告、卸载失败也关,gsfid 的十进制、十六进制(含负数)、no-id、没有 decimal 行、0、不是数字、没开机、锁;命令行和接口的转发、错误码、reason;界面的菜单、复制和对话框、没有 ID 的提示、装完提示的文字。test_playstore_ui.mjs 的模块加载器修了一个竞态:两个模块同时引入同一个文件时会出两份 store.js,偶尔让「有任务时菜单灰掉」那条挂。
- 变异检查只做失败时回滚和 gsfid 没有 ID 时报错两处,20 个变体都被测试抓到。

Refs ModAVD/ModAVD#125
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