定制安全中心

啟用或停用安全中心

若要啟用或停用安全中心,請使用frameworks/base/core/res/res/values/config.xml檔案中的可覆寫config_enableSafetyCenter布林欄位。

在大多數裝置上,例如手機和平板電腦,預設支援安全中心。在某些外形規格上,安全中心預設為停用狀態,例如在 Auto、TV 和 Wear 上。

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <!-- ... -->
   <!-- Determines whether SafetyCenter feature is enabled. -->
    <bool name="config_enableSafetyCenter">true</bool>
    <!-- ... -->
</resources>

若要支援安全中心,請將config_enableSafetyCenter設為true 。如果您不想支援安全中心,請將此值設為false以停用它。

停用安全中心後,任何重定向到「安全性和隱私」頁面的嘗試都會開啟「設定」應用程式。任何與 API 互動的嘗試都會被靜默忽略或傳回預設值。關聯的「快速設定」圖塊和「設定」條目也會顯示或隱藏,取決於是否啟用安全中心。

設備配置標誌

除了使用config_enableSafetyCenter配置啟用安全性中心外, DeviceConfig標誌 ( safety_center_is_enabled ) 用於遠端啟用或停用安全中心。

在 Android 14 及更高版本中,無需採取進一步操作,因為該標誌預設為true

在 Android 13 中,安全中心預設在伺服器端停用,並透過允許清單使用此標誌啟用。提交您的裝置指紋並聯絡您的 TAM 以將其新增至允許清單。請注意,主線版本M-2022-11或更高版本需要加入白名單。對於本機開發和測試,可以使用adb命令在本地啟用或停用該標誌(直到重新啟動)。例如,若要啟用該標誌:

adb root
adb shell device_config set_sync_disabled_for_tests until_reboot
adb shell device_config put privacy safety_center_is_enabled true

並確認安全中心是否啟用:

adb root
adb shell cmd safety_center enabled

輸出將返回裝置上是否正確啟用安全中心。

更新設定檔

使用safety_center_config.xml設定檔修改安全中心畫面的內容。假設您已符合自訂要求,則可以覆寫此文件。

覆蓋設定檔

若要覆寫safety_center_config.xml文件,請參閱在執行時間變更應用程式資源的值,以了解有關修改執行時間資源覆蓋 (RRO) 的資訊。

在 Android 14 中,請確保覆蓋res/raw-v34/safety_center_config.xml文件,而不是res/raw/safety_center_config.xml ,因為前者優先(這也適用於v34範圍內的其他文件,例如res/values-v34/strings.xml )。 Overlay 套件的 min SDK 必須低於34 ,否則v34限定符可能會在最佳化過程中被剝離。還要確保使用靜態覆蓋,因為該值是在啟動時載入的。

對於 Android 開源專案 (AOSP) 設備,定位包com.android.safetycenter.resources 。沒有要定位的覆蓋配置。所有資源均可疊加,內容不受限制。

對於配置為接收主線更新的 GMS 設備,定位包com.google.android.safetycenter.resources 。以配置SafetyCenterConfig為目標。此配置要求覆蓋包位於productsystemvendor分區。 GMS OEM 應複製 Google 提供的safety_center_config.xml文件,並將修改限制為GTS 測試允許的範圍。覆蓋定義應該與此接近:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your.overlay.package"
    android:versionCode="1"
    android:versionName="1.0">
    <application android:hasCode="false" />
    <overlay
      android:targetPackage="com.google.android.safetycenter.resources"
      android:targetName="SafetyCenterConfig"
      android:isStatic="true"
      android:priority="0"/>
</manifest>

對於未配置為接收主線更新的 GMS 設備,請定位套件com.android.safetycenter.resources 。沒有要定位的覆蓋配置。覆蓋包必須使用套件名稱com.google.android.safetycenter.resources

GMS OEM 應複製 Google 提供的safety_center_config.xml文件,並將修改限制為 GTS 測試允許的範圍。 GMS OEM 也必須定義 XML 配置中使用的字串。

文件結構

在較高層級上, safety_center_config.xml檔案是安全來源的清單。這些安全性來源會按群組進行組織,以管理安全中心螢幕上的訊號,例如應用程式安全性或螢幕鎖定。此清單的順序定義了顯示順序:

<safety-center-config> <!-- Wrapper for the Safety Center configuration -->
    <safety-sources-config>< !-- Wrapper for the safety sources groups -->
        <safety-sources-group> <!-- Contains information about a safety sources group -->
            <dynamic-safety-source /> <!-- Contains information about a safety source -->
            <!-- More safety sources in the group -->
        </safety-sources-group> <!-- More safety sources groups -->
    </safety-sources-config>
</safety-center-config>

谷歌設定檔

AOSP 設定檔位於packages/modules/Permission/SafetyCenter/Resources/res/raw/safety_center_config.xml中。

在Android 13中,Google設定檔為:

