ترافیک شبکه تولید شده توسط یک برنامه میتواند تأثیر قابل توجهی بر عمر باتری دستگاه داشته باشد. برای بهینهسازی این ترافیک، باید آن را اندازهگیری و منبع آن را شناسایی کنید. درخواستهای شبکه میتوانند مستقیماً از یک اقدام کاربر، از کد برنامه خودتان یا از سروری که با برنامه شما در ارتباط است، ناشی شوند.
این مبحث به شما نشان میدهد که چگونه ترافیک شبکه خود را نظارت و دستهبندی کنید و راهنماییهایی در مورد شناسایی و حل مشکلات ارائه میدهد.
استفاده از Network Profiler برای نظارت بر درخواستها
از Network Profiler برای ردیابی درخواستهای شبکه برنامه خود استفاده کنید. میتوانید نحوه و زمان انتقال دادهها توسط برنامه خود را رصد کنید و کد زیرین را به طور مناسب بهینه کنید.

شکل ۱. ردیابی ترافیک شبکه. الگوی ترافیک شبکه نشان میدهد که با پیشواکشی درخواستها یا دستهبندی آپلودها، میتوان کارایی را به طرز چشمگیری بهبود بخشید.
با نظارت بر فرکانس انتقال داده و میزان داده منتقل شده در طول هر اتصال، میتوانید بخشهایی از برنامه خود را که میتوانند از نظر مصرف باتری کارآمدتر باشند، شناسایی کنید. به طور کلی، شما به دنبال افزایشهای کوتاه مدت مصرف باتری هستید که بتوان آنها را به تأخیر انداخت.
برای شناسایی بهتر علت افزایش ناگهانی سرعت انتقال، 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 pools، همانطور که در نمونه کد زیر نشان داده شده است، تگگذاری و حذف تگ میکند:
کاتلین
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(); } }
انواع ترافیک شبکه را تجزیه و تحلیل کنید
وقتی به ترافیک شبکه ایجاد شده توسط برنامه خود نگاه میکنید، باید منبع ترافیک را درک کنید تا بتوانید آن را به طور مناسب بهینه کنید. فعالیت مکرر شبکه ایجاد شده توسط برنامه شما ممکن است کاملاً مناسب باشد اگر به اقدامات کاربر پاسخ دهد، اما اگر برنامه شما در پیشزمینه نباشد یا اگر دستگاه در جیب یا کیف باشد، کاملاً نامناسب است.
ترافیک آغاز شده توسط کاربر را تجزیه و تحلیل کنید
ترافیک شبکهای که توسط کاربر ایجاد میشود، ممکن است در حالی که کاربر در حال انجام یک کار خاص در برنامه شما است، به طور مؤثر گروهبندی شود، یا با درخواست اطلاعات اضافی که برنامه شما نیاز به دریافت آن دارد، به طور ناهموار پخش شود. هدف شما در تجزیه و تحلیل ترافیک شبکهای که توسط کاربر ایجاد میشود، جستجوی الگوهای استفاده مکرر از شبکه در طول زمان و تلاش برای کاهش فراوانی آنها با گروهبندی درخواستها است.
غیرقابل پیشبینی بودن درخواستهای کاربر، بهینهسازی این نوع استفاده از شبکه را در برنامه شما چالشبرانگیز میکند. علاوه بر این، کاربران هنگام استفاده فعال از یک برنامه، انتظار پاسخهای سریع دارند، بنابراین تأخیر در درخواستها برای بهرهوری میتواند منجر به تجربه کاربری ضعیف شود. به طور کلی، شما باید در حالی که کاربر مستقیماً با برنامه شما در تعامل است، پاسخ سریع به کاربر را بر استفاده کارآمد از شبکه اولویت دهید.
برای توصیههایی برای بهینهسازی ترافیک آغاز شده توسط کاربر، به «بهینهسازی درخواستهای آغاز شده توسط کاربر» مراجعه کنید.
ترافیک آغاز شده توسط برنامه را تجزیه و تحلیل کنید
ترافیک شبکهای که توسط برنامه شروع میشود، معمولاً حوزهای است که میتوانید تأثیر قابل توجهی بر استفاده کارآمد از پهنای باند شبکه داشته باشید. در تجزیه و تحلیل فعالیت شبکه برنامه خود، به دنبال دورههای عدم فعالیت باشید و تعیین کنید که آیا میتوان آنها را افزایش داد یا خیر. اگر الگوهایی از دسترسی مداوم به شبکه از برنامه خود مشاهده کردید، سعی کنید این ترافیک را دستهبندی کنید تا به رادیو دستگاه اجازه دهید بین دورههای فعالیت به حالت کممصرف برگردد.
برای توصیههایی برای بهینهسازی ترافیک آغاز شده توسط برنامه، به «بهینهسازی درخواستهای آغاز شده توسط برنامه» مراجعه کنید.
ترافیک آغاز شده توسط سرور را تجزیه و تحلیل کنید
فعالیت شبکهای که توسط سرورهایی که با برنامه شما در ارتباط هستند آغاز میشود، معمولاً حوزهای است که میتوانید تأثیر قابل توجهی بر استفاده کارآمد از پهنای باند شبکه داشته باشید. پیامرسانی ابری فایربیس (FCM) یک مکانیسم سبک وزن است که برای انتقال دادهها از یک سرور به یک نمونه برنامه خاص استفاده میشود. با استفاده از FCM، سرور شما میتواند به برنامه شما که روی یک دستگاه خاص در حال اجرا است، اطلاع دهد که دادههای جدیدی برای آن در دسترس است.
برای توصیههایی برای بهینهسازی ترافیک آغاز شده توسط سرور، به «بهینهسازی درخواستهای آغاز شده توسط سرور» مراجعه کنید.
استفاده از Battery Historian برای تجسم اثرات ترافیک شبکه
Battery Historian ابزاری است که مصرف باتری دستگاه را در یک دوره زمانی مشخص، به صورت بصری نمایش میدهد. میتوانید از این ابزار برای تجزیه و تحلیل چگونگی تأثیر فعالیت شبکه خود بر مصرف باتری استفاده کنید. به عنوان مثال، Battery Historian میتواند به شما نشان دهد که آیا برنامه شما بیشتر از آنچه انتظار دارید از رادیوی تلفن همراه استفاده میکند یا خیر. برای اطلاعات بیشتر در مورد استفاده از Battery Historian، به Profile battery usage with Batterystats و Battery Historian مراجعه کنید.