排解網路問題

應用程式產生的網路流量可能會對裝置的電池續航力產生重大影響。如要最佳化這類流量 您必須評估流量並找出來源網路要求可直接透過使用者動作、您自己的應用程式程式碼,或是與應用程式通訊的伺服器直接發出。

本主題說明如何監控與分類網路流量,並提供識別和解決問題的相關指引。

使用網路分析器監控要求

使用網路分析器追蹤應用程式的網路要求。您可以監控應用程式轉移資料的方式和時間點,並適當改進基礎程式碼。



圖1. 追蹤網路流量。網路流量模式顯示,預先擷取要求或組合上傳作業可大幅提升效率。

透過監控資料傳輸頻率,以及每個連線期間的傳輸資料量,您可以找出應用程式的哪些區域可以更節省電池電力。一般而言,您會尋找可能延遲的短暫高峰。

為更準確地找出傳輸流量遽增的原因,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 剖析電池用量」。