<safety-center-config>
    <safety-sources-config>
        <safety-sources-group
            id="GoogleAppSecuritySources"
            title="@com.google.android.safetycenter.resources:string/google_app_security_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_app_security_sources_summary">
            <dynamic-safety-source
                id="GooglePlayProtect"
                packageName="com.android.vending"
                profile="all_profiles"
                intentAction="com.google.android.finsky.PLAY_PROTECT"
                title="@com.google.android.safetycenter.resources:string/google_play_protect_title"
                titleForWork="@com.google.android.safetycenter.resources:string/google_play_protect_title_for_work"
                summary="@com.google.android.safetycenter.resources:string/google_play_protect_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_play_protect_search_terms"
                refreshOnPageOpenAllowed="true"/>
            <dynamic-safety-source
                id="GoogleAppProtectionService"
                packageName="com.google.android.odad"
                profile="primary_profile_only"
                initialDisplayState="hidden"
                loggingAllowed="false"/>
        </safety-sources-group>
        <safety-sources-group
            id="AndroidLockScreenSources"
            title="@com.google.android.safetycenter.resources:string/google_lock_screen_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_lock_screen_sources_summary">
            <dynamic-safety-source
                id="AndroidLockScreen"
                packageName="com.android.settings"
                profile="primary_profile_only"
                title="@com.google.android.safetycenter.resources:string/google_lock_screen_title"
                summary="@com.google.android.safetycenter.resources:string/google_lock_screen_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_lock_screen_search_terms"
                initialDisplayState="disabled"
                maxSeverityLevel="300"
                refreshOnPageOpenAllowed="true"/>
            <dynamic-safety-source
                id="AndroidBiometrics"
                packageName="com.android.settings"
                profile="primary_profile_only"
                title="@com.google.android.safetycenter.resources:string/google_biometrics_title"
                summary="@com.google.android.safetycenter.resources:string/google_biometrics_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_biometrics_search_terms"
                initialDisplayState="@com.google.android.safetycenter.resources:string/google_biometrics_initial_display_state"
                maxSeverityLevel="0"
                refreshOnPageOpenAllowed="true"/>
        </safety-sources-group>
        <safety-sources-group
            id="GoogleAccountsSources"
            title="@com.google.android.safetycenter.resources:string/google_accounts_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_accounts_sources_summary">
            <dynamic-safety-source
                id="GoogleSecurityCheckup"
                packageName="com.google.android.gms"
                profile="all_profiles"
                intentAction="com.google.android.gms.accountsettings.action.SAFETY_CENTER_SECURITY_CHECKUP"
                title="@com.google.android.safetycenter.resources:string/google_security_checkup_title"
                titleForWork="@com.google.android.safetycenter.resources:string/google_security_checkup_title_for_work"
                summary="@com.google.android.safetycenter.resources:string/google_security_checkup_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_security_checkup_search_terms"
                refreshOnPageOpenAllowed="true"/>
        </safety-sources-group>
        <safety-sources-group
            id="GoogleDeviceFinderSources"
            title="@com.google.android.safetycenter.resources:string/google_device_finder_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_device_finder_sources_summary">
            <dynamic-safety-source
                id="GoogleFindMyDevice"
                packageName="com.google.android.gms"
                profile="primary_profile_only"
                intentAction="com.google.android.gms.settings.FIND_MY_DEVICE_SETTINGS"
                title="@com.google.android.safetycenter.resources:string/google_find_my_device_title"
                summary="@com.google.android.safetycenter.resources:string/google_find_my_device_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_find_my_device_search_terms"
                refreshOnPageOpenAllowed="true"/>
            <dynamic-safety-source
                id="GoogleRogueTag"
                packageName="com.google.android.gms"
                profile="primary_profile_only"
                initialDisplayState="hidden"
                refreshOnPageOpenAllowed="true"/>
        </safety-sources-group>
        <safety-sources-group
            id="GoogleUpdateSources"
            title="@com.google.android.safetycenter.resources:string/google_updates_title"
            summary="@com.google.android.safetycenter.resources:string/google_updates_summary">
            <dynamic-safety-source
                id="GoogleSecurityUpdates"
                packageName="com.google.android.gms"
                profile="primary_profile_only"
                intentAction="@com.google.android.safetycenter.resources:string/google_security_updates_intent"
                title="@com.google.android.safetycenter.resources:string/google_security_updates_title"
                summary="@com.google.android.safetycenter.resources:string/google_security_updates_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_security_updates_search_terms"
                refreshOnPageOpenAllowed="true"/>
            <dynamic-safety-source
                id="GooglePlaySystemUpdate"
                packageName="com.android.vending"
                profile="primary_profile_only"
                intentAction="android.settings.MODULE_UPDATE_SETTINGS"
                title="@com.google.android.safetycenter.resources:string/google_play_system_update_title"
                summary="@com.google.android.safetycenter.resources:string/google_play_system_update_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_play_system_update_search_terms"
                refreshOnPageOpenAllowed="true"/>
        </safety-sources-group>
        <safety-sources-group
            id="AndroidPrivacySources"
            title="@com.google.android.safetycenter.resources:string/google_privacy_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_privacy_sources_summary"
            statelessIconType="privacy">
            <static-safety-source
                id="AndroidPermissionUsage"
                profile="primary_profile_only"
                intentAction="android.intent.action.REVIEW_PERMISSION_USAGE"
                title="@com.google.android.safetycenter.resources:string/google_permission_usage_title"
                summary="@com.google.android.safetycenter.resources:string/google_permission_usage_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_permission_usage_search_terms"/>
            <static-safety-source
                id="AndroidPermissionManager"
                profile="primary_profile_only"
                intentAction="android.intent.action.MANAGE_PERMISSIONS"
                title="@com.google.android.safetycenter.resources:string/google_permission_manager_title"
                summary="@com.google.android.safetycenter.resources:string/google_permission_manager_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_permission_manager_search_terms"/>
            <static-safety-source
                id="AndroidPrivacyControls"
                profile="primary_profile_only"
                intentAction="android.settings.PRIVACY_CONTROLS"
                title="@com.google.android.safetycenter.resources:string/google_privacy_controls_title"
                summary="@com.google.android.safetycenter.resources:string/google_privacy_controls_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_privacy_controls_search_terms"/>
            <issue-only-safety-source
                id="AndroidAccessibility"
                packageName="com.google.android.permissioncontroller"
                profile="all_profiles"
                refreshOnPageOpenAllowed="true"/>
            <issue-only-safety-source
                id="AndroidNotificationListener"
                packageName="com.google.android.permissioncontroller"
                profile="primary_profile_only"
                refreshOnPageOpenAllowed="true"/>
            <issue-only-safety-source
                id="AndroidBackgroundLocation"
                packageName="com.google.android.permissioncontroller"
                profile="all_profiles"
                refreshOnPageOpenAllowed="true"/>
            <issue-only-safety-source
                id="AndroidPermissionAutoRevoke"
                packageName="com.google.android.permissioncontroller"
                profile="all_profiles"
                refreshOnPageOpenAllowed="true"/>
        </safety-sources-group>
        <safety-sources-group
            id="AndroidAdvancedSources"
            title="@com.google.android.safetycenter.resources:string/google_advanced_title">
            <dynamic-safety-source
                id="AndroidWorkPolicyInfo"
                packageName="com.google.android.permissioncontroller"
                profile="primary_profile_only"
                initialDisplayState="hidden"
                refreshOnPageOpenAllowed="true"/>
            <static-safety-source
                id="AndroidAdvancedSecurity"
                profile="primary_profile_only"
                intentAction="com.android.settings.security.SECURITY_ADVANCED_SETTINGS"
                title="@com.google.android.safetycenter.resources:string/google_advanced_security_title"
                summary="@com.google.android.safetycenter.resources:string/google_advanced_security_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_advanced_security_search_terms"/>
            <static-safety-source
                id="AndroidAdvancedPrivacy"
                profile="primary_profile_only"
                intentAction="android.settings.PRIVACY_ADVANCED_SETTINGS"
                title="@com.google.android.safetycenter.resources:string/google_advanced_privacy_title"
                summary="@com.google.android.safetycenter.resources:string/google_advanced_privacy_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_advanced_privacy_search_terms"/>
        </safety-sources-group>
    </safety-sources-config>
