ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DroidDeck 第二图书馆实战:Windows 游戏文件夹如何变成正式 Steam 条目并只补差量文件

DroidDeck 第二图书馆实战:Windows 游戏文件夹如何变成正式 Steam 条目并只补差量文件

DroidDeck 第二图书馆实战:Windows 游戏文件夹如何变成正式 Steam 条目并只补差量文件

【免费下载链接】DroidDeckDroidDeck brings the SteamOS experience to Android项目地址: https://gitcode.com/gh_mirrors/dr/DroidDeck

如果想在手机上玩已经下好的 Windows 游戏、又不想重新下载几个 GB,DroidDeck 的第二图书馆(Second library)就是答案:它把游戏文件夹注册成 Steam 库,自动把你拥有的游戏导入为正式条目,之后 Steam 只补差量文件,全程免密钥。

从散装文件夹到正式 Steam 条目:收益对比

放在 SD 卡里的 Windows 游戏,过去只能以"非 Steam 快捷方式"存在:能启动,但 Steam 不认识它,库管理与更新都和它无关。开启第二图书馆后,同一个文件夹会变成 Steam 的正式库条目,差别在四处:

维度旧方式(手动处理)第二图书馆
库条目逐个添加为 Custom 快捷方式,没有更新通道拥有则自动导入为真实 Steam 条目
导入后首次校验视为全新安装,逐文件检查,可能整份重下携带旧客户端的构建记录,只补变化部分
文件归属Steam 看不到 SD 卡里的文件更新与卸载直接操作你的原文件
所有权确认手动对照商店页逐个查登录中的客户端实时查询BIsSubscribedApp

机制拆解:身份、所有权与差量下载各靠什么

三条线索识别游戏身份

导入前先回答"这个文件夹对应哪个 AppID"。导入脚本的identify()按优先级取线索:

优先级线索位置说明
1已有 Steam manifest 的installdir同级steamapps/appmanifest_*.acf精确匹配,最可靠
2steam_appid.txt游戏文件夹或 exe 旁边直接读取,无需联网
3商店搜索的精确标题匹配Steam store search 接口规范化标题必须唯一命中

标题规范化会统一大小写、去掉商标符号与全角差异,并处理Windows Edition、Intergrade这类版本后缀;命中多条同名游戏时判定为无法识别,游戏保持非 Steam 快捷方式。封面相似度等模糊匹配被刻意排除在身份判定之外——宁可漏掉,不把别人的同名游戏当成你的导入。脚本全文见 droiddeck-steam-games。

所有权确认:BIsSubscribedApp 实时查询

"你是否拥有这款游戏"不查网页、不用 API 密钥,而是问随会话运行的 ARM64 Steam 客户端,走SteamClient020、SteamUser021、STEAMAPPS_INTERFACE_VERSION008版本化接口,不要求公开个人主页。

  • 每次探测跑在受限子进程里(15 秒超时),失败不会拖垮导入流程或客户端;
  • 快照存到该账号userdata/<id>/config下,登录期间每 30 秒刷新一次;
  • 标题查找每 5 分钟重试,探测失败按 30 秒起步指数退避、封顶 5 分钟,网络抖动不会让监视器放弃;
  • 有 Proton 游戏在运行时不做探测,把 CPU 留给游戏。

Steam 客户端只在启动时读取 manifest 与快捷方式,所以监视器在确认"拥有且未导入"、游戏没在跑、下载空闲时,会让客户端重启一次,导入就在这段"退出到下次启动"的窗口里完成。

带着构建记录,Steam 只补差量

裸 manifest 会让 Steam 当作全新安装、逐文件校验;导入器会把"另一个 Steam 客户端留下的构建记录"写进新 manifest,Steam 对照本地文件后只下载变化部分——好比托运时出示旧行李牌,行李被认出,免了重新安检。

来源位置生效条件
WinNative manifest游戏目录上级的.winnative-steam/steamapps处于已安装状态且含InstalledDepots
完整下载记录游戏目录内.DepotDownloader/depot.config的installedManifestIDs文件夹带.download_complete标记

