#3805·GmsCore

"允许应用程序查找帐户"对在启用该选项之前添加的帐户没有任何影响

作者: braklo创建于 2026年9月16日更新于 2026年9月16日

"Allow apps to find accounts" 切换项(Legacy Settings,键 auth_manager_visible)仅对在启用后添加的帐户生效。稍后启用此项对已存在的帐户没有任何影响,且 UI 中没有任何提示。这影响了任何使用 getAccountsByType() 而不是直接使用 getAuthToken() 来枚举帐户的应用程序 - Viber 和 WhatsApp 是人们不断报告的应用程序,但这并不是特定于应用程序。可见性行存储在 /data/system_de/0/accounts_de.db 中的 visibility 表中,作为 android:accounts:key_legacy_not_visible。如果没有它,持有既不具有 GET_ACCOUNTS_PRIVILEGED 权限,也不具有身份验证签名的应用程序将返回一个空列表。在当前树中,setAccountVisibility 只在一个位置被写入,即 LoginActivity.java(第 186 行和 441 行),由 isAuthVisible() 保护:

java
if (isAuthVisible(this) && SDK_INT >= 26) {
    accountManager.setAccountVisibility(account, PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE,
                                        VISIBILITY_USER_MANAGED_VISIBLE);
}

切换项本身在 AccountsFragment.onCreatePreferences() 中处理,其中监听器保存了值并刷新了 UI,并执行了其他两个设置的后续操作:

kotlin
SettingsContract.setSettings(requireContext(), Auth.getContentUri(requireContext())) { put(preference.key, newValue) }
updateSettings()
if (preference.key == Auth.TWO_STEP_VERIFICATION && newValue) registerGcmInGms()
if (preference.key == Auth.FIND_DEVICES && newValue) registerGcmInGms()

Auth.VISIBLE 没有此分支,因此启用它永远不会触发 setAccountVisibility。我通过将其切换为关闭状态并重新读取表来在设备上确认这一点:没有写入发生。要重现此问题,请通过 microG 添加 Google 帐户,切换为关闭状态,然后启用切换项,然后打开任何列出帐户的应用程序 - WhatsApp 聊天备份或 Viber 备份仍然不会显示任何帐户。读取表显示缺失的行:

bash
adb shell "sqlite3 /data/system_de/0/accounts_de.db \
  \"SELECT _package, value FROM visibility WHERE _package LIKE 'android:%';\""

这是自 2024 年以来,在 #1988 中人们传播的解决方案的背后机制 - 启用切换项,然后删除 Google 帐户并重新添加。这项操作之所以有效,是因为重新添加是行被写入的唯一时刻。这已在 CalyxOS 和 /e/OS 上由多名用户独立验证,同一个根原因也适用于 #2398 和 #2244。