如何使用新的清单合并(Android Studio 和 Gradle)?

How to use the new manifest merger (of Android Studio and Gradle)?

背景

以前,当Eclipse&ADT是官方的Android开发工具时,在"project.properties" 的应用程序项目,你得到它自动合并所有库的清单(我已经发布了它 here)。

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

问题

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

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

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

我发现了什么

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

问题

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

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

  2. 我如何点重写应用程序组件(库的)属性(在应用程序的项目上)?比如活动的主题?

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

  4. 存储库中的依赖项清单会怎样?他们也合并了吗?

  5. 关于这个新功能(对我来说是新功能)有任何 tutorials/samples/videos 吗?

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

我希望这些问题具有足够的代表性,足够的信息量,但对于了解的人来说也不会太难回答。

1。禁用元素

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

例子

考虑上面的代码 link:

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

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

示例 #2

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

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

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

2。覆盖库中的属性

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

什么是构建类型?

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

它是这样工作的:您将默认值和共享值放在 main 清单中。然后在 flavor 清单中覆盖您需要的值。 Google“gradle 口味”获取更多信息。

以下例子取自a previous version of manifest merger documentation.

Override an attribute coming from a library

Using tools:replace="x, y, z" will override x,y,z attributes from the imported library’s activity XML declarations.

Higher Priority declaration

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

with a lower priority declaration :

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

will result in :

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

3。完全禁用清单合并

参见 Disable Manifest Merger in 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

此线程中的某些链接已过时。这是与清单自动合并相关的主要更新,由 gradle 为 Android 个 AARs 更新。

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