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

Hec*_*tor 77 android android-manifest

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

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

android:allowBackup="false"
android:fullBackupContent="false"
Run Code Online (Sandbox Code Playgroud)

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

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

我查看了 xml 的示例android:dataExtractionRules,但没有一个显示如何配置allowBackup="false".

我缺少什么?

是否可以allowBackup="false"使用 android:dataExtractionRulesxml来实现?

Vad*_*dik 130

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

\n
<application\n    android:allowBackup="false"\n    android:fullBackupContent="false"\n    android:dataExtractionRules="@xml/data_extraction_rules"\n    ...>\n
Run Code Online (Sandbox Code Playgroud)\n

然后,排除云备份和d2d传输的所有可能的域,更新或创建文件app/src/main/res/xml/data_extraction_rules.xml

\n
<?xml version="1.0" encoding="utf-8"?>\n<data-extraction-rules>\n    <cloud-backup>\n        <exclude domain="root" />\n        <exclude domain="file" />\n        <exclude domain="database" />\n        <exclude domain="sharedpref" />\n        <exclude domain="external" />\n    </cloud-backup>\n    <device-transfer>\n        <exclude domain="root" />\n        <exclude domain="file" />\n        <exclude domain="database" />\n        <exclude domain="sharedpref" />\n        <exclude domain="external" />\n    </device-transfer>\n</data-extraction-rules>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

请注意,可能会静音“ Attribute dataExtractionRules is only used in API level 31 and higher (current min is 19)”警告,tools:targetApi="s"也带有属性(因为旧平台只是忽略它们不支持的清单属性,并且警告是无用的)。

\n
\n

  • 另外,我在文档中没有看到“false”对于 fullBackupContent 是合法的。它旨在指向一个 xml 文件,但从快速查看源代码来看,如果将“false”(或任何不指向可解析 xml 资源文件的字符串)放在那里,则可能仍然有效。请参阅https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/backup/FullBackup.java#495 (3认同)
  • [文档](https://developer.android.com/guide/topics/data/autobackup#xml-include-exclude) 说“如果指定 `&lt;include&gt;` 元素,系统将不再包含任何文件默认并仅备份指定的文件”。有人尝试过像“&lt;device-transfer&gt;&lt;include domain=""tools:ignore="FullBackupContent"/&gt;&lt;/device-transfer&gt;`这样的东西吗? (2认同)
  • @CodingBruceLee 这是一个很好的问题 - 没有提到关于 oa 路径会发生什么,所以更好的答案看起来像: &lt;full-backup-content&gt; &lt;exclude domain="sharedpref" path="." /&gt; &lt;排除域=“数据库”路径=“。” /&gt; &lt;排除域=“文件”路径=“./”/&gt; &lt;排除域=“外部”路径=“./”/&gt; &lt;排除域=“根”路径=“./”/&gt; &lt;/完整-备份内容&gt; (2认同)

Sco*_*our 5

@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>
Run Code Online (Sandbox Code Playgroud)

我希望这些附加信息有助于支持上述答案:)