اختبار عملية "الاحتفاظ بنسخة احتياطية من البيانات واستعادتها"

توضّح لك هذه الصفحة كيفية اختبار عمليات الاحتفاظ بنسخة احتياطية من بيانات تطبيقك في السحابة الإلكترونية وعملية نقل البيانات من جهاز إلى آخر. من المهم اختبار كلتا الميزتين مع كل إصدار أساسي من تطبيقك للمساعدة في ضمان استمرار قدرة المستخدمين على استخدام تطبيقك على جهاز جديد. على الرغم من تشابه ميزتَي الاحتفاظ بنسخة احتياطية من البيانات ونقلها، هناك اختلافات مهمة بينهما في الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) والإصدارات الأحدث، وأهم اختلاف هو أنّ عملية النقل لها حد أقصى لحجم البيانات أكبر بكثير يبلغ 2 غيغابايت مقارنةً بحدود ملف الاحتفاظ بنسخة احتياطية من البيانات في السحابة الإلكترونية التي تبلغ 25 ميغابايت.

يوضّح لك هذا الدليل كيفية اختبار كلّ من ميزتَي الاحتفاظ بنسخة احتياطية من البيانات على السحابة الإلكترونية واستعادتها ونقل البيانات من جهاز إلى آخر بكفاءة طوال دورة التطوير.

آلية عمل اختبار النسخ الاحتياطية

يصف هذا القسم العناصر المختلفة في إطار عمل ميزة "الاحتفاظ بنسخة احتياطية" في Android وكيفية تعاملها مع التطبيقات التي تتيح ميزة "الاحتفاظ بنسخة احتياطية تلقائية" وميزة "الاحتفاظ بنسخة احتياطية من المفاتيح والقيم". خلال مرحلة تطوير التطبيق، يتم تجميع معظم الأعمال الداخلية للإطار العملي، لذا لا تحتاج إلى معرفة هذه المعلومات. ومع ذلك، خلال مرحلة الاختبار، يصبح فهم هذه المفاهيم أكثر أهمية.

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

تدفق بيانات إطار عمل النسخ الاحتياطي

يوضّح المخطّط التالي كيفية تدفّق البيانات أثناء النقل من جهاز إلى آخر:

تدفّق البيانات في إطار عمل النقل

على عكس اختبار الاحتفاظ بنسخة احتياطية من البيانات واستعادتها على السحابة الإلكترونية، يتطلب اختبار النقل المباشر للبيانات جهاز مصدر وجهاز مستهدَف للنسخ منهما وإليهما.

خدمة مدير النسخ الاحتياطي هي خدمة نظام Android تنظم وتبدأ عمليات النسخ الاحتياطي والاستعادة. يمكن الوصول إلى الخدمة من خلال واجهة برمجة التطبيقات Backup Manager.

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

عمليات نقل البيانات الاحتياطية هي مكوّنات Android المسؤولة عن تخزين بيانات تطبيقك واستعادتها. يمكن أن يتضمّن جهاز Android معدّل نقل احتياطيًا واحدًا أو أكثر، ولكن يمكن وضع علامة "نشط" على أحد هذه المعدّلات فقط. تختلف وسائل نقل ملف النسخ الاحتياطي المتاحة من جهاز إلى آخر، وذلك بسبب عمليات التخصيص التي يجريها مصنعو الأجهزة ومقدّمو الخدمات، ولكن معظم الأجهزة المزوّدة بخدمة Google Play تأتي مع وسائل النقل التالية:

  • نقل بيانات خدمات Google للأجهزة الجوّالة: نقل البيانات الاحتياطية النشطة في السحابة الإلكترونية على معظم الأجهزة، وهو جزء من خدمات Google للأجهزة الجوّالة. تخزِّن عملية النقل هذه البيانات في "خدمة الاحتفاظ بنسخة احتياطية من البيانات في جهاز Android".
  • نقل البيانات من جهاز إلى جهاز: يُستخدَم هذا النقل في نقل البيانات من جهاز إلى جهاز مباشرةً.

الأدوات

لاختبار عمليات الاحتفاظ بنسخة احتياطية من البيانات واستعادتها، عليك معرفة بعض المعلومات عن الأدوات التالية.

  • adb: لتشغيل الأوامر على الجهاز أو المحاكي
  • bmgr: لإجراء عمليات مختلفة للنسخ الاحتياطي والاستعادة
  • logcat: للاطّلاع على نتائج عمليات الاحتفاظ بنسخة احتياطية والاستعادة

اختبار ميزة "الاحتفاظ بنسخة احتياطية على السحابة الإلكترونية"

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

تحضير جهازك أو المحاكي للاحتفاظ بنسخ احتياطية على السحابة الإلكترونية