</safety-center-config>

在Android 14中,Google設定檔為:

<safety-center-config>
    <safety-sources-config>
        <safety-sources-group
            id="GoogleAppSecuritySources"
            title="@com.google.android.safetycenter.resources:string/google_app_security_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_app_security_sources_summary">
            <dynamic-safety-source
                id="GooglePlayProtect"
                packageName="com.android.vending"
                profile="all_profiles"
                intentAction="com.google.android.finsky.PLAY_PROTECT"
                title="@com.google.android.safetycenter.resources:string/google_play_protect_title"
                titleForWork="@com.google.android.safetycenter.resources:string/google_play_protect_title_for_work"
                summary="@com.google.android.safetycenter.resources:string/google_play_protect_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_play_protect_search_terms"
                notificationsAllowed="true"
                packageCertificateHashes="1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,f0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83,d22cc500299fb22873a01a010de1c82fbe4d061119b94814dd301dab50cb7678,7ce83c1b71f3d572fed04c8d40c5cb10ff75e6d87d9df6fbd53f0468c2905053"
                deduplicationGroup="AppSecurity"/>
            <issue-only-safety-source
                id="GoogleAppProtectionService"
                packageName="com.google.android.odad"
                profile="primary_profile_only"
                loggingAllowed="false"
                deduplicationGroup="AppSecurity"/>
        </safety-sources-group>
        <safety-sources-group
            id="AndroidLockScreenSources"
            title="@com.google.android.safetycenter.resources:string/google_lock_screen_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_lock_screen_sources_summary">
            <dynamic-safety-source
                id="AndroidLockScreen"
                packageName="com.android.settings"
                profile="primary_profile_only"
                title="@com.google.android.safetycenter.resources:string/google_lock_screen_title"
                summary="@com.google.android.safetycenter.resources:string/google_lock_screen_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_lock_screen_search_terms"
                initialDisplayState="disabled"
                notificationsAllowed="true"
                maxSeverityLevel="300"/>
            <dynamic-safety-source
                id="AndroidBiometrics"
                packageName="com.android.settings"
                profile="all_profiles"
                title="@com.google.android.safetycenter.resources:string/google_biometrics_title"
                titleForWork="@com.google.android.safetycenter.resources:string/google_biometrics_title_for_work"
                summary="@com.google.android.safetycenter.resources:string/google_biometrics_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_biometrics_search_terms"
                initialDisplayState="@com.google.android.safetycenter.resources:string/google_biometrics_initial_display_state"
                maxSeverityLevel="0"/>
        </safety-sources-group>
        <safety-sources-group
            id="GoogleAccountsSources"
            title="@com.google.android.safetycenter.resources:string/google_accounts_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_accounts_sources_summary">
            <dynamic-safety-source
                id="GoogleSecurityCheckup"
                packageName="com.google.android.gms"
                profile="all_profiles"
                intentAction="com.google.android.gms.accountsettings.action.SAFETY_CENTER_SECURITY_CHECKUP"
                title="@com.google.android.safetycenter.resources:string/google_security_checkup_title"
                titleForWork="@com.google.android.safetycenter.resources:string/google_security_checkup_title_for_work"
                summary="@com.google.android.safetycenter.resources:string/google_security_checkup_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_security_checkup_search_terms"
                deduplicationGroup="AccountRequired"
                packageCertificateHashes="1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,f0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83,d22cc500299fb22873a01a010de1c82fbe4d061119b94814dd301dab50cb7678,7ce83c1b71f3d572fed04c8d40c5cb10ff75e6d87d9df6fbd53f0468c2905053"
                refreshOnPageOpenAllowed="true"/>
            <dynamic-safety-source
                id="GooglePasswordCheckup"
                packageName="com.google.android.gms"
                profile="all_profiles"
                title="@com.google.android.safetycenter.resources:string/google_password_checkup_title"
                titleForWork="@com.google.android.safetycenter.resources:string/google_password_checkup_title_for_work"
                searchTerms="@com.google.android.safetycenter.resources:string/google_password_checkup_search_terms"
                initialDisplayState="hidden"
                notificationsAllowed="true"
                deduplicationGroup="AccountRequired"
                packageCertificateHashes="1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,f0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83,d22cc500299fb22873a01a010de1c82fbe4d061119b94814dd301dab50cb7678,7ce83c1b71f3d572fed04c8d40c5cb10ff75e6d87d9df6fbd53f0468c2905053"
                refreshOnPageOpenAllowed="false"/>
        </safety-sources-group>
        <safety-sources-group
            id="GoogleDeviceFinderSources"
            title="@com.google.android.safetycenter.resources:string/google_device_finder_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_device_finder_sources_summary">
            <dynamic-safety-source
                id="GoogleFindMyDevice"
                packageName="com.google.android.gms"
                profile="primary_profile_only"
                intentAction="com.google.android.gms.settings.FIND_MY_DEVICE_SETTINGS"
                title="@com.google.android.safetycenter.resources:string/google_find_my_device_title"
                summary="@com.google.android.safetycenter.resources:string/google_find_my_device_summary"
                notificationsAllowed="true"
                deduplicationGroup="AccountRequired"
                packageCertificateHashes="1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,f0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83,d22cc500299fb22873a01a010de1c82fbe4d061119b94814dd301dab50cb7678,7ce83c1b71f3d572fed04c8d40c5cb10ff75e6d87d9df6fbd53f0468c2905053"
                searchTerms="@com.google.android.safetycenter.resources:string/google_find_my_device_search_terms"/>
            <dynamic-safety-source
                id="GoogleRogueTag"
                packageName="com.google.android.gms"
                profile="primary_profile_only"
                packageCertificateHashes="1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,f0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83,d22cc500299fb22873a01a010de1c82fbe4d061119b94814dd301dab50cb7678,7ce83c1b71f3d572fed04c8d40c5cb10ff75e6d87d9df6fbd53f0468c2905053"
                initialDisplayState="hidden"/>
        </safety-sources-group>
        <safety-sources-group
            id="GoogleUpdateSources"
            title="@com.google.android.safetycenter.resources:string/google_updates_title"
            summary="@com.google.android.safetycenter.resources:string/google_updates_summary">
            <dynamic-safety-source
                id="GoogleSecurityUpdates"
                packageName="com.google.android.gms"
                profile="primary_profile_only"
                intentAction="@com.google.android.safetycenter.resources:string/google_security_updates_intent"
                title="@com.google.android.safetycenter.resources:string/google_security_updates_title"
                summary="@com.google.android.safetycenter.resources:string/google_security_updates_summary"
                notificationsAllowed="true"
                packageCertificateHashes="1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,f0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83,d22cc500299fb22873a01a010de1c82fbe4d061119b94814dd301dab50cb7678,7ce83c1b71f3d572fed04c8d40c5cb10ff75e6d87d9df6fbd53f0468c2905053"
                searchTerms="@com.google.android.safetycenter.resources:string/google_security_updates_search_terms"/>
            <dynamic-safety-source
                id="GooglePlaySystemUpdate"
                packageName="com.android.vending"
                profile="primary_profile_only"
                intentAction="android.settings.MODULE_UPDATE_SETTINGS"
                title="@com.google.android.safetycenter.resources:string/google_play_system_update_title"
                summary="@com.google.android.safetycenter.resources:string/google_play_system_update_summary"
                notificationsAllowed="true"
                deduplicationGroup="AccountRequired"
                packageCertificateHashes="1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,f0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83,d22cc500299fb22873a01a010de1c82fbe4d061119b94814dd301dab50cb7678,7ce83c1b71f3d572fed04c8d40c5cb10ff75e6d87d9df6fbd53f0468c2905053"
                searchTerms="@com.google.android.safetycenter.resources:string/google_play_system_update_search_terms"/>
            <dynamic-safety-source
                id="GoogleBackupAndRestore"
                packageName="com.google.android.gms"
                profile="primary_profile_only"
                initialDisplayState="hidden"
                title="@com.google.android.safetycenter.resources:string/google_backup_title"
                packageCertificateHashes="1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,f0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83,d22cc500299fb22873a01a010de1c82fbe4d061119b94814dd301dab50cb7678,7ce83c1b71f3d572fed04c8d40c5cb10ff75e6d87d9df6fbd53f0468c2905053"
                searchTerms="@com.google.android.safetycenter.resources:string/google_backup_search_terms"/>
        </safety-sources-group>
        <safety-sources-group
            id="AndroidPrivacySources"
            title="@com.google.android.safetycenter.resources:string/google_privacy_sources_title"
            summary="@com.google.android.safetycenter.resources:string/google_privacy_sources_summary"
            statelessIconType="privacy">
            <static-safety-source
                id="AndroidPermissionManager"
                profile="primary_profile_only"
                intentAction="android.intent.action.MANAGE_PERMISSIONS"
                title="@com.google.android.safetycenter.resources:string/google_permission_manager_title"
                summary="@com.google.android.safetycenter.resources:string/google_permission_manager_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_permission_manager_search_terms"/>
            <static-safety-source
                id="AndroidPermissionUsage"
                profile="primary_profile_only"
                intentAction="android.intent.action.REVIEW_PERMISSION_USAGE"
                title="@com.google.android.safetycenter.resources:string/google_permission_usage_title"
                summary="@com.google.android.safetycenter.resources:string/google_permission_usage_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_permission_usage_search_terms"/>
            <static-safety-source
                id="GoogleAdsIdentity"
                profile="all_profiles"
                packageName="com.google.android.gms"
                intentAction="com.google.android.gms.adsidentity.ACTION_ADS_IDENTITY_SETTINGS"
                title="@com.google.android.safetycenter.resources:string/google_ads_identity_title"
                titleForWork="@com.google.android.safetycenter.resources:string/google_ads_identity_title_for_work"
                summary="@com.google.android.safetycenter.resources:string/google_ads_identity_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_ads_identity_search_terms"/>
            <dynamic-safety-source
                id="AndroidHealthConnect"
                profile="primary_profile_only"
                packageName="com.google.android.healthconnect.controller"
                initialDisplayState="hidden"
                refreshOnPageOpenAllowed="false"
                title="@com.google.android.safetycenter.resources:string/google_health_connect_title"
                searchTerms="@com.google.android.safetycenter.resources:string/google_health_connect_search_terms"/>
            <dynamic-safety-source
                id="AndroidPrivacyAppDataSharingUpdates"
                packageName="com.google.android.permissioncontroller"
                profile="primary_profile_only"
                initialDisplayState="hidden"
                refreshOnPageOpenAllowed="true"
                title="@com.google.android.safetycenter.resources:string/google_app_data_sharing_updates_title"
                searchTerms="@com.google.android.safetycenter.resources:string/google_app_data_sharing_updates_search_terms"/>
            <static-safety-source
                id="AndroidPrivacyControls"
                profile="primary_profile_only"
                intentAction="android.settings.PRIVACY_CONTROLS"
                title="@com.google.android.safetycenter.resources:string/google_privacy_controls_title"
                summary="@com.google.android.safetycenter.resources:string/google_privacy_controls_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_privacy_controls_search_terms"/>
            <static-safety-source
                id="GoogleActivityControls"
                profile="all_profiles"
                packageName="com.google.android.gms"
                intentAction="com.google.android.gms.accountsettings.action.ACTIVITY_CONTROLS"
                title="@com.google.android.safetycenter.resources:string/google_activity_controls_title"
                titleForWork="@com.google.android.safetycenter.resources:string/google_activity_controls_title_for_work"
                summary="@com.google.android.safetycenter.resources:string/google_activity_controls_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_activity_controls_search_terms"/>
            <issue-only-safety-source
                id="AndroidAccessibility"
                packageName="com.google.android.permissioncontroller"
                profile="all_profiles"
                notificationsAllowed="true"
                refreshOnPageOpenAllowed="true"/>
            <issue-only-safety-source
                id="AndroidNotificationListener"
                packageName="com.google.android.permissioncontroller"
                profile="primary_profile_only"
                notificationsAllowed="true"
                refreshOnPageOpenAllowed="true"/>
            <issue-only-safety-source
                id="AndroidBackgroundLocation"
                packageName="com.google.android.permissioncontroller"
                profile="all_profiles"
                notificationsAllowed="true"
                refreshOnPageOpenAllowed="true"/>
            <issue-only-safety-source
                id="AndroidPermissionAutoRevoke"
                packageName="com.google.android.permissioncontroller"
                profile="all_profiles"
                notificationsAllowed="true"
                refreshOnPageOpenAllowed="true"/>
        </safety-sources-group>
        <safety-sources-group
            id="AndroidAdvancedSources"
            title="@com.google.android.safetycenter.resources:string/google_advanced_title">
            <dynamic-safety-source
                id="AndroidWorkPolicyInfo"
                packageName="com.google.android.permissioncontroller"
                profile="primary_profile_only"
                title="@com.google.android.safetycenter.resources:string/google_work_policy_title"
                initialDisplayState="hidden"
                refreshOnPageOpenAllowed="true"/>
            <static-safety-source
                id="AndroidMoreSettings"
                profile="primary_profile_only"
                intentAction="com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
                title="@com.google.android.safetycenter.resources:string/google_more_settings_title"
                summary="@com.google.android.safetycenter.resources:string/google_more_settings_summary"
                searchTerms="@com.google.android.safetycenter.resources:string/google_more_settings_search_terms"/>
        </safety-sources-group>
    </safety-sources-config>
