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 ölçmeniz ve kaynağını belirlemeniz gerekir. Ağ istekleri doğrudan bir kullanıcı işleminden, kendi uygulama kodunuzdan veya uygulamanızla iletişim kuran bir sunucudan gelebilir.

Bu konuda, ağ trafiğinizi nasıl izleyip kategorilere ayıracağınız gösterilmekte ve sorunları belirleyip çözme konusunda rehberlik sunulmaktadır.

İstekleri izlemek için Network Profiler'ı kullanma

Uygulamanızın ağ isteklerini izlemek için Network Profiler'ı 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 deseni, isteklerin önceden getirilmesi veya yüklemelerin paketlenmesiyle verimliliğin önemli ölçüde artırılabileceğini gösteriyor.

Veri aktarımlarınızın sıklığını ve her bağlantı sırasında aktarılan veri miktarını izleyerek uygulamanızın pil verimliliğini artırabileceğiniz alanları belirleyebilirsiniz. Genellikle, ertelenebilecek kısa süreli yoğunluklar ararsınız.

Traffic Stats API, aktarım artışlarının nedenini daha iyi belirlemek için TrafficStats.setThreadStatsTag() kullanarak belirli bir iş parçacığındaki soketten gerçekleşen veri aktarımlarını etiketlemenize olanak tanır. Bu işlevin çağrılması, belirli bir iş parçacığındaki tüm trafiği otomatik olarak etiketlemez. Etiketlerin soketlere uygulanması gerekir.

İleti dizisi etiketi ayarlandıktan sonra, TrafficStats.tagSocket() ve TrafficStats.untagSocket() tuşlarını kullanarak her bir soketi manuel olarak etiketleyebilir ve etiketlerini kaldırabilirsiniz. İş parçacığında bir yuva açılırsa veya bir sunucu yuvası bağlantı kabul ederse de etiket uygulanır.

Aynı sokete birden fazla iş parçacığı tarafından eşzamanlı erişim, ağ paketleri gönderildiğinde veya alındığında soketin sahip olduğu etiketi kullanır (arabelleğe alma ve yeniden iletim 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 eden sabitler 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;

Ardından, ağ isteklerinizi buna göre 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ığı, geçerli TrafficStats.getThreadStatsTag() değerine göre soketleri otomatik olarak etiketler. Kitaplık, aşağıdaki kod örneğinde gösterildiği gibi, etkin kalma havuzları aracılığıyla geri dönüştürüldüğünde soketleri etiketler ve etiketlerini 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ği uygun şekilde optimize edebilmek için trafiğin kaynağını anlamanız gerekir. Uygulamanızın oluşturduğu sık ağ etkinliği, kullanıcı işlemlerine yanıt veriyorsa tamamen uygun olabilir ancak uygulamanız ön planda değilse veya cihaz cepte ya da çantadaysa tamamen uygunsuz olabilir.

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

Kullanıcı tarafından başlatılan ağ trafiği, kullanıcı uygulamanızda belirli bir görevi gerçekleştirirken verimli bir şekilde gruplandırılabilir veya kullanıcı uygulamanızın alması gereken ek bilgiler istediğinde düzensiz bir ş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 bir araya getirerek sıklıklarını azaltmaya çalışmaktı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 kullanırken hızlı yanıtlar bekler. Bu nedenle, verimlilik için istekleri geciktirmek kötü kullanıcı deneyimlerine yol açabilir. Genel olarak, kullanıcı uygulamanızla doğrudan etkileşim kurarken ağın verimli kullanımından ziyade kullanıcıya hızlı yanıt vermeye öncelik vermeniz gerekir.

Kullanıcı tarafından başlatılan trafiği optimize etmeye yönelik öneriler 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 etkiye sahip olabileceğiniz bir alandır. Uygulamanızın ağ etkinliğini analiz ederken etkinlik olmayan dönemleri inceleyin ve bu dönemlerin artırılıp artırılamayacağını belirleyin. Uygulamanızdan tutarlı ağ erişimi kalıpları görüyorsanız cihaz radyosunun etkinlik dönemleri arasında düşük güç moduna geri dönmesine izin vermek için bu trafiği toplu olarak işlemeyi deneyin.

Uygulama tarafından başlatılan trafiği optimize etmeye yönelik öneriler 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 tarafından başlatılan ağ etkinliği de genellikle ağ bant genişliğinin verimli kullanımı üzerinde önemli bir etkiye sahip olabileceğiniz bir alandır. Firebase Cloud Messaging (FCM), bir sunucudan belirli bir uygulama örneğine veri aktarmak için kullanılan basit bir mekanizmadır. FCM'yi kullanarak sunucunuz, belirli bir cihazda çalışan uygulamanıza yeni veriler olduğunu bildirebilir.

Sunucu tarafından başlatılan trafiği optimize etmeye yönelik öneriler 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 Battery Historian'ı kullanma

Battery Historian, bir cihazın belirli bir süre boyunca pil tüketimini görselleştiren bir araçtır. Bu aracı kullanarak ağ etkinliğinizin pil tüketimini nasıl etkilediğini analiz edebilirsiniz. Örneğin, Battery Historian, uygulamanızın telefon radyosunu beklediğinizden daha sık kullanıp kullanmadığını gösterebilir. Battery Historian'ı kullanma hakkında daha fazla bilgi için Batterystats ve Battery Historian ile pil kullanımını profilleme başlıklı makaleyi inceleyin.