写入的 manifest 带Universe=1与StateFlags=4(已安装),游戏文件夹以符号链接进入内部 Steam 库。早期版本产生的裸 manifest 只要未被 Steam 改动,会被自动升级为带构建信息的版本。完整机制以官方文档 steam-game-imports.md 为准。

上手体验:四步把 SD 卡游戏接进 Steam

前置条件:Android 9 以上、受支持的 Adreno GPU(730 及以上或 8xx 系列),DroidDeck 已安装并登录 Steam。

  1. 准备文件夹:把 Windows 游戏放进 SD 卡,推荐"每个游戏一个子文件夹",或沿用steamapps/common标准布局。做完后你应该看到:每个游戏各占一个目录,主 exe 在列。
  2. 选择存储模式:在模式设置的库页找到 Second library 并指向该文件夹,入口在 ModeSettingsDialog.kt。应用会按路径 SHA-256 生成私有目录,并把compatdata、shadercache等一次性迁入且补回执行权限,逻辑见 SecondaryLibrary.kt。做完后你应该看到:存储行显示所选文件夹,会话正常启动。
  3. 保持 Steam 会话运行:随附的droiddeck-steam-games watch常驻扫描候选游戏并刷新快照。做完后你应该看到:会话日志出现matched N/M games一类的进度行。

  1. 等一次客户端重启:确认拥有且未导入、游戏未运行、下载空闲时,客户端重启一次,导入在间隙完成。做完后你应该看到:该游戏从 Custom 快捷方式变成正式 Steam 条目,下载页可能只出现很小的差量任务。
  2. 从 Steam 库启动游戏:更新与卸载此后都直接作用于你的原文件。做完后你应该看到:游戏正常运行,性能画面有帧率与 CPU 数据。

常见坑:它什么时候会失灵 ⚠️

  • 同名标题识别不了:商店搜索命中多条时按设计判为无法识别,游戏保持非 Steam 快捷方式。规避:在 exe 旁放一个steam_appid.txt,或等文件夹里出现 Steam manifest。
  • 导入后无法更新:源文件夹不可写,Steam 对符号链接目标没有写权限,更新会失败。规避:确认存储卡处于可写状态,避免只读挂载。
  • SD 卡上流式读资产卡顿:界面已明示"从 SD 或共享存储流式读资产的游戏可能卡顿",共享存储的随机读性能有限。规避:重度游戏迁到内部存储。
  • 首次离线启动:没有运行中的客户端可探测所有权,导入降级为快捷方式,不阻塞使用;历史快照仍可离线使用,最终授权由 Steam 在启动时执行。
  • 它不会做什么:不移动、不删除原游戏文件,导入失败时文件原封不动留在原处;GOG、Epic 等商店安装的游戏永远不会被导入为 Steam 条目,只按该商店的快捷方式管理;账号 A 的路由不会带到账号 B。

验证与延伸:怎么确认导入真的生效

仓库为这条链路提供了自动化测试,test_steam_games.py 覆盖 39 个用例,包括身份匹配与版本后缀、网络恢复、账号隔离、manifest 迁移和差量构建记录:

python3 -m unittest discover -s tools/tests -p 'test_*.py'

手动观察点:在该账号的steamapps目录找appmanifest_<appid>.acf,确认StateFlags为4且InstalledDepots有 depot 记录;steamapps/common下应有指向你原文件夹的DroidDeck-<appid>链接,两者齐备说明 Steam 已按"旧安装"对待你的游戏。

一句话总结:第二图书馆完成的是"文件夹变库"的这一步——注册库、识别游戏、确认所有权、差量补齐。想动手的话,git clone https://gitcode.com/gh_mirrors/dr/DroidDeck获取仓库,按 README.md 的 Build 一节编译安装,再选一个装满游戏的 SD 卡文件夹交给它。

【免费下载链接】DroidDeckDroidDeck brings the SteamOS experience to Android项目地址: https://gitcode.com/gh_mirrors/dr/DroidDeck

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进