由于最近在谷歌上发布Android应用时需要项目的最低SDK API版本在31以上(支持Android12),项目在提高SDK API到31之后提交就出现问题提示:
您上传的 APK 或 Android App Bundle 内含活动、活动别名、服务或广播接收器,这些项目有 intent 过滤器,但没有“android:exported”属性设置。此文件无法在 Android 12 或更高版本上安装。
在AndroidManifest.xml文件中的activity、service注册时如果使用到了<intent-fliter>标签,就必须为该组件设置 android:exported = "true|false"(设置了<intent-fliter>标签的组件一般情况下exported设置为true)
例如:
查看自己项目中的AndroidManifest.xml文件,将所有带<intent-fliter>标签的组件添加上android:exported="true"后重新签名打包提交即可
如果自己项目中的AndroidManifest.xml全部修改完后提交到谷歌后还是提示没有申明exported属性,那么有可能是自己项目中使用的第三方SDK的原因。
如果是下载SDK本地依赖的形式引入到项目中就如同修改自己项目的配置文件一般,为使用<intent-fliter>标签的组件添加adnroid:exported="true"后再打包提交
如果是通过Gradle 集成SDK,第三方SDK中有些activity、service中使用了<intent-fliter>标签但没有添加android:exported也会无法发布
这时候需要先rebuild,之后到项目中的app-build-intermediates-merge_mainfest下的AndroidManifest.xml,这个文件是合并完成后的配置文件,第三方SDK中的组件注册也会在文件中出现
找到之后打开配置文件,查看哪些组件使用了<intent-fliter>标签但是又没有设置android:exported属性(有些组件有android:exported="false",但全局搜索到的却没有配置exported,这种还是要处理)
例如:merge-manifest中的CheckService服务
第三方SDK中的CheckService服务
将该组件复制到项目本身的AndroidManifest.xml中,添加上android:exported="true",之后重新打包提交即可