Android Manifest文件中的`tools:replace`属性有什么作用?

问题描述

我发现了一些有关tools:replace错误的问题,但是在Internet上却找不到它的作用。

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

有人可以解释它的作用吗?例如, 发现tools:replace="android:label,android:supportsRtl,android:allowBackup">作为application标签属性。在相同的application xml标记中,指定了android:labelandroid:supportsRtlandroid:allowBackup,所以我只能猜测它将覆盖这些属性如果它们是嵌套在activity标记内的application标记中指定的。就像我期望的application属性一样,此功能似乎没有用,如果没有设置,则认情况下设置其子级属性

编辑:感谢您在答案中链接the docs。我个人认为文档非常全面,甚至提供了有关何时使用此功能的示例。不幸的是,我的搜索引擎无法为我找到这个。该链接实际上是首先在Google上发布的,但在DuckDuckGo上却丢失了。

解决方法

tools:replace是一个属性标记,可以通过合并项目reconfigure中的特定清单设置(构建变体)来flavors主清单文件。

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

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

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

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

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

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

请注意,您也可以通过添加tools:node="replace"来完全替换整个节点。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...