一、應(yīng)用行為變更
1.1记餐、進(jìn)程只能殺死自己的后臺(tái)進(jìn)程
??說(shuō)明:從Android 14開(kāi)始驮樊,當(dāng)應(yīng)用調(diào)用 killBackgroundProcesses() 時(shí),該API只能殺死應(yīng)用自己的后臺(tái)進(jìn)程片酝。如果傳入其他應(yīng)用的包名囚衔,該方法對(duì)其他應(yīng)用的后臺(tái)進(jìn)程沒(méi)有影響。
??應(yīng)用不應(yīng)使用 killBackgroundProcesses() 或以其他方式嘗試影響其他應(yīng)用的進(jìn)程生命周期雕沿。如果應(yīng)用不必要地殺死其他應(yīng)用练湿,會(huì)降低系統(tǒng)性能并增加電池消耗,因?yàn)樯院笮枰耆貑⑦@些應(yīng)用审轮,這比恢復(fù)現(xiàn)有的緩存應(yīng)用占用的資源要多得多肥哎。
1.2、默認(rèn)情況下拒絕使用精準(zhǔn)鬧鐘
??說(shuō)明:Android 12中引入的精準(zhǔn)鬧鐘權(quán)限SCHEDULE_EXACT_ALARM疾渣,不再預(yù)先授予大多數(shù)針對(duì)Android 13及更高版本的新安裝應(yīng)用篡诽,將默認(rèn)設(shè)置為拒絕。如果用戶(hù)通過(guò)備份還原操作將應(yīng)用數(shù)據(jù)傳輸?shù)紸ndroid14的設(shè)備上榴捡,權(quán)限仍然會(huì)被拒絕杈女。如果現(xiàn)有的應(yīng)用已經(jīng)擁有此權(quán)限,它將在設(shè)備升級(jí)到Android 14 時(shí)預(yù)先授予吊圾。
始終允許以下類(lèi)型的應(yīng)用程序調(diào)用setExact()或setExactAndAllowWhileIdle()方法:
- 使用平臺(tái)證書(shū)簽名的應(yīng)用程序达椰;
- 特權(quán)應(yīng)用程序;
- 電源許可名單上的應(yīng)用程序(如果應(yīng)用符合要求项乒,可以使用intent操作請(qǐng)求ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
影響范圍:
- targetSdkVersion為33或更高版本的應(yīng)用啰劲;
- 在 manifest中聲明SCHEDULE_EXACT_ALARM權(quán)限;
- 不屬于豁免或者授權(quán)前擁有權(quán)限檀何;
- 不是日歷或者鬧鐘應(yīng)用蝇裤。
1.3趁尼、前臺(tái)服務(wù)類(lèi)型是必填項(xiàng)
??說(shuō)明:Android 14 為目標(biāo)平臺(tái),則必須指定適當(dāng)?shù)那芭_(tái)服務(wù)類(lèi)型猖辫。與以前的 Android 版本一樣,可組合使用多個(gè)類(lèi)型砚殿。
下面列出了可供選擇的前臺(tái)服務(wù)類(lèi)型:
- camera
- connectedDevice
- dataSync
- health
- location
- mediaPlayback
- mediaProjection
- microphone
- phoneCall
- remoteMessaging
- shortService
- specialUse
- systemExempted
// 示例
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
</application>
</manifest>
??如果應(yīng)用中的用例與這些類(lèi)型均不相關(guān)啃憎,強(qiáng)烈建議您遷移邏輯以使用 WorkManager 或用戶(hù)發(fā)起的數(shù)據(jù)傳輸作業(yè)。
1.4似炎、將前臺(tái)服務(wù)遷移到用戶(hù)啟動(dòng)的數(shù)據(jù)傳輸作業(yè)類(lèi)型中
??說(shuō)明:由于Android 14對(duì)應(yīng)用使用前臺(tái)服務(wù)應(yīng)用了嚴(yán)格的規(guī)則辛萍,所以在Android 14中,我們引入了一種新的API羡藐,用于指定作業(yè)是由用戶(hù)啟動(dòng)的數(shù)據(jù)傳輸作業(yè)贩毕。該API 有助于需要持續(xù)時(shí)間更長(zhǎng)、用戶(hù)啟動(dòng)的數(shù)據(jù)傳輸?shù)挠美袜拢鐝倪h(yuǎn)程服務(wù)器下載文件辉阶。
??用戶(hù)啟動(dòng)的數(shù)據(jù)傳輸作業(yè)由用戶(hù)啟動(dòng)。這些作業(yè)需要通知瘩扼,立即啟動(dòng)谆甜,并且可能會(huì)在系統(tǒng)條件允許的情況下運(yùn)行更長(zhǎng)的時(shí)間。
??用戶(hù)啟動(dòng)的數(shù)據(jù)傳輸作業(yè)需要新的運(yùn)行權(quán)限: RUN_USER_INITIATED_JOBS集绰。系統(tǒng)將會(huì)自動(dòng)授予此權(quán)限规辱。如果未在應(yīng)用manifest中聲明權(quán)限,系統(tǒng)將拋出SecurityException栽燕。
??影響范圍:targetSdkVersion為34的應(yīng)用罕袋。
1.5、語(yǔ)法性別
Android 14 推出了針對(duì)語(yǔ)法性別的 API:GrammaticalInflectionManager碍岔,其提供了針對(duì)單個(gè) App 獲取浴讯、設(shè)置性別偏好的入口。
getApplicationGrammaticalGender():獲取語(yǔ)法性別偏好付秕,返回的是 Configuration 類(lèi)中的 int 常量兰珍,有這么幾種類(lèi)型:
- GRAMMATICAL_GENDER_NOT_SPECIFIED, 0:尚未指定性別偏好,將用默認(rèn)的資源文本
- GRAMMATICAL_GENDER_NEUTRAL, 1:指定中性询吴、客觀的資源文本
- GRAMMATICAL_GENDER_FEMININE, 2:指定針對(duì)女性的資源文本
- GRAMMATICAL_GENDER_MASCULINE, 3:指定針對(duì)男性的資源文本
setRequestedApplicationGrammaticalGender():相對(duì)應(yīng)的將上述常量類(lèi)型動(dòng)態(tài)設(shè)置到性別偏好掠河。
這樣可以針對(duì)不同的性別,加載不同的資源目錄:
- 女性 —— res/values-fr-feminine
- 男性 —— res/values-fr-masculine
- 中性 —— res/values-fr
二猛计、用戶(hù)體驗(yàn)
2.1唠摹、授予對(duì)照片和視頻的部分訪問(wèn)權(quán)限
??新增權(quán)限:READ_MEDIA_VISUAL_USER_SELECTED
??說(shuō)明: 在Android14上與應(yīng)用交互的用戶(hù)現(xiàn)在可以授予對(duì)其媒體庫(kù)的部分訪問(wèn)權(quán)限(READ_MEDIA_IMAGES和READ_MEDIA_VIDEO)。
新對(duì)話框包含以下選項(xiàng):
- 選擇照片和視頻: Android14中的新功能奉瘤。用戶(hù)選擇想要提供給應(yīng)用的特定照片和視頻勾拉;
- 全部允許:用戶(hù)授予對(duì)設(shè)備上所有照片和視頻的完整庫(kù)訪問(wèn)權(quán)限煮甥;
- 不允許:用戶(hù)拒絕所有訪問(wèn)。
??如果用戶(hù)選擇了“選擇照片和視頻”并且應(yīng)用稍后再次請(qǐng)求READ_MEDIA_IMAGES 或者 READ_MEDIA_VIDEO權(quán)限藕赞,系統(tǒng)會(huì)顯示不同的對(duì)話框成肘,讓用戶(hù)有機(jī)會(huì)授予完全訪問(wèn)的權(quán)限,維持現(xiàn)狀斧蜕,或者授予對(duì)其他照片和視頻的訪問(wèn)權(quán)限双霍。為了幫助應(yīng)用支持新的變化,系統(tǒng)引入了一個(gè)新的權(quán)限READ_MEDIA_VISUAL_USER_SELECTED批销。
如果應(yīng)用不聲明READ_MEDIA_VISUAL_USER_SELECTED權(quán)限洒闸,則會(huì)發(fā)生以下行為:
- 在用戶(hù)與應(yīng)用會(huì)話期間,將會(huì)授予對(duì)用戶(hù)選擇的照片和視頻的READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 臨時(shí)訪問(wèn)權(quán)限均芽。當(dāng)應(yīng)用移到后臺(tái)或者當(dāng)用戶(hù)主動(dòng)殺死應(yīng)用時(shí)丘逸,系統(tǒng)最終會(huì)拒絕這些權(quán)限。此行為就像其他一次性權(quán)限一樣;
??如果應(yīng)用稍后需要訪問(wèn)其他照片和視頻掀宋,必須手動(dòng)請(qǐng)求權(quán)限重新獲得權(quán)限深纲。
2.2、改變不可關(guān)閉通知的方式
??說(shuō)明:對(duì)于應(yīng)用向用戶(hù)顯示不可關(guān)閉的前臺(tái)通知布朦,從Android14開(kāi)始允許用戶(hù)關(guān)閉此類(lèi)通知囤萤。
??這項(xiàng)變更適用于通過(guò) Notification.Builder#setOngoing(true)
或 NotificationCompat.Builder#setOngoing(true)
設(shè)置 Notification.FLAG_ONGOING_EVENT
來(lái)阻止用戶(hù)關(guān)閉前臺(tái)通知的應(yīng)用。FLAG_ONGOING_EVENT
的行為已發(fā)生變化是趴,使用戶(hù)實(shí)際上能夠關(guān)閉此類(lèi)通知涛舍。
在以下情況下,此類(lèi)通知仍不可關(guān)閉:
- 當(dāng)手機(jī)處于鎖定狀態(tài)時(shí)
- 如果用戶(hù)選擇全部清除通知操作(有助于防止意外關(guān)閉)
此外唆途,這一新行為不適用于以下用例中的不可關(guān)閉通知:
- 使用
MediaStyle
創(chuàng)建的通知- 安全和隱私用例的政策限制使用
- 企業(yè)設(shè)備政策控制器 (DPC) 和支持軟件包
2.3富雅、非線性字體放大至 200%
??說(shuō)明:從Android14開(kāi)始,系統(tǒng)支持高達(dá)200%的字體縮放肛搬,為弱視用戶(hù)提供了符合網(wǎng)絡(luò)內(nèi)容無(wú)障礙指南 (WCAG) 的其他無(wú)障礙功能選項(xiàng)没佑。
2.4、區(qū)域偏好
??說(shuō)明:區(qū)域偏好使用戶(hù)能夠自定義溫度單位温赔、一周的第一天蛤奢、數(shù)字系統(tǒng)。新 Android設(shè)置菜單為用戶(hù)提供了一個(gè)集中位置來(lái)更改應(yīng)用程序區(qū)域偏好陶贼,應(yīng)用可通過(guò)API例如getTemperatureUnit和getFirstDayOfWeek獲取用戶(hù)設(shè)置啤贩,以便調(diào)整應(yīng)用內(nèi)顯示信息的方式。
2.5拜秧、數(shù)據(jù)安全信息更顯眼
??說(shuō)明:為了加強(qiáng)用戶(hù)隱私保護(hù)痹屹,Android 14 增加了系統(tǒng)顯示您在 Play 管理中心表單中聲明的信息的位置數(shù)量。目前枉氮,用戶(hù)可以在 Google Play 中的應(yīng)用詳情的數(shù)據(jù)安全部分查看此信息志衍。
2.6暖庄、安全的全屏 intent 通知
??說(shuō)明: 在 Android 11(API 級(jí)別 30)中,任何應(yīng)用都可以在手機(jī)處于鎖定狀態(tài)時(shí)使用 Notification.Builder.setFullScreenIntent
發(fā)送全屏 intent楼肪。您可以通過(guò)在 AndroidManifest 中聲明 USE_FULL_SCREEN_INTENT
權(quán)限培廓,在應(yīng)用安裝時(shí)自動(dòng)授予此權(quán)限。
??全屏 intent 通知適用于需要用戶(hù)立即注意的極高優(yōu)先級(jí)通知春叫,例如用戶(hù)來(lái)電或用戶(hù)配置的鬧鐘設(shè)置医舆。從 Android 14 開(kāi)始,獲準(zhǔn)使用此權(quán)限的應(yīng)用僅限于提供通話和鬧鐘的應(yīng)用象缀。對(duì)于不適合此情況的任何應(yīng)用,Google Play 商店會(huì)撤消其默認(rèn)的 USE_FULL_SCREEN_INTENT
權(quán)限爷速。
??在用戶(hù)更新到 Android 14 之前央星,在手機(jī)上安裝的應(yīng)用仍擁有此權(quán)限。用戶(hù)可以開(kāi)啟和關(guān)閉此權(quán)限惫东。
??您可以使用新 API NotificationManager.canUseFullScreenIntent
檢查應(yīng)用是否具有該權(quán)限莉给;如果沒(méi)有,應(yīng)用可以使用新 intent ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT
啟動(dòng)設(shè)置頁(yè)面廉沮,在該頁(yè)面中颓遏,用戶(hù)可以授予權(quán)限。
三滞时、圖形
3.1叁幢、Path可查詢(xún)和可插值
??說(shuō)明:Android的Path API是一種用于創(chuàng)建和渲染矢量圖形的強(qiáng)大而靈活的機(jī)制,具有描邊或填充路徑坪稽、從線段或二次或三次曲線構(gòu)建路徑曼玩、執(zhí)行布爾運(yùn)算以獲得更復(fù)雜的形狀。但是對(duì)象的內(nèi)部在創(chuàng)建后對(duì)調(diào)用者是不透明的窒百。
??可以調(diào)用moveTo()黍判、lineTo()和cubicTo() 添加路徑段等方法創(chuàng)建Path,但是沒(méi)有辦法詢(xún)問(wèn)該路徑的段是什么篙梢,因此必須在創(chuàng)建時(shí)保留該信息顷帖。從 Android 14 開(kāi)始,可以查詢(xún)路徑里面有些什么渤滞,同時(shí)支持路徑內(nèi)部插值返回新路徑贬墩。
四、安全
4.1蔼水、限制隱式intent
??說(shuō)明: Android 通過(guò)以下方式限制應(yīng)用向內(nèi)部應(yīng)用組件發(fā)送隱式intent:
- 隱式intent僅傳遞給exported的組件震糖。應(yīng)用程序必須使用明確的intent傳遞給unexported的組件,或者將組件標(biāo)記為exported趴腋。
- 如果應(yīng)用創(chuàng)建一個(gè)pending intent吊说,但intent未指定組件或包论咏,系統(tǒng)現(xiàn)在會(huì)拋出異常。
??這些更改可防止惡意應(yīng)用攔截用在供應(yīng)用內(nèi)部組件使用的隱式intent颁井。
4.2 更安全的動(dòng)態(tài)代碼加載
??說(shuō)明: 如果應(yīng)用使用動(dòng)態(tài)代碼加載 (DCL)丈挟,則所有動(dòng)態(tài)加載的文件都必須標(biāo)記為只讀榛臼,否則系統(tǒng)會(huì)拋出異常。建議應(yīng)用盡可能避免動(dòng)態(tài)加載代碼,因?yàn)檫@樣做會(huì)大大增加應(yīng)用程序因代碼注入或代碼篡改而受到危害的風(fēng)險(xiǎn)趣钱。
??為防止現(xiàn)有動(dòng)態(tài)加載文件拋出異常,建議嘗試在應(yīng)用中再次動(dòng)態(tài)加載文件之前刪除并重新創(chuàng)建這些文件唐责。重新創(chuàng)建文件時(shí)瞒爬,請(qǐng)按照前面的指導(dǎo)在寫(xiě)入時(shí)將文件標(biāo)記為只讀∈癖洌或者將現(xiàn)有文件重新標(biāo)記為只讀悄谐,但在這種情況下,強(qiáng)烈建議首先驗(yàn)證文件的完整性(例如库北,通過(guò)根據(jù)可信值檢查文件的簽名)爬舰,來(lái)保護(hù)你的app避免被惡意篡改。
4.3 Zip路徑遍歷
??說(shuō)明:對(duì)于以 Android 14 為目標(biāo)平臺(tái)的應(yīng)用寒瓦,Android 會(huì)通過(guò)以下方式防止 Zip 路徑遍歷漏洞:如果 Zip 文件條目名稱(chēng)包含“..”或以“/”開(kāi)頭情屹,ZipFile(String)
和 ZipInputStream.getNextEntry()
會(huì)拋出 ZipException
。
??應(yīng)用可以通過(guò)調(diào)用 dalvik.system.ZipPathValidator.clearCallback()
選擇停用此驗(yàn)證杂腰。
4.4 額外的后臺(tái)啟動(dòng)activity限制
??說(shuō)明:系統(tǒng)進(jìn)一步限制了應(yīng)用在后臺(tái)啟動(dòng) Activity 的時(shí)機(jī):
- 當(dāng)應(yīng)用發(fā)送PendingIntent使用PendingIntent.send()或類(lèi)似方法時(shí)垃你,如果應(yīng)用想要授予自己的后臺(tái)activity啟動(dòng)權(quán)限以啟動(dòng)intent,則該應(yīng)用現(xiàn)在必須調(diào)用setPendingIntentBackgroundActivityStartMode(MODE_BACKGROUND_ACTIVITY_START_ALLOWED)來(lái)明確的表達(dá)意圖喂很。
- 當(dāng)一個(gè)可見(jiàn)應(yīng)用使用bindService()方法綁定另一個(gè)在后臺(tái)運(yùn)行的應(yīng)用的服務(wù)時(shí) 蜡镶,如果該可見(jiàn)應(yīng)用想要將其自己的后臺(tái)活動(dòng)啟動(dòng)權(quán)限授予綁定服務(wù),則它現(xiàn)在必須添加BIND_ALLOW_ACTIVITY_STARTS標(biāo)志恤筛。
??通過(guò)這樣的限制可以防止惡意應(yīng)用程序?yàn)E用API從后臺(tái)啟動(dòng)破壞性activity以便保護(hù)用戶(hù)官还。
4.5、廣播接收器必須指定導(dǎo)出行為
??說(shuō)明: 以 Android 14 為目標(biāo)平臺(tái)并使用 上下文注冊(cè)
的接收器的應(yīng)用和服務(wù)指定以下標(biāo)志毒坛,以指定接收器是否應(yīng)導(dǎo)出到設(shè)備上的所有其他應(yīng)用:RECEIVER_EXPORTED
或RECEIVER_NOT_EXPORTED
望伦。此要求有助于使用Android 13 中引入的這些接收器的功能,來(lái)保護(hù)應(yīng)用主板安全漏洞的影響煎殷。
五屯伞、可升級(jí)Android 14的機(jī)子
以下只列出部份品牌:
- 小米13Pro、小米13豪直、小米12T
- vivo X90 Pro劣摇、iQOO 11
- Pixel 4a (5G)、Pixel 5弓乙、Pixel 5a末融、Pixel 6勾习、Pixel 6 Pro......