ทดสอบการสำรองและกู้คืนข้อมูล

หน้านี้จะแสดงวิธีทดสอบการสำรองข้อมูลบนระบบคลาวด์และกระบวนการโอนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง (D2D) สำหรับแอปของคุณ คุณควรทดสอบทั้ง 2 กระบวนการนี้กับแอปรุ่นหลักแต่ละรุ่นเพื่อช่วยดูแลให้ผู้ใช้สามารถใช้แอปของคุณในอุปกรณ์เครื่องใหม่ได้ต่อไป แม้ว่าการสำรองข้อมูลและการโอนจะคล้ายกัน แต่ก็มีความแตกต่างที่สำคัญระหว่างการสำรองข้อมูลและการโอนใน Android 12 (API ระดับ 31) ขึ้นไป โดยเฉพาะอย่างยิ่งการโอนมีขีดจำกัดขนาดข้อมูลที่ใหญ่กว่ามากถึง 2 GB เมื่อเทียบกับการสำรองข้อมูลบนระบบคลาวด์ที่มีขีดจำกัดขนาดข้อมูล 25 MB

คู่มือนี้จะแสดงวิธีทดสอบทั้งการสำรองและกู้คืนข้อมูลบนระบบคลาวด์ รวมถึงการโอน D2D อย่างมีประสิทธิภาพตลอดวงจรการพัฒนา

วิธีการทำงานของการทดสอบการสำรองข้อมูล

ส่วนนี้จะอธิบายส่วนต่างๆ ในเฟรมเวิร์กการสำรองข้อมูล Android และวิธีโต้ตอบกับแอปที่รองรับการสำรองข้อมูลอัตโนมัติและการสำรองข้อมูลคีย์-ค่า ในระหว่างระยะการพัฒนาแอป การทำงานภายในส่วนใหญ่ของเฟรมเวิร์กจะแยกออกมา คุณจึงไม่จำเป็นต้องทราบข้อมูลนี้ อย่างไรก็ตาม ในช่วงการทดสอบ ความเข้าใจในแนวคิดเหล่านี้จะยิ่งมีความสำคัญมากขึ้น

แผนภาพต่อไปนี้แสดงการไหลของข้อมูลระหว่างการสำรองและกู้คืนข้อมูลในระบบคลาวด์ คุณสามารถสำรองและกู้คืนข้อมูลในระบบคลาวด์จากอุปกรณ์เครื่องเดียวกันได้เพื่อวัตถุประสงค์ในการทดสอบ

ขั้นตอนการส่งข้อมูลของเฟรมเวิร์กการสำรองข้อมูล

แผนภาพต่อไปนี้แสดงการไหลของข้อมูลระหว่างการโอน D2D

โฟลว์ข้อมูลของเฟรมเวิร์กการโอน

การทดสอบ D2D ต้องใช้อุปกรณ์ต้นทางและอุปกรณ์ปลายทางเพื่อคัดลอกข้อมูลไปมา ซึ่งแตกต่างจากการทดสอบการสำรองข้อมูลและกู้คืนในระบบคลาวด์

บริการจัดการข้อมูลสำรองคือบริการระบบ Android ที่ประสานงานและเริ่มการดำเนินการสำรองและกู้คืนข้อมูล บริการนี้เข้าถึงได้ผ่าน Backup Manager API

ระหว่างการดำเนินการสำรองข้อมูล บริการจะค้นหาข้อมูลสำรองจากแอป จากนั้นส่งข้อมูลไปยังตัวขนส่งข้อมูลสำรอง ซึ่งจะเก็บถาวรข้อมูลไปยังระบบคลาวด์ ในระหว่างการดำเนินการกู้คืน บริการจัดการข้อมูลสำรองจะดึงข้อมูลสำรองจากตัวขนส่งข้อมูลสำรองและกู้คืนข้อมูลไปยังอุปกรณ์ สำหรับการโอน D2D บริการจัดการข้อมูลสำรองจะค้นหาข้อมูลสำรองจากแอปของคุณและส่งไปยังบริการจัดการข้อมูลสำรองในอุปกรณ์เครื่องใหม่โดยตรง ซึ่งจะโหลดข้อมูลดังกล่าวลงในแอป

