Android 17 隆重登場

閱讀時間:13 分鐘
Matthew McCullough
Android 開發人員產品管理副總裁

今天我們將發布 Android 17,並在大多數支援的 Pixel 裝置上推出。搭載 Android 17 的新裝置將於未來幾個月內推出。

AfD-Android-17.gif

Android 17 標誌著我們開始轉向智慧系統,將應用程式置於核心地位。Android 正在轉向以適應性為優先的開發標準,強制導入大螢幕可調整大小功能,同時提供新一代的隱私權、安全性、媒體、相機和效能。我們將在這篇文章中說明所有這些內容,以及如何整合新一代工具、程式庫和代理程式技能,協助應用程式掌握這項商機。

過去一年,我們與開發人員社群的許多成員合作,從 Canary 管道到 Beta 版,共同建構值得您和使用者信賴的平台。為此,我們現在已在 Android 開放原始碼計畫 (AOSP) 中提供原始碼,讓您檢查原始碼,進一步瞭解 Android 的運作方式。

我們來深入瞭解 Android 17。

智慧型系統

透過硬體、軟體和 AI 的深度整合,我們將 Android 從作業系統轉變為智慧系統,提供可預測使用者需求的新實用體驗,並帶來更多與應用程式互動的機會。為此,Android 17 擴充了 AppFunctions 的功能,這項平台 API 具有對應的 Jetpack 程式庫,可讓您將應用程式的獨特功能做為可編排的「工具」,提供給 Android MCP (裝置端等同於 Model Context Protocol)。AI 代理程式和助理 (例如 Google Gemini) 可以探索及執行 AppFunctions,代表使用者執行工作流程,並直接存取應用程式的本機狀態。

目前為 Alpha 版的 Jetpack 程式庫可讓您輕鬆新增 AppFunctions,只要為類別加上註解並新增 KDoc 註解即可。

/**
 *   A note app's [AppFunction]s.
 */
