عیب‌یابی مشکلات شبکه

ترافیک شبکه ایجادشده توسط برنامه می‌تواند تأثیر قابل‌توجهی بر عمر باتری دستگاه داشته باشد. برای بهینه‌سازی آن ترافیک، باید آن را اندازه‌گیری کنید و منبع آن را شناسایی کنید. درخواست‌های شبکه می‌تواند مستقیماً از کنش کاربر، از کد برنامه خودتان، یا از سروری که با برنامه‌تان ارتباط برقرار می‌کند ارسال شود.

این سند به شما نشان می‌دهد که چگونه ترافیک شبکه خود را نظارت و دسته‌بندی کنید و راهنمایی‌هایی برای شناسایی و حل مشکلات ارائه می‌دهد.

از «تحلیل‌گر عملکرد شبکه» برای نظارت بر درخواست‌ها استفاده کنید

از تحلیل‌گر عملکرد شبکه برای ردیابی درخواست‌های شبکه برنامه‌تان استفاده کنید. می‌توانید بر نحوه و زمان انتقال داده توسط برنامه‌تان نظارت کنید و کد اصلی را به‌طور مناسب بهینه‌سازی کنید.


نمای رشته‌ای «تحلیل‌گر عملکرد شبکه» از درخواست‌های شبکه برنامه.
شکل ۱. درحال ردیابی ترافیک شبکه. الگوی ترافیک شبکه نشان می‌دهد که با پیش‌واکشی درخواست‌ها یا دسته‌بندی بارگذاری‌ها، کارایی می‌تواند به‌طور چشمگیری بهبود یابد.

با نظارت بر بسامد انتقال داده و مقدار داده منتقل‌شده درطول هر اتصال، می‌توانید بخش‌هایی از برنامه‌تان را که می‌توانند ازنظر مصرف باتری کارآمدتر شوند شناسایی کنید. به‌طور کلی، شما به‌دنبال جهش‌های کوتاهی خواهید بود که ممکن است با تأخیر رخ دهند.

برای شناسایی بهتر علت جهش‌های انتقال، Traffic Stats API به شما امکان می‌دهد انتقال‌های داده‌ای را که از سوکت در رشته‌ای معین رخ می‌دهد بااستفاده از TrafficStats.setThreadStatsTag() برچسب‌گذاری کنید. فراخوانی این تابع به‌طور خودکار همه ترافیک را برای رشته خاصی برچسب‌گذاری نمی‌کند؛ برچسب‌ها باید روی سوکت‌ها اعمال شوند.

پس‌از تنظیم برچسب رشته، می‌توانید سوکت‌های تکی را به‌صورت دستی برچسب‌گذاری کنید و برچسب آن‌ها را بردارید بااستفاده از TrafficStats.tagSocket() و TrafficStats.untagSocket(). اگر سوکتی در رشته باز شود یا سوکت سرور اتصالی را بپذیرد، برچسبی نیز اعمال می‌شود.

دسترسی هم‌زمان به یک سوکت توسط چند رشته از هر برچسبی که سوکت هنگام ارسال یا دریافت بسته‌های شبکه داشته است استفاده خواهد کرد (که ممکن است به‌دلیل میان‌گیری و ارسال مجدد، با زمانی که کاربر داده را نوشته یا خوانده است متفاوت باشد).

برای مثال، می‌توانید ثابت‌هایی را برای نشان دادن انواع مختلف ترافیک شبکه تعریف کنید، همان‌طور که در نمونه کد زیر نشان داده شده است:

const val USER_INITIATED = 0x1000
const val APP_INITIATED = 0x2000
const val SERVER_INITIATED = 0x3000

سپس می‌توانید درخواست‌های شبکه‌تان را براین‌اساس برچسب‌گذاری کنید:

TrafficStats.setThreadStatsTag(USER_INITIATED)
try {
    TrafficStats.tagSocket(outputSocket)
    try {
        // Transfer data using socket.
    } finally {
        TrafficStats.untagSocket(outputSocket)
    }
} finally {
    TrafficStats.clearThreadStatsTag()
}

کتابخانه HttpURLConnection به‌طور خودکار سوکت‌ها را براساس مقدار فعلی TrafficStats.getThreadStatsTag() برچسب‌گذاری می‌کند. این کتابخانه همچنین سوکت‌ها را هنگام بازیافت ازطریق استخرهای keep-alive برچسب‌گذاری و لغو برچسب‌گذاری می‌کند، همان‌طور که در نمونه کد زیر نشان داده شده است:

class IdentifyTransferSpikeTask {
    @WorkerThread
    fun request(url: String) {
        TrafficStats.setThreadStatsTag(APP_INITIATED)
        try {
            // Make network request using HttpURLConnection.connect().
            val connection = URL(url).openConnection() as HttpURLConnection
            try {
                connection.connect()
                // ...
            } finally {
                connection.disconnect()
            }
        } finally {
            TrafficStats.clearThreadStatsTag()
        }
    }
}

