Android 12 一個重要的變更是提高應用和系統的安全性,這個變更影響了所有目標版本為 Android 12 的應用。
在 AndroidManifest.xml 文件中注冊的 Activity、rvice 和 broadcast receiver 組件如果有 intent-filter 聲明都必須顯式申明是否需要對外披露服務 (android:exported)。
??如果您的應用出現了以下錯誤信息,很有可能和這個變更有關。
Installation did not succeed.
The application could not be installed: INSTALL_FAILED_VERIFICATION_FAILURE
List of apks:
[0] ‘…/build/outputs/apk/debug/app-debug.apk’
Installation failed due to: ‘null’
或
NSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed par during installPackageLI:
/data/app/vmdl538800143.tmp/ba.apk (at Binary XML file line #…):
com.example.package.ActivityName: Targeting S+ (version 10000 and above) requires that an explicit
value for android:exported be defined when intent filters are prent”
解決方法要解決上述問題,您需要在 AndroidManifest.xml 文件中,為使用了 <intent-filter> 的 <activity>、<activity-alias>、<rvice> 或 <receiver> 組件聲明 android:exported 屬性。
我們非常期待收到您對這項關于本要求的反饋,如果有任何建議和想法,請填寫這份 簡短的調查問卷 向我們反饋,告訴我們您的應用中的哪些用例受到此變更的影響。
?? 請不要 "簡單粗暴" 地給這些組件直接添加 android:exported="true",您需要檢查并斟酌那些加入了 intent-filter 屬性的組件: 用戶設備上的任何其他應用都能啟動這個組件,這是否是您需要的?
判斷組件能否與其他應用的組件或服務相互調用或交互,這取決于應用本身的功能、其他應用如何與本應用交互,以及可能存在的特定應用場景。這里有一些常見例子,例子中包含了 intent-filter 的建議配置以及為什么要這樣設置。
為包含 <category android:name="android.intent.category.LAUNCHER" /> 的 Activity 設定 android:exported="true"
這個 Activity 可能是您應用的 MainActivity,由于 Android 上的 Launcher (桌面/啟動器) 是一個很常規的應用,這個 Activity 必須設定 exported="true",否則 Launcher 應用就無法啟動它。
為包含 <action android:name="android.intent.action.VIEW" /> 的 Activity 設定 android:exported="true"
這個 Activity 負責處理來自其他應用的 "open with" 操作。
為包含 <action android:name="android.intent.action.SEND" /> 或 <action android:name="android.intent.action.SEND_MULTIPLE"/> 的 Activity 設定 android:exported="true"
這個 Activity 負責處理來自其他應用分享的內容。如需了解更多,請參閱: 從其他應用接收簡單的數據。
為包含 <action android:name="android.media.brow.MediaBrowrService" /> 的 Service 設定 android:exported="true"
如果這是一個將應用的媒體庫公開給其他應用的 Service,則需要設定為 android:exported="true",以便于其他應用連接和瀏覽。這個 Service 一般是通過直接或者間接繼承 MediaBrowrServiceCompat 來實現的,如果不是,就沒有必要設置這個。
為包含 <action android:name="com.google.fireba.MESSAGING_EVENT" /> Service 設定 android:exported="fal"
這個 Service 會被 Fireba Cloud Messaging 調用,Service 需要繼承 FirebaMessagingService。這個 Service 不應該設定 android:exported="true",因為無論它的屬性值是什么,Fireba 都可以啟動這個 Service。如需要了解更多,請參閱: 在 Android 上開發一個基于 Fireba Cloud 的消息應用。
為包含 <action android:name="android.intent.action.BOOT_COMPLETED" /> 的 Receiver 設定 android:exported="fal"
因為無論是否設定 exported,系統都會向 receiver 發送對應的廣播。
背景在 Android 12 之前,有 intent-filter 屬性的組件 (只有 Activity、Service 和 BroadcastReceiver) 自動被默認設定為 exported。
下面的 Activity 默認會 exported:
<activityandroid:name=".MainActivity"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity>
下面的 Activity 不會 exported:
<activityandroid:name=".MainActivity"/>
這個默認的設置看起來可能合理,但這個錯誤可能會讓應用容易受到攻擊。舉個例子,假設我們的應用有一個播放視頻的 Activity:
<activityandroid:name=”.PlayVideoActivity”/>
后來我們發現很多地方都需要顯式地調用或啟動這個 Activity,為了降低應用的耦合,我們給 Activity 添加了 intent-filter 屬性,允許系統選擇這個 Activity:
<activityandroid:name=”.PlayVideoActivity”><intent-filter><actionandroid:name=”android.intent.action.VIEW”/><dataandroid:mimeType=”video/*”android:scheme=”content”/></intent-filter></activity>
到這里問題就出現了,這個 Activity 設計的目的僅僅是在應用內部使用,可現在卻被公開了!
如果我們的應用目標版本是 Android 12,系統會阻止這樣的設置,并強制要求我們去設置 android:exported 屬性。由于我們不想將 Activity 對外公開,我們可以設置 android:export=fal,以確保應用的安全性。
<activityandroid:name=”.PlayVideoActivity”android:exported=”fal”><intent-filter><actionandroid:name=”android.intent.action.VIEW”/><dataandroid:mimeType=”video/*”android:scheme=”content”/></intent-filter></activity>簡要總結
Android 12 一個重要的變化是提高了安全性。以 Android 12 為目標版本的應用,如果 AndroidManifest.xml 注冊的 activity、activity-alias、rvice 或者 broadcast receiver 組件有 intent-filter 屬性,必須顯式設置 android:exported 的值,否則應用將無法安裝。
需要仔細考慮 android:exported 屬性需要設置什么值,如果不確定,建議設置 android:exported="fal"。
了解更多關于 intent 和 intent-filter 的信息,請參閱: 接收一個隱式的 intent。
了解更多安全和隱私上的更新,請參閱: 行為變更: 以 Android 12 為目標平臺的應用->安全性。
了解 Android 12 所有的更新,請參閱: Android 12 首個開發者預覽版到來。
本文發布于:2023-02-28 21:07:00,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/167772724699766.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:intentfilter(intent和intentfilter).doc
本文 PDF 下載地址:intentfilter(intent和intentfilter).pdf
| 留言與評論(共有 0 條評論) |