حضِّر جهازك أو المحاكي لاختبار النسخة الاحتياطية من خلال تنفيذ الخطوات الواردة في قائمة التحقّق التالية:

  1. لاستخدام ميزة "الاحتفاظ بنسخة احتياطية تلقائية"، تأكَّد من أنّك تستخدم جهازًا أو محاكيًا يعملان بالإصدار 6.0 من Android (المستوى 23 من واجهة برمجة التطبيقات) أو إصدار أحدث.
  2. بالنسبة إلى الاحتفاظ بنسخة احتياطية من مفاتيح القيمة، تأكَّد من أنّك تستخدم جهازًا أو محاكيًا يعملان بالإصدار Android 2.2 (المستوى 8 لواجهة برمجة التطبيقات) أو إصدار أحدث.
  3. يجب أن يكون لديك اتصال بالإنترنت لاختبار ميزة "الاحتفاظ بنسخة احتياطية في السحابة الإلكترونية".
  4. سجِّل الدخول إلى الجهاز باستخدام حساب Google واضبطه كحساب احتياطي في الإعدادات -> Google -> الاحتفاظ بنسخة احتياطية.

لاختبار ميزة "الاحتفاظ بنسخة احتياطية في السحابة الإلكترونية"، يمكنك تفعيلها، ثم إلغاء تثبيت التطبيق وإعادة تثبيته. لتكرار هذه الخطوات، يمكنك استخدام النص البرمجي التالي، وهو test_cloud_backup.sh، الذي يحتفظ بنسخة احتياطية من تطبيقك، وينزِّل حزمة APK على الجهاز، ويُلغي تثبيتها، ثم يُعيد تثبيتها:

#!/bin/bash -eu
: "${1?"Usage: $0 package name"}"

# Initialize and create a backup
adb shell bmgr enable true
adb shell bmgr transport com.android.localtransport/.LocalTransport | grep -q "Selected transport" || (echo "Error: error selecting local transport"; exit 1)
adb shell settings put secure backup_local_transport_parameters 'is_encrypted=true'
adb shell bmgr backupnow "$1" | grep -F "Package $1 with result: Success" || (echo "Backup failed"; exit 1)

# Uninstall and reinstall the app to clear the data and trigger a restore
apk_path_list=$(adb shell pm path "$1")
OIFS=$IFS
IFS=$'\n'
apk_number=0
for apk_line in $apk_path_list
do
    (( ++apk_number ))
    apk_path=${apk_line:8:1000}
    adb pull "$apk_path" "myapk${apk_number}.apk"
done
IFS=$OIFS
adb shell pm uninstall --user 0 "$1"
apks=$(seq -f 'myapk%.f.apk' 1 $apk_number)
adb install-multiple -t --user 0 $apks

# Clean up
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
rm $apks

echo "Done"

خطوات الاختبار

  1. افتح تطبيقك وسجِّل الدخول وعدِّل جميع الإعدادات.
  2. شغِّل النص البرمجي مع تضمين اسم الحزمة، مثل test_cloud_backup.sh com.example.myapp
  3. أعِد فتح التطبيق وتأكَّد من أنّه يعمل بشكل صحيح مع الاحتفاظ بجميع البيانات.

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

اختبار نقل البيانات من جهاز إلى آخر

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

تحضير جهازك لاختبار D2D

لاختبار نقل البيانات من جهاز إلى آخر على جهاز واحد، عليك تحضيره على النحو التالي:

  1. يجب أن يعمل جهازك بالإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) أو إصدار أحدث.
  2. لاختبار أحدث إصدار من البيانات من D2D، استهدِف الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث في تطبيقك.
  3. أنشئ النص البرمجي التالي، test_d2d.sh، للسماح بإعادة إجراء الاختبار:
#!/bin/bash -eu
: "${1?"Usage: $0 package name"}"

# Initialize and create a backup
adb shell bmgr enable true
adb shell settings put secure backup_enable_d2d_test_mode 1
adb shell bmgr transport com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell bmgr init com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell bmgr list transports | grep -q -F "  * com.google.android.gms/.backup.migrate.service.D2dTransport" || (echo "Failed to select and initialize backup transport"; exit 1)
adb shell bmgr backupnow "$1" | grep -F "Package $1 with result: Success" || (echo "Backup failed"; exit 1)

# Uninstall and reinstall the app to clear the data and trigger a restore
apk_path_list=$(adb shell pm path "$1")
OIFS=$IFS
IFS=$'\n'
apk_number=0
for apk_line in $apk_path_list
do
    (( ++apk_number ))
    apk_path=${apk_line:8:1000}
    adb pull "$apk_path" "myapk${apk_number}.apk"
done
IFS=$OIFS
adb shell pm uninstall --user 0 "$1"
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
apks=$(seq -f 'myapk%.f.apk' 1 $apk_number)
adb install-multiple -t --user 0 $apks

