Ağ sorunlarını giderme

Bir uygulamanın oluşturduğu ağ trafiği, cihazın pil ömrü üzerinde önemli bir etkiye sahip olabilir. Bu trafiği optimize etmek için trafiği ölçmeniz ve kaynağını tanımlamanız gerekir. Ağ istekleri doğrudan bir kullanıcı işleminden, kendi uygulama kodunuzdan veya uygulamanızla iletişim kuran bir sunucudan gelebilir.

Bu konu, ağ trafiğinizi nasıl izleyeceğinizi ve sınıflandıracağınızı gösterirken, sorunları tanımlama ve çözme konusunda yol gösterici bilgiler sağlar.

İstekleri izlemek için Network Profiler'ı (Ağ Profil Aracı) kullanma

Uygulamanızın ağ isteklerini izlemek için Network Profiler'ı (Ağ Profil Aracı) kullanın. Uygulamanızın verileri nasıl ve ne zaman aktardığını izleyebilir ve temel kodu uygun şekilde optimize edebilirsiniz.



Şekil 1. Ağ trafiğini izleme. Ağ trafiği kalıbı, isteklerin önceden yüklenmesi veya yüklemelerin paketlenmesiyle verimliliğin önemli ölçüde artırılabileceğini göstermektedir.

Veri aktarımlarınızın sıklığını ve her bağlantı sırasında aktarılan veri miktarını izleyerek uygulamanızda pil tasarrufu yapılabilecek alanları belirleyebilirsiniz. Genellikle gecikmeli olabilecek kısa ani artışlar ararsınız.

Trafik İstatistikleri API'si, aktarım artışlarının nedenini daha iyi belirleyebilmeniz için belirli bir iş parçacığındaki bir yuvadan gerçekleşen veri aktarımlarını TrafficStats.setThreadStatsTag() kullanarak etiketlemenize olanak tanır. Bu işlevin çağrılması, belirli bir iş parçacığı için tüm trafiği otomatik olarak etiketlemez; etiketlerin yuvalara uygulanması gerekir.

İş parçacığı etiketi ayarlandıktan sonra, TrafficStats.tagSocket() ve TrafficStats.untagSocket() kullanarak yuvaları manuel olarak tek tek etiketleyip kaldırabilirsiniz. İş parçacığında bir yuva açılırsa veya bir sunucu soketi bağlantıyı kabul ederse de etiket uygulanır.

Birden fazla iş parçacığı ile aynı yuvaya eşzamanlı erişim, ağ paketleri gönderildiğinde veya alındığında soketin sahip olduğu etiketi kullanır (bu, arabelleğe alma ve yeniden iletme işlemleri nedeniyle kullanıcının verileri yazdığı veya okuduğu zamandan farklı olabilir).

Örneğin, aşağıdaki kod örneğinde gösterildiği gibi farklı ağ trafiği türlerini temsil edecek sabit değerler tanımlayabilirsiniz:

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;

Daha sonra ağ isteklerinizi uygun şekilde etiketleyebilirsiniz:

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 kitaplığı, yuvaları geçerli TrafficStats.getThreadStatsTag() değerine göre otomatik olarak etiketler. Kitaplık, aşağıdaki kod örneğinde gösterildiği gibi keep-alive havuzları ile geri dönüştürüldüğünde yuvaları da etiketler ve etiketleri kaldırır:

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();
    }
}

Ağ trafiği türlerini analiz etme

Uygulamanızın oluşturduğu ağ trafiğine baktığınızda trafiğin kaynağını anlamanız gerekir. Böylece trafiği uygun şekilde optimize edebilirsiniz. Uygulamanız kullanıcı işlemlerine yanıt veriyorsa sık ağ etkinliği olması tamamen uygun olabilir. Ancak uygulamanız ön planda değilse veya cihaz cebinizde ya da çantadaysa kesinlikle uygunsuz olabilir.

Kullanıcı tarafından başlatılan trafiği analiz etme

Kullanıcı tarafından başlatılan ağ trafiği, bir kullanıcı uygulamanızda belirli bir görevi gerçekleştirirken verimli bir şekilde gruplandırılabilir veya uygulamanızın alması gereken ek bilgileri talep ettikçe kullanıcı tarafından eşit olmayan şekilde dağıtılabilir. Kullanıcı tarafından başlatılan ağ trafiğini analiz ederken amacınız, zaman içinde sık ağ kullanımı kalıplarını aramak ve istekleri birlikte gruplandırarak bunların sıklığını azaltmaktır.

Kullanıcı isteklerinin öngörülemez olması, uygulamanızda bu tür ağ kullanımını optimize etmeyi zorlaştırır. Ayrıca, kullanıcılar bir uygulamayı aktif olarak kullandıklarında hızlı yanıtlar beklerler. Bu nedenle, verimlilik isteklerinin geciktirilmesi kötü kullanıcı deneyimlerine yol açabilir. Genel olarak, bir kullanıcı doğrudan uygulamanızla etkileşimde bulunurken ağın verimli kullanımı yerine kullanıcıya hızlı yanıt vermeye öncelik vermelisiniz.

Kullanıcı tarafından başlatılan trafiği optimize etme önerileri için Kullanıcı tarafından başlatılan istekleri optimize etme bölümüne bakın.

Uygulama tarafından başlatılan trafiği analiz etme

Uygulama tarafından başlatılan ağ trafiği, genellikle ağ bant genişliğinin verimli kullanımı üzerinde önemli bir etki yaratabileceğiniz bir alandır. Uygulamanızın ağ etkinliğini analiz ederken, etkin olmama dönemlerine bakın ve bu sürelerin uzatılıp artırılamayacağını belirleyin. Uygulamanızdan tutarlı ağ erişimi kalıpları görürseniz cihaz radyosunun, etkinlik dönemleri arasında tekrar düşük güç moduna geçmesini sağlamak için bu trafiği gruplandırmayı deneyin.

Uygulama tarafından başlatılan trafiği optimize etme önerileri için Uygulama tarafından başlatılan istekleri optimize etme bölümüne bakın.

Sunucu tarafından başlatılan trafiği analiz etme

Uygulamanızla iletişim kuran sunucuların başlattığı ağ etkinliği aynı zamanda genellikle ağ bant genişliğinin verimli kullanımı üzerinde önemli bir etki yaratabileceğiniz bir alandır. Firebase Cloud Messaging (FCM), bir sunucudan belirli bir uygulama örneğine veri iletmek için kullanılan hafif bir mekanizmadır. Sunucunuz FCM'yi kullanarak, belirli bir cihazda çalışan uygulamanıza kendisi için yeni veriler olduğunu bildirebilir.

Sunucu tarafından başlatılan trafiği optimize etme önerileri için Sunucu tarafından başlatılan istekleri optimize etme bölümüne bakın.

Ağ trafiği etkilerini görselleştirmek için Pil Geçmişi'ni kullanma

Pil Geçmişi, bir cihazın belirli bir dönemdeki pil tüketimini görselleştiren bir araçtır. Ağ etkinliğinizin pil tüketimini nasıl etkilediğini analiz etmek için bu aracı kullanabilirsiniz. Örneğin, Pil Geçmişi, uygulamanızın hücresel radyoyu beklediğinizden daha sık kullanıp kullanmadığını gösterebilir. Pil Geçmişi'ni kullanma hakkında daha fazla bilgi için Pil İstatistikleri ve Pil Geçmişi ile profil pil kullanımı bölümüne bakın.