1.禁用元素
您始终可以在应用清单中明确禁用权限和功能并覆盖任何库值。我发现您可以禁用 library 中的元素。
例子
考虑上面链接中的以下代码:
<activity-alias android:name="foo.bar.alias">
<meta-data
android:name="zoo"
tools:node="remove" />
</activity-alias>
通过在清单中包含此代码,您可以确保合并找到任何<activity-alias>
具有属性的元素,并在元素具有该属性时android:name="foo.bar.alias"
删除它。它只删除“动物园”元数据。不是活动别名。如果您在主清单中指定它,它将对迄今为止已合并的任何内容(来自库的元素)有效。<meta-data>
android:name="zoo"
示例 #2
由于您要求提供活动示例,这就是我想出的:
<activity android:name="com.example.ui.MyActivity" tools:node="remove" />
此行将使合并删除android:name="com.example.ui.MyActivity"
迄今为止已合并的任何具有属性的活动。因此,如果您在主清单中指定它,它将有效地删除任何com.example.ui.MyActivity
可能已从库中合并的条目。
2. 覆盖库中的属性
此处描述了合并值的顺序。基本上,它是这样的:库,然后是主清单,然后是风味和构建类型清单(如果您使用它们)。
什么是构建类型?
默认为“调试”和“发布”。您可以定义自己的设置并覆盖签名或proguard等设置。出于您的目的,您可以说它相当于运行配置。
它的工作原理是这样的:您将默认值和共享值放在main
清单中。然后在风味清单中,您覆盖所需的值。谷歌“gradle风味”了解更多信息。
以下示例取自先前版本的清单合并文档。
覆盖来自库的属性
使用 tools:replace="x, y, z" 将覆盖导入库的活动 XML 声明中的 x,y,z 属性。
更高优先级声明
<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. 完全禁用清单合并
请参阅在 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