问题描述:
android 错误 android:exported needs to be explicitly specified for Apps targeting Android 12
问题原因:
由于项目的编译版本compileSdkVersion和targetSdkVersion升级到了31及以上(Android12),然后就是清单文件manifest里面包含了intent-filter的四大组件,没有明确的设置android:exported,就会出现这个错。
问题解决方案:
第一步,先调整我们能改动的App项目及依赖的Library里面的所有AndroidManifest.xml
a、在AndroidManifest.xml中搜索“<intent-filter”关键字,寻找设置了intent-filter的对应组件,确认是否包含android:exported ,如果没有则添加上,设置true或false具体看自己需求。
b、还有一种情况是,可能某些设置了android:export,但是合并时会报覆盖override相关错误,此时可加上tools:replace=“android:exported” 或许能解决。
通过以上两步后再次运行, 如果三方库的android:exported没问题,问题也就解决了,但如果还是爆错,那就是三方库没有解决这个问题导致的。
第二步,第三方库引起报错, 需要定位是哪个三方库导致的,这就需要在控制台执行命令:
chmod +x gradlew
./gradlew processDebugMainManifest --stacktrack
第三步,根据错误提示信息,可知道失败是四大组件的哪个组件,还可知道有几个失败的问题。
这时,我们就需要定位导致这个问题的是哪个具体的第三方库。
a、如果是自己刚加的第三方库,可尝试删除再执行第二步,看是否还报错误。如果不再报错误,则问题解决。
b、如果还报错误,那我们可以在build.gradle里面的dependencies里面, 采用二分大法, 先块注释一部分依赖引用(我们先不用去管代码里面由于没有引用,而引起的相关报红,只是暂时注释而已,找问题而已,问题找到后再恢复),再执行第二步,看是否还报错。
c、如果还报错,再具体二分大法块注释细分,直到能够行注释确定某一个三方库。
d、找到之后我们可以根据第二步执行后的结果,确认对应三方库的清单文件是否存在没加android:exported的问题 。
e、这样就定位到具体是哪个三方库导致的了,具体解决方法:
- 更新 build.gradle 里面的dependencies 第三方库的版本
方法一、我们可以在浏览器中搜索这个第三方库,找到开源代码,再阅读 readme , 找到此库,最新的版本号进行引用,以修复此问题。
方法二、直接使用build.gradle dependencies 引用第三方库的最新版本。
例如:
implementation 'com.github.wy749814530:MultiGraphics:1.0.4' ====> implementation 'com.github.wy749814530:MultiGraphics:latest.release' 只需要将版本号1.0.4 替换为latest.release 就可以总是依赖最新版本了。
方法三、可以在我们自己的AndroidManifest里面覆写这个有问题的三方组件,主动加上android:exported
方法四、联系对方修复下这个问题再依赖新版。
PS总结:推荐直接使用版本号,不太推荐使用“latest.release”这种方式来依赖第三方库。
“latest.release”依赖方式的缺点:
- 会增编译时间,而且有时候可能下载依赖失败
- 新版本升级有可能影响到自身项目,导致编译失败
- android studio在编译时,不能第一时间检查到新版本,会有时间间隔。