24

背景

过去,当 Eclipse&ADT 是 Android 开发的官方工具时,您可以简单地在应用项目的“ project.properties ”中使用“ manifestmerger.enabled=true ” ,然后自动合并所有库的清单(我已经在这里发布了)。

这有时奏效。它有很多奇怪的问题,我总是宁愿避免使用它,而是手动将所需的内容放入主清单文件中。

问题

在 2014 年的某个地方,Google 宣布新的 Android-Studio(我认为是 0.1)与 Gradle 一起,将允许您准确选择如何执行库组件的合并。

但是,新的说明(链接在这里)非常复杂,我真的(真的)试图了解如何使用它们,也没有找到如何使用它们的示例。

不是我什么都不懂,只是我不确定我是否理解得很好。

我发现了什么

从好的方面来说,我发现合并是完全自动完成的,所以如果你在库的清单上有一个 BroadcastReceiver(当然,作为一个类),它将被添加到使用它的应用程序的项目中。

问题

我不能简单地要求一切解释。我认为问这些问题就足够了:

  1. 如何选择自动合并忽略哪些应用程序组件(权限、活动等)?

  2. 如何指向覆盖应用程序组件(库的)属性(在应用程序的项目上)?比如活动的主题?

  3. 有没有办法完全禁用清单文件的自动合并?

  4. 存储库内的依赖项清单会发生什么?他们也合并了吗?

  5. 有没有关于这个新的(对我来说是新的)功能的教程/示例/视频?

  6. 使用自动合并时有什么需要注意的吗?

我希望这些问题足够有代表性,足够丰富,但对于知道的人来说回答起来并不难。

4

2 回答 2

45

1.禁用元素

您始终可以在应用清单中明确禁用权限和功能并覆盖任何库值。我发现您可以禁用 library 中的元素

例子

考虑上面链接中的以下代码:

<activity-alias android:name="foo.bar.alias">
    <meta-data 
        android:name="zoo"
        tools:node="remove" />
</activity-alias>

通过在清单中包含此代码,您可以确保合并找到任何<activity-alias>具有属性的元素,并在元素具有该属性时android:name="foo.bar.alias"删除它。它只删除“动物园”元数据。不是活动别名。如果您在主清单中指定它,它将对迄今为止已合并的任何内容(来自库的元素)有效。<meta-data>android:name="zoo"

示例 #2

由于您要求提供活动示例,这就是我想出的:

<activity android:name="com.example.ui.MyActivity" tools:node="remove" />

此行将使合并删除android:name="com.example.ui.MyActivity"迄今为止已合并的任何具有属性的活动。因此,如果您在主清单中指定它,它将有效地删除任何com.example.ui.MyActivity可能已从库中合并的条目。

2. 覆盖库中的属性

此处描述了合并值的顺序。基本上,它是这样的:库,然后是主清单,然后是风味和构建类型清单(如果您使用它们)。

什么是构建类型?

默认为“调试”和“发布”。您可以定义自己的设置并覆盖签名proguard等设置。出于您的目的,您可以说它相当于运行配置。

它的工作原理是这样的:您将默认值和共享值放在main清单中。然后在风味清单中,您覆盖所需的值。谷歌“gradle风味”了解更多信息。

以下示例取自先前版本的清单合并文档

覆盖来自库的属性

使用 tools:replace="x, y, z" 将覆盖导入库的活动 XML 声明中的 x,y,z 属性。

更高优先级声明

<activity
    android:name="com.foo.bar.ActivityOne"
    android:screenOrientation="portrait"
    android:theme="@theme1"
    tools:replace="theme"/>

具有较低优先级的声明:

<activity
    android:name="com.foo.bar.ActivityOne"
    android:theme="@olddogtheme"
    android:windowSoftInputMode="stateUnchanged"
    android:exported="true">

将导致:

<activity
    android:name="com.foo.bar.ActivityOne"
    android:screenOrientation="portrait"
    android:theme="@theme1"
    android:windowSoftInputMode="stateUnchanged"
    android:exported="true"/>

3. 完全禁用清单合并

请参阅在 Android Gradle Build 中禁用清单合并

android.applicationVariants.all { variant ->
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml')
    variant.processManifest.enabled=false
}

你把这个放在什么文件里?

模块的(不是根项目)的末尾build.gradle

4. 依赖项的清单是否合并?

是的,它们是(它们是图书馆)。

有没有办法阻止合并某些库清单?

不是我知道的,对不起。

5. 有教程吗?

取决于你想达到什么目标。到目前为止,它总是对我开箱即用。

我不知道任何视频。

6. 我应该注意什么?

如果您怀疑额外的权限等,您可以检查生成的清单。它位于project/module/build/intermediates/manifests/full/[flavor]/build-type/AndroidManifest.xml.

来源:https ://developer.android.com/studio/build/manifest-merge

于 2015-01-06T01:22:47.177 回答
0

此线程中的某些链接已过时。这是与清单的自动合并相关的主要更新,通过 gradle,用于 Android AAR。

https://developer.android.com/studio/build/manifest-merge

于 2018-10-22T15:44:20.893 回答