如何使用新的清单合并(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(当然是作为一个类),它将被添加到应用程序的项目中使用它。
问题
我不能简单地要求一切都得到解释。我认为问这些问题就足够了:
如何选择要忽略哪些应用程序组件(权限、活动等)以防止自动合并?
我如何点重写应用程序组件(库的)属性(在应用程序的项目上)?比如活动的主题?
有没有办法完全禁用清单文件的自动合并?
存储库中的依赖项清单会怎样?他们也合并了吗?
关于这个新功能(对我来说是新功能)有任何 tutorials/samples/videos 吗?
使用自动合并有什么需要注意的地方吗?
我希望这些问题具有足够的代表性,足够的信息量,但对于了解的人来说也不会太难回答。
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。基本上,它是这样的:库,然后是主清单,然后是风味和构建类型清单(如果您使用的话)。
什么是构建类型?
默认为“调试”和“发布”。您可以定义自己的设置并覆盖 signing 或 proguard 等设置。出于您的目的,您可以说它相当于 运行 配置。
它是这样工作的:您将默认值和共享值放在 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 更新。
背景
以前,当Eclipse&ADT是官方的Android开发工具时,在"project.properties" 的应用程序项目,你得到它自动合并所有库的清单(我已经发布了它 here)。
这有时奏效。它有很多奇怪的问题,我总是倾向于避免使用它,并手动将需要的内容放入主清单文件中。
问题
2014 年的某个时候,Google 宣布新的 Android-Studio(我认为是 0.1)与 Gradle 一起,将允许您准确选择如何执行库组件的合并。
但是,新指令(链接 here)非常复杂,我真的(真的)试图了解如何使用它们,但也没有找到如何使用它们的示例。
不是我什么都不懂,只是我不确定我是否理解得很好。
我发现了什么
好的一面是,我发现合并是完全自动完成的,因此如果您在库的清单中有一个 BroadcastReceiver(当然是作为一个类),它将被添加到应用程序的项目中使用它。
问题
我不能简单地要求一切都得到解释。我认为问这些问题就足够了:
如何选择要忽略哪些应用程序组件(权限、活动等)以防止自动合并?
我如何点重写应用程序组件(库的)属性(在应用程序的项目上)?比如活动的主题?
有没有办法完全禁用清单文件的自动合并?
存储库中的依赖项清单会怎样?他们也合并了吗?
关于这个新功能(对我来说是新功能)有任何 tutorials/samples/videos 吗?
使用自动合并有什么需要注意的地方吗?
我希望这些问题具有足够的代表性,足够的信息量,但对于了解的人来说也不会太难回答。
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。基本上,它是这样的:库,然后是主清单,然后是风味和构建类型清单(如果您使用的话)。
什么是构建类型?
默认为“调试”和“发布”。您可以定义自己的设置并覆盖 signing 或 proguard 等设置。出于您的目的,您可以说它相当于 运行 配置。
它是这样工作的:您将默认值和共享值放在 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 更新。