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 | 精确匹配,最可靠 |
| 2 | steam_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。
- 准备文件夹:把 Windows 游戏放进 SD 卡,推荐"每个游戏一个子文件夹",或沿用
steamapps/common标准布局。做完后你应该看到:每个游戏各占一个目录,主 exe 在列。 - 选择存储模式:在模式设置的库页找到 Second library 并指向该文件夹,入口在 ModeSettingsDialog.kt。应用会按路径 SHA-256 生成私有目录,并把
compatdata、shadercache等一次性迁入且补回执行权限,逻辑见 SecondaryLibrary.kt。做完后你应该看到:存储行显示所选文件夹,会话正常启动。 - 保持 Steam 会话运行:随附的
droiddeck-steam-games watch常驻扫描候选游戏并刷新快照。做完后你应该看到:会话日志出现matched N/M games一类的进度行。
- 等一次客户端重启:确认拥有且未导入、游戏未运行、下载空闲时,客户端重启一次,导入在间隙完成。做完后你应该看到:该游戏从 Custom 快捷方式变成正式 Steam 条目,下载页可能只出现很小的差量任务。
- 从 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),仅供参考