</safety-center-config>

自訂安全中心來源

安全中心來源類型

來源可以是動態的、僅針對問題的或靜態的,這取決於它們向安全中心提供的資料類型。

動態來源

如果安全來源可以為其條目卡和潛在警告卡向安全中心提供動態數據,則將安全來源標記為dynamic-safety-source

<dynamic-safety-source
    id="AndroidLockScreen"
    packageName="com.android.settings"
    profile="primary_profile_only"
    title="@com.google.android.safetycenter.resources:string/google_lock_screen_title"
    summary="@com.google.android.safetycenter.resources:string/google_lock_screen_summary"
    searchTerms="@com.google.android.safetycenter.resources:string/google_lock_screen_search_terms"
    initialDisplayState="disabled"
    maxSeverityLevel="300"
    refreshOnPageOpenAllowed="true"/>

僅發布來源

如果沒有關聯的設定條目但仍提供警告,則將來源標記為issue-only-safety-source 。您只能提供警告;提供設定條目會導致錯誤:

<issue-only-safety-source
    id="AndroidAccessibility"
    packageName="com.google.android.permissioncontroller"
    profile="all_profiles"
    refreshOnPageOpenAllowed="true"/>

靜態來源

如果來源是沒有動態資料的重定向條目,則將來源標記為static-safety-source

