Android 17 今天正式推出 Beta 3 版,達到平台穩定性。這表示 API 介面已鎖定,您可以執行最終相容性測試,並將指定 Android 17 的應用程式推送至 Play 商店。此外,Beta 3 還提供許多新功能,協助您建構更優質、更安全且高度整合的應用程式。
請做好萬全準備,讓應用程式、程式庫、工具和遊戲引擎可搭配 Android 15 運作!
如果您開發的是 SDK、程式庫、工具或遊戲引擎,現在更應著手準備必要更新,以免下游應用程式和遊戲開發人員因相容性問題而受阻,並讓他們能使用最新的 SDK 功能。如果需要更新才能完整支援 Android 17,請通知下游開發人員。
測試時,請在搭載 Android 17 Beta 3 的裝置或模擬器上,透過 Google Play 或其他方式安裝正式版應用程式,或使用程式庫/引擎的測試應用程式。請逐步完成應用程式的所有流程,並確認是否有功能或 UI 問題。請查看行為變更,以便集中測試。每個 Android 版本都會對平台進行變更,以改善隱私權、安全性和整體使用者體驗,而這些變更可能會影響您的應用程式。以下是需要留意的幾項異動:
- 大螢幕的大小調整功能:指定 Android 17 後,您就無法選擇不維持大螢幕的螢幕方向、大小調整和顯示比例限制。
- 動態程式碼載入:如果應用程式指定 Android 17 以上版本,則 Android 14 針對 DEX 和 JAR 檔案推出的更安全動態程式碼載入 (DCL) 保護措施,現在也適用於原生程式庫。使用 System.load() 載入的所有原生檔案都必須標示為唯讀。否則系統會擲回 UnsatisfiedLinkError。
- 預設啟用 CT:憑證透明化 (CT) 預設為啟用。(在 Android 16 中,CT 可用,但應用程式必須選擇加入)。
- 區域網路保護措施:根據預設,指定 Android 17 以上版本的應用程式無法存取區域網路。建議盡可能改用隱私權保護挑選器,並使用新的 ACCESS_LOCAL_NETWORK 權限,取得廣泛且永久的存取權。
媒體和相機強化功能
相片挑選工具自訂選項
Android 現在可讓您自訂相片挑選工具的視覺呈現方式,更符合應用程式的使用者介面。只要使用新的 PhotoPickerUiCustomizationParams API,就能將格狀檢視畫面的顯示比例,從標準的 1:1 正方形,修改為 9:16 直向顯示。這項彈性也適用於 ACTION_PICK_IMAGES 意圖和內嵌相片挑選工具,讓您在使用者與媒體互動時,維持一致的美感。
我們致力讓 Android 隱私權保護相片挑選工具完美融入應用程式體驗。進一步瞭解如何將相片挑選工具直接嵌入應用程式,提供最原生的體驗。
val params = PhotoPickerUiCustomizationParams.Builder()
.setAspectRatio(PhotoPickerUiCustomizationParams.ASPECT_RATIO_PORTRAIT_9_16)
.build()
val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
putExtra(MediaStore.EXTRA_PICK_IMAGES_UI_CUSTOMIZATION_PARAMS, params)
}
startActivityForResult(intent, REQUEST_CODE)支援 RAW14 圖片格式: Android 17 透過新的 ImageFormat.RAW14 常數,支援 RAW14 圖片格式,這是高階數位攝影的業界標準。RAW14 是單一通道、每像素 14 位元的格式,採用密集封裝版面配置,每四個連續像素會封裝成七個位元組。
供應商定義的相機擴充功能:Android 17 新增供應商定義的擴充功能,讓硬體合作夥伴定義及實作自訂相機擴充功能模式,提供最新、最優質的相機功能,例如「超高解析度」或先進的 AI 強化功能。您可以使用 isExtensionSupported(int) API 查詢這些模式。
相機裝置類型 API:Android 17 新增 API,可查詢基礎裝置類型,判斷相機是內建硬體、外接 USB 網路攝影機,還是虛擬相機。
支援藍牙 LE Audio 助聽器
Android 現在包含藍牙低功耗 (BLE) 音訊助聽器的特定裝置類別。新增 AudioDeviceInfo.TYPE_BLE_HEARING_AID 常數後,應用程式現在可以區分助聽器和一般耳機。
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
val isHearingAidConnected = devices.any { it.type == AudioDeviceInfo.TYPE_BLE_HEARING_AID }助聽器音訊播放位置精細設定
Android 17 允許使用者獨立管理特定系統音效的播放位置。使用者可以選擇將通知、鈴聲和鬧鐘轉送至已連結的助聽器或裝置內建喇叭。
Extended HE-AAC 軟體編碼器
Android 17 推出系統提供的 Extended HE-AAC 軟體編碼器。這款編碼器採用統一語音和音訊編碼,支援低和高位元率。您可以使用 c2.android.xheaac.encoder 名稱,或查詢 audio/mp4a-latm MIME 類型,透過 MediaCodec API 存取這個編碼器。
val encoder = MediaCodec.createByCodecName("c2.android.xheaac.encoder")
val format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 48000, 1)
format.setInteger(MediaFormat.KEY_BIT_RATE, 24000)
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectXHE)
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)效能和電池強化
透過監聽器支援閒置時允許的鬧鐘,減少 Wake Lock
Android 17 推出 AlarmManager.setExactAndAllowWhileIdle 的新變化版本,可接受 OnAlarmListener,而非 PendingIntent。這個新的回呼機制非常適合目前依賴持續喚醒鎖定執行週期性工作的應用程式,例如維護通訊端連線的訊息應用程式。
val alarmManager = getSystemService(AlarmManager::class.java)
val listener = AlarmManager.OnAlarmListener {
// Do work here
}
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 60000,
listener,
null
)隱私權更新
系統提供的位置資訊按鈕
Android 即將推出系統算繪的位置資訊按鈕,您可以使用 Android Jetpack 程式庫,直接將按鈕嵌入應用程式版面配置。使用者輕觸這個系統按鈕後,應用程式就會取得精確位置存取權,但僅限目前工作階段。如要導入這項功能,您必須宣告 USE_LOCATION_BUTTON 權限。
觸控和實體鍵盤的密碼顯示設定各自獨立
這項功能會將現有的「顯示密碼」系統設定,拆分為兩種不同的使用者偏好設定:一種用於觸控輸入,另一種用於實體 (硬體) 鍵盤輸入。現在,透過實體鍵盤輸入的字元預設會立即隱藏。
val isPhysical = event.source and InputDevice.SOURCE_KEYBOARD == InputDevice.SOURCE_KEYBOARD val shouldShow = android.text.ShowSecretsSetting.shouldShowPassword(context, isPhysical)
安全性
強制執行唯讀動態程式碼載入
為提升安全性,防範程式碼注入式攻擊,Android 現在強制規定動態載入的原生資料庫必須為唯讀。如果應用程式指定 Android 17 以上版本,則使用 System.load() 載入的所有原生檔案都必須預先標示為唯讀。
val libraryFile = File(context.filesDir, "my_native_lib.so") // Mark the file as read-only before loading to comply with Android 17+ security requirements libraryFile.setReadOnly() System.load(libraryFile.absolutePath)
後量子密碼編譯 (PQC) 混合 APK 簽署
為因應未來量子運算的發展,Android 將透過新的 v3.2 APK 簽署配置,支援後量子密碼編譯 (PQC)。這個配置採用混合式做法,結合傳統簽章與 ML-DSA 簽章。
使用者體驗和系統 UI
更完善支援外接螢幕上的小工具
這項功能可改善應用程式小工具的視覺一致性,在連接或外接螢幕上顯示時,會使用 DP 或 SP 單位,因應不同的像素密度。
val options = appWidgetManager.getAppWidgetOptions(appWidgetId) val displayId = options.getInt(AppWidgetManager.OPTION_APPWIDGET_DISPLAY_ID) val remoteViews = RemoteViews(context.packageName, R.layout.widget_layout) remoteViews.setViewPadding( R.id.container, 16f, 8f, 16f, 8f, TypedValue.COMPLEX_UNIT_DIP )
主畫面上的隱藏應用程式標籤
Android 現在提供使用者設定,可隱藏主畫面工作區的應用程式名稱 (標籤)。確保應用程式圖示獨特且容易辨識。
電腦版互動式子母畫面
與傳統子母畫面不同,這些固定視窗在電腦模式下,會一直顯示在其他應用程式視窗上方,且仍可互動。
val appTask: ActivityManager.AppTask = activity.getSystemService(ActivityManager::class.java).appTasks[0]
appTask.requestWindowingLayer(
ActivityManager.AppTask.WINDOWING_LAYER_PINNED,
context.mainExecutor,
object : OutcomeReceiver<Int, Exception> {
override fun onResult(result: Int) {
if (result == ActivityManager.AppTask.WINDOWING_LAYER_REQUEST_GRANTED) {
// Task successfully moved to pinned layer
}
}
override fun onError(error: Exception) {}
}
)重新設計的螢幕錄影工具列
核心功能
VPN 應用程式排除設定
使用新的 ACTION_VPN_APP_EXCLUSION_SETTINGS 意圖,應用程式可以啟動系統管理的「設定」畫面,讓使用者選取要略過 VPN 通道的應用程式。
val intent = Intent(Settings.ACTION_VPN_APP_EXCLUSION_SETTINGS)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}OpenJDK 25 和 21 API 更新
本次更新帶來 OpenJDK 21 和 OpenJDK 25 的多項功能和改善項目,包括最新的 Unicode 支援,以及 TLS 命名群組的強化 SSL 支援。
開始使用 Android 17
您可以註冊任何支援的 Pixel 裝置,或在 Android Emulator 中使用 64 位元系統映像檔。
- 請根據新的 SDK 進行編譯,並在意見回饋頁面回報問題。
- 測試現有應用程式的相容性,瞭解應用程式是否會受到 Android 17 變更影響。
如要瞭解詳情,請前往 Android 17 開發人員網站。
-
產品最新消息今天,我們將發布 Android 17,並在多數支援的 Pixel 裝置上推出。未來幾個月,搭載 Android 17 的新裝置將陸續上市。
Matthew McCullough • 閱讀時間:13 分鐘 -
產品最新消息今天,我們在 Android 開發人員高峰會上宣布,將廣泛提供多項工具和 API,旨在消除日常摩擦,讓您更靈活地建構出色的 Android 應用程式。
Matthew McCullough • 閱讀時間:4 分鐘 -
產品最新消息今天,我們發布了第一組長程任務 (LHT),這些任務非常複雜,工程師需要多天甚至一週才能完成。我們也將推出代理評估功能,首先會從相應模型供應商的代理開始。
Matthew McCullough • 閱讀時間:3 分鐘
每週透過電子郵件接收 Android 開發人員的最新深入分析。