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

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

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

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

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



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

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

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

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

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

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

کاتلین

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

جاوا

public static final int USER_INITIATED = 0x1000;
public static final int APP_INITIATED = 0x2000;
public static final int SERVER_INITIATED = 0x3000;

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

کاتلین

TrafficStats.setThreadStatsTag(USER_INITIATED)
TrafficStats.tagSocket(outputSocket)
// Transfer data using socket
TrafficStats.untagSocket(outputSocket)

جاوا

TrafficStats.setThreadStatsTag(USER_INITIATED);
TrafficStats.tagSocket(outputSocket);
// Transfer data using socket
TrafficStats.untagSocket(outputSocket);

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

کاتلین

class IdentifyTransferSpikeTask {
    @WorkerThread
    fun request(url: String) {
        TrafficStats.setThreadStatsTag(APP_INITIATED)
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag()
    }
}

جاوا

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 مراجعه کنید.