class NoteFunctions(
    private val noteRepository: NoteRepository
) {
    /**
     *   Adds a new note to the app.
     *
     *   @param appFunctionContext The execution context.
     *   @param title The title of the note.
     *   @param content The note's content.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createNote(
        appFunctionContext: AppFunctionContext,
        title: String,
        content: String
    ): Note {
        return noteRepository.createNote(title, content)
    }
}

我們也推出了 AppFunctions 代理程式技能,可分析應用程式的主要工作流程、自動產生所需的 Kotlin 程式碼、針對大型語言模型工具呼叫功能最佳化 KDocs,並提供用於測試和偵錯的 ADB 指令。

Gemini 整合功能目前為私下預先發布版,僅供信任的測試人員使用,但您現在可以開始準備應用程式。除了使用 ADB 指令執行 AppFunctions,我們也提供測試代理程式應用程式,其中包含可探索及執行 AppFunctions 的介面,並模擬 AI 代理程式整合。歡迎前往 goo.gle/eap-af 加入整合搶先體驗計畫,搶先將 AppFunctions 部署至正式版應用程式。

自動調節優先

使用者不再只依賴單一板型規格,而是在手機、折疊式裝置、平板電腦、筆電、車輛螢幕和沉浸式 XR 環境之間切換。如今,使用者手中的大螢幕裝置超過 5 億 8 千萬台,加上即將推出 Google 圖書,新一代 ChromeOS 採用 Android 堆疊技術,因此「適應性」不再只是技術目標,這是觸及高參與度使用者的絕佳機會,這也是我們轉向以適應性為優先的開發標準的原因之一。

大螢幕裝置沒有大小調整/螢幕方向限制

為確保應用程式在所有板型規格 (包括在連線螢幕上以電腦模式執行的行動裝置) 中提供優質體驗,Android 17 (API 級別 37) 會針對以 API 級別 37 為目標的應用程式,移除大螢幕裝置 (sw > 600 dp) 的螢幕方向和大小調整限制開發人員停用選項。系統會忽略舊版資訊清單屬性和執行階段 API,包括 screenOrientationsetRequestedOrientation()resizeableActivity=false 和螢幕比例限制 (minAspectRatio/maxAspectRatio)。遊戲 (根據 Google Play 中的應用程式類別) 仍可豁免。應用程式必須能配合任何視窗大小調整,尊重使用者偏好的裝置姿勢,並原生支援任意形式視窗。

新一代多工處理功能:應用程式對話框、對話框列和電腦互動式子母畫面

Android 17 推出強大的全新視窗功能,重新定義使用者執行多工的方式,因此應用程式需要提供更大的版面配置彈性:

  • 應用程式泡泡: 除了訊息泡泡 API,使用者現在只要在啟動器上長按應用程式圖示,就能將任何應用程式轉換成浮動泡泡。這項功能適用於手機、摺疊式裝置和平板電腦,可讓使用者在任何工作流程中輕鬆執行多工。
  • 泡泡列:在大螢幕 (平板電腦和摺疊式裝置) 上,系統工作列現在會顯示專屬的泡泡列,方便你整理、切換及固定這些浮動的應用程式泡泡。
  • 電腦互動式子母畫面:在電腦環境中,Android 17 推出互動式子母畫面 (PiP)。與傳統的唯讀子母畫面視窗不同,這些釘選視窗會保持完全互動,同時永遠顯示在其他應用程式視窗上方。
Bubbles (1).gif
運作中的應用程式對話框和對話框列

活動重建更新

為避免造成狀態遺失和畫面延遲,Android 17 更新了活動重新建立的預設行為。對於不需要完整重新繪製 UI 的一般設定變更 (包括 CONFIG_KEYBOARDCONFIG_KEYBOARD_HIDDENCONFIG_NAVIGATIONCONFIG_TOUCHSCREENCONFIG_COLOR_MODE),系統預設不會重新啟動活動。

而是透過 onConfigurationChanged() 接收這些更新,實現平穩的轉移。如果應用程式明確依賴完整重新啟動來重新載入這些變更的資源,您現在必須使用新的 android:recreateOnConfigChanges 資訊清單屬性明確選擇加入。

Continue On

Android 17 新增「繼續操作」功能,協助使用者在 Android 裝置間順暢切換工作。平板電腦工作列會顯示使用者最近在行動裝置上開啟的應用程式建議,只要輕觸一下即可啟動應用程式,並透過深層連結繼續上次的進度。這項功能支援應用程式至網頁的轉換,包括在未安裝應用程式時改用網頁。

Continue On.png
平板電腦上的交接建議
class MyHandoffActivity : Activity() {

    ...

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Do stuff
    ...
    // Enable handoff
    setHandoffEnabled(true, null)
  }

  // Override and implement onHandoffActivityDataRequested
  override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
    // Create and return handoff data
  }
}

使用 Jetpack Compose 優先建構自動調整式應用程式

為協助您調整應用程式,以符合 Android 17 的新規定,我們推出了 Jetpack Compose 適應性技能。這項 AI 輔助開發人員工作流程可協助您導入最佳適應性做法:

  • 自動調整導覽:使用 Material 3 自動調整程式庫中的 NavigationSuiteScaffold,在行動裝置的底部導覽列和大螢幕的邊緣錨定導覽軌之間自動轉換。
  • 多窗格版面配置:使用 Navigation 3 場景 (ListDetailSceneStrategySupportingPaneSceneStrategy) 原生實作清單/詳細資料和輔助窗格版面配置,而非脆弱的片段交易。
  • FlexBox 和 Grid API:運用 Compose 1.11 的動態版面配置元件,輕鬆即時調整列和欄的跨度,確保內容一律能完美填滿空間。
  • 進階非觸控輸入:善用 Compose 1.11 的強化觸控板和滑鼠支援功能,包括原生焦點環和新版 API (例如 TrackpadInjectionScopeperformTrackpadInput),輕鬆測試並在 Googlebooks 和電腦模式中提供真正的「筆電級」體驗。
  • 動態視窗狀態:運用 Compose 的反應式狀態模型,在應用程式從全螢幕轉換為浮動應用程式氣泡或互動式電腦版子母畫面視窗時,順暢調整 UI,即使在最小尺寸也能確保優質體驗。

Android 優先採用 Compose

Compose 提供最簡單的方式來建構適應性應用程式,而這只是我們認為所有 Android UI 都應使用 Compose 建構眾多原因之一。為此,Android 開發作業現在以 Compose 為優先。所有新的 Android API、程式庫、工具和開發人員指南,都將專為 Jetpack Compose 建構。舊版 View 元件 (位於 android.widget 套件中) 和以 View 為基礎的 Jetpack 程式庫 (例如 FragmentsRecyclerViewViewPager) 現在處於維護模式。這些元件只會收到重大錯誤修正,不會有新功能。


提示:準備好遷移了嗎?使用 AI 驅動的 XML 到 Compose 遷移技能,自動分析舊版 View 版面配置,並轉換為高度適應性的 Compose 程式碼。


成效與效率

應用程式效能是指流暢的使用者介面、快速的應用程式啟動時間,以及有效率的多工處理;Android 17 在所有這些領域都有顯著的改善。

應用程式記憶體限制

記憶體用量是整體效能的無聲基礎之一。如果前景應用程式或服務未經檢查就成長,記憶體管理就會導致 CPU 和電池用量暴增,最終導致其他運作正常的快取應用程式和背景工作終止,進而強制執行較慢的冷啟動,並損害多工處理能力。

從 Android 17 開始,系統會根據裝置的總 RAM 嚴格限制應用程式記憶體,並突然終止違規程序。為協助您因應這些更嚴格的規定,我們推出以下新功能:

  • R8 最佳化工具:R8 最佳化工具會將類別、方法和欄位縮減為較短的名稱,並移除未使用的程式碼和資源,大幅縮減應用程式的位元碼記憶體用量。請使用完整模式的 R8,並搭配新的 R8 設定分析器,確保應用程式充分運用 R8。
R8 Configuration Analyzer.png
R8 設定分析器
  • Android Studio Panda 中的 LeakCanary: 現在,剖析器已原生整合 LeakCanary,並將其做為專屬工作,與 IDE 和原始碼完全整合。
  • ApplicationExitInfo:如果應用程式因這些限制而終止,ApplicationExitInfo 中的 getDescription() 會傳回「MemoryLimiter:AnonSwap」。
  • 裝置端異常偵測:這是 ProfilingManager 的一部分,您可以利用觸發條件式剖析功能 (使用 TRIGGER_TYPE_ANOMALY),在達到記憶體上限時自動擷取記憶體快照資料。
val profilingManager = applicationContext
   .getSystemService(ProfilingManager::class.java)

val triggers = ArrayList<ProfilingTrigger>().apply {
  add(ProfilingTrigger.Builder(
    ProfilingTrigger.TRIGGER_TYPE_ANOMALY).build())
}
profilingManager.addProfilingTriggers(triggers)

此外,我們也努力在 Google Play 管理中心中,向您顯示更多現場記憶體指標。

分代垃圾收集

Android 17 推出更頻繁、資源用量更少的年輕代集合,適用於 ART 的並行標記壓縮垃圾收集器 (GC)。系統會將短期物件與穩定、長期物件分開,執行頻繁的輕量「年輕代」掃描,而非耗費資源的完整堆積掃描,大幅減少 CPU 用量、耗電量和 UI 延遲。我們的測試顯示,GC 對應用程式執行緒的干擾顯著減少,且最大記憶體常駐集大小 (RSS) 也隨之縮小。此外,透過 Google Play 系統更新,超過 10 億部搭載 Android 12 (API 級別 31) 以上版本的裝置也能享有 ART 改善功能。

無鎖定 MessageQueue

如果應用程式指定 SDK 37 以上版本,核心 android.os.MessageQueue 現在會實作無鎖架構,大幅減少錯過的影格、縮短應用程式啟動時間,並在多執行緒情境中大幅提升忙碌佇列的效能。注意:如果應用程式在私有 MessageQueue 欄位和方法上使用反射,可能會導致應用程式中斷。已將 peekWhenpoll API 新增至 TestLooperManager,以便進行插樁測試,不必依賴 MessageQueue 內部項目。

靜態最終欄位現在確實是最終欄位

從 Android 17 開始,指定 SDK 37 以上版本的應用程式無法修改「static final」欄位,因此執行階段可以更積極地套用效能最佳化措施。如果嘗試透過反射 (或深層反射) 執行這項操作,系統會擲回 IllegalAccessException。

透過 JNI 的 SetStatic<Type>Field 方法系列修改這些方法,會立即導致應用程式當機。

自訂通知檢視限制

為減少記憶體用量,我們進一步限制 自訂通知檢視畫面的大小。這次更新將封鎖應用程式透過 URI 規避現有限制的漏洞。這項行為會受到目標 SDK 版本管制,且適用於指定 API 37 以上版本的應用程式。

隱私權與安全性

維護使用者信任是 Android 生態系統的核心。Android 17 推出強大的功能,可保護機密資料,同時簡化使用者體驗。

隱私權保護選項

過去,應用程式需要廣泛的永久權限,才能存取聯絡人、精確位置資訊和媒體檔案等資訊。Android 17 持續朝向隱私權保護選項發展,只會根據使用者明確選取的資料授予暫時性存取權:

  • 系統層級聯絡人選擇工具:應用程式可利用 ACTION_PICK_CONTACTS,僅要求暫時存取使用者選擇的特定欄位 (例如電子郵件地址或電話號碼),不必取得廣泛的 READ_CONTACTS 權限。此外,這項功能也完全支援工作/個人資料夾分離。
  • 可自訂的相片挑選工具顯示比例:使用 PhotoPickerUiCustomizationParams,即可自訂系統相片挑選工具,以直向模式顯示縮圖。這非常適合一律以直向顯示相片和影片的應用程式,例如以影片為主的社群媒體應用程式。
  • 系統算繪的位置資訊按鈕:您可以將新的系統算繪位置資訊按鈕嵌入應用程式,只在目前工作階段授予精確位置資訊存取權。
  • EyeDropper API:這項新的系統層級 API ACTION_OPEN_EYE_DROPPER 可讓應用程式建立系統輔助的滴管,讓使用者從螢幕上的任何像素選取顏色。這項功能可提供安全且注重隱私的顏色挑選體驗,不必要求廣泛的敏感螢幕截圖或媒體投影權限。
val eyeDropperLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
   if (result.resultCode == Activity.RESULT_OK) {
       val color = result.data?.getIntExtra(Intent.EXTRA_COLOR, Color.BLACK)
       // Use the picked color in your app
   }
}
fun launchColorPicker() {
   val intent = Intent(Intent.ACTION_OPEN_EYE_DROPPER)
   eyeDropperLauncher.launch(intent)
}
Eyedropper Tester.webp
使用系統的滴管工具,從螢幕上的任何位置選取顏色

區域網路存取權

現在,指定 Android 17 的應用程式必須取得 ACCESS_LOCAL_NETWORK 執行階段權限,或使用系統中介的隱私權保護裝置挑選工具,才能進行區域網路通訊,例如與智慧住宅裝置通訊或投放接收器。由於 ACCESS_LOCAL_NETWORK  屬於現有的 NEARBY_DEVICES 權限群組,因此如果使用者已授予其他 NEARBY_DEVICES 權限,系統就不會再次提示。

簡訊動態密碼防護

Android 17 擴大簡訊動態密碼 (OTP) 保護機制,延後三小時才開放存取簡訊:

豁免:預設訊息、助理和連結的隨附應用程式可獲豁免。強烈建議應用程式遷移至 SMS RetrieverSMS User Consent API。

後量子密碼編譯 (PQC)

Android 17 支援新一代密碼編譯安全防護:

  • 金鑰儲存區整合:支援的裝置可在安全硬體中產生 ML-DSA (以模格為基礎的數位簽章演算法) 金鑰,以產生量子安全簽章,並透過標準 JCA API 公開。
  • 混合式 APK 簽署:推出 v3.2 APK 簽署配置,結合傳統簽章和 ML-DSA 簽章,確保應用程式交付安全無虞。

更安全的動態原生程式碼載入

如果您的應用程式指定 SDK 37 以上版本,Android 14 導入的更安全動態程式碼載入 (DCL) 保護機制,現在也適用於原生程式庫的 DEX 和 JAR 檔案。使用 System.load 載入的所有原生檔案都必須標記為唯讀。否則系統會擲回 UnsatisfiedLinkError

更智慧的密碼保護機制,可防範實體輸入

在 Android 17 中,我們預設不會再顯示最後輸入的字元,讓使用者在使用實體鍵盤時,能更安全地輸入密碼、PIN 碼和其他私密資訊。

使用者仍可輕鬆自訂這些顯示設定,以符合個人偏好 (可用性可能因裝置製造商而異)。

Android 內建的 SDK 元件會自動支援這些強化隱私權保護措施,Compose 1.12 則會支援 SecureTextFields

Hide First Letter.gif
更智慧的密碼保護機制,適用於實體輸入

提供媒體和相機功能,協助創作者製作內容並帶給使用者樂趣

Android 17 推出全新創作功能,讓使用者存取專業級相機和媒體,同時提升消費者體驗。

  • Eclipsa 影片:以 SMPTE ST 2094-50 規格為基礎建構的 HDR 影片標準,可導入新中繼資料,協助裝置根據螢幕亮度上限和環境光線條件調整內容,並改善標準和 HDR 內容的同步顯示效果。
  • RAW14 圖像格式:全新支援 RAW14 圖像格式,讓專業相機應用程式從相容的相機感應器擷取最高層級的細節和色深。
  • 廠商定義的攝影機擴充功能:硬體合作夥伴可透過廠商定義的擴充功能,定義及實作自訂攝影機擴充功能模式,進而存取最新且最優質的攝影機功能。
  • 擴充 HE-AAC 軟體編碼器:系統提供全新的擴充 HE-AAC 軟體編碼器,支援使用統一語音和音訊編碼的低位元率和高位元率,在低頻寬環境中提供音質明顯更佳的語音訊息,包括支援響度中繼資料。
  • 多功能影片編碼 (H.266):OEM 可在 MediaFormat 中定義 video/vvc MIME 類型、在 MediaCodecInfo 中新增 VVC 設定檔,並將支援功能整合至 MediaExtractor,藉此新增轉碼器支援功能。
  • 攝影機裝置類型:新的 API 會查詢基礎裝置類型,判斷攝影機是內建硬體、外接 USB 網路攝影機還是虛擬攝影機。
  • 影片錄製的固定畫質:MediaRecorder 中使用 setVideoEncodingQuality,即可為影片編碼器設定固定畫質 (CQ) 模式,確保整部影片的視覺保真度一致。

更完善的助聽器支援

  • 藍牙 LE Audio 助聽器支援:Android 現在為藍牙低功耗 (BLE) 音訊助聽器提供專屬裝置類別,並新增 AudioDeviceInfo.TYPE_BLE_HEARING_AID 常數,因此應用程式可以區分助聽器和一般耳機,為使用輔助聆聽裝置的使用者提供專屬體驗。
  • 精細的助聽器音訊路徑設定:Android 17 可讓使用者獨立管理特定系統音效的播放位置。使用者可以選擇將通知、鈴聲和鬧鐘音效傳送到已連線的助聽器或裝置內建喇叭,避免助聽器管理應用程式維持藍牙連線時,不必要的耳內干擾。

CameraX 和 Media3

CameraXMedia3 已更新為 Android 17 版本,可協助您處理繁重的工作,簡化媒體開發作業,並輕鬆建構可靠的相機拍攝、流暢的媒體播放,以及創意且複雜的編輯體驗。

我們已發布代理程式技能,可將舊版 Android 相機實作 (Camera1 或原始 Camera2 API) 遷移至 CameraX。

注意:您必須將 CameraX 版本更新至 1.5.2 或 1.6.0 以上,才能避免在 Android 17 裝置上因新增動態範圍模式而導致當機。

準備好應用程式、程式庫、工具和遊戲引擎!

如果您開發 Android SDK、程式庫、工具或遊戲引擎,請務必立即準備所有必要更新,以免下游應用程式和遊戲開發人員因相容性問題而無法使用,並確保他們能使用最新的 SDK 功能。如果需要更新才能完全支援 Android 17,請通知下游開發人員。

測試時,請在搭載 Android 17 Beta 4 的裝置或模擬器上,透過 Google Play 或其他方式,安裝使用程式庫或引擎的正式版或測試版應用程式。逐步完成應用程式的所有流程,並找出功能或 UI 問題。每個 Android 版本都包含平台變更,可提升隱私權、安全性和整體使用者體驗。請查看在 Android 17 上執行的以 Android 17 為目標版本的應用程式,瞭解會影響應用程式的行為變更,並將測試重點放在以下項目:

  • 大螢幕上的可調整大小功能: 指定 Android 17 (SDK 37) 後,您就無法再選擇不維持大螢幕上的螢幕方向、可調整大小功能和長寬比限制。
  • 動態程式碼載入:如果您的應用程式指定 SDK 37 以上版本,Android 14 導入的更安全動態程式碼載入 (DCL) 保護機制,現在也適用於原生程式庫,而不僅限於 DEX 和 JAR 檔案。使用 System.load() 載入的所有原生檔案都必須標示為唯讀。否則系統會擲回 UnsatisfiedLinkError。
  • 預設啟用 CT: 憑證透明化 (CT) 預設為啟用。(Android 16 支援 CT,但應用程式必須選擇加入。)
  • 區域網路防護: 如果應用程式指定 SDK 37 以上版本,系統會預設封鎖區域網路存取權。請盡可能改用可保護隱私權的選擇器,並使用新的 ACCESS_LOCAL_NETWORK 權限,取得廣泛的持續存取權。
  • 背景音訊強化:從 Android 17 開始,音訊架構會強制執行背景音訊互動限制,包括音訊播放、音訊焦點要求和音量變更 API。我們根據各位的意見,自 Beta 版 2 推出後進行了一些變更,包括在「使用中」狀態下強制執行 FGS,以及排除鬧鐘音訊。詳情請參閱新版指南
  • NPU 存取權聲明:如果應用程式以 Android 17 為目標,且需要直接存取 NPU,就必須在資訊清單中聲明  FEATURE_NEURAL_PROCESSING_UNIT,以免無法存取 NPU。這包括使用 LiteRT NPU 委派、供應商專屬 SDK,以及已淘汰的 NNAPI 的應用程式。

開始使用 Android 17

如果尚未加入 Android Beta 版計畫,Pixel 裝置應該很快就會收到 Android 17。如果你沒有 Pixel 裝置,可以在 Android Studio 中使用 Android Emulator 的 64 位元系統映像檔。如果你目前使用 Android 17 Beta 版 4.1,且尚未安裝 Android 17 QPR1 Beta 版,可以選擇退出這項計畫,系統會透過無線更新提供 Android 17 發布版本。

在合作夥伴裝置上取得 Android 17 Beta 版

Android 17 Beta 版適用於手機、平板電腦和摺疊式裝置,合作夥伴包括 Honor、iQOO、Lenovo、OnePlus、OPPO、Realme、Sharp、vivo 和 Xiaomi。

android-17-beta-partners.jpg

為獲得最佳 Android 17 開發體驗,建議您使用最新 Canary 版的 Android Studio Quail。設定完成後,請執行下列操作:

再次感謝所有參與 Android 開發人員預覽版和 Beta 版計畫的開發人員。我們很期待看到您的應用程式如何善用 Android 17 的更新內容,並計畫在未來以快速的發布頻率提供更新。

如要瞭解 Android 17 的完整資訊,請造訪 Android 17 開發人員網站

撰寫者:

繼續閱讀