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

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

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

از Network Profiler برای نظارت بر درخواست ها استفاده کنید

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



شکل 1. ردیابی ترافیک شبکه. الگوی ترافیک شبکه نشان می‌دهد که کارایی می‌تواند به طور چشمگیری با واکشی درخواست‌ها یا بسته‌بندی آپلودها بهبود یابد.

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

برای شناسایی بهتر علت جهش‌های انتقال، 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() فعلی برچسب گذاری می کند. همانطور که در نمونه کد زیر نشان داده شده است، این کتابخانه همچنین سوکت‌ها را هنگام بازیافت از طریق استخرهای نگهدارنده، برچسب‌گذاری می‌کند و آن را حذف می‌کند:

کاتلین

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 Cloud Messaging (FCM) یک مکانیسم سبک وزن است که برای انتقال داده ها از یک سرور به یک نمونه برنامه خاص استفاده می شود. با استفاده از FCM، سرور شما می‌تواند به برنامه شما که روی دستگاه خاصی اجرا می‌شود اطلاع دهد که داده‌های جدیدی برای آن موجود است.

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

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

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