android - 如何使用新的 list 合并(Android Studio 和 Gradle)?

标签 android android-studio android-manifest manifest-merging

背景

过去,当 Eclipse&ADT 是为 Android 开发的官方工具时,您可以简单地在“project.properties”中使用“ma​​nifestmerger.enabled=true”应用程序的项目,你得到它自动合并所有库的 list (我已经发布了它here)。

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

问题

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

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

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

我发现了什么

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

问题

我不能简单地要求对所有事情进行解释。我认为问这些问题就足够了:

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

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

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

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

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

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

我希望这些问题具有足够的代表性、足够的信息量,而且对于知道的人来说也不太难回答。

最佳答案

1。禁用元素

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

示例

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

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

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

示例 #2

由于您要求提供 Activity 示例,因此我提出了以下建议:

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

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

2。覆盖库中的属性

这些值的合并顺序描述为here .基本上,它是这样的:库,然后是主 list ,然后是 flavor 和构建类型 list (如果您使用它们)。

什么是构建类型?

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

它的工作原理如下:您将默认值和共享值放入 main显现。然后在 flavor list 中覆盖你需要的值。谷歌“gradle flavor ”了解更多信息。

以下示例取自 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。完全禁用 list 合并

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。是否合并了依赖项的 list ?

是的,它们是(它们是库)。

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

我不知道,抱歉。

5。有教程吗?

取决于您要达到的目标。到目前为止,它对我来说总是开箱即用。

我不知道任何视频。

6。我应该注意什么?

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

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

关于android - 如何使用新的 list 合并(Android Studio 和 Gradle)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27790209/

相关文章:

javascript - 如何使用phonegap将文件从一个文件夹移动/复制到android中的另一个文件夹?

android - 无法在 android studio 中创建新 Activity (NullPointerException)

android - 无法在 Play 上安装我的第一个应用。支持设备之间的 Galaxy Nexus,但显然不是我的 Nexus

android - 从 NFC 标签读取启动应用程序

android - 如何更改 android 微调器中的文本大小?

android - 通过 Parse 检索我的 Android 应用程序中与手机联系人匹配的用户列表

android - 在 Android Studio 中签署 Android apk 文件的最简单方法是什么?

Android Horizo​​ntalScrollView 显示为 Vertical

java - 为什么我的 Activity 被停止?

Android 应用程序链接已经过验证。但是,仍然出现消歧对话框