應用程式產生的網路流量可能會對裝置的電池續航力造成重大影響。如要將流量最佳化,您必須評估流量並找出來源。網路要求可以直接來自使用者動作、您自己的應用程式程式碼,或是與應用程式通訊的伺服器。
本主題將說明如何監控及分類網路流量,並提供如何找出及解決問題的指引。
使用網路分析儀監控要求
使用網路分析儀追蹤應用程式的網路要求。您可以監控應用程式轉移資料的方式和時機,並適當調整基礎程式碼。
透過監控資料傳輸的頻率,以及每個連線期間的資料傳輸量,您可以找出應用程式中可以提高電池效率的部分。一般來說,您會尋找可延遲的短暫尖峰。
為進一步找出造成移轉尖峰的原因,您可以使用 Traffic Stats API,透過 TrafficStats.setThreadStatsTag()
標記特定執行緒中從 Socket 發生的資料移轉作業。呼叫這個函式不會自動為特定執行緒的所有流量加上標記;標記必須套用至 Socket。
設定執行緒標記後,您可以使用 TrafficStats.tagSocket()
和 TrafficStats.untagSocket()
手動為個別 Socket 加上或移除標記。如果在執行緒上開啟套接字,或伺服器套接字接受連線,也會套用標記。
多個執行緒同時存取同一個通訊端時,將使用通訊端在傳送或接收網路封包時擁有的任何標記 (這可能與使用者寫入或讀取資料時不同,因為緩衝處理和重新傳輸所致)。
舉例來說,您可以定義常數來代表不同類型的網路流量,如以下程式碼範例所示:
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()
值自動標記通訊端。當透過保活叢集回收時,程式庫也會標記和取消標記 Socket,如以下程式碼範例所示:
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 剖析電池用量」。