1. Android 12 安装报错
1.1 报错信息
应用配置 targetSdkVersion=31,在 Android 12 的设备上安装,出现报错:
Installation did not succeed. The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
Installation failed due to: 'INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl966251191.tmp/base.apk (at Binary XML file line #59): Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present'
根据错误信息提示,“针对 S+(版本31及更高版本),当 intent filters 存在时,需要显式定义 android:exported 属性值”。
1.2 解决方法
-
方法 1
若应用不需要适配Android 12及以上版本设备
,将targetSdkVersion 设置小于31
即可; -
方法 2
若应用必须适配Android 12及以上版本设备
,将启动Activity
设置android:exported="true"
。
将所有包含intent-filter 的 activity、service和receiver组件
显式定义android:exported
属性。
1.3 注意事项
- 高版本安装
(应用:targetSdkVersion >=31,设备的系统版本:Android 12及以上)
所有在
AndroidManifest.xml
注册的activity、service、receiver
,如果包含intent-filter
,必须显式定义android:exported
属性,否则无法安装;游戏的
启动Activity
必须显式设置android:exported="true"
;若设置成 `android:exported=“false”,应用将无法启动;
- 所有在
AndroidManifest.xml
注册并继承FileProvider类
的provider
不能将 android:exported 设置为true
,否则将引起报错"Provider must not be exported"
。
2. exported 属性
报错信息涉及到 android:exported
属性。
Android
的 四大组件 Activity、Service、BroadcastReceiver、ContentProvider
都存在着 exported
属性。
如果想要定义的组件被其它应用访问调用,android:exported
属性需要设置为 true
。这是一个必要不充分的条件,因为还受到 permission
权限影响。
2.1 android:exported 的描述
以下是参考 官方文档 对四大组件 android:exported
属性的描述
- Activity
设置Activit
是否可由其他应用的组件启动
- 设为
true
,表示Activity
可由任何应用访问,并且可以通过其确切的类名启动;- 设为
false
,没有设置intent-filter
时,这是默认值。表示Activity
只能由同一应用的组件、使用同一用户 ID 的不同应用或具有特权的系统组件启动。
- Service
其它应用的组件是否能调用服务或与之交互,true
表示可以,false
表示不可以。
- 若
Service
包含intent-filter
,意味着该服务供外部使用,默认值为true
.- 若
Service
不包含intent-filter
,意味着服务专供应用内部使用,默认值为false
.
- BroadcastReceiver
广播接收器是否可以接收来自其应用外部非系统来源的消息,true
表示可以,false
表示不可以。
- 当
receiver
未指定exported
属性,并且不包含intent-filter
,默认值为false
- 当
receiver
未指定exported
属性,包含intent-filter
,默认值为true
- ContentProvider
Content Provider
是否可供其它应用使用。
true
:提供程序可供其他应用使用。任何应用均可使用提供程序的内容URI
来访问它,但需依据为提供程序指定的权限进行访问- 提供程序不可供其他应用使用。设置
android:exported="false"
可仅限您的应用访问提供程序。只有与提供程序具有相同的用户ID (UID)
的应用或者通过android:grantUriPermissions
元素被临时授予对提供程序的访问权限的应用才能访问提供程序- 由于此属性是在
API 级别 17
中引入的,因此所有搭载API 级别 16
及更低级别的设备的行为方式就像将此属性设为true
一样。对于搭载API 级别 17
及更高级别的设备,如果您将android:targetSdkVersion 设为 17
或更高版本,则默认值为false
.
来源地址:https://blog.csdn.net/LewisWang_/article/details/128681726