การส่งข้อมูลสำรองคือคอมโพเนนต์ของ Android ที่รับผิดชอบในการจัดเก็บและเรียกข้อมูลแอป อุปกรณ์ที่ใช้ระบบ Android อาจมีพาหนะสำรอง 0 พาหนะหรือมีมากกว่า 1 พาหนะ แต่จะทำเครื่องหมายการขนส่งเหล่านั้นได้เพียง 1 ประเภทเท่านั้น ผู้ให้บริการสำรองข้อมูลที่ใช้ได้จะแตกต่างกันไปในแต่ละอุปกรณ์เนื่องจากการปรับแต่งโดยผู้ผลิตอุปกรณ์และผู้ให้บริการ แต่อุปกรณ์ที่พร้อมใช้งาน Google Play ส่วนใหญ่จะมาพร้อมกับผู้ให้บริการต่อไปนี้

  • GMS Transport: การรับส่งข้อมูลสำรองในระบบคลาวด์ที่ใช้งานอยู่บนอุปกรณ์ส่วนใหญ่ ซึ่งเป็นส่วนหนึ่งของบริการของ Google Mobile การรับส่งนี้จะจัดเก็บข้อมูลไว้ในบริการสำรองข้อมูลของ Android
  • การขนส่ง D2D: การขนส่งนี้ใช้ในการย้ายข้อมูล D2D เพื่อโอนข้อมูลจากอุปกรณ์หนึ่งไปยังอีกเครื่องหนึ่งโดยตรง

เครื่องมือ

ในการทดสอบการดำเนินการสำรองและกู้คืนข้อมูล คุณจำเป็นต้องทราบสักเล็กน้อยเกี่ยวกับเครื่องมือต่อไปนี้

  • adb: เพื่อเรียกใช้คําสั่งในอุปกรณ์หรือโปรแกรมจําลอง
  • bmgr: เพื่อสำรองข้อมูลและกู้คืนต่างๆ
  • logcat: เพื่อดูผลลัพธ์ของการดำเนินการสำรองข้อมูลและกู้คืน

ทดสอบการสำรองข้อมูลในระบบคลาวด์

การสำรองและกู้คืนข้อมูลในระบบคลาวด์ทำได้โดยใช้อุปกรณ์เครื่องเดียวโดยทำตามขั้นตอนต่างๆ ในส่วนนี้

เตรียมอุปกรณ์หรือโปรแกรมจำลองสำหรับการสำรองข้อมูลระบบคลาวด์

เตรียมอุปกรณ์หรือโปรแกรมจำลองสำหรับการทดสอบการสำรองข้อมูลโดยทำตามรายการตรวจสอบต่อไปนี้

  1. สำหรับการสํารองข้อมูลอัตโนมัติ ให้ตรวจสอบว่าคุณใช้อุปกรณ์หรือโปรแกรมจําลองที่ใช้ Android 6.0 (API ระดับ 23) ขึ้นไป
  2. สำหรับการสำรองข้อมูลคีย์-ค่า ให้ตรวจสอบว่าคุณใช้อุปกรณ์หรือโปรแกรมจำลองที่ใช้ Android 2.2 (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

สังเกตความแตกต่างของการประทับเวลาในเอาต์พุตบันทึก ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อแอปของคุณใช้การกำหนดค่า Multidex โดยไม่มี 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 อาจไม่มีการเรียกใช้วิธีการตั้งค่าของแอป การสำรองข้อมูลอัตโนมัติจะไม่เปิดกิจกรรมของแอปด้วย คุณจึงอาจเห็นข้อผิดพลาดหากแอปตั้งค่าในกิจกรรม ดูข้อมูลเพิ่มเติมที่หัวข้อติดตั้งใช้งาน BackupAgent

ในทางตรงกันข้าม การสำรองข้อมูลคีย์-ค่าจะเป็นการเปิดแอปของคุณด้วยคลาสย่อย Application ที่คุณประกาศในไฟล์ Manifest ของแอป

ไม่มีข้อมูลที่จะสำรอง

ข้อความต่อไปนี้ใน 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 ของคุณเอง ก็น่าจะหมายความว่าคุณยังไม่ได้เพิ่มข้อมูลหรือไฟล์ใดๆ ในข้อมูลสำรอง