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

توضّح لك هذه الصفحة كيفية اختبار النُسخ الاحتياطية على السحابة الإلكترونية وعملية نقل البيانات من جهاز إلى جهاز (D2D) لتطبيقك. ومن المهم اختبار كليهما مع كل إصدار رئيسي من تطبيقك للمساعدة في ضمان تمكّن المستخدمين من مواصلة استخدام التطبيق على جهاز جديد. على الرغم من تشابه كل من النسخ الاحتياطي والنقل، هناك اختلافات مهمة بين الاثنين في نظام التشغيل Android 12 (المستوى 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>

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

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

تشير الرسالة التالية في 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 الخاصة بك، يعني ذلك على الأرجح أنّك لم تضِف أي بيانات أو ملفات إلى النسخة الاحتياطية.