前言

在工作中遇到以下报错信息: error: attribute android:dataExtractionRules not found.,记录一下,以免后续再次遇到类似的问题:

1
2
3
Android resource linking failed
D:\MyWork\android\app\build\intermediates\packaged_manifests\debug\AndroidManifest.xml:13: error: attribute android:dataExtractionRules not found.
error: failed processing manifest.

问题分析

打开报错的AndroidManifest.xml文件,内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat"
tools:targetApi="28">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
</application>
</manifest>

发现第7行代码:android:dataExtractionRules="@xml/data_extraction_rules",有黄色的警告信息:Unknown attribute android:dataExtractionRules

解决方法

既然提示未知属性,果断删除后,重新编译通过,问题得到解决。

后记

应用的清单标志
通过在清单文件中使用 android:dataExtractionRules 属性,将您的应用指向新的 XML 配置。当您指向新的 XML 配置时,搭载 Android 12 或更高版本的设备会忽略指向旧配置的 android:fullBackupContent 属性。以下代码示例展示了新的清单文件条目:

1
2
3
4
5
6
7
8
9
<application
...
<!-- The below attribute is ignored. -->
android:fullBackupContent="old_config.xml"
<!-- You can point to your new configuration using the new
dataExtractionRules attribute . -->
android:dataExtractionRules="new_config.xml"
...>
</application>

xml/data_extraction_rules.xml 文件内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup [disableIfNoEncryptionCapabilities="true|false"]>
...
<include domain=["file" | "database" | "sharedpref" | "external" |
"root"] path="string"/>
...
<exclude domain=["file" | "database" | "sharedpref" | "external" |
"root"] path="string"/>
...
</cloud-backup>
<device-transfer>
...
<include domain=["file" | "database" | "sharedpref" | "external" |
"root"] path="string"/>
...
<exclude domain=["file" | "database" | "sharedpref" | "external" |
"root"] path="string"/>
...
</device-transfer>
</data-extraction-rules>

原因分析

由于手动修改的版本号低于Android12导致该属性不支持,因此在低版本中就需要删除android:dataExtractionRules="@xml/data_extraction_rules"配置项。

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