應用程式產生的網路流量可能會對裝置的電池續航力產生重大影響。如要最佳化這類流量 您必須評估流量並找出來源網路要求可直接透過使用者動作、您自己的應用程式程式碼,或是與應用程式通訊的伺服器直接發出。
本主題說明如何監控與分類網路流量,並提供識別和解決問題的相關指引。
使用網路分析器監控要求
使用網路分析器追蹤應用程式的網路要求。您可以監控應用程式轉移資料的方式和時間點,並適當改進基礎程式碼。
透過監控資料傳輸頻率,以及每個連線期間的傳輸資料量,您可以找出應用程式的哪些區域可以更節省電池電力。一般而言,您會尋找可能延遲的短暫高峰。
為更準確地找出傳輸流量遽增的原因,Traffic Stats API 可讓您使用 TrafficStats.setThreadStatsTag()
,標記從通訊端在特定執行緒中發生的資料移轉。呼叫此函式並不會自動將特定執行緒的所有流量加上標記;您必須將標記套用至通訊端。
設定執行緒標記後,您可以使用 TrafficStats.tagSocket()
和 TrafficStats.untagSocket()
,手動標記及取消個別通訊端的標記。如果通訊端在執行緒上開啟,或伺服器通訊端接受連線,則也會套用標記。
多個執行緒同時存取相同通訊端時,將使用通訊端傳送或接收網路封包時擁有的任何標記 (可能與使用者寫入或讀取資料的時間不同,因為系統會緩衝和重新傳送作業)。
例如,您可以定義常數來代表不同類型的網路流量,如以下程式碼範例所示:
Kotlin
const val USER_INITIATED = 0x1000 const val APP_INITIATED = 0x2000 const val SERVER_INITIATED = 0x3000
Java
public static final int USER_INITIATED = 0x1000; public static final int APP_INITIATED = 0x2000; public static final int SERVER_INITIATED = 0x3000;
接著,您就可以據此標記聯播網請求:
Kotlin
TrafficStats.setThreadStatsTag(USER_INITIATED) TrafficStats.tagSocket(outputSocket) // Transfer data using socket TrafficStats.untagSocket(outputSocket)
Java
TrafficStats.setThreadStatsTag(USER_INITIATED); TrafficStats.tagSocket(outputSocket); // Transfer data using socket TrafficStats.untagSocket(outputSocket);
HttpURLConnection
程式庫會根據目前的 TrafficStats.getThreadStatsTag()
值自動標記通訊端。透過保持運作集區回收時,程式庫還會標記和取消通訊端,如以下程式碼範例所示:
Kotlin
class IdentifyTransferSpikeTask { @WorkerThread fun request(url: String) { TrafficStats.setThreadStatsTag(APP_INITIATED) // Make network request using HttpURLConnection.connect() ... TrafficStats.clearThreadStatsTag() } }
Java
public class IdentifyTransferSpikeTask { @WorkerThread public void request(String url) { TrafficStats.setThreadStatsTag(APP_INITIATED); // Make network request using HttpURLConnection.connect() ... TrafficStats.clearThreadStatsTag(); } }
分析網路流量類型
查看應用程式產生的網路流量時,您需先瞭解流量來源,才能據此進行最佳化。如果應用程式確實會回應使用者的操作,那麼其產生的頻繁網路活動可能就完全不是問題;但如果應用程式不在前景中,或裝置放在口袋或皮包中,這樣就完全不適合。
分析使用者導致的流量
當使用者在應用程式內執行特定工作時,可將使用者啟動的網路流量有效率地分組,或是在使用者要求應用程式需要取得的額外資訊時不平均分散。要分析使用者導致的網路流量,目的是找出一段時間內頻繁使用網路的模式,並嘗試將要求分組以降低頻率。
由於使用者要求難以預測,要在應用程式中最佳化這類網路使用行為並不容易。此外,使用者的期望是使用應用程式時能快速獲得回應,所以如果您為了提高效率而延後處理他們的要求,可能會導致使用者體驗不佳。一般來說,當使用者與應用程式直接互動時,您應先快速回應使用者,而不是提高網路使用效率。
如需最佳化使用者啟動的流量方面的建議,請參閱「最佳化使用者發起的要求」。
分析應用程式導致的流量
應用程式導致的網路流量通常是一個區域,您在此區域中的設定可能會對網路頻寬的效益造成重大影響。分析應用程式的網路活動時,請尋找無活動的時段,並判斷這些時段是否可以增加。如果您發現應用程式存取網路時的模式一致,請嘗試批次處理這類流量,讓裝置無線電在活動期間切換回低耗電模式。
如需最佳化應用程式啟動的流量最佳化建議,請參閱「最佳化應用程式發起的要求」。
分析伺服器導致的流量
伺服器與應用程式通訊而啟動的網路服務,通常也是可以大幅影響網路頻寬使用效益的區域。Firebase 雲端通訊 (FCM) 是一種輕量的機制,用來將資料從伺服器傳送到特定應用程式執行個體。使用 FCM,您的伺服器就能通知在特定裝置上執行的應用程式有新資料可用。
如需最佳化伺服器啟動的流量方面的建議,請參閱「最佳化伺服器發出的要求」一節。
使用 Battery Historian 視覺化網路流量影響
Battery Historian 這項工具可視覺化呈現裝置在特定期間內的電池用量,您可以使用這項工具來分析網路活動對耗電量的影響。舉例來說,Battery Historian 可以顯示應用程式使用行動無線電的頻率是否高於預期。如要進一步瞭解如何使用 Battery Historian,請參閱「使用 Batterystats 和 Battery Historian 剖析電池用量」。