成效管理

管理 Android 裝置的電力和效能,有助於確保應用程式在各種硬體上執行時能維持一致性和流暢度。在 Android 7.0 以上版本中,原始設備製造商 (OEM) 可以實作持續效能提示的支援功能,讓應用程式維持一致的裝置效能,並指定專屬核心,以改善 CPU 密集式前景應用程式的效能。

持續效能

對於長時間執行的應用程式 (遊戲、相機、RenderScript、音訊處理),效能可能會因達到裝置溫度限制而大幅變化,且晶片系統 (SoC) 引擎會受到限制。應用程式開發人員在打造高效能、長時間執行的應用程式時,會受到限制,因為當裝置開始升溫時,基礎平台的功能會變動。

為解決這些限制,Android 7.0 推出了持續效能支援功能,讓原始設備製造商 (OEM) 可針對長時間執行的應用程式提供裝置效能功能提示。應用程式開發人員可以利用這些提示,調整應用程式,讓裝置在長時間內維持可預測且一致的效能。

建築

Android 應用程式可以要求平台進入持續效能模式,讓 Android 裝置在長時間內維持一致的效能。

圖 1. 持續效能模式架構。

實作

如要在 Android 7.0 以上版本維持持續的效能,原始設備製造商必須:

  • 針對電源 HAL 進行裝置專屬變更,以鎖定 CPU/GPU 的最高頻率執行其他最佳化作業,防止熱節流。
  • 在電源 HAL 中實作新的提示 POWER_HINT_SUSTAINED_PERFORMANCE
  • 透過 isSustainedPerformanceModeSupported() API 傳回 TRUE,宣告支援。
  • 實作 Window.setSustainedPerformanceMode

在 Nexus 參考實作中,電源提示會將 CPU 和 GPU 的最高頻率限制在可持續的最高等級。請注意,降低 CPU/GPU 頻率的 MAX 列會降低影格速率,但在這個模式中,由於可持續性較高,因此建議使用較低的速率。舉例來說,使用一般最高時脈的裝置可能能在幾分鐘內以 60 FPS 的速度算繪,但在裝置過熱後,可能會在 30 分鐘內降至 30 FPS。使用持續模式時,裝置可在 30 分鐘內以 45 FPS 的穩定速度算繪。目標是使用模式時的幀率,應與未使用模式時的幀率相同或更高,且隨著時間一致,以免開發人員追逐移動中的目標。

強烈建議您實作持續模式,讓裝置達到最高持續效能,而非只達到通過測試所需的最低值 (例如,選擇不會導致裝置隨時間過熱而降低效能的最高頻率上限)。

注意:實作持續模式時,不必限制 MAX 時脈率。

驗證

原始設備製造商 (OEM) 可以使用 CTS 測試 (Android 7.0 以上版本) 來驗證持續效能 API 的實作方式。這項測試會執行工作負載約 30 分鐘,並比較啟用和未啟用持續模式的效能:

  • 啟用持續模式時,影格速率必須保持相對不變 (測試會評估影格速率隨時間變化的百分比,且變化幅度必須小於 5%)。
  • 啟用持續模式時,影格速率不得低於停用模式後 30 分鐘的影格速率。

此外,您可以使用多項 CPU 和 GPU 密集型工作負載手動測試實作項目,確保裝置在使用 30 分鐘後不會因熱量而降速。在內部測試中,我們使用了遊戲和基準測試應用程式 (例如 gfxbench) 等範例工作負載。

專屬核心

對於 CPU 密集且時間敏感的工作負載,如果其他執行緒搶先執行,就可能會影響是否能準時完成影格。如果應用程式有嚴格的延遲和影格速率要求 (例如音訊或虛擬實境應用程式),使用專屬的 CPU 核心可確保可接受的效能水準。

搭載 Android 7.0 以上版本的裝置現在可以明確為最上層的前景應用程式保留一個核心,進而提升所有前景應用程式的效能,並讓工作量繁重的應用程式更能控管其工作如何在多個 CPU 核心之間分配。

如要在裝置上支援專屬核心:

  • 啟用 cpusets,並設定只包含頂層前景應用程式的 cpuset
  • 請確認一個核心 (這是專屬核心) 是為此 cpuset 的執行緒保留。
  • 實作 getExclusiveCores API,以便傳回專屬核心的核心編號。

如要判斷哪些處理序會在哪些核心上排程,請在執行任何工作負載時使用 systrace,並確認除了頂層前景應用程式以外,其他應用程式都不會在專屬核心上排程使用者空間執行緒。

如要查看 Nexus 6P 的參考實作項目,請參閱 android//device/huawei/angler/power/power.c