หน้านี้จะแสดงวิธีทดสอบการสำรองข้อมูลบนระบบคลาวด์และกระบวนการโอนจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง (D2D) สำหรับแอปของคุณ คุณควรทดสอบทั้ง 2 กระบวนการนี้กับแอปรุ่นหลักแต่ละรุ่นเพื่อช่วยดูแลให้ผู้ใช้สามารถใช้แอปของคุณในอุปกรณ์เครื่องใหม่ได้ต่อไป แม้ว่าการสำรองข้อมูลและการโอนจะคล้ายกัน แต่ก็มีความแตกต่างที่สำคัญระหว่างการสำรองข้อมูลและการโอนใน Android 12 (API ระดับ 31) ขึ้นไป โดยเฉพาะอย่างยิ่งการโอนมีขีดจำกัดขนาดข้อมูลที่ใหญ่กว่ามากถึง 2 GB เมื่อเทียบกับการสำรองข้อมูลบนระบบคลาวด์ที่มีขีดจำกัดขนาดข้อมูล 25 MB
คู่มือนี้จะแสดงวิธีทดสอบทั้งการสำรองและกู้คืนข้อมูลบนระบบคลาวด์ รวมถึงการโอน D2D อย่างมีประสิทธิภาพตลอดวงจรการพัฒนา
วิธีการทำงานของการทดสอบการสำรองข้อมูล
ส่วนนี้จะอธิบายส่วนต่างๆ ในเฟรมเวิร์กการสำรองข้อมูล Android และวิธีที่เฟรมเวิร์กโต้ตอบกับแอปที่รองรับการสำรองข้อมูลอัตโนมัติและการสำรองข้อมูลคีย์-ค่า ในระหว่างระยะการพัฒนาแอป การทำงานภายในส่วนใหญ่ของเฟรมเวิร์กจะแยกออกมา คุณจึงไม่จำเป็นต้องทราบข้อมูลนี้ อย่างไรก็ตาม ในช่วงทดสอบ ความเข้าใจในแนวคิดเหล่านี้จะมีความสำคัญมากยิ่งขึ้น
แผนภาพต่อไปนี้แสดงการไหลของข้อมูลระหว่างการสำรองและกู้คืนข้อมูลในระบบคลาวด์ สำหรับการทดสอบ คุณใช้อุปกรณ์เดียวกันในการสำรองและกู้คืนข้อมูลในระบบคลาวด์ได้
แผนภาพต่อไปนี้แสดงการไหลของข้อมูลระหว่างการโอน D2D
การทดสอบ D2D ต้องใช้อุปกรณ์ต้นทางและอุปกรณ์ปลายทางเพื่อคัดลอกข้อมูลไปมา ซึ่งแตกต่างจากการทดสอบการสำรองข้อมูลและกู้คืนในระบบคลาวด์
บริการจัดการข้อมูลสำรองคือบริการระบบ Android ที่ประสานงานและเริ่มการดำเนินการสำรองและกู้คืนข้อมูล บริการนี้เข้าถึงได้ผ่าน Backup Manager
API
ระหว่างการดำเนินการสำรองข้อมูล บริการจะค้นหาข้อมูลสำรองจากแอป จากนั้นส่งข้อมูลไปยังตัวขนส่งข้อมูลสำรอง ซึ่งจะเก็บถาวรข้อมูลไปยังระบบคลาวด์ ในระหว่างการดำเนินการกู้คืน บริการจัดการข้อมูลสำรองจะดึงข้อมูลสำรองจากตัวขนส่งข้อมูลสำรองและกู้คืนข้อมูลไปยังอุปกรณ์ สำหรับการโอน D2D บริการจัดการข้อมูลสำรองจะค้นหาข้อมูลสำรองในแอปและส่งไปยังบริการเครื่องมือจัดการข้อมูลสำรองโดยตรงในอุปกรณ์ใหม่ ซึ่งจะโหลดข้อมูลนั้นลงในแอปของคุณ
การส่งข้อมูลสำรองคือคอมโพเนนต์ของ Android ที่รับผิดชอบในการจัดเก็บและเรียกข้อมูลแอป อุปกรณ์ที่ใช้ Android อาจมีระบบขนส่งสำรองตั้งแต่ 0 ระบบขึ้นไป แต่ระบบขนส่งดังกล่าวจะมีสถานะ "ใช้งานอยู่" ได้เพียงระบบเดียวเท่านั้น การขนส่งสำรองที่มีให้ใช้งานจะต่างกันไปตามแต่ละอุปกรณ์ เนื่องจากผู้ผลิตอุปกรณ์และผู้ให้บริการมีการปรับแต่งโดยผู้ให้บริการ แต่อุปกรณ์ที่พร้อมใช้งาน Google Play ส่วนใหญ่จะจัดส่งโดยมีการขนส่งต่อไปนี้
- ตัวขนส่ง GMS: ตัวขนส่งข้อมูลสำรองบนระบบคลาวด์ที่ใช้งานอยู่ในอุปกรณ์ส่วนใหญ่ ซึ่งเป็นส่วนหนึ่งของบริการของ Google Mobile โดยการรับส่งข้อมูลนี้จะจัดเก็บข้อมูลใน Android Backup Service
- การขนส่ง D2D: การขนส่งนี้ใช้ในการย้ายข้อมูล D2D เพื่อโอนข้อมูลจากอุปกรณ์หนึ่งไปยังอีกเครื่องหนึ่งโดยตรง
เครื่องมือ
หากต้องการทดสอบการสำรองข้อมูลและการกู้คืน คุณต้องทราบข้อมูลคร่าวๆ เกี่ยวกับเครื่องมือต่อไปนี้
adb
: เพื่อเรียกใช้คำสั่งในอุปกรณ์หรือโปรแกรมจำลองbmgr
: เพื่อดำเนินการสำรองและกู้คืนข้อมูลต่างๆlogcat
: เพื่อดูผลลัพธ์ของการดำเนินการสำรองข้อมูลและกู้คืน
ทดสอบการสำรองข้อมูลในระบบคลาวด์
คุณสำรองและกู้คืนข้อมูลในระบบคลาวด์ได้โดยใช้อุปกรณ์เครื่องเดียวโดยทำตามขั้นตอนในส่วนนี้
เตรียมอุปกรณ์หรือโปรแกรมจำลองสำหรับการสำรองข้อมูลในระบบคลาวด์
เตรียมอุปกรณ์หรือโปรแกรมจำลองสำหรับการทดสอบการสำรองข้อมูลโดยทำตามรายการตรวจสอบต่อไปนี้
- สำหรับการสํารองข้อมูลอัตโนมัติ ให้ตรวจสอบว่าคุณใช้อุปกรณ์หรือโปรแกรมจําลองที่ใช้ Android 6.0 (API ระดับ 23) ขึ้นไป
- สําหรับการสำรองข้อมูลแบบคีย์-ค่า ให้ตรวจสอบว่าคุณใช้อุปกรณ์หรือโปรแกรมจำลองที่ใช้ Android 2.2 (API ระดับ 8) ขึ้นไป
- คุณต้องมีการเชื่อมต่ออินเทอร์เน็ตเพื่อทดสอบการสำรองข้อมูลบนระบบคลาวด์
- เข้าสู่ระบบอุปกรณ์ด้วยบัญชี 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"
ขั้นตอนการทดสอบ
- เปิดแอป เข้าสู่ระบบ และแก้ไขการตั้งค่าทั้งหมด
- เรียกใช้สคริปต์โดยส่งชื่อแพ็กเกจ เช่น
test_cloud_backup.sh com.example.myapp
- เปิดแอปอีกครั้งและตรวจสอบความถูกต้องโดยเก็บรักษาข้อมูลไว้ทั้งหมด
คุณไม่ต้องการให้ผู้ใช้ต้องเข้าสู่ระบบ และการตั้งค่า ขั้นตอน และข้อมูลแอปทั้งหมดของผู้ใช้ต้องเหมือนเดิม หากผลการทดสอบไม่เป็นไปตามเกณฑ์เหล่านี้ ให้ตรวจสอบว่าคุณได้กำหนดค่าข้อมูลสำรองอย่างถูกต้อง โดยไม่ละเว้นข้อมูลสำคัญ และคุณกำลังจัดการกับการสร้างข้อมูลแคชใหม่ซึ่งคุณยกเว้นจากข้อมูลสำรองด้วยเช่นกัน ทําซ้ำขั้นตอนที่ 1-3 สําหรับการทดสอบแต่ละรอบ
ทดสอบการโอน D2D
วิธีที่ครอบคลุมที่สุดในการทดสอบการโอน D2D คือการโอนเนื้อหาทั้งหมดในโทรศัพท์ไปยังอุปกรณ์เครื่องใหม่ที่รีเซ็ตเป็นค่าเริ่มต้น แล้วตรวจสอบว่าอุปกรณ์ทำงานอย่างถูกต้อง อย่างไรก็ตาม วิธีนี้อาจไม่สะดวกและใช้เวลานานหากต้องทำซ้ำหลายครั้ง ขั้นตอนเหล่านี้แสดงวิธีจําลองการโอนด้วยอุปกรณ์เครื่องเดียวโดยไม่ต้องรีเซ็ตเป็นค่าเริ่มต้นในอุปกรณ์ซ้ำ
เตรียมอุปกรณ์สำหรับการทดสอบ D2D
หากต้องการทดสอบการโอน D2D ในอุปกรณ์เดียว ให้เตรียมอุปกรณ์ดังนี้
- อุปกรณ์ต้องใช้ Android 12 (API ระดับ 31) ขึ้นไป
- หากต้องการทดสอบ D2D เวอร์ชันล่าสุด ให้กำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไปในแอป
- สร้างสคริปต์
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"
ขั้นตอนการทดสอบ
- ติดตั้งแอปที่ต้องการทดสอบในอุปกรณ์
- เปิดแอป เข้าสู่ระบบ และแก้ไขการตั้งค่าของแอป
- เรียกใช้สคริปต์ในอุปกรณ์โดยส่งชื่อแพ็กเกจ เช่น
test_d2d.sh com.example.myapp
- เมื่อสคริปต์เสร็จสมบูรณ์แล้ว ให้เปิดแอปบนอุปกรณ์ แล้วตรวจสอบว่าสคริปต์ทำงานได้อย่างถูกต้องโดยเก็บรักษาข้อมูลทั้งหมดไว้
คุณไม่ต้องการให้ผู้ใช้ลงชื่อเข้าสู่ระบบ และการตั้งค่า ความคืบหน้า และข้อมูลแอปทั้งหมดของผู้ใช้ต้องปรากฏเช่นเดิมก่อนที่จะเรียกใช้สคริปต์ หากผลการทดสอบไม่เป็นไปตามเกณฑ์เหล่านี้ ให้ตรวจสอบว่าคุณได้กำหนดค่าการโอนอย่างถูกต้อง โดยไม่ละเว้นส่วนสำคัญของข้อมูล และคุณกำลังจัดการกับการสร้างข้อมูลแคชใหม่ที่คุณได้ยกเว้นจากการโอนด้วย ทำขั้นตอนที่ 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
แสดงว่าคุณอาจยังไม่ได้เพิ่มข้อมูลหรือไฟล์ใดๆ ลงในข้อมูลสํารอง