Android 清单文件中的“tools:replace”属性有什么作用?

What does the `tools:replace` attribute do in an Android Manifest file?

我发现了一些关于 tools:replace 错误的问题,但在 Internet 上找不到关于它的功能的任何信息。

我确实找到了 tools attributes reference,似乎这是一个不再记录的过时属性。

有人可以解释一下它的作用吗?例如, tools:replace="android:label,android:supportsRtl,android:allowBackup"> 作为 application 标签的一个属性被发现。在同一个applicationxml标签中,指定了android:labelandroid:supportsRtlandroid:allowBackup,所以我只能猜测 如果在嵌套在 application 标签内的 activity 标签中指定它们,它将覆盖这些属性。这个功能似乎没用,因为我希望 application 属性默认设置它的子属性,如果它们没有设置的话。

编辑:感谢您在回答中 linking the docs。我个人认为文档非常全面,甚至提供了有关何时使用它的示例。不幸的是,我的搜索引擎无法为我找到这个。这个 link 实际上是第一个出现在 Google 上,但在 DuckDuckGo 上丢失了...

tools:replace 是一个属性标记,可用于 reconfigure the main manifest file by merging specific manifest setups from project flavors(构建变体)。

假设您在主清单中有下一个节点,其中特定 Activity 被定义为导出:

<activity android:name="com.example.ActivityTest"
    android:exported="true"> 
    ...

但对于特定风格(构建变体),不应导出相同的 Activity。因此,您在 flavor 文件夹中定义一个准系统清单文件,并添加具有替换属性的节点:

<activity android:name="com.example.ActivityTest"
    android:exported="false"
    tools:replace="android:exported"> 
    ...

Active Build Variant 中选择目标风格时,构建系统将合并两个清单,并在主清单节点中将 android:exported 属性替换为风格的一个.

总而言之,当您有多个项目风格时使用此属性标记,并且每个项目都需要为主清单文件中定义的现有节点定义不同的属性。

请注意,您也可以通过添加 tools:node="replace".

来完全替换完整节点