【问题标题】:How to use the new manifest merger (of Android Studio and Gradle)?如何使用新的清单合并(Android Studio 和 Gradle)?
【发布时间】:2015-01-06 00:21:36
【问题描述】:

背景

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

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

问题

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

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

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

我发现了什么

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

问题

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    1。禁用元素

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

    示例

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

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

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

    示例 #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 清单中覆盖你需要的值。谷歌“gradle风味”了解更多信息。

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

    覆盖来自库的属性

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

    更高的优先级声明

    <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。完全禁用清单合并

    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

    【讨论】:

    • 1. “动物园”有什么用? 2. 什么是“内置类型”?它是否等同于 Eclipse 上使用的运行配置?对于他们每个人,我什至可以选择合并什么? 3. 你把答案写在哪个文件里(这里:stackoverflow.com/a/13959122/878126)? 4.有没有办法阻止某些库的合并清单?或者至少在添加任何内容时得到通知? 5. 我不明白。我的意思是关于清单合并的教程/视频。 6.在哪里?它在 "\app\build\outputs\apk\manifest-merger-debug-report" 上吗?看起来很乱。它不是通过 UI 显示的吗?
    • 1. “动物园”在您提供的链接上:android:name=”zoo”。 2-6。好的。谢谢你。顺便说一句,你有一个错字“酱”而不是“来源”。
    • 哦,对了,这是一个示例名称。在第一个示例中,活动“foo.bar.alias”的名称为“zoo”的元数据将被删除。在第二个示例中,值将被更改。打错字:这是故意的,注意发音是一样的:)
    • 什么的示例名称?为什么它需要一个名字,如果它被删除了?这些示例仅显示活动别名,但删除活动不是更常见吗?我不明白那里发生了什么。
    • 好的,另一个例子:你想删除名称为“com.example.ui.MyActivity”的活动。你写&lt;activity android:name="com.example.ui.MyActivity" tools:node="remove"/&gt;。现在清楚了吗?它需要名称,因为合并需要知道要删除的内容。您可以对 manifest 根元素中的任何元素应用这些操作。
    【解决方案2】:

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

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

    【讨论】:

    • 我已经更新了答案中的链接。请注意,Stack Overflow 不是经典论坛,也不是主题。相反,如果您对我的帖子发表了评论,我会收到通知,并且可以在两年前解决问题。还是谢谢
    • 感谢您更新您的答案 Eugen。并解释使用 cmets 的优点。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    相关资源
    最近更新 更多