0. 问题现象

本来在Android用得是KeePass2Android, 可惜passkey功能到现在(20260907)都没上正式版, 暂且换为KeePassDX, 除了没有云端同步以外体感没区别.

KeePassDX passkey功能在ColorOS手机测试正常, 但在HyperOS测试异常

设备环境:

  • Xiaomi 14 Pro
  • Android 16 / 国行 HyperOS 3
  • KeePassDX 包名: com.kunzisoft.keepass.free

在 HyperOS 3 设置中已经将 KeePassDX 选择为密码/凭据服务,

image-20260907153312562

但 Firefox、Chrome 等浏览器访问 WebAuthn 网站时, Android 仍然无法调用 KeePassDX, Passkey 注册会提示Registration ceremony was sent an abort signal.

image-20260907152038400

1. 确认 ADB 已连接手机

本文不展开 ADB 安装及 USB 调试配置, 确保执行 adb devices 能正常识别手机即可.

2. 查看当前 Credential Provider

执行:

adb shell settings get secure credential_service
adb shell settings get secure credential_service_primary

输出

com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService

两个设置项都指向小米自己的 Credential Provider.

结合后续修改后的测试结果,可以确认问题出在 HyperOS 对第三方 Credential Provider 的配置/加载这一环节.

3. 确认 KeePassDX 包名

PowerShell 下可以执行:

adb shell pm list packages | Select-String "keepass"

输出:

package:keepass2android.keepass2android
package:com.kunzisoft.keepass.free

KeePassDX 包名为:

com.kunzisoft.keepass.free

注意: 不同渠道安装的 KeePassDX 包名可能不同, 不建议直接照抄包名.

4. 查找 KeePassDX 的 CredentialProviderService

执行:

adb shell dumpsys package com.kunzisoft.keepass.free | Select-String -Pattern "CredentialProviderService" -Context 5,8

可以找到:

android.service.credentials.CredentialProviderService:

com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService

permission android.permission.BIND_CREDENTIAL_PROVIDER_SERVICE

Action: "android.service.credentials.CredentialProviderService"

因此 KeePassDX 实际注册的 Credential Provider Component 为:

com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService

如果你的包名或 Service 名称与此不同, 后面的命令需要相应修改.

5. 将 KeePassDX 加入 Credential Provider

选择保留小米自己的 Credential Provider, 同时加入 KeePassDX:

adb shell settings put secure credential_service "com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService:com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService"

然后将 KeePassDX 设置为 Primary Provider:

adb shell settings put secure credential_service_primary "com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService"

此处保留 Xiaomi Credential Provider 并非 KeePassDX 工作的必要条件, 是为了尽量减少对 HyperOS 原有配置的修改. 未测试完全移除 Xiaomi Provider 是否会影响其他系统功能.

6. 验证修改结果

执行:

adb shell settings get secure credential_service
>> com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService:com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService

执行

adb shell settings get secure credential_service_primary
>> com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService

可以确认 Settings.Secure 中的两个配置项已经修改成功.

7. 验证结果

image-20260907153922534

可以看到已经可以正常激活KeepassDX的passkey.

虽然这里提示了可在所有小米设备使用, 但在实际register之后查看小米自己的密码app, 并没有在里面的通行密钥中看到刚刚保存的passkey.

根据issue和reddit部分用户反馈, 部分设备需要在重启后才能正常激活, 如果上述步骤后仍无法正常激活可尝试重启手机后验证.

8. 测试 Passkey

可以使用 WebAuthn 测试网站测试.

在确认 WebAuthn Demo 正常后, 再测试实际网站, 如 Cloudflare等.

9. 恢复小米默认 Credential Provider

adb shell settings put secure credential_service "com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService"
adb shell settings put secure credential_service_primary "com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService"

注意事项

上述设置完毕后, 如果不是 HyperOS大更新, 应该可以做到重启手机后依然配置不变(手动验证重启后不变).

但如果手动切换了Credential的provider, 会导致临时失效, 个人经验是在设置界面重新将Credential Provider设置为KeepassDX, 再将KeepassDX和浏览器清理后台后, 重新进入WebAuthn测试.

如果将provider切换成会导致KeepassDX的adb配置被完全删除, 这时需要再执行一遍上文步骤.

参考资料

Passkey prompt not showing on Xiaomi

[Discussion] Fixing third-party passkey pprooviders on Chinese HyperOS using ADB