# Clean up
adb shell bmgr init com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell settings put secure backup_enable_d2d_test_mode 0
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
rm $apks

echo "Done"

خطوات الاختبار

  1. ثبِّت التطبيق الذي تريد اختباره على الجهاز.
  2. افتح تطبيقك وسجِّل الدخول وغيِّر إعدادات تطبيقك.
  3. شغِّل النص البرمجي على جهازك مع تضمين اسم الحزمة، مثل test_d2d.sh com.example.myapp.
  4. عند اكتمال النص البرمجي، افتح التطبيق على الجهاز وتحقق مما إذا كان يعمل بشكل صحيح مع الاحتفاظ بجميع البيانات.

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

تحديد وحلّ المشاكل المتعلّقة بالاحتفاظ بنسخة احتياطية واستعادتها

يساعدك هذا القسم في تحديد بعض المشاكل الشائعة وحلّها.

تم تجاوز الحصة المسموح بها للنقل

تشير الرسائل التالية في Logcat إلى أنّ تطبيقك تجاوز الحصة المسموح بها لنقل البيانات:

I/PFTBT: Transport rejected backup of <PACKAGE>, skipping

--- or ---

I/PFTBT: Transport quota exceeded for package: <PACKAGE>

عليك تقليل مقدار البيانات الاحتياطية وإعادة المحاولة. على سبيل المثال، تأكَّد من أنّك تخزّن البيانات مؤقتًا في دليل ذاكرة التخزين المؤقت لتطبيقك، لأنّ دليل ذاكرة التخزين المؤقت غير مضمّن في النُسخ الاحتياطية.

الاحتفاظ بنسخة احتياطية كاملة غير ممكن

تشير الرسالة التالية في Logcat إلى تعذُّر عملية الاحتفاظ بنسخة احتياطية كاملة لأنّه لم يتم إجراء عملية الاحتفاظ بنسخة احتياطية من المفاتيح والقيم على الجهاز بعد:

I/BackupManagerService: Full backup not currently possible -- key/value backup
not yet run?

يمكنك بدء عملية احتياطية للمفتاح والقيمة باستخدام الأمر bmgr run، ثم إعادة المحاولة.

انتهاء مهلة الانتظار إلى أن يصل موظّف الدعم

تشير الرسالة التالية في Logcat إلى أنّ تطبيقك يستغرق أكثر من 10 ثوانٍ لبدء عملية الاحتفاظ بنسخة احتياطية:

12-05 18:59:02.033  1910  2251 D BackupManagerService:
    awaiting agent for ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Timeout waiting for agent ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Can't find backup agent for com.your.app.package

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

حساب احتياطي غير مهيأ

تشير الرسائل التالية في Logcat إلى إيقاف عملية الاحتفاظ بنسخة احتياطية بسبب عدم إعداد مجموعة بيانات النسخ الاحتياطي:

01-31 14:32:45.698 17280 17292 I Backup: [GmsBackupTransport] Try to backup for
an uninitialized backup account.
01-31 14:32:45.699  1043 18255 W PFTBT: Transport failed; aborting backup: -1001
01-31 14:32:45.699  1043 18255 I PFTBT: Full backup completed with status: -1000

شغِّل المدير الاحتياطي باستخدام الأمر adb shell bmgr run، ثم حاول تنفيذ النسخ الاحتياطي مرة أخرى.

طُرق التطبيق غير مُستدعاة

بما أنّ ميزة "الاحتفاظ بنسخة احتياطية تلقائية" تبدأ تطبيقك باستخدام فئة أساسية من Application، قد لا يتم استدعاء طُرق إعداد تطبيقك. لا يبدأ ميزة "النسخ التلقائي" أيًا من أنشطة تطبيقك، لذلك قد تظهر لك أخطاء إذا كان تطبيقك يُجري عملية الإعداد في نشاط معيّن. للاطّلاع على معلومات إضافية، يُرجى الاطّلاع على مقالة Implement BackupAgent.

في المقابل، يؤدي الاحتفاظ بنسخة احتياطية من المفاتيح والقيم إلى تشغيل تطبيقك باستخدام أي Application فئة فرعية تحدّدها في ملف بيان التطبيق.

ما مِن بيانات للاحتفاظ بنسخة احتياطية منها

تشير الرسائل التالية في Logcat إلى أنّ تطبيقك لا يحتوي على بيانات للاحتفاظ بنسخة احتياطية منها:

I Backup  : [FullBackupSession] Package com.your.app.package doesn't have any backup data.

--- or ---

I Backup  : [D2dTransport] Package com.your.app.package doesn't have any backup data.

إذا نفّذت عملية النسخ الاحتياطي بنفسك BackupAgent، يعني ذلك على الأرجح أنّك لم تضِف أي بيانات أو ملفات إلى النسخة الاحتياطية.