تست پشتیبان گیری و بازیابی

این صفحه به شما نشان می دهد که چگونه پشتیبان گیری ابری و فرآیند انتقال دستگاه به دستگاه (D2D) را برای برنامه خود آزمایش کنید. مهم است که هر دوی این موارد را با هر نسخه اصلی برنامه خود آزمایش کنید تا اطمینان حاصل شود که کاربران می توانند به استفاده از برنامه شما در دستگاه جدید ادامه دهند. در حالی که پشتیبان‌گیری و انتقال هر دو مشابه هستند، تفاوت‌های مهمی بین این دو در Android 12 (سطح API 31) و بالاتر وجود دارد – به ویژه اینکه انتقال دارای محدودیت حجم داده بسیار بزرگ‌تر 2 گیگابایت است، در مقایسه با 25 مگابایت برای پشتیبان‌گیری ابری.

این راهنما به شما نشان می‌دهد که چگونه می‌توانید پشتیبان‌گیری و بازیابی ابری و انتقال D2D را به طور موثر در طول چرخه توسعه آزمایش کنید.

نحوه عملکرد تست پشتیبان گیری

این بخش بخش‌های مختلف در چارچوب پشتیبان‌گیری Android و نحوه تعامل آنها با برنامه‌هایی را که از پشتیبان‌گیری خودکار و پشتیبان‌گیری با مقدار کلید پشتیبانی می‌کنند، توضیح می‌دهد. در مرحله توسعه برنامه، بیشتر کارهای درونی فریم ورک انتزاعی می شود، بنابراین نیازی به دانستن این اطلاعات ندارید. با این حال، در مرحله آزمایش، درک این مفاهیم اهمیت بیشتری پیدا می کند.

نمودار زیر نحوه جریان داده ها در حین پشتیبان گیری و بازیابی ابری را نشان می دهد. برای اهداف آزمایشی، می توان از همان دستگاه برای پشتیبان گیری و بازیابی ابر استفاده کرد.

جریان داده چارچوب پشتیبان

نمودار زیر نحوه جریان داده ها در طول انتقال D2D را نشان می دهد:

جریان داده چارچوب انتقال

برخلاف آزمایش پشتیبان گیری و بازیابی ابری، آزمایش D2D به یک دستگاه منبع و یک دستگاه هدف برای کپی کردن از و به آن نیاز دارد.

سرویس Backup Manager یک سرویس سیستم اندروید است که عملیات پشتیبان گیری و بازیابی را هماهنگ و آغاز می کند. این سرویس از طریق Backup Manager API قابل دسترسی است.

در طول عملیات پشتیبان‌گیری، سرویس از برنامه شما برای اطلاعات پشتیبان درخواست می‌کند، سپس آن را به انتقال پشتیبان می‌دهد، که سپس داده‌ها را در ابر بایگانی می‌کند. در طی عملیات بازیابی، سرویس Backup Manager داده های پشتیبان را از انتقال پشتیبان بازیابی می کند و داده ها را به دستگاه بازیابی می کند. برای انتقال D2D، سرویس مدیریت پشتیبان از برنامه شما برای اطلاعات پشتیبان پرس و جو می کند و آن را مستقیماً به سرویس مدیریت پشتیبان در دستگاه جدید ارسال می کند، که آن را در برنامه شما بارگیری می کند.

Backup Transports اجزای Android هستند که وظیفه ذخیره و بازیابی اطلاعات برنامه شما را بر عهده دارند. یک دستگاه مجهز به اندروید می‌تواند صفر یا چند بار پشتیبان‌گیری داشته باشد، اما فقط یکی از آن‌ها را می‌توان فعال علامت‌گذاری کرد. به دلیل سفارشی‌سازی‌های تولیدکنندگان دستگاه و ارائه‌دهندگان خدمات، انتقال‌های پشتیبان موجود از دستگاهی به دستگاه دیگر متفاوت است، اما اکثر دستگاه‌های دارای Google Play با موارد زیر ارسال می‌شوند:

  • GMS Transport: انتقال فعال پشتیبان ابری در اکثر دستگاه‌ها، بخشی از خدمات Google Mobile . این انتقال داده ها را در سرویس پشتیبان گیری اندروید ذخیره می کند.
  • D2D Transport: این انتقال در انتقال D2D برای انتقال مستقیم داده ها از یک دستگاه به دستگاه دیگر استفاده می شود.

ابزار

برای آزمایش عملیات پشتیبان گیری و بازیابی، باید کمی در مورد ابزارهای زیر بدانید.

  • adb : برای اجرای دستورات روی دستگاه یا شبیه ساز.
  • bmgr : برای انجام عملیات های مختلف پشتیبان گیری و بازیابی.
  • logcat : برای دیدن خروجی عملیات پشتیبان گیری و بازیابی.

تست پشتیبان گیری ابری

پشتیبان گیری و بازیابی ابری را می توان با استفاده از یک دستگاه و با دنبال کردن مراحل این بخش انجام داد.

دستگاه یا شبیه ساز خود را برای پشتیبان گیری ابری آماده کنید

با بررسی چک لیست زیر، دستگاه یا شبیه ساز خود را برای آزمایش پشتیبان آماده کنید:

  1. برای پشتیبان‌گیری خودکار، بررسی کنید که از دستگاه یا شبیه‌سازی با Android نسخه 6.0 (سطح API 23) یا بالاتر استفاده می‌کنید.
  2. برای پشتیبان‌گیری کلید-مقدار، بررسی کنید که از دستگاه یا شبیه‌سازی دارای Android نسخه ۲.۲ (سطح API 8) یا بالاتر استفاده می‌کنید.
  3. برای آزمایش پشتیبان گیری ابری باید به اینترنت دسترسی داشته باشید.
  4. با یک حساب Google وارد دستگاه شوید و آن را به عنوان حساب پشتیبان در تنظیمات -> Google -> پشتیبان‌گیری تنظیم کنید.

برای آزمایش پشتیبان‌گیری ابری، یک پشتیبان ابری را فعال کنید، سپس برنامه را حذف نصب و دوباره نصب کنید. برای تکرار این مراحل، می‌توانید از اسکریپت زیر، test_cloud_backup.sh استفاده کنید، که از برنامه شما نسخه پشتیبان تهیه می‌کند، APK را به صورت محلی دانلود می‌کند، آن را حذف نصب می‌کند و 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 را آزمایش کنید

جامع ترین راه برای آزمایش انتقال D2D این است که کل محتویات تلفن خود را به یک دستگاه جدید بازنشانی کارخانه ای منتقل کنید و تأیید کنید که درست کار می کند. با این حال، در صورت نیاز به تکرار چندین بار این فرآیند می تواند ناخوشایند و زمان بر باشد. این مراحل به شما نشان می دهد که چگونه یک انتقال را با یک دستگاه بدون انجام مکرر بازنشانی کارخانه ای روی دستگاه شبیه سازی کنید.

دستگاه خود را برای آزمایش D2D آماده کنید

برای آزمایش انتقال D2D روی یک دستگاه، آن را به صورت زیر آماده کنید:

  1. دستگاه شما باید دارای Android 12 (سطح API 31) یا بالاتر باشد.
  2. برای آزمایش آخرین نسخه D2D، Android 12 (سطح API 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 خود را پیاده سازی کرده اید، احتمالاً به این معنی است که هیچ داده یا فایلی را به نسخه پشتیبان اضافه نکرده اید.