Ağ sorunlarını giderme

Bir uygulama tarafından oluşturulan ağ trafiği, cihazın pil ömrünü önemli ölçüde etkileyebilir. 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 izleyeceğiniz ve kategorize edeceğiniz açıklanmakta, ayrıca sorunları tespit etme ve çözme konusunda yol gösterici bilgiler verilmektedir.

İstekleri izlemek için Ağ Profilleyici'yi kullanma

Uygulamanızın ağ isteklerini izlemek için Ağ Profilleyici'yi 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ı, istekleri önceden getirme veya yüklemeleri gruplayarak verimliliğin önemli ölçüde iyileştirilebileceğ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ızda daha fazla pil tasarrufu sağlayabileceğiniz alanları belirleyebilirsiniz. Genellikle geciktirilebilir kısa artışlar ararsınız.

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

Mesaj dizisi etiketi ayarlandıktan sonra TrafficStats.tagSocket() ve TrafficStats.untagSocket() simgesini kullanarak soketlerin etiketini manuel olarak ekleyebilir ve kaldırabilirsiniz. Mesaj dizisinde bir yuva açılırsa veya sunucu yuvası bir bağlantıyı kabul ederse de etiket uygulanır.

Birden fazla iş parçacığı tarafından aynı sokete eşzamanlı erişim sağlandığında, ağ paketleri gönderilirken veya alınırken soketteki etiket kullanılır (bu etiket, arabelleğe alma ve yeniden yayınlama 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 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 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ığı, mevcut TrafficStats.getThreadStatsTag() değerine göre soketleri otomatik olarak etiketler. Kitaplık, aşağıdaki kod örneğinde gösterildiği gibi, soketlerin etkin tutma havuzları aracılığıyla geri dönüştürülmesi sırasında soketlere etiket uygular 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 tarafından oluşturulan ağ trafiğine baktığınızda, trafiği uygun şekilde optimize edebilmek için trafiğin kaynağını anlamanız gerekir. Uygulamanız tarafından oluşturulan 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 bilgileri talep ederken 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 gruplandırarak sıklığı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ı etkin bir şekilde kullanırken hızlı yanıtlar bekler. Bu nedenle, verimlilik için isteklerin geciktirilmesi kötü kullanıcı deneyimlerine neden olabilir. Genel olarak, kullanıcı doğrudan uygulamanızla etkileşimde bulunurken ağa verimli bir şekilde kullanım yerine kullanıcıya hızlı yanıt vermeye öncelik vermelisiniz.

Kullanıcı tarafından başlatılan trafiği optimize etmeyle ilgili öneriler için Kullanıcı tarafından başlatılan istekleri optimize etme başlıklı makaleyi inceleyin.

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, işlem yapılmayan dönemlere bakın ve bu sürelerin artırılıp artırılamayacağını belirleyin. Uygulamanızda tutarlı ağ erişimi kalıpları görüyorsanız cihaz radyosunun farklı etkinlik dönemleri arasında düşük güç moduna geri dönmesine izin vermek için bu trafiği gruplandırmayı deneyin.

Uygulama tarafından başlatılan trafiği optimize etmeyle ilgili öneriler için Uygulama tarafından başlatılan istekleri optimize etme başlıklı makaleyi inceleyin.

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 etki yaratabileceğiniz bir alandır. Firebase Cloud Messaging (FCM), bir sunucudan belirli bir uygulama örneğine veri aktarmak için kullanılan hafif bir mekanizmadır. Sunucunuz, FCM'yi kullanarak belirli bir cihazda çalışan uygulamanızı yeni verilerin kullanılabilir olduğu konusunda bilgilendirebilir.

Sunucu tarafından başlatılan trafiği optimize etmeyle ilgili öneriler için Sunucu tarafından başlatılan istekleri optimize etme başlıklı makaleyi inceleyin.

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

Pil Geçmişi, cihazların belirli bir süre içindeki 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 hücresel radyoyu beklediğinizden daha sık kullanıp kullanmadığını gösterebilir. Pil Geçmiş'i kullanma hakkında daha fazla bilgi edinmek için Pil İstatistikleri ve Pil Geçmişi ile profil pil kullanımı bölümüne bakın.