如何使用 android:dataExtractionRules 指定不允许任何数据备份?

问题描述 投票:0回答:2

我当前的 Android 应用程序目标为 12 及更高版本。

我不想允许任何类型的备份,并且当前具有以下清单设置:

android:allowBackup="false"
android:fullBackupContent="false"

但是,

android:allowBackup="false"
设置现在会发出以下警告:

android:allowBackup 属性已从 Android 12 及更高版本中弃用,并且可能会在未来版本中删除。考虑添加属性 android:dataExtractionRules 指定 @xml 资源,该资源在 Android 12 及更高版本上配置云备份和设备传输。

我查看了

android:dataExtractionRules
xml 的示例,但没有一个显示如何配置
allowBackup="false"
的等效项。

我错过了什么?

使用

allowBackup="false"
xml是否可以实现
android:dataExtractionRules

android android-manifest
2个回答
125
投票

dataExtractionRules
属性添加到您的 AndroidManifest.xml 文件,并引用 data_extraction_rules.xml 文件:

<application
    android:allowBackup="false"
    android:fullBackupContent="false"
    android:dataExtractionRules="@xml/data_extraction_rules"
    ...>

然后,排除云备份和 d2d 传输、更新或创建文件 app/src/main/res/xml/data_extraction_rules.xml:

的所有可能的域
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
    <cloud-backup>
        <exclude domain="root" />
        <exclude domain="file" />
        <exclude domain="database" />
        <exclude domain="sharedpref" />
        <exclude domain="external" />
    </cloud-backup>
    <device-transfer>
        <exclude domain="root" />
        <exclude domain="file" />
        <exclude domain="database" />
        <exclude domain="sharedpref" />
        <exclude domain="external" />
    </device-transfer>
</data-extraction-rules>

dataExtractionRules
属性适用于API 31 (Android 12)及更高版本。对于 API 31 之前的 Android 版本,保留 allowBackup
fullBackupContent
 属性。

注意可能会静音“Attribute dataExtractionRules is only used in API level 31 and higher (current min is 19)

”警告,也带有
tools:targetApi="s"
属性(因为旧平台只是忽略它们不支持的清单属性,并且警告是无用的)。


2
投票

@Vadik Sirekanyan 给出的精彩答案的评论部分提出的一个重要问题是,是否使用仅具有 <exclude>

 属性的 
domain
 元素会排除该域中的所有内容。

我自己阅读了文档,

XML 配置语法部分提到了一个重要点,其中指出:

每个

<include>

<exclude>
 元素必须包含以下两个属性:


domain
...


path


所以,我不会为了安全而省略路径。

但是,

path

部分给出了一个重要的观点,我认为它回答了上述评论中提出的讨论点:

    如果指定目录,则该规则适用于该目录和递归子目录中的所有文件。

因此,我认为

data extraction rules

 文件的以下设置将模仿 
allowBackup=false
 的行为,通过排除域根目录和子目录中的所有内容进行备份:

<?xml version="1.0" encoding="utf-8"?> <data-extraction-rules>  <cloud-backup>    <exclude domain="root" path="." />    <exclude domain="file" path="." />    <exclude domain="database" path="." />    <exclude domain="sharedpref" path="." />    <exclude domain="external" path="."/>  </cloud-backup>  <device-transfer>    <exclude domain="root" path="."/>    <exclude domain="file" path="."/>    <exclude domain="database" path="."/>    <exclude domain="sharedpref" path="."/>    <exclude domain="external" path="."/>  </device-transfer> </data-extraction-rules>
我希望这些附加信息有助于支持上述答案:)

© www.soinside.com 2019 - 2024. All rights reserved.