Android 14適配指南

一、應(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è)置為拒絕。如果用戶通過(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ù)先授予。

始終允許以下類型的應(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ù)類型是必填項(xiàng)

??說(shuō)明:Android 14 為目標(biāo)平臺(tái),則必須指定適當(dāng)?shù)那芭_(tái)服務(wù)類型。與以前的 Android 版本一樣,可組合使用多個(gè)類型。

下面列出了可供選擇的前臺(tái)服務(wù)類型:

  • 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)用中的用例與這些類型均不相關(guān),強(qiáng)烈建議您遷移邏輯以使用 WorkManager用戶發(fā)起的數(shù)據(jù)傳輸作業(yè)

1.4、將前臺(tái)服務(wù)遷移到用戶啟動(dòng)的數(shù)據(jù)傳輸作業(yè)類型中

??說(shuō)明:由于Android 14對(duì)應(yīng)用使用前臺(tái)服務(wù)應(yīng)用了嚴(yán)格的規(guī)則,所以在Android 14中,我們引入了一種新的API,用于指定作業(yè)是由用戶啟動(dòng)的數(shù)據(jù)傳輸作業(yè)。該API 有助于需要持續(xù)時(shí)間更長(zhǎng)、用戶啟動(dòng)的數(shù)據(jù)傳輸?shù)挠美鐝倪h(yuǎn)程服務(wù)器下載文件。

??用戶啟動(dòng)的數(shù)據(jù)傳輸作業(yè)由用戶啟動(dòng)。這些作業(yè)需要通知,立即啟動(dòng),并且可能會(huì)在系統(tǒng)條件允許的情況下運(yùn)行更長(zhǎng)的時(shí)間。

??用戶啟動(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 類中的 int 常量,有這么幾種類型:

  • 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)的將上述常量類型動(dòng)態(tài)設(shè)置到性別偏好。

這樣可以針對(duì)不同的性別,加載不同的資源目錄:

  • 女性 —— res/values-fr-feminine
  • 男性 —— res/values-fr-masculine
  • 中性 —— res/values-fr

二、用戶體驗(yàn)

2.1、授予對(duì)照片和視頻的部分訪問(wèn)權(quán)限

??新增權(quán)限:READ_MEDIA_VISUAL_USER_SELECTED

??說(shuō)明: 在Android14上與應(yīng)用交互的用戶現(xiàn)在可以授予對(duì)其媒體庫(kù)的部分訪問(wèn)權(quán)限(READ_MEDIA_IMAGES和READ_MEDIA_VIDEO)。

新對(duì)話框包含以下選項(xiàng):

  • 選擇照片和視頻: Android14中的新功能。用戶選擇想要提供給應(yīng)用的特定照片和視頻;
  • 全部允許:用戶授予對(duì)設(shè)備上所有照片和視頻的完整庫(kù)訪問(wèn)權(quán)限;
  • 不允許:用戶拒絕所有訪問(wèn)。

??如果用戶選擇了“選擇照片和視頻”并且應(yīng)用稍后再次請(qǐng)求READ_MEDIA_IMAGES 或者 READ_MEDIA_VIDEO權(quán)限,系統(tǒng)會(huì)顯示不同的對(duì)話框,讓用戶有機(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ā)生以下行為:

  • 在用戶與應(yīng)用會(huì)話期間,將會(huì)授予對(duì)用戶選擇的照片和視頻的READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 臨時(shí)訪問(wèn)權(quán)限。當(dāng)應(yīng)用移到后臺(tái)或者當(dāng)用戶主動(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)用向用戶顯示不可關(guān)閉的前臺(tái)通知,從Android14開(kāi)始允許用戶關(guān)閉此類通知。

??這項(xiàng)變更適用于通過(guò) Notification.Builder#setOngoing(true)NotificationCompat.Builder#setOngoing(true)設(shè)置 Notification.FLAG_ONGOING_EVENT 來(lái)阻止用戶關(guān)閉前臺(tái)通知的應(yīng)用。FLAG_ONGOING_EVENT 的行為已發(fā)生變化,使用戶實(shí)際上能夠關(guān)閉此類通知。

在以下情況下,此類通知仍不可關(guān)閉:

  • 當(dāng)手機(jī)處于鎖定狀態(tài)時(shí)
  • 如果用戶選擇全部清除通知操作(有助于防止意外關(guān)閉)

此外,這一新行為不適用于以下用例中的不可關(guān)閉通知:

  • 使用 MediaStyle 創(chuàng)建的通知
  • 安全和隱私用例的政策限制使用
  • 企業(yè)設(shè)備政策控制器 (DPC) 和支持軟件包
2.3、非線性字體放大至 200%

??說(shuō)明:從Android14開(kāi)始,系統(tǒng)支持高達(dá)200%的字體縮放,為弱視用戶提供了符合網(wǎng)絡(luò)內(nèi)容無(wú)障礙指南 (WCAG) 的其他無(wú)障礙功能選項(xiàng)。

2.4、區(qū)域偏好

??說(shuō)明:區(qū)域偏好使用戶能夠自定義溫度單位、一周的第一天、數(shù)字系統(tǒng)。新 Android設(shè)置菜單為用戶提供了一個(gè)集中位置來(lái)更改應(yīng)用程序區(qū)域偏好,應(yīng)用可通過(guò)API例如getTemperatureUnit和getFirstDayOfWeek獲取用戶設(shè)置,以便調(diào)整應(yīng)用內(nèi)顯示信息的方式。

2.5、數(shù)據(jù)安全信息更顯眼

??說(shuō)明:為了加強(qiáng)用戶隱私保護(hù),Android 14 增加了系統(tǒng)顯示您在 Play 管理中心表單中聲明的信息的位置數(shù)量。目前,用戶可以在 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 通知適用于需要用戶立即注意的極高優(yōu)先級(jí)通知,例如用戶來(lái)電或用戶配置的鬧鐘設(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)限。

??在用戶更新到 Android 14 之前,在手機(jī)上安裝的應(yīng)用仍擁有此權(quán)限。用戶可以開(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è)面中,用戶可以授予權(quán)限。

三、圖形

3.1、Path可查詢和可插值

??說(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)有辦法詢問(wèn)該路徑的段是什么,因此必須在創(chuàng)建時(shí)保留該信息。從 Android 14 開(kāi)始,可以查詢路徑里面有些什么,同時(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 文件條目名稱包含“..”或以“/”開(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()或類似方法時(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ù)用戶。

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_EXPORTEDRECEIVER_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......
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容