在 Linux 桌面环境中运行带有 Google 服务的 Waydroid 时,Google Play 商店可能原本一直正常,某次启动后却突然显示:

This device isn’t Play Protect certified

页面会提示设备没有获得运行 Google 应用和服务的认证,Play 商店也无法继续使用。

这类问题看起来像是整个 Google 服务环境失效,但实际原因往往没有那么严重。一次实际排查表明,网络连接、Google Services Framework ID 和 Google 服务器签到都可能完全正常,真正没有刷新的只是 Google Play services 内部保存的设备认证状态。


一、问题表现

Waydroid 可以正常启动,Android 系统也能够联网,其他应用没有明显异常,但打开 Google Play 商店后会直接跳转到未认证提示页面。

常见误判包括:

  • Waydroid 网络再次故障
  • Google 账号被封锁
  • ARM 应用兼容层损坏
  • 整个 Waydroid 数据需要重新初始化
  • 关闭 Play Protect 扫描即可解决

实际上,Play Protect 应用扫描设备认证状态是两套不同的机制。关闭扫描并不能让未认证设备恢复认证。


二、先查询当前 GSF Android ID

Google 为未经过厂商认证的自定义 Android 环境提供了设备 ID 登记页面。Waydroid 需要提交的是 Google Services Framework 数据库中的 android_id

保持 Waydroid 正在运行,在 Linux 宿主机执行:

sudo waydroid shell -- sh -c \
"sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \
'select value from main where name = \"android_id\";'"

正常情况下会输出一串十进制数字:

1234567890123456789

该数字就是当前 Waydroid 实例使用的 GSF Android ID。

不要把这个 ID 公开发布到博客、论坛或截图中。


三、在 Google 页面登记设备

在宿主机浏览器中登录与 Waydroid 相同的 Google 账号,然后访问 Google 的未认证设备登记页面:

https://www.google.com/android/uncertified/

将查询到的数字 ID 原样提交。

可能出现两种结果:

  • 登记成功
  • 提示该 ID 已经 registered

如果页面提示已经登记,说明 Google 服务器端已经保存了当前 ID。此时继续重复提交通常没有意义,问题更可能位于 Waydroid 内部的 Google 服务缓存。


四、先尝试完整重启 Waydroid

执行:

waydroid session stop
sudo systemctl restart waydroid-container.service

随后从桌面应用菜单重新启动 Waydroid,等待几分钟,再打开 Google Play 商店。

若仍然出现相同页面,可以先清除 Play 商店自身的数据:

sudo waydroid shell -- am force-stop com.android.vending
sudo waydroid shell -- pm clear com.android.vending

然后再次完整重启 Waydroid。

waydroid session stop
sudo systemctl restart waydroid-container.service

pm clear 成功时会返回:

Success

这一步只会重置 Play 商店本地数据,不会删除普通 Android 应用。

不过,实际排查中仅清除 Play 商店并没有解决问题。


五、通过日志确认问题位置

为了区分网络、设备 ID、Google 签到和认证缓存,可以收集以下信息:

printf '========== 时间 ==========\n'
sudo waydroid shell -- date

printf '\n========== GSF Android ID ==========\n'
sudo waydroid shell -- sh -c \
"sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \
'select value from main where name = \"android_id\";'"

printf '\n========== Google 组件版本 ==========\n'
for pkg in \
    com.android.vending \
    com.google.android.gms \
    com.google.android.gsf
do
    echo
    echo "[$pkg]"
    sudo waydroid shell -- dumpsys package "$pkg" |
        grep -m1 -E 'versionName=|versionCode='
done

printf '\n========== 最近相关日志 ==========\n'
sudo waydroid shell -- logcat -d -v time |
    grep -iE 'certif|uncertif|checkin|droidguard|attest|vending|gmscore' |
    tail -n 250

这次日志中出现了几个关键证据:

Checkin Succeeded

说明 Waydroid 已成功连接 Google 的 Android Check-in 服务,网络链路并没有故障。

Reading existing AID

说明 Google 服务正在继续使用已有的 Android ID,并非设备 ID 丢失。

Integrity key attestation record generated successfully

说明完整性与认证相关流程确实已经运行。

但打开 Play 商店时,系统仍启动了:

