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

and*_*per 23 android android-manifest android-studio manifest-merging

背景

在过去,当Eclipse和ADT是Android开发的官方工具时,您可以在应用程序项目的" project.properties "中使用" manifestmerger.enabled = true " ,然后让它自动合并所有库的清单(我在这里发布了它).

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

问题

在2014年的某个地方,谷歌宣布新的Android-Studio(我认为0.1)和Gradle将允许您精确选择如何合并库的组件.

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

这不是我什么都不懂,但我不确定我是否理解得很好.

我发现了什么

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

这个问题

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

  1. 如何选择要自动合并的哪些应用程序组件(权限,活动......)?

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

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

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

  5. 是否有关于这个新功能(对我而言是新的)功能的教程/样本/视频?

  6. 使用自动合并时有什么我应该注意的事项吗?

我希望这些问题具有足够的代表性,足够的信息,但对于那些知道的人来说却不难回答.

Eug*_*nec 39

1.禁用元素

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

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

<activity-alias
    android:name=”foo.bar.alias”>
  <meta-data 
      android:name=”zoo” 
      tools:node=”remove”/>
</activity-alias>
Run Code Online (Sandbox Code Playgroud)

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

例#2

既然你要求一个活动的例子,这就是我提出的:

<activity android:name="com.example.ui.MyActivity" tools:node="remove"/>
Run Code Online (Sandbox Code Playgroud)

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

2.覆盖库中的属性

其中值合并的顺序描述了这里的部分清单文件排序.基本上它是这样的:库,然后主要清单,然后味道和构建类型显示,如果你使用它们.如何覆盖库中的属性?

什么是构建类型?

默认为"debug"和"release".您可以定义自己的设置并覆盖设置,例如signedproguard.出于您的目的,您可以说它等同于运行配置.

它的工作原理如下:您将默认值和共享值放在main清单中.然后在flavor清单中覆盖您需要的值.谷歌"gradle flavors"获取更多信息.

3.完全禁用清单合并

在Android Gradle Build中禁用Manifest Merger

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

你把这个文件放在哪个文件中?

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

来自依赖关系的清单是否合并?

是的,他们是(他们是图书馆).

有没有办法阻止合并某些图书馆清单?

不是我知道的,抱歉.

5.任何教程?

取决于你想要实现的目标.到目前为止,它始终对我开箱即用.

我不知道任何视频.

6.我应该注意什么?

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

酱:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger


归档时间:

查看次数:

22021 次

最近记录:

7 年,4 月 前