1. Android 12 安裝報錯
1.1 報錯信息
應(yīng)用配置 targetSdkVersion=31,在 Android 12 的設(shè)備上安裝,出現(xiàn)報錯:
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'
根據(jù)錯誤信息提示,“針對 S+(版本31及更高版本),當 intent filters 存在時,需要顯式定義 android:exported 屬性值”。
1.2 解決方法
-
方法 1
若應(yīng)用不需要適配Android 12及以上版本設(shè)備
,將targetSdkVersion 設(shè)置小于31
即可; -
方法 2
若應(yīng)用必須適配Android 12及以上版本設(shè)備
,將啟動Activity
設(shè)置android:exported="true"
。
將所有包含intent-filter 的 activity、service和receiver組件
顯式定義android:exported
屬性。
1.3 注意事項
- 高版本安裝
(應(yīng)用:targetSdkVersion >=31,設(shè)備的系統(tǒng)版本:Android 12及以上)
所有在
AndroidManifest.xml
注冊的activity、service、receiver
,如果包含intent-filter
,必須顯式定義android:exported
屬性,否則無法安裝;游戲的
啟動Activity
必須顯式設(shè)置android:exported="true"
;若設(shè)置成 `android:exported=“false”,應(yīng)用將無法啟動;
- 所有在
AndroidManifest.xml
注冊并繼承FileProvider類
的provider
不能將 android:exported 設(shè)置為true
,否則將引起報錯"Provider must not be exported"
。
2. exported 屬性
報錯信息涉及到 android:exported
屬性。
Android
的 四大組件 Activity、Service、BroadcastReceiver、ContentProvider
都存在著 exported
屬性。
如果想要定義的組件被其它應(yīng)用訪問調(diào)用,android:exported
屬性需要設(shè)置為 true
。這是一個必要不充分的條件,因為還受到 permission
權(quán)限影響。文章來源:http://www.zghlxwxcb.cn/news/detail-667320.html
2.1 android:exported 的描述
以下是參考 官方文檔 對四大組件 android:exported
屬性的描述文章來源地址http://www.zghlxwxcb.cn/news/detail-667320.html
-
Activity
設(shè)置Activit
是否可由其他應(yīng)用的組件啟動
- 設(shè)為
true
,表示Activity
可由任何應(yīng)用訪問,并且可以通過其確切的類名啟動;- 設(shè)為
false
,沒有設(shè)置intent-filter
時,這是默認值。表示Activity
只能由同一應(yīng)用的組件、使用同一用戶 ID 的不同應(yīng)用或具有特權(quán)的系統(tǒng)組件啟動。
-
Service
其它應(yīng)用的組件是否能調(diào)用服務(wù)或與之交互,true
表示可以,false
表示不可以。
- 若
Service
包含intent-filter
,意味著該服務(wù)供外部使用,默認值為true
.- 若
Service
不包含intent-filter
,意味著服務(wù)專供應(yīng)用內(nèi)部使用,默認值為false
.
-
BroadcastReceiver
廣播接收器是否可以接收來自其應(yīng)用外部非系統(tǒng)來源的消息,true
表示可以,false
表示不可以。
- 當
receiver
未指定exported
屬性,并且不包含intent-filter
,默認值為false
- 當
receiver
未指定exported
屬性,包含intent-filter
,默認值為true
-
ContentProvider
Content Provider
是否可供其它應(yīng)用使用。
true
:提供程序可供其他應(yīng)用使用。任何應(yīng)用均可使用提供程序的內(nèi)容URI
來訪問它,但需依據(jù)為提供程序指定的權(quán)限進行訪問- 提供程序不可供其他應(yīng)用使用。設(shè)置
android:exported="false"
可僅限您的應(yīng)用訪問提供程序。只有與提供程序具有相同的用戶ID (UID)
的應(yīng)用或者通過android:grantUriPermissions
元素被臨時授予對提供程序的訪問權(quán)限的應(yīng)用才能訪問提供程序- 由于此屬性是在
API 級別 17
中引入的,因此所有搭載API 級別 16
及更低級別的設(shè)備的行為方式就像將此屬性設(shè)為true
一樣。對于搭載API 級別 17
及更高級別的設(shè)備,如果您將android:targetSdkVersion 設(shè)為 17
或更高版本,則默認值為false
.
到了這里,關(guān)于Android 12 安裝報錯 INSTALL_PARSE_FAILED_MANIFEST_MALFORMED的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!