Android 12 AndroidManifest文件合并

435 阅读3分钟

需求

Google Play现在上架要求API的版本最低为31。

您的应用目前的目标 API 级别为 30,但其目标 API 级别必须最低为 31,这样才能确保应用基于最新 API 而构建,让安全性和性能达到最佳状态。请将应用的目标 API 级别至少更改为 31。了解详情

第一次尝试处理

按着上架要求,将targetSdkVersion的值设置为31,报错。

Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined.

Android12的要求是需要在四大组件中添加android:exported这个属性。

android:exported

这个属性很早就有了,不过一般默认情况下都为false

它表示当前组件是否可被其他应用调用。

blog.csdn.net/watermusicy…

既然有这个要求,那就添加吧,不管是否包含intent标签,都添加exported属性。

然而,点击运行后发现,仍然报这个错误。怀疑是自己哪里有漏掉的地方,反复检查了三遍,再次运行,仍然报错。

在AS的Build的界面中点击Run with --info--debug optionRun with --scan,结果不是自己想要的内容。

AndroidManifest配置清单

APK 或 Android App Bundle 文件只能包含一个 AndroidManifest.xml 文件,但 Android Studio 项目可以包含多个清单文件,这些清单文件由主源代码集、build 变体和导入的库提供。因此,在构建应用时,Gradle 构建系统会将所有清单文件合并成一个清单文件打包到应用中。 链接地址:developer.android.google.cn/studio/buil…

根据提示可以知道,虽然报错的是app/src/main/AndroidManifest.xml文件错误,但是,在构建时将多个配置文件合并到一个文件中。

这里推荐一篇Manifest文件合并的文章 Android 微技巧之清单文件合并那些事儿

修改AndroidManifest

修改每个Module中的AndroidManifest.xml文件,添加exported属性,再次尝试构建。

image.png

报错内容没变,怀疑是自己漏了什么地方。然而,检查了三遍后还是错误,有点雾水。要是能查看build后错误的AndroidManifest.xml文件就好了,那个文件应该是构建后合并的清单文件,里面可以清楚知道到底是哪个组件没有添加exported属性。

Merged Manifest

Merged Manifest合并清单的效果并找出冲突错误 发现这么一篇文章,将合并清单讲的非常详细,干货。

在AS中找到app下的AndroidManifest.xml文件,左下角有两个标签,点击Merged Manifest(如果不是这篇文章提到,我都不会注意配置文件居然还有这个按钮

image.png

真相大白

输出的内容显示,原来合并的不仅仅是依赖的Module中的配置清单,Gradle甚至将App的所有依赖库内的配置清单都依赖进来了。

image.png 忽略警告(Warning)的部分,根据错误的提示可以知道,com.squareup.leakcanary库下的DisplayLeakActivity组件在AndroidManifest.xml文件中没有添加android:exported 属性。 找到External Libraries中找到com.squareup.leakcanary

image.png 确实,其中的DisplayLeakActivity包含intent标签,但没有android:exported 属性,在app/src/main/AndroidManifest.xml文件下添加DisplayLeakActivity

当然,也可以升级leakcanary依赖库,该项目的依赖版本是1.5.4,而官方目前都2.10。

结语

这又是知识的荒原,不过最后好在确定了具体的问题。