行為變更:指定 Android 17 以上版本的應用程式

和先前版本一樣,Android 17 也包含可能會影響應用程式的行為變更。以下行為變更僅適用於指定 Android 17 以上版本的應用程式。如果您的應用程式指定 Android 17 以上版本,建議您視情況修改應用程式,以支援這些行為。

此外,無論應用程式的 targetSdkVersion 為何,請務必查看對所有 Android 17 應用程式有影響的行為變更清單。

核心功能

Android 17 包含下列異動項目,這類變更會修改或擴充 Android 系統的各種核心功能。

MessageQueue 的新無鎖實作

自 Android 17 起,指定 Android 17 以上版本的應用程式會收到 android.os.MessageQueue 的新實作方式,不會發生鎖定情形。新實作方式可提升效能並減少遺失的影格,但可能會中斷反映 MessageQueue 私有欄位和方法的用戶端。

如需更多資訊 (包括緩解策略),請參閱「MessageQueue 行為異動指南」。

靜態最終欄位現在無法修改

如果應用程式在 Android 17 以上版本上執行,且指定 Android 17 以上版本,則無法變更 static final 欄位。如果應用程式嘗試使用反射功能變更 static final 欄位,就會導致 IllegalAccessException。如果嘗試透過 JNI API (例如 SetStaticLongField()) 修改其中一個欄位,應用程式就會當機。

無障礙設定

Android 17 進行下列變更,提升無障礙功能。

支援複雜 IME 實體鍵盤輸入的無障礙功能

這項功能導入了新的 AccessibilityEventTextAttribute API,可提升中文、日文、韓文和越南文輸入的螢幕閱讀器語音回饋。CJKV 輸入法應用程式現在可以指出在文字撰寫期間是否已選取文字轉換候選字。含有編輯欄位的應用程式可以在傳送文字變更無障礙功能事件時,指定文字變更類型。舉例來說,應用程式可以指定文字在文字撰寫期間發生變更,或是文字變更是由提交作業所致。這樣一來,螢幕閱讀器等無障礙服務就能根據文字修改的性質,提供更精確的回饋。

應用程式採用數

  • 輸入法編輯器應用程式:在編輯欄位中設定撰寫文字時,輸入法編輯器可以使用 TextAttribute.Builder.setTextSuggestionSelected() 指出是否已選取特定轉換候選字。

  • 可編輯欄位的應用程式:維護自訂 InputConnection 的應用程式可以呼叫 TextAttribute.isTextSuggestionSelected() 擷取候選人選取資料。這些應用程式應在分派 TYPE_VIEW_TEXT_CHANGED 事件時呼叫 AccessibilityEvent.setTextChangeTypes()。如果應用程式適用於 Android 17,且使用標準 TextView,這項功能就會預設為啟用。(也就是說,TextView 會處理從 IME 擷取資料,以及在將事件傳送至無障礙服務時設定文字變更類型)。

  • 無障礙服務:處理 TYPE_VIEW_TEXT_CHANGED 事件的無障礙服務可以呼叫 AccessibilityEvent.getTextChangeTypes(),判斷修改性質並相應調整意見回饋策略。

安全性

Android 17 在裝置和應用程式安全性方面有以下改進。

活動安全性

Android 17 平台持續朝「預設安全」架構邁進,推出一系列強化功能,旨在防範網路釣魚、互動劫持和混淆副手攻擊等高嚴重性攻擊。這項更新要求開發人員明確選擇採用新的安全標準,以維持應用程式相容性並保護使用者。

對開發人員的主要影響包括:

  • 強化 BAL 並改善啟用程序:我們將擴大保護範圍至 IntentSender,進一步完善背景活動啟動 (BAL) 限制。開發人員必須從舊版 MODE_BACKGROUND_ACTIVITY_START_ALLOWED 常數遷移。您應改為採用細微控制項,例如 MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,將活動啟動限制在呼叫應用程式可見的情況,大幅減少攻擊面。
  • 採用工具:開發人員應使用嚴格模式和更新的 Lint 檢查,找出舊版模式,確保符合日後目標 SDK 規定。

本機主機防護

為提升平台安全性和使用者隱私權,Android 17 導入了新的安裝時權限 USE_LOOPBACK_INTERFACE。這項變更會限制透過回送介面進行跨應用程式和跨設定檔通訊 (例如 127.0.0.1::1),先前系統會使用 INTERNET 權限隱含允許這類通訊。如果應用程式指定 Android 17 以上版本,則適用下列規則:

  • 必須取得雙方同意:根據預設,系統現在會封鎖跨應用程式和跨設定檔的通訊。如要成功連線,傳送端和接收端應用程式都必須在資訊清單中明確宣告 USE_LOOPBACK_INTERFACE 權限。
  • 應用程式內流量不受影響:同一應用程式內的迴路通訊 (應用程式內通訊) 不受影響,也不需要這項新權限。
  • 目標 SDK 行為:
    • 應用程式指定 Android 17 以上版本:必須明確要求這項權限。如果缺少這個權限,通訊端作業 (例如 TCP 連線或 UDP 傳送) 就會失敗,通常會傳回 EPERM (不允許作業) 錯誤。
    • 應用程式指定 API 級別 36 以下版本:在 INTERNET 上,這項權限會視為分割權限。如果應用程式指定較低的 API 級別,且持有 INTERNET,系統就會自動授予這項權限。
  • 相容性警告:如果接收端應用程式將目標更新為 Android 17,但未要求這項權限,系統就會拒絕其他應用程式的連線要求,即使傳送端應用程式的目標 API 級別較低也一樣。

預設啟用 CT

如果應用程式指定 Android 17 以上版本,系統預設會啟用憑證透明度 (CT)。(在 Android 16 上,CT 可供使用,但應用程式必須選擇加入)。

更安全的 Native DCL - C

如果您的應用程式指定 Android 17 以上版本,Android 14 針對 DEX 和 JAR 檔案導入的「更安全的動態程式碼載入 (DCL)」保護機制,現在也適用於原生程式庫。

使用 System.load() 載入的所有原生檔案都必須標示為唯讀。否則系統會擲回 UnsatisfiedLinkError

我們建議應用程式盡量避免使用動態載入程式碼,否則應用程式很可能會因為程式碼插入或竄改程式碼而無法正常運作。

裝置板型規格

Android 17 包含下列異動項目,可改善各種尺寸和板型規格裝置的使用者體驗。

平台 API 異動,可忽略大螢幕 (sw>=600dp) 的螢幕方向、大小調整和長寬比限制

我們在 Android 16 中導入了平台 API 變更,針對指定 API 級別 36 以上版本的應用程式,忽略大螢幕 (sw >= 600dp) 的螢幕方向、顯示比例和大小調整限制。開發人員可使用 SDK 36 選擇避開這些變更,但如果應用程式的目標版本是 Android 17 以上,則無法再避開。

詳情請參閱「系統會忽略方向和大小調整限制」。