تحديد مشاكل الشبكة وحلّها

يمكن أن يؤثر عدد الزيارات على الشبكة التي ينشئها أحد التطبيقات بشكل كبير في عمر بطارية الجهاز. لتحسين هذه الزيارات، عليك قياسها وتحديد مصدرها. يمكن أن تأتي طلبات الشبكة مباشرةً من إجراء يتّخذه المستخدم، أو من رمز تطبيقك، أو من خادم يتواصل مع تطبيقك.

يوضّح لك هذا الموضوع كيفية تتبُّع حركة بيانات الشبكة وتصنيفها، ويقدّم إرشادات حول تحديد المشاكل وحلّها.

استخدام "أداة تحليل الشبكة" لتتبُّع الطلبات

استخدِم أداة تحليل الشبكة لتتبُّع طلبات الشبكة التي يرسلها تطبيقك. يمكنك مراقبة طريقة نقل تطبيقك للبيانات وتوقيت ذلك، وتحسين الرمز الأساسي بشكل مناسب.



الشكل 1. تتبُّع حركة بيانات الشبكة يشير نمط نقل البيانات عبر الشبكة إلى أنّه يمكن تحسين الكفاءة بشكل كبير من خلال جلب البيانات مسبقًا أو تجميع عمليات التحميل.

من خلال مراقبة معدّل تكرار عمليات نقل البيانات ومقدار البيانات المنقولة أثناء كل عملية اتصال، يمكنك تحديد أجزاء تطبيقك التي يمكن أن تكون أكثر كفاءة في استهلاك البطارية. بشكل عام، ستبحث عن ارتفاعات قصيرة يمكن تأخيرها.

لتحديد سبب الارتفاعات المفاجئة في عمليات النقل بشكل أفضل، تتيح واجهة برمجة التطبيقات Traffic Stats API لك وضع علامة على عمليات نقل البيانات التي تتم من مقبس ضمن سلسلة محددة باستخدام TrafficStats.setThreadStatsTag(). لا يؤدي استدعاء هذه الدالة إلى وضع علامات تلقائيًا على كل الزيارات الخاصة بموضوع معيّن، بل يجب تطبيق العلامات على مآخذ التوصيل.

بعد ضبط علامة سلسلة المحادثات، يمكنك وضع علامة وإزالتها يدويًا على مقابس فردية باستخدام TrafficStats.tagSocket() وTrafficStats.untagSocket(). يتم أيضًا تطبيق علامة إذا تم فتح مقبس على سلسلة المحادثات، أو إذا قبل مقبس خادم اتصالاً.

سيؤدي الوصول المتزامن إلى المقبس نفسه من خلال سلاسل محادثات متعدّدة إلى استخدام أي علامة كان المقبس يتضمّنها عند إرسال حِزم الشبكة أو تلقّيها (وقد تختلف هذه العلامة عن العلامة التي استخدمها المستخدم عند كتابة البيانات أو قراءتها، وذلك بسبب التخزين المؤقت وعمليات إعادة الإرسال).

على سبيل المثال، يمكنك تحديد ثوابت لتمثيل أنواع مختلفة من زيارات الشبكة، كما هو موضّح في نموذج الرمز البرمجي التالي:

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;

يمكنك بعد ذلك وضع علامات على طلبات الشبكة على النحو التالي:

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 علامات تلقائيًا على مآخذ التوصيل استنادًا إلى قيمة TrafficStats.getThreadStatsTag() الحالية. تضيف المكتبة أيضًا علامات إلى مآخذ التوصيل وتزيلها عند إعادة استخدامها من خلال مجموعات keep-alive، كما هو موضّح في نموذج الرمز البرمجي التالي:

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();
    }
}

تحليل أنواع حركة بيانات الشبكة

عند الاطّلاع على حركة بيانات الشبكة التي ينشئها تطبيقك، عليك فهم مصدر هذه الحركة حتى تتمكّن من تحسينها بشكل مناسب. قد يكون النشاط المتكرّر على الشبكة الذي ينشئه تطبيقك مناسبًا تمامًا إذا كان يستجيب لإجراءات المستخدم، ولكنّه غير مناسب على الإطلاق إذا لم يكن تطبيقك يعمل في المقدّمة أو إذا كان الجهاز في جيب أو حقيبة.