com.google.android.gms.gmscompliance.ui.UncertifiedDeviceActivity

同时日志明确提示 Google Play services 的数据并未被清除:

There is GoogleAccountData so GmsCore data probably was not cleared.

由此可以判断:Google 服务器签到正常,GSF ID 也存在并已登记,但 Google Play services 仍保留着旧的“设备未认证”状态。


六、最终修复:清除 Google Play services 认证状态

先记录当前 GSF Android ID:

printf '========== 操作前 GSF Android ID ==========\n'
sudo waydroid shell -- sh -c \
"sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \
'select value from main where name = \"android_id\";'"

然后停止 Google 组件:

sudo waydroid shell -- am force-stop com.android.vending
sudo waydroid shell -- am force-stop com.google.android.gms

清除 Google Play services 数据:

sudo waydroid shell -- pm clear com.google.android.gms

再清除 Play 商店数据:

sudo waydroid shell -- pm clear com.android.vending

最后完整重启 Waydroid:

waydroid session stop
sudo systemctl restart waydroid-container.service

重新启动 Waydroid 后,不要立刻打开 Play 商店。可以先等待三到五分钟,让 Google Play services 完成初始化和服务器同步。

由于 Google Play services 的本地账号状态被清除,系统可能要求重新输入 Google 账号密码。这属于正常现象。

完成重新认证后,Google Play 商店即可恢复正常。


七、不要随意清除 Google Services Framework

排查期间应避免直接执行:

sudo waydroid shell -- pm clear com.google.android.gsf

com.google.android.gsf 是 Google Services Framework。清除它的数据可能导致 gservices.db 被重建,并生成新的 Android ID。

一旦 ID 发生变化,之前在 Google 页面登记的旧 ID 便不再对应当前 Waydroid 实例,需要重新查询并登记。

因此,推荐的处理顺序应是:

  1. 查询并确认 GSF Android ID。
  2. 检查 Google 登记页面。
  3. 重启 Waydroid。
  4. 清除 Play 商店数据。
  5. 根据日志判断 Google Play services 是否保存了旧认证状态。
  6. 清除 com.google.android.gmscom.android.vending
  7. 最后才考虑处理 Google Services Framework。

八、日志中的几个非关键警告

排查过程中还可能看到:

Failed to write while dumping service package: Broken pipe

这是因为:

grep -m1

找到第一条结果后提前退出,上游的 dumpsys 继续写入已经关闭的管道所致。它并不表示 Android Package Manager 损坏。

另外还可能看到:

Unable to open ... .dm
Entry not found

这些通常与可选的 dex metadata 或应用优化文件有关,并不是此次设备认证失败的核心原因。

只要 Play 商店可以正常运行,就没有必要单独处理这些警告。


九、原因总结

这次故障的完整状态是:

  • Waydroid 网络正常
  • Google Check-in 正常
  • GSF Android ID 正常存在
  • 当前 ID 已在 Google 页面登记
  • Play 商店数据已被清除
  • Google Play services 仍保留旧的未认证结果
  • 清除 Google Play services 和 Play 商店数据后恢复正常

因此,问题并不是整个 Waydroid 环境损坏,也不需要重新初始化容器。

更可能的触发因素是 Google Play 商店或 Google Play services 自动更新后,重新执行了设备合规检查,但本地保存的认证状态没有正确刷新。


十、结论

Waydroid 突然出现 Play Protect 未认证提示时,不应立即重装或清空整个 Android 环境。

最有效的排查思路是:

  • 先确认 GSF Android ID;
  • 确认该 ID 是否已经登记;
  • 通过 Checkin Succeeded 判断 Google 网络链路;
  • 通过 UncertifiedDeviceActivity 判断认证页面由哪个组件触发;
  • 在保留 GSF ID 的前提下,清除 Google Play services 和 Play 商店的数据。

最终修复命令并不复杂,真正重要的是区分三个不同的数据层:

  • com.android.vending:Google Play 商店
  • com.google.android.gms:Google Play services
  • com.google.android.gsf:Google Services Framework

只清除 Play 商店可能不足以刷新认证结果;清除 Google Play services 才是此次恢复正常的关键。

Leave a Reply

Your email address will not be published. Required fields are marked *