android 错误 exported needs to be explicitly specified for Apps targeting Android 12


问题描述:

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中搜索“

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在编译时,不能第一时间检查到新版本,会有时间间隔。

你可能感兴趣的:(Android,android)