تجزیه‌وتحلیل انواع ترافیک شبکه

وقتی به ترافیک شبکه تولیدشده توسط برنامه‌تان نگاه می‌کنید، باید منبع ترافیک را درک کنید تا بتوانید آن را به‌طور مناسب بهینه‌سازی کنید. فعالیت مکرر شبکه که توسط برنامه شما ایجاد می‌شود ممکن است کاملاً مناسب باشد اگر در پاسخ به کنش‌های کاربر باشد، اما اگر برنامه‌تان در پیش‌زمینه نباشد یا دستگاه در جیب یا کیف باشد، کاملاً نامناسب است.

تجزیه‌وتحلیل ترافیک شروع‌شده توسط کاربر

ترافیک شبکه آغازشده توسط کاربر ممکن است به‌طور مؤثری باهم گروه‌بندی شود درحالی‌که کاربر درحال انجام کار خاصی در برنامه شما است، یا به‌طور نامساوی پخش شود وقتی کاربر اطلاعات بیشتری را درخواست می‌کند که برنامه شما باید دریافت کند. هدف شما در تحلیل ترافیک شبکه آغازشده توسط کاربر، جستجوی الگوهای استفاده مکرر از شبکه درطول زمان و تلاش برای کاهش بسامد آن‌ها با گروه‌بندی درخواست‌ها با یکدیگر است.

غیرقابل‌پیش‌بینی بودن درخواست‌های کاربر، بهینه‌سازی این نوع استفاده از شبکه را در برنامه شما دشوار می‌کند. علاوه‌براین، کاربران هنگام استفاده فعال از برنامه انتظار پاسخ‌های سریع دارند، بنابراین تأخیر در درخواست‌ها برای افزایش کارایی می‌تواند منجر به تجربه کاربری ضعیف شود. به‌طور کلی، وقتی کاربر مستقیماً با برنامه‌تان تعامل برقرار می‌کند، باید پاسخ سریع به کاربر را بر استفاده کارآمد از شبکه اولویت دهید.

برای توصیه‌هایی درباره بهینه‌سازی ترافیک آغازشده توسط کاربر، به بهینه‌سازی درخواست‌های آغازشده توسط کاربر مراجعه کنید.

تحلیل ترافیک شروع‌شده از برنامه

ترافیک شبکه آغازشده توسط برنامه معمولاً حوزه‌ای است که می‌توانید در آن تأثیر قابل‌توجهی بر استفاده کارآمد از پهنای باند شبکه داشته باشید. در تجزیه‌وتحلیل فعالیت شبکه برنامه‌تان، به‌دنبال دوره‌های عدم فعالیت بگردید و تعیین کنید که آیا می‌توان آن‌ها را افزایش داد یا نه. اگر الگوهای دسترسی مداوم به شبکه را از برنامه‌تان مشاهده می‌کنید، سعی کنید این ترافیک را دسته‌بندی کنید تا رادیو دستگاه بتواند بین دوره‌های فعالیت به حالت کم‌مصرف برگردد.

برای توصیه‌هایی درباره بهینه‌سازی ترافیک آغازشده از برنامه، به بهینه‌سازی درخواست‌های آغازشده از برنامه مراجعه کنید.

تجزیه‌وتحلیل ترافیک آغازشده توسط سرور

فعالیت شبکه که توسط سرورهای درحال ارتباط با برنامه شما آغاز می‌شود نیز معمولاً حوزه‌ای است که می‌توانید تأثیر قابل‌توجهی بر استفاده کارآمد از پهنای باند شبکه داشته باشید. پیام‌رسانی ابریِ Firebase (FCM) سازوکاری سبک است که برای انتقال داده از سرور به نمونه برنامه خاصی استفاده می‌شود. بااستفاده از FCM، سرور شما می‌تواند به برنامه‌تان که در دستگاه خاصی اجرا می‌شود اطلاع دهد که داده‌های جدیدی برای آن دردسترس است.

برای توصیه‌هایی درباره بهینه‌سازی ترافیک آغازشده از سرور، به بهینه‌سازی درخواست‌های آغازشده از سرور مراجعه کنید.

استفاده از Battery Historian برای تجسم تأثیرات ترافیک شبکه

Battery Historian ابزاری است که مصرف باتری دستگاه را درطول یک دوره زمانی به‌صورت تصویری نشان می‌دهد. می‌توانید از این ابزار برای تحلیل نحوه تأثیر فعالیت شبکه بر مصرف باتری استفاده کنید. برای مثال، Battery Historian می‌تواند به شما نشان دهد که آیا برنامه‌تان بیشتر از حد انتظار شما از رادیو سلولی استفاده می‌کند یا نه. برای اطلاعات بیشتر درباره استفاده از Battery Historian، به نمایه مصرف باتری با Batterystats و Battery Historian مراجعه کنید.