<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Adb on Moo&#39;s Blog</title>
    <link>https://blog.moo.ac/tags/adb/</link>
    <description>Recent content in Adb on Moo&#39;s Blog</description>
    <image>
      <title>Moo&#39;s Blog</title>
      <url>https://blog.moo.ac/images/papermod-cover.png</url>
      <link>https://blog.moo.ac/images/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.145.0</generator>
    <language>en</language>
    <copyright>PaperMod Contributors</copyright>
    <lastBuildDate>Mon, 07 Sep 2026 15:17:02 +0800</lastBuildDate>
    <atom:link href="https://blog.moo.ac/tags/adb/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>HyperOS国行调用KeePassDX Passkey失效解决方案</title>
      <link>https://blog.moo.ac/posts/keepassdx/</link>
      <pubDate>Mon, 07 Sep 2026 15:17:02 +0800</pubDate>
      <guid>https://blog.moo.ac/posts/keepassdx/</guid>
      <description>利用adb解决HyperOS的第三方Credential Provider问题</description>
      <content:encoded><![CDATA[<h2 id="0-问题现象">0. 问题现象</h2>
<p>本来在<code>Android</code>用得是<code>KeePass2Android</code>, 可惜passkey功能到现在(20260907)都没上正式版, 暂且换为<code>KeePassDX</code>, 除了没有云端同步以外体感没区别.</p>
<p><code>KeePassDX passkey</code>功能在<code>ColorOS</code>手机测试正常, 但在<code>HyperOS</code>测试异常</p>
<p>设备环境:</p>
<ul>
<li>Xiaomi 14 Pro</li>
<li>Android 16 / 国行 HyperOS 3</li>
<li>KeePassDX 包名: <code>com.kunzisoft.keepass.free</code></li>
</ul>
<p>在 HyperOS 3 设置中已经将 KeePassDX 选择为密码/凭据服务,</p>
<img src="index.assets/image-20260907153312562.png" alt="image-20260907153312562" style="zoom:25%;" />
<p>但 Firefox、Chrome 等浏览器访问 <a href="https://webauthn.io/">WebAuthn</a> 网站时, Android 仍然无法调用 KeePassDX, Passkey 注册会提示<strong>Registration ceremony was sent an abort signal</strong>.</p>
<img src="index.assets/image-20260907152038400.png" alt="image-20260907152038400" style="zoom: 25%;" />
<h2 id="1-确认-adb-已连接手机">1. 确认 ADB 已连接手机</h2>
<p>本文不展开 ADB 安装及 USB 调试配置, 确保执行 <code>adb devices</code> 能正常识别手机即可.</p>
<h2 id="2-查看当前-credential-provider">2. 查看当前 Credential Provider</h2>
<p>执行:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">adb shell settings get secure credential_service
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">adb shell settings get secure credential_service_primary
</span></span></code></pre></div><p>输出</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService
</span></span></code></pre></div><p>两个设置项都指向小米自己的 Credential Provider.</p>
<p>结合后续修改后的测试结果，可以确认问题出在 HyperOS 对第三方 Credential Provider 的配置/加载这一环节.</p>
<h2 id="3-确认-keepassdx-包名">3. 确认 KeePassDX 包名</h2>
<p>PowerShell 下可以执行:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">adb</span> <span class="n">shell</span> <span class="n">pm</span> <span class="n">list</span> <span class="n">packages</span> <span class="p">|</span> <span class="nb">Select-String</span> <span class="s2">&#34;keepass&#34;</span>
</span></span></code></pre></div><p>输出:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">package:keepass2android.keepass2android
</span></span><span class="line"><span class="cl">package:com.kunzisoft.keepass.free
</span></span></code></pre></div><p>KeePassDX 包名为:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">com.kunzisoft.keepass.free
</span></span></code></pre></div><p>注意: 不同渠道安装的 KeePassDX 包名可能不同, 不建议直接照抄包名.</p>
<h2 id="4-查找-keepassdx-的-credentialproviderservice">4. 查找 KeePassDX 的 CredentialProviderService</h2>
<p>执行:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">adb</span> <span class="n">shell</span> <span class="n">dumpsys</span> <span class="n">package</span> <span class="n">com</span><span class="p">.</span><span class="py">kunzisoft</span><span class="p">.</span><span class="py">keepass</span><span class="p">.</span><span class="py">free</span> <span class="p">|</span> <span class="nb">Select-String</span> <span class="n">-Pattern</span> <span class="s2">&#34;CredentialProviderService&#34;</span> <span class="n">-Context</span> <span class="mf">5</span><span class="p">,</span><span class="mf">8</span>
</span></span></code></pre></div><p>可以找到:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">android.service.credentials.CredentialProviderService:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">permission android.permission.BIND_CREDENTIAL_PROVIDER_SERVICE
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Action: &#34;android.service.credentials.CredentialProviderService&#34;
</span></span></code></pre></div><p>因此 KeePassDX 实际注册的 Credential Provider Component 为:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService
</span></span></code></pre></div><p>如果你的包名或 Service 名称与此不同, 后面的命令需要相应修改.</p>
<h2 id="5-将-keepassdx-加入-credential-provider">5. 将 KeePassDX 加入 Credential Provider</h2>
<p>选择保留小米自己的 Credential Provider, 同时加入 KeePassDX:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">adb</span> <span class="n">shell</span> <span class="n">settings</span> <span class="n">put</span> <span class="n">secure</span> <span class="n">credential_service</span> <span class="s2">&#34;com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService:com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService&#34;</span>
</span></span></code></pre></div><p>然后将 KeePassDX 设置为 Primary Provider:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">adb</span> <span class="n">shell</span> <span class="n">settings</span> <span class="n">put</span> <span class="n">secure</span> <span class="n">credential_service_primary</span> <span class="s2">&#34;com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService&#34;</span>
</span></span></code></pre></div><blockquote>
<p>此处保留 Xiaomi Credential Provider 并非 KeePassDX 工作的必要条件, 是为了尽量减少对 HyperOS 原有配置的修改. 未测试完全移除 Xiaomi Provider 是否会影响其他系统功能.</p></blockquote>
<h2 id="6-验证修改结果">6. 验证修改结果</h2>
<p>执行:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">adb shell settings get secure credential_service
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&gt;&gt; com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService:com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService
</span></span></code></pre></div><p>执行</p>
<pre tabindex="0"><code>adb shell settings get secure credential_service_primary
</code></pre><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&gt;&gt; com.kunzisoft.keepass.free/com.kunzisoft.keepass.credentialprovider.passkey.PasskeyProviderService
</span></span></code></pre></div><p>可以确认 <code>Settings.Secure</code> 中的两个配置项已经修改成功.</p>
<h2 id="7-验证结果">7. 验证结果</h2>
<img src="index.assets/image-20260907153922534.png" alt="image-20260907153922534" style="zoom:25%;" />
<p>可以看到已经可以正常激活KeepassDX的passkey.</p>
<p>虽然这里提示了可在所有小米设备使用, 但在实际register之后查看小米自己的<code>密码app</code>, 并没有在里面的通行密钥中看到刚刚保存的passkey.</p>
<blockquote>
<p>根据issue和reddit部分用户反馈, 部分设备需要在重启后才能正常激活, 如果上述步骤后仍无法正常激活可尝试重启手机后验证.</p></blockquote>
<h2 id="8-测试-passkey">8. 测试 Passkey</h2>
<p>可以使用 <a href="https://webauthn.io/">WebAuthn</a> 测试网站测试.</p>
<p>在确认 WebAuthn Demo 正常后, 再测试实际网站, 如 Cloudflare等.</p>
<h2 id="9-恢复小米默认-credential-provider">9. 恢复小米默认 Credential Provider</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">adb</span> <span class="n">shell</span> <span class="n">settings</span> <span class="n">put</span> <span class="n">secure</span> <span class="n">credential_service</span> <span class="s2">&#34;com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService&#34;</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">adb</span> <span class="n">shell</span> <span class="n">settings</span> <span class="n">put</span> <span class="n">secure</span> <span class="n">credential_service_primary</span> <span class="s2">&#34;com.miui.contentcatcher/com.miui.credential.provider.XiaomiCredentialProviderService&#34;</span>
</span></span></code></pre></div><h2 id="注意事项">注意事项</h2>
<p>上述设置完毕后, 如果不是 HyperOS大更新, 应该可以做到重启手机后依然配置不变(手动验证重启后不变).</p>
<p>但如果<strong>手动切换</strong>了Credential的provider, 会导致临时失效, 个人经验是在设置界面重新将Credential Provider设置为KeepassDX, <strong>再将KeepassDX和浏览器清理后台</strong>后, 重新进入WebAuthn测试.</p>
<p>如果将provider切换成<code>无</code>会导致KeepassDX的adb配置被完全删除, 这时需要再执行一遍上文步骤.</p>
<h2 id="参考资料">参考资料</h2>
<p><a href="https://github.com/Kunzisoft/KeePassDX/issues/2220">Passkey prompt not showing on Xiaomi</a></p>
<p><a href="https://www.reddit.com/r/HyperOS/comments/1w3pyhk/discussion_fixing_thirdparty_passkey_pprooviders/">[Discussion] Fixing third-party passkey pprooviders on Chinese HyperOS using ADB </a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