<static-safety-source
    id="AndroidAdvancedSecurity"
    profile="primary_profile_only"
    intentAction="com.google.android.settings.security.SECURITY_ADVANCED_SETTINGS"
    title="@com.google.android.safetycenter.resources:string/google_advanced_security_title"
    summary="@com.google.android.safetycenter.resources:string/google_advanced_security_summary"
    searchTerms="@com.google.android.safetycenter.resources:string/google_advanced_security_search_terms"/>

安全中心源配置

根據安全中心來源類型和其他不變量,設定檔欄位是可選的、必需的或禁止的,並且可以自訂:

  • id
    • 安全來源的唯一標識符,在整個文件中必須是唯一的,並且必須僅由字母字元(az、AZ)組成,並且區分大小寫
    • 字串類型
    • 所有安全來源類型都需要
  • packageName
    • 擁有此安全來源的套件的名稱,例如com.google.android.permissioncontroller
    • 字串類型
    • 動態和僅問題安全來源所需
    • Android 13 中禁止靜態安全源;在 Android 14 中,可以選擇將其設定為顯式而不是隱式地針對來源的intentAction (有關更多詳細信息,請參閱意圖解析文件
  • initialDisplayState
    • 當安全來源未提供資料時,UI 條目如何顯示
    • 表示為字串的枚舉類型,必須是以下之一:
      • enabled (默認,正常顯示)
      • disabled (顯示為灰色,無法點選)
      • hidden (不顯示)
    • 動態安全來源可選(預設為enabled
    • 禁止僅用於問題和靜態安全來源
  • profile
    • 此安全源是否與使用者的託管設定檔交互
    • 表示為字串的枚舉類型,必須是以下之一:
      • primary_profile_only (僅與設定檔父級互動)
      • all_profiles (也可以與託管設定檔互動)
    • all_profiles上,產生多個 UI 條目(一個用於設定檔父級,一個用於每個託管設定檔);安全來源可以為每個設定檔提供不同的數據
    • 所有安全源都需要
  • searchTerms
    • 在「設定」應用程式中使用搜尋時對應到安全中心條目的搜尋字詞列表
    • 資源 ID 表示為完全限定的資源名稱,例如@package:string/my_search_terms
    • 動態和靜態安全來源可選(預設為無搜尋字詞)
    • 禁止僅用於問題安全來源
  • title
    • UI 條目的預設標題,當來源沒有動態提供資料時使用
    • 資源 ID 表示為完全限定的資源名稱,例如@package:string/my_title
    • 動態和靜態安全來源所需(除非initialDisplayState="hidden"且沒有searchTerms
    • 禁止僅用於問題安全來源
  • titleForWork
    • 當來源未動態提供資料時所使用的託管設定檔的 UI 條目的預設標題
    • 資源 ID 表示為完全限定的資源名稱,例如@package:string/my_title_for_work
    • 對於已指定profile="all_profiles"動態和靜態安全來源是必要的(除非initialDisplayState="hidden"且沒有searchTerms
    • 禁止僅用於問題的安全來源或profile="primary_profile_only"的來源
  • summary
    • UI 條目的預設摘要(這是標題下方顯示的較長文字描述),當資料來源未動態提供資料時使用
    • 資源 ID 表示為完全限定的資源名稱,例如@package:string/my_summary
    • 靜態安全來源可選(預設無摘要)
    • 動態安全來源所需(除非initialDisplayStatehidden
    • 禁止僅用於問題安全來源
  • intentAction
    • 點選 UI 條目時觸發的操作
    • 字串類型,例如com.google.android.settings.security.SECURITY_ADVANCED_SETTINGS ,或表示為完全限定資源名稱的資源 ID,例如@package:string/my_intent_action
    • 如果此 Intent 操作無法解析給定的packageName (如果有),則 UI 條目的行為方式與initialDisplayState="disabled"相同
    • 對於具有initialDisplayState="enabled"的靜態安全來源和dynamic安全來源是必要的
    • 禁止僅用於問題安全來源
  • maxSeverityLevel
    • 此安全中心來源可以提供的最高嚴重性級別
    • 表示為字串的整數,例如300
    • 對於動態和僅問題安全來源是可選的(預設值沒有最大值)
    • 禁止用於靜態安全源
  • loggingAllowed
    • 安全中心是否可以記錄與此來源相關的互動或數據
    • 布林值表示為字串,例如false
    • 對於動態和僅問題安全來源是可選的(預設為true
    • 禁止用於靜態安全源
  • refreshOnPageOpenAllowed
    • 當安全中心螢幕開啟時是否應向安全來源發送訊號以刷新其數據
    • 布林值表示為字串,例如true
    • 對於動態和僅問題安全來源是可選的(預設為false
    • 禁止用於靜態安全源
  • notificationsAllowed (從 Android 14 開始)
    • 安全來源在報告問題時是否可以選擇提供通知
    • 布林值表示為字串,例如true
    • 對於動態和僅問題安全來源是可選的(預設為false
    • 禁止用於靜態安全源
  • deduplicationGroup (從 Android 14 開始)
    • 一個潛在的唯一標識符,可用於消除來自不同來源的重複問題。相同重複資料刪除群組內的來源可以使用可選的重複資料刪除 ID 傳送問題。具有相同重複資料刪除 ID 的問題只會在 UI 中顯示一次,即使有多個來源發送這些問題也是如此。
    • 字串類型
    • 對於動態和僅問題安全來源是可選的(預設為無重複資料刪除)
    • 禁止用於靜態安全源
  • packageCertificateHashes (從 Android 14 開始)
    • 給定packageName的憑證雜湊的逗號分隔清單。如果設定了此項,出於安全目的,在與安全來源互動時,將根據給定packageName的給定packageCertificateHashes執行憑證檢查
    • 字串類型
    • 對於動態和僅發布的安全來源是可選的(預設是沒有憑證檢查)
    • 禁止用於靜態安全源

自訂安全中心來源群組

安全中心來源必須包含在安全中心來源群組中。每個來源組按照來源組在文件中列出的順序顯示在 UI 中。每個來源會依照來源在文件中列出的順序顯示在群組中。如果群組包含單一安全性來源,它將顯示為單一條目而不是群組。

安全中心來源群組配置

使用下列變數自訂安全中心來源群組:

  • id
    • 安全來源群組的唯一識別碼;在整個文件中必須是唯一的
    • 字串類型
    • 必需的
  • title
    • UI 中群組的標題
    • 資源 ID 表示為完全限定的資源名稱,例如@package:string/my_title
    • 如果群組內至少有一個動態或靜態安全來源(即該群組不是type="hidden" ),則為必要
  • summary
    • UI 中群組的簡要說明,顯示在標題下方。在特定條件下顯示,通常是在未提供資料時顯示;否則,摘要是根據組內來源提供的數據計算的。
    • 資源 ID 表示為完全限定的資源名稱,例如@package:string/my_summary
    • 可選(預設無摘要)
  • statelessIconType
    • 當安全來源未提供狀態時為群組顯示的圖示類型,例如靜態條目
    • 表示為字串的枚舉類型,必須為noneprivacy (隱私圖示類型)
    • 可選(預設為none
  • type (從 Android 14 開始)
    • 用於限定該群組如何與安全中心互動的明確類型
    • 表示為字串的枚舉類型,必須是以下之一:
      • stateful (顯示並有助於整體安全中心狀態)
      • stateless (顯示且不會影響整體安全中心狀態)
      • hidden (不顯示,所有來源必須僅限問題)
    • 可選,預設透過使用群組中包含的安全來源以及summarystatelessIconType進行推斷。如果指定了type則強制執行一些附加的不變量以確保它與群組中遇到的來源相符(例如,如果群組包含使用者可見的條目,則無法hidden該群組)

安全中心來源群組類型

根據某些欄位的狀態,安全中心來源群組分為有狀態、無狀態或隱藏。

有狀態組

同時具有標題和摘要或stateLessIconType="privacy"群組被視為有狀態,有助於整體安全中心狀態:

<safety-sources-group
    id="GoogleAppSecuritySources"
    title="@com.google.android.safetycenter.resources:string/google_app_security_sources_title"
    summary="@com.google.android.safetycenter.resources:string/google_app_security_sources_summary">
    <dynamic-safety-source
        id="GooglePlayProtect"
        packageName="com.android.vending"
        profile="all_profiles"
        intentAction="com.google.android.finsky.PLAY_PROTECT"
        title="@com.google.android.safetycenter.resources:string/google_play_protect_title"
        titleForWork="@com.google.android.safetycenter.resources:string/google_play_protect_title_for_work"
        summary="@com.google.android.safetycenter.resources:string/google_play_protect_summary"
        searchTerms="@com.google.android.safetycenter.resources:string/google_play_protect_search_terms"
        refreshOnPageOpenAllowed="true"/>
    <dynamic-safety-source
        id="GoogleAppProtectionService"
        packageName="com.google.android.odad"
        profile="primary_profile_only"
        initialDisplayState="hidden"
        loggingAllowed="false"/>
</safety-sources-group>

在 Android 13 中,此類群組將在 UI 中顯示為可折疊條目。在 Android 14 中,它將顯示為一個條目,具有自己的狀態,可重定向到子頁面。

無狀態組

有標題但沒有摘要且stateLessIconType="none"群組被視為無狀態,且不會影響整體安全中心狀態:

<safety-sources-group
    id="AndroidPrivacySources"
    title="@com.google.android.safetycenter.resources:string/google_privacy_sources_title"
    summary="@com.google.android.safetycenter.resources:string/google_privacy_sources_summary"
    statelessIconType="privacy">
    <static-safety-source
        id="AndroidPermissionUsage"
        profile="primary_profile_only"
        intentAction="android.intent.action.REVIEW_PERMISSION_USAGE"
        title="@com.google.android.safetycenter.resources:string/google_permission_usage_title"
        summary="@com.google.android.safetycenter.resources:string/google_permission_usage_summary"
        searchTerms="@com.google.android.safetycenter.resources:string/google_permission_usage_search_terms"/>
    <static-safety-source
        id="AndroidPermissionManager"
        profile="primary_profile_only"
        intentAction="android.intent.action.MANAGE_PERMISSIONS"
        title="@com.google.android.safetycenter.resources:string/google_permission_manager_title"
        summary="@com.google.android.safetycenter.resources:string/google_permission_manager_summary"
        searchTerms="@com.google.android.safetycenter.resources:string/google_permission_manager_search_terms"/>
    <static-safety-source
        id="AndroidPrivacyControls"
        profile="primary_profile_only"
        intentAction="android.settings.PRIVACY_CONTROLS"
        title="@com.google.android.safetycenter.resources:string/google_privacy_controls_title"
        summary="@com.google.android.safetycenter.resources:string/google_privacy_controls_summary"
        searchTerms="@com.google.android.safetycenter.resources:string/google_privacy_controls_search_terms"/>
    <issue-only-safety-source
        id="AndroidAccessibility"
        packageName="com.google.android.permissioncontroller"
        profile="all_profiles"
        refreshOnPageOpenAllowed="true"/>
    <issue-only-safety-source
        id="AndroidNotificationListener"
        packageName="com.google.android.permissioncontroller"
        profile="primary_profile_only"
        refreshOnPageOpenAllowed="true"/>
    <issue-only-safety-source
        id="AndroidBackgroundLocation"
        packageName="com.google.android.permissioncontroller"
        profile="all_profiles"
        refreshOnPageOpenAllowed="true"/>
    <issue-only-safety-source
        id="AndroidPermissionAutoRevoke"
        packageName="com.google.android.permissioncontroller"
        profile="all_profiles"
        refreshOnPageOpenAllowed="true"/>
</safety-sources-group>

這樣的群組將在 UI 中顯示為嚴格的條目清單。

隱藏群組

隱藏群組僅包含僅限問題的安全來源,且沒有標題。隱藏群組不會顯示在 UI 中:

<safety-sources-group
    id="HiddenGroup">
    <issue-only-safety-source
        id="AndroidAccessibility"
        packageName="com.google.android.permissioncontroller"
        profile="all_profiles"
        refreshOnPageOpenAllowed="true"/>
</safety-sources-group>

靜態條目的動態數據

您可以將動態安全中心來源顯示為靜態條目,這允許根據某些條件推送重定向條目,並允許在執行時自訂其內容。例如,根據您的工作策略資訊條目定義無狀態群組內的動態來源。

此範例顯示了一個不提供安全訊號的動態安全來源,因為它位於無狀態群組中:

<safety-sources-group
    id="AndroidAdvancedSources"
    title="@com.google.android.safetycenter.resources:string/google_advanced_title">
    <dynamic-safety-source
        id="AndroidWorkPolicyInfo"
        packageName="com.google.android.permissioncontroller"
        profile="primary_profile_only"
        initialDisplayState="hidden"
        refreshOnPageOpenAllowed="true"/>
            <!-- … -->
</safety-sources-group>

在此範例中,來源只能推送綠色警告卡並提供未指定的狀態。為了能夠提供其他數據,來源必須位於有狀態群組內。

自訂字串和覆蓋字段

對於未配置為接收主線更新的 GMS 設備,您可以覆寫六個字串資源來滿足所有自訂需求,而不是覆寫整個設定檔。表中列出了覆蓋的字串資源。

字串資源描述
google_lock_screen_sources_summary覆寫此值以定義當群組中的所有來源都處於良好狀態(資訊或未指定的嚴重性等級)時為AndroidLockScreenSources群組顯示的靜態摘要。預設情況下,安全中心將群組中所有來源的標題顯示為串聯的群組摘要。
google_biometrics_title覆寫此值可為com.android.settings套件擁有的生物辨識來源定義靜態標題,當來源未提供動態資料時使用該生物辨識來源。在覆蓋com.android.settings套件中來源動態提供的標題時覆蓋此內容。預設情況下,這會被忽略,因為來源的初始顯示狀態是hidden
google_biometrics_summary覆寫此值以定義com.android.settings套件擁有的生物識別來源的靜態摘要,當來源未提供動態資料時使用該生物識別來源。預設情況下,這會被忽略,因為來源的初始顯示狀態是hidden
google_biometrics_search_terms覆寫此值以定義com.android.settings套件擁有的生物辨識來源的搜尋字詞清單。
google_biometrics_initial_display_state當來源未提供動態資料時,覆寫此值以顯示com.android.settings套件擁有的生物辨識來源的 UI 條目。預設值是hidden
google_security_updates_intent覆寫此值可變更開啟允許使用者檢查和安裝安全性更新的活動所需的意圖。此意圖操作必須與導出的活動關聯。預設值為android.settings.SYSTEM_UPDATE_SETTINGS

com.google.android.safetycenter.resources套件中的其他字串均不可疊加。

對於 AOSP 設備, com.android.safetycenter.resources套件中的所有資源都是可疊加的,內容沒有限制。

對於未配置為接收主線更新的 GMS 設備,請建立com.google.android.safetycenter.resources包,替換或覆蓋com.android.safetycenter.resources ,定義 GTS 測試所需的所有字串。

這些字串是:

  • google_app_security_sources_title
  • google_app_security_sources_summary
  • google_play_protect_title
  • google_play_protect_title_for_work
  • google_play_protect_summary
  • google_play_protect_search_terms
  • google_lock_screen_sources_title
  • google_lock_screen_sources_summary
  • google_lock_screen_title
  • google_lock_screen_summary
  • google_lock_screen_search_terms
  • google_biometrics_title
  • google_biometrics_summary
  • google_biometrics_search_terms
  • google_biometrics_initial_display_state
  • google_accounts_sources_title
  • google_accounts_sources_summary
  • google_security_checkup_title
  • google_security_checkup_title_for_work
  • google_security_checkup_summary
  • google_security_checkup_search_terms
  • google_device_finder_sources_title
  • google_device_finder_sources_summary
  • google_find_my_device_title
  • google_find_my_device_summary
  • google_find_my_device_search_terms
  • google_updates_title
  • google_updates_summary
  • google_security_updates_title
  • google_security_updates_summary
  • google_security_updates_search_terms
  • google_security_updates_intent
  • google_play_system_update_title
  • google_play_system_update_summary
  • google_play_system_update_search_terms
  • google_privacy_sources_title
  • google_privacy_sources_summary
  • google_permission_usage_title
  • google_permission_usage_summary
  • google_permission_usage_search_terms
  • google_permission_manager_title
  • google_permission_manager_summary
  • google_permission_manager_search_terms
  • google_privacy_controls_title
  • google_privacy_controls_summary
  • google_privacy_controls_search_terms
  • google_advanced_title
  • google_advanced_security_title
  • google_advanced_security_summary
  • google_advanced_security_search_terms
  • google_advanced_privacy_title
  • google_advanced_privacy_summary
  • google_advanced_privacy_search_terms

定制要求

文件格式要求

設定檔必須是 XML 文件,並遵循更新設定檔中所述的格式。該文件必須位於raw資料夾中。它必須滿足自訂安全中心來源自訂安全中心來源群組中描述的不變量。如果設定檔的格式不符合上述要求,則該功能將完全停用。解析此文件還得到 CTS 和 GTS 測試的支持,這些測試可以在文件格式不正確的情況下提供額外的上下文(在logcat設備日誌之上)。

Google 服務設備

在 GMS 裝置上,對此文件施加了一些限制。 GTS 測試支持這一點。

AOSP設備

在 AOSP 設備上,設定檔必須格式正確並通過安全中心的CTS 測試。測試驗證文件格式是否正確。 GMS 設備也必須通過這些測試。