تحليل الزيارات التي يبدأها المستخدم

قد يتم تجميع عدد كبير من الزيارات على الشبكة التي يبدأها المستخدمون بشكل فعّال أثناء تنفيذ المستخدم مهمة معيّنة داخل تطبيقك، أو قد يتم توزيعها بشكل غير متساوٍ عندما يطلب المستخدم معلومات إضافية يحتاج تطبيقك إلى الحصول عليها. عند تحليل الزيارات الواردة من الشبكة التي يبدأها المستخدم، يكون هدفك هو البحث عن أنماط الاستخدام المتكرر للشبكة بمرور الوقت ومحاولة تقليل معدل تكرارها من خلال تجميع الطلبات معًا.

إنّ عدم القدرة على التنبؤ بطلبات المستخدمين يجعل من الصعب تحسين هذا النوع من استخدام الشبكة في تطبيقك. بالإضافة إلى ذلك، يتوقّع المستخدمون الحصول على ردود سريعة عندما يستخدمون تطبيقًا بشكل نشط، لذا قد يؤدي تأخير الطلبات لتحسين الكفاءة إلى تجارب سيئة للمستخدمين. بشكل عام، يجب إعطاء الأولوية للاستجابة السريعة لطلب المستخدم على حساب الاستخدام الفعّال للشبكة أثناء تفاعل المستخدم مباشرةً مع تطبيقك.

للحصول على اقتراحات لتحسين عدد الزيارات التي يبدأها المستخدم، راجِع تحسين الطلبات التي يبدأها المستخدم.

تحليل الزيارات التي يبدأها التطبيق

عادةً ما يكون عدد زيارات الشبكة التي يبدأها التطبيق أحد المجالات التي يمكنك فيها إحداث تأثير كبير في الاستخدام الفعّال لنطاق ترددي للشبكة. عند تحليل نشاط الشبكة لتطبيقك، ابحث عن فترات عدم النشاط وحدِّد ما إذا كان يمكن زيادتها. إذا لاحظت أن تطبيقك يطلب الوصول إلى الشبكة بشكل متكرّر، حاوِل تجميع هذه الطلبات في حِزم للسماح لراديو الجهاز بالعودة إلى وضع توفير الطاقة بين فترات النشاط.

للاطّلاع على اقتراحات لتحسين الزيارات التي تبدأها التطبيقات، راجِع تحسين الطلبات التي تبدأها التطبيقات.

تحليل الزيارات التي يبدأها الخادم

عادةً ما يكون نشاط الشبكة الذي تبدأه الخوادم من خلال التواصل مع تطبيقك من المجالات التي يمكنك فيها إحداث تأثير كبير في الاستخدام الفعّال لنطاق تردّد الشبكة. خدمة المراسلة عبر السحابة الإلكترونية من Firebase ‏(FCM) هي آلية بسيطة تُستخدم لنقل البيانات من خادم إلى مثيل تطبيق معيّن. باستخدام "المراسلة عبر السحابة الإلكترونية من Firebase"، يمكن لخادمك إرسال إشعار إلى تطبيقك الذي يعمل على جهاز معيّن بأنّه تتوفّر بيانات جديدة له.

للحصول على اقتراحات لتحسين عدد الزيارات التي يبدأها الخادم، اطّلِع على تحسين الطلبات التي يبدأها الخادم.

استخدام أداة Battery Historian لتصوُّر تأثيرات زيارات الشبكة

Battery Historian هي أداة تعرض بشكل مرئي استهلاك بطارية الجهاز على مدار فترة زمنية. يمكنك استخدام هذه الأداة لتحليل تأثير نشاط الشبكة على استهلاك البطارية. على سبيل المثال، يمكن أن يوضّح لك أداة Battery Historian ما إذا كان تطبيقك يستخدم الراديو الخلوي بوتيرة أكبر من المتوقّع. لمزيد من المعلومات حول استخدام أداة Battery Historian، راجِع مقالة تحديد استخدام البطارية باستخدام أداتَي Batterystats وBattery Historian.