背景
过去,当 Eclipse&ADT 是为 Android 开发的官方工具时,您可以简单地在“project.properties”中使用“manifestmerger.enabled=true”应用程序的项目,你得到它自动合并所有库的 list (我已经发布了它here)。
这有时奏效。它有很多奇怪的问题,我总是宁愿避免使用它,而是手动将所需的内容放入主 list 文件中。
问题
在 2014 年的某个时候,Google 宣布新的 Android-Studio(我认为是 0.1)和 Gradle 将允许您准确选择如何执行库组件的合并。
但是,新的说明(链接 here)非常复杂,我真的(真的)试图了解如何使用它们,但也没有找到如何使用它们的示例。
不是我什么都不懂,只是我不确定我是否理解得很好。
我发现了什么
从好的方面来说,我发现合并是完全自动完成的,所以如果你在库的 list 上有一个 BroadcastReceiver(当然,作为一个类),它将被添加到应用程序的项目中它。
问题
我不能简单地要求对所有事情进行解释。我认为问这些问题就足够了:
如何选择在自动合并时忽略哪些应用组件(权限、 Activity 等)?
如何指向覆盖应用程序组件(库的)属性(在应用程序的项目上)?比如 Activity 主题?
有没有办法完全禁用 list 文件的自动合并?
存储库中的依赖 list 会发生什么?他们也合并了吗?
是否有任何关于这个新(对我来说是新的)功能的教程/示例/视频?
在使用自动合并时有什么需要注意的吗?
我希望这些问题具有足够的代表性、足够的信息量,而且对于知道的人来说也不太难回答。
最佳答案
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 (如果您使用它们)。
什么是构建类型?
默认为“调试”和“发布”。您可以定义自己的设置和覆盖设置,例如 signing 或 proguard。出于您的目的,您可以说它相当于运行配置。
它的工作原理如下:您将默认值和共享值放入 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。有教程吗?
取决于您要达到的目标。到目前为止,它对我来说总是开箱即用。
- 例如http://www.myandroidsolutions.com/2014/04/10/android-gradle-manifest-merge/
- list 合并文档(下面的链接)。
我不知道任何视频。
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/