การสำรองข้อมูลอัตโนมัติสำหรับแอปจะสำรองข้อมูลของผู้ใช้จากแอปที่กำหนดเป้าหมายและทำงานใน Android 6.0 (API ระดับ 23) ขึ้นไปโดยอัตโนมัติ Android จะเก็บข้อมูลแอปไว้โดยอัปโหลดไปยัง Google ไดรฟ์ของผู้ใช้ ซึ่งข้อมูลดังกล่าวจะได้รับการปกป้องด้วยข้อมูลเข้าสู่ระบบบัญชี Google ของผู้ใช้ ข้อมูลสำรองได้รับการเข้ารหัสจากต้นทางถึงปลายทางในอุปกรณ์ที่ใช้ Android 9 ขึ้นไปโดยใช้ PIN, รูปแบบ หรือรหัสผ่านของอุปกรณ์ แอปทุกแอปสามารถจัดสรรพื้นที่เก็บข้อมูลสํารองได้สูงสุด 25 MB ต่อผู้ใช้แอป 1 คน โดยไม่มีค่าใช้จ่ายในการจัดเก็บข้อมูลสำรอง แอปสามารถปรับแต่งกระบวนการสำรองข้อมูลหรือเลือกไม่ใช้ได้โดยปิดใช้การสำรองข้อมูล
ดูภาพรวมของตัวเลือกการสำรองข้อมูลของ Android และคำแนะนำเกี่ยวกับข้อมูลที่จะสำรองและกู้คืนได้ที่ภาพรวมการสำรองข้อมูล
ไฟล์ที่สำรองข้อมูลไว้
โดยค่าเริ่มต้น การสำรองข้อมูลอัตโนมัติจะรวมไฟล์ในไดเรกทอรีส่วนใหญ่ที่ระบบกำหนดให้กับแอปของคุณ ดังนี้
ไฟล์ค่ากำหนดที่แชร์
ไฟล์ที่บันทึกไว้ในที่จัดเก็บข้อมูลภายในของแอปและเข้าถึงโดย
getFilesDir()
หรือgetDir(String, int)
ไฟล์ในไดเรกทอรีที่
getDatabasePath(String)
แสดงผล ซึ่งรวมถึงไฟล์ที่สร้างด้วยคลาสSQLiteOpenHelper
ด้วยไฟล์ในที่จัดเก็บข้อมูลภายนอกในไดเรกทอรีที่
getExternalFilesDir(String)
แสดง
การสำรองข้อมูลอัตโนมัติจะไม่รวมไฟล์ในไดเรกทอรีที่แสดงผลโดย getCacheDir()
,
getCodeCacheDir()
และ getNoBackupFilesDir()
ไฟล์ที่บันทึกไว้ในตำแหน่งเหล่านี้จําเป็นเพียงชั่วคราวและตั้งใจที่จะยกเว้นจากการดำเนินการสำรองข้อมูล
คุณสามารถกำหนดค่าแอปให้รวมและยกเว้นไฟล์บางรายการได้ ดูข้อมูลเพิ่มเติมได้ที่ส่วนรวมและยกเว้นไฟล์
ตำแหน่งของข้อมูลสำรอง
ข้อมูลสำรองจะเก็บไว้ในโฟลเดอร์ส่วนตัวในบัญชี Google ไดรฟ์ของผู้ใช้ โดยจำกัดที่ 25 MB ต่อแอป ข้อมูลที่บันทึกไว้จะไม่นับรวมในโควต้า Google ไดรฟ์ส่วนตัวของผู้ใช้ ระบบจะจัดเก็บเฉพาะข้อมูลสำรองล่าสุดเท่านั้น เมื่อทำการสำรองข้อมูล ระบบจะลบข้อมูลสำรองก่อนหน้าออก ผู้ใช้หรือแอปอื่นๆ ในอุปกรณ์จะอ่านข้อมูลสำรองไม่ได้
ผู้ใช้จะเห็นรายการแอปที่สำรองข้อมูลไว้ในแอป Google ไดรฟ์บน Android โดยในอุปกรณ์ที่ทำงานด้วยระบบปฏิบัติการ Android ผู้ใช้จะเห็นรายการนี้ในลิ้นชักการนำทางของแอปไดรฟ์ในส่วนการตั้งค่า > การสํารองข้อมูลและการรีเซ็ต
ระบบจะจัดเก็บข้อมูลสำรองจากช่วงอายุการตั้งค่าอุปกรณ์แต่ละช่วงไว้ในชุดข้อมูลแยกต่างหาก ดังที่อธิบายไว้ในตัวอย่างต่อไปนี้
หากผู้ใช้มีอุปกรณ์ 2 เครื่อง ก็จะมีชุดข้อมูลสํารองสําหรับอุปกรณ์แต่ละเครื่อง
หากผู้ใช้รีเซ็ตอุปกรณ์เป็นค่าเริ่มต้นจากโรงงานแล้วตั้งค่าอุปกรณ์ด้วยบัญชีเดียวกัน ข้อมูลสำรองจะได้รับการจัดเก็บไว้ในชุดข้อมูลใหม่ ระบบจะลบชุดข้อมูลที่ล้าสมัยโดยอัตโนมัติหลังจากไม่มีการใช้งานในระยะเวลาหนึ่ง
กำหนดการสำรองข้อมูล
ระบบจะสำรองข้อมูลโดยอัตโนมัติเมื่อตรงกับเงื่อนไขทั้งหมดต่อไปนี้
- ผู้ใช้เปิดใช้การสำรองข้อมูลในอุปกรณ์ ใน Android 9 การตั้งค่านี้อยู่ในการตั้งค่า > ระบบ > การสำรองข้อมูล
- เมื่อเวลาผ่านไปอย่างน้อย 24 ชั่วโมงนับตั้งแต่การสำรองข้อมูลครั้งล่าสุด
- อุปกรณ์ไม่มีการใช้งาน
- อุปกรณ์เชื่อมต่อกับเครือข่าย Wi-Fi (หากผู้ใช้อุปกรณ์ไม่ได้เลือกใช้การสำรองข้อมูลผ่านอินเทอร์เน็ตมือถือ)
ในทางปฏิบัติ เงื่อนไขเหล่านี้จะเกิดขึ้นทุกคืนโดยประมาณ แต่อุปกรณ์อาจไม่สำรองข้อมูลเลย (เช่น ไม่ได้เชื่อมต่อเครือข่ายเลย) ระบบจะอัปโหลดเฉพาะในกรณีที่ข้อมูลแอปมีการเปลี่ยนแปลงเท่านั้น เพื่อประหยัดแบนด์วิดท์เครือข่าย
ในระหว่างการสำรองข้อมูลอัตโนมัติ ระบบจะปิดแอปเพื่อให้แน่ใจว่าแอปไม่ได้เขียนลงในระบบไฟล์อีกต่อไป โดยค่าเริ่มต้น ระบบการสำรองข้อมูลจะไม่สนใจแอปที่ทำงานอยู่เบื้องหน้าเพื่อไม่ให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี คุณสามารถลบล้างลักษณะการทำงานเริ่มต้นได้โดยตั้งค่าแอตทริบิวต์ android:backupInForeground
เป็น "จริง"
Android มีเครื่องมือที่ช่วยให้คุณเริ่มสำรองข้อมูลแอปด้วยตนเองได้ เพื่อลดความซับซ้อนในการทดสอบ ดูข้อมูลเพิ่มเติมได้ที่ทดสอบการสำรองและกู้คืนข้อมูล
คืนค่ากำหนดเวลา
ระบบจะกู้คืนข้อมูลทุกครั้งที่มีการติดตั้งแอป ไม่ว่าจะเป็นจาก Play Store ระหว่างการตั้งค่าอุปกรณ์ (เมื่อระบบติดตั้งแอปที่ติดตั้งไว้ก่อนหน้านี้) หรือโดยเรียกใช้adb
install การดำเนินการกู้คืนจะเกิดขึ้นหลังจากติดตั้ง APK แต่ก่อนที่ผู้ใช้จะเปิดแอปได้
ในระหว่างวิซาร์ดการตั้งค่าอุปกรณ์เริ่มต้น ผู้ใช้จะเห็นรายการชุดข้อมูลสำรองที่ใช้ได้และระบบจะถามว่าต้องการกู้คืนข้อมูลจากชุดข้อมูลใด ชุดข้อมูลสํารองที่เลือกจะเป็นชุดข้อมูลเดิมของอุปกรณ์ อุปกรณ์จะกู้คืนได้จากข้อมูลสำรองของตัวเองหรือชุดข้อมูลเดิม หากมีการสำรองข้อมูลจากแหล่งที่มาทั้ง 2 แหล่ง อุปกรณ์จะจัดลำดับความสำคัญของการสำรองข้อมูลของตนเอง หากผู้ใช้ไม่ทำตามขั้นตอนในวิซาร์ดการตั้งค่าอุปกรณ์ อุปกรณ์จะคืนค่าได้จากข้อมูลสำรองของตัวเองเท่านั้น
Android มีเครื่องมือที่ช่วยให้คุณเริ่มการกู้คืนแอปด้วยตนเองได้ง่ายขึ้น ดูข้อมูลเพิ่มเติมได้ที่ทดสอบการสำรองและกู้คืนข้อมูล
เปิดและปิดใช้การสำรองข้อมูล
แอปที่กำหนดเป้าหมายเป็น Android 6.0 (API ระดับ 23) ขึ้นไปจะเข้าร่วมการสำรองข้อมูลอัตโนมัติโดยอัตโนมัติ ในไฟล์ Manifest ของแอป ให้ตั้งค่าบูลีน android:allowBackup
เพื่อเปิดหรือปิดใช้การสำรองข้อมูล ค่าเริ่มต้นคือ true
แต่เราขอแนะนำให้ตั้งค่าแอตทริบิวต์ในไฟล์ Manifest อย่างชัดเจน ดังที่แสดงในตัวอย่างต่อไปนี้
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
คุณปิดใช้การสำรองข้อมูลได้โดยตั้งค่า android:allowBackup
เป็น false
คุณอาจต้องทําเช่นนี้หากแอปสามารถสร้างสถานะใหม่ผ่านกลไกอื่นๆ หรือหากแอปจัดการข้อมูลที่ละเอียดอ่อน
รวมและยกเว้นไฟล์
โดยค่าเริ่มต้น ระบบจะสำรองข้อมูลแอปเกือบทั้งหมด ดูข้อมูลเพิ่มเติมได้ที่ส่วนไฟล์ที่สำรองข้อมูลไว้
ส่วนนี้จะแสดงวิธีกำหนดกฎ XML ที่กําหนดเองเพื่อควบคุมสิ่งที่จะสํารองข้อมูล หากแอปกำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป คุณต้องระบุกฎการสำรองข้อมูล XML ชุดเพิ่มเติมตามที่อธิบายไว้ในส่วนนี้เพื่อรองรับการเปลี่ยนแปลงการกู้คืนข้อมูลสำรองที่เปิดตัวสำหรับอุปกรณ์ที่ใช้ Android เวอร์ชันเหล่านี้
ควบคุมการสำรองข้อมูลใน Android 11 และต่ำกว่า
ทำตามขั้นตอนในส่วนนี้เพื่อควบคุมไฟล์ที่จะสำรองข้อมูลในอุปกรณ์ที่ใช้ Android 11 (API ระดับ 30) หรือต่ำกว่า
ในไฟล์
AndroidManifest.xml
ให้เพิ่มแอตทริบิวต์android:fullBackupContent
ลงในองค์ประกอบ<application>
ดังที่แสดงในตัวอย่างต่อไปนี้ แอตทริบิวต์นี้ชี้ไปยังไฟล์ XML ที่มีกฎการสำรองข้อมูล<application ... android:fullBackupContent="@xml/backup_rules"> </application>
สร้างไฟล์ XML ชื่อ
@xml/backup_rules
ในไดเรกทอรีres/xml/
ในไฟล์นี้ ให้เพิ่มกฎด้วยองค์ประกอบ<include>
และ<exclude>
ตัวอย่างต่อไปนี้จะสำรองข้อมูลค่ากำหนดที่แชร์ทั้งหมดยกเว้นdevice.xml
<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </full-backup-content>
กำหนดเงื่อนไขของอุปกรณ์ที่จําเป็นสําหรับการสํารองข้อมูล
หากแอปบันทึกข้อมูลที่ละเอียดอ่อนไว้ในอุปกรณ์ คุณระบุเงื่อนไขที่ข้อมูลของแอปจะรวมอยู่ในการสำรองข้อมูลของผู้ใช้ได้ คุณสามารถใส่เงื่อนไขต่อไปนี้ใน Android 9 (API ระดับ 28) ขึ้นไป
clientSideEncryption
: ข้อมูลสํารองของผู้ใช้ได้รับการเข้ารหัสด้วยรหัสลับฝั่งไคลเอ็นต์ การเข้ารหัสรูปแบบนี้จะเปิดใช้ในอุปกรณ์ที่ใช้ Android 9 ขึ้นไป ตราบใดที่ผู้ใช้เปิดใช้การสำรองข้อมูลใน Android 9 ขึ้นไปและตั้งค่าการล็อกหน้าจอ (PIN, รูปแบบ หรือรหัสผ่าน) สำหรับอุปกรณ์deviceToDeviceTransfer
: ผู้ใช้กำลังโอนข้อมูลสำรองไปยังอุปกรณ์อื่นที่รองรับการโอนในอุปกรณ์เครื่องอื่น (เช่น Google Pixel)
หากอัปเกรดอุปกรณ์สำหรับพัฒนาเป็น Android 9 แล้ว คุณต้องปิดใช้แล้วเปิดการสำรองข้อมูลอีกครั้งหลังจากอัปเกรด เนื่องจาก Android จะเข้ารหัสข้อมูลสำรองด้วยข้อมูลลับฝั่งไคลเอ็นต์หลังจากที่แจ้งให้ผู้ใช้ทราบในการตั้งค่าหรือวิซาร์ดการตั้งค่าเท่านั้น
หากต้องการประกาศเงื่อนไขการรวม ให้ตั้งค่าแอตทริบิวต์ requireFlags
เป็นค่าหรือค่าที่เลือกในองค์ประกอบ <include>
ภายในชุดกฎการสำรองข้อมูล
<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <!-- App data isn't included in user's backup unless client-side encryption is enabled. --> <include domain="file" path="." requireFlags="clientSideEncryption" /> </full-backup-content>
หากแอปใช้ระบบข้อมูลสำรองคีย์-ค่า หรือหากคุณใช้งาน
BackupAgent
ด้วยตนเอง คุณยังนำข้อกำหนดแบบมีเงื่อนไขเหล่านี้ไปใช้กับตรรกะสำรองได้โดยทำการเปรียบเทียบเล็กน้อยระหว่างชุด Transport Flag ของออบเจ็กต์ BackupDataOutput
กับ Flag FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
หรือ Flag FLAG_DEVICE_TO_DEVICE_TRANSFER
ของ Agent ข้อมูลสำรองที่กำหนดเอง
ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างการใช้เมธอดนี้
Kotlin
class CustomBackupAgent : BackupAgent() { override fun onBackup(oldState: ParcelFileDescriptor?, data: BackupDataOutput?, newState: ParcelFileDescriptor?) { if (data != null) { if ((data.transportFlags and FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } } // Implementation of onRestore() here. }
Java
public class CustomBackupAgent extends BackupAgent { @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { if ((data.getTransportFlags() & FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) { // Client-side backup encryption is enabled. } if ((data.getTransportFlags() & FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) { // Local device-to-device transfer is enabled. } } // Implementation of onRestore() here. }
ควบคุมการสำรองข้อมูลใน Android 12 ขึ้นไป
หากแอปกำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป ให้ทำตามขั้นตอนในส่วนนี้เพื่อควบคุมไฟล์ที่จะสำรองในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป
ในไฟล์
AndroidManifest.xml
ให้เพิ่มแอตทริบิวต์android:dataExtractionRules
ลงในองค์ประกอบ<application>
ดังที่แสดงในตัวอย่างต่อไปนี้ แอตทริบิวต์นี้จะชี้ไปยังไฟล์ XML ที่มีกฎการสำรองข้อมูล<application ... android:dataExtractionRules="backup_rules.xml"> </application>
สร้างไฟล์ XML ชื่อ
backup_rules.xml
ในไดเรกทอรีres/xml/
ในไฟล์นี้ ให้เพิ่มกฎด้วยองค์ประกอบ<include>
และ<exclude>
ตัวอย่างต่อไปนี้จะสำรองข้อมูลค่ากำหนดที่แชร์ทั้งหมดยกเว้นdevice.xml
<?xml version="1.0" encoding="utf-8"?> <data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> <include domain="sharedpref" path="."/> <exclude domain="sharedpref" path="device.xml"/> </cloud-backup> </data-extraction-rules>
ไวยากรณ์การกำหนดค่า XML
ไวยากรณ์ XML สำหรับไฟล์กำหนดค่าจะแตกต่างกันไปตามเวอร์ชัน Android ที่แอปกำหนดเป้าหมายและใช้งานอยู่
Android 11 หรือต่ำกว่า
ใช้ไวยากรณ์ XML ต่อไปนี้สำหรับไฟล์การกําหนดค่าที่ควบคุมการสำรองข้อมูลสำหรับอุปกรณ์ที่ใช้ Android 11 หรือต่ำกว่า
<full-backup-content> <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string" requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] /> <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string" /> </full-backup-content>
Android 12 ขึ้นไป
หากแอปกำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป ให้ใช้ไวยากรณ์ XML ต่อไปนี้สำหรับไฟล์การกำหนดค่าที่ควบคุมการสำรองข้อมูลสำหรับอุปกรณ์ที่ใช้ Android 12 ขึ้นไป
<data-extraction-rules> <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... </cloud-backup> <device-transfer> ... <include domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... <exclude domain=["file" | "database" | "sharedpref" | "external" | "root" | "device_file" | "device_database" | "device_sharedpref" | "device_root" ] path="string"/> ... </device-transfer> </data-extraction-rules>
แต่ละส่วนของการกำหนดค่า (<cloud-backup>
, <device-transfer>
) มีกฎที่ใช้กับการโอนประเภทดังกล่าวเท่านั้น การแยกนี้จะช่วยให้คุณยกเว้นไฟล์หรือไดเรกทอรีจากข้อมูลสำรองของ Google ไดรฟ์ในขณะที่ยังคงโอนไฟล์ระหว่างการโอนระหว่างอุปกรณ์ (D2D) ได้ เป็นต้น ซึ่งจะมีประโยชน์ในกรณีที่คุณมีไฟล์ขนาดใหญ่เกินกว่าที่จะสำรองข้อมูลไปยังระบบคลาวด์ได้ แต่สามารถโอนระหว่างอุปกรณ์ได้โดยไม่มีปัญหา
หากไม่มีกฎสำหรับโหมดการสำรองข้อมูลบางโหมด เช่น ไม่มีส่วน <device-transfer>
โหมดดังกล่าวจะเปิดใช้อย่างสมบูรณ์สำหรับเนื้อหาทั้งหมดยกเว้นไดเรกทอรี no-backup
และ cache
ตามที่อธิบายไว้ในส่วนไฟล์ที่สำรองข้อมูลไว้
แอปสามารถตั้งค่า Flag disableIfNoEncryptionCapabilities
ในส่วน <cloud-backup>
เพื่อให้แน่ใจว่าระบบจะสำรองข้อมูลเฉพาะในกรณีที่สามารถเข้ารหัสได้ เช่น เมื่อผู้ใช้มีหน้าจอล็อก การตั้งข้อจำกัดนี้จะหยุดไม่ให้ระบบส่งข้อมูลสำรองไปยังระบบคลาวด์หากอุปกรณ์ของผู้ใช้ไม่รองรับการเข้ารหัส แต่เนื่องจากระบบจะไม่ส่งการโอน D2D ไปยังเซิร์ฟเวอร์ การโอนจึงจะยังคงทำงานต่อไปได้แม้ในอุปกรณ์ที่ไม่รองรับการเข้ารหัส
ไวยากรณ์สําหรับรวมและยกเว้นองค์ประกอบ
คุณกำหนดองค์ประกอบ <include>
และ <exclude>
ได้ในแท็ก <full-backup-content>
, <cloud-backup>
และ <device-transfer>
(ขึ้นอยู่กับเวอร์ชัน Android ของอุปกรณ์และtargetSDKVersion
ของแอป) ดังนี้
<include>
ระบุไฟล์หรือโฟลเดอร์ที่จะสํารองข้อมูล โดยค่าเริ่มต้น การสำรองข้อมูลอัตโนมัติจะรวมไฟล์แอปเกือบทั้งหมด หากคุณระบุองค์ประกอบ
<include>
ระบบจะไม่รวมไฟล์ใดๆ ไว้โดยค่าเริ่มต้นอีกต่อไปและจะสำรองข้อมูลเฉพาะไฟล์ที่ระบุ หากต้องการรวมหลายไฟล์ ให้ใช้องค์ประกอบ<include>
หลายรายการใน Android 11 และต่ำกว่า องค์ประกอบนี้ยังมีแอตทริบิวต์
requireFlags
ได้ด้วย ซึ่งส่วนที่อธิบายวิธีระบุข้อกำหนดเกี่ยวกับเงื่อนไขสำหรับการสำรองข้อมูลจะให้รายละเอียดเพิ่มเติมระบบจะยกเว้นไฟล์ในไดเรกทอรีที่
getCacheDir()
,getCodeCacheDir()
หรือgetNoBackupFilesDir()
แสดงผลเสมอ แม้ว่าคุณจะพยายามรวมไฟล์เหล่านั้นไว้ก็ตาม<exclude>
ระบุไฟล์หรือโฟลเดอร์ที่จะยกเว้นระหว่างการสำรองข้อมูล ต่อไปนี้คือไฟล์ที่โดยทั่วไปจะยกเว้นจากการสำรองข้อมูล
ไฟล์ที่มีตัวระบุเฉพาะอุปกรณ์ ซึ่งออกโดยเซิร์ฟเวอร์หรือสร้างขึ้นในอุปกรณ์ เช่น Firebase Cloud Messaging (FCM) จำเป็นต้องสร้างโทเค็นการลงทะเบียนทุกครั้งที่ผู้ใช้ติดตั้งแอปของคุณในอุปกรณ์เครื่องใหม่ หากมีการกู้คืนโทเค็นการลงทะเบียนเดิม แอปอาจทำงานผิดปกติ
ไฟล์ที่เกี่ยวข้องกับการแก้ไขข้อบกพร่องของแอป
ไฟล์ขนาดใหญ่ที่ทำให้แอปใช้โควต้าการสำรองข้อมูลเกิน 25 MB
เอลิเมนต์ <include>
และ <exclude>
แต่ละรายการต้องมีแอตทริบิวต์ 2 รายการต่อไปนี้
domain
ระบุตำแหน่งของทรัพยากร ค่าที่ถูกต้องสำหรับแอตทริบิวต์นี้ได้แก่
root
: ไดเรกทอรีในระบบไฟล์ที่จัดเก็บไฟล์ส่วนตัวทั้งหมดของแอปนี้file
: ไดเรกทอรีที่getFilesDir()
แสดงdatabase
: ไดเรกทอรีที่getDatabasePath()
แสดง ระบบจะจัดเก็บฐานข้อมูลที่สร้างขึ้นด้วยSQLiteOpenHelper
ไว้ที่นี่sharedpref
: ไดเรกทอรีที่จัดเก็บSharedPreferences
external
: ไดเรกทอรีที่getExternalFilesDir()
แสดงdevice_root
: เช่นroot
แต่สำหรับพื้นที่เก็บข้อมูลที่มีการป้องกันอุปกรณ์device_file
: เหมือนกับfile
แต่สำหรับพื้นที่เก็บข้อมูลที่อุปกรณ์ปกป้องdevice_database
: เช่นdatabase
แต่สำหรับพื้นที่เก็บข้อมูลที่มีการป้องกันอุปกรณ์device_sharedpref
: เหมือนกับsharedpref
แต่สำหรับพื้นที่เก็บข้อมูลที่อุปกรณ์ปกป้อง
path
ระบุไฟล์หรือโฟลเดอร์ที่จะรวมหรือยกเว้นจากการสํารองข้อมูล ข้อควรทราบ มีดังนี้
- แอตทริบิวต์นี้ไม่รองรับไวลด์การ์ดหรือไวยากรณ์ของนิพจน์ทั่วไป
- คุณสามารถอ้างอิงไดเรกทอรีปัจจุบันได้โดยใช้
./
แต่อ้างอิงไดเรกทอรีหลักไม่ได้ เช่น การใช้..
ทั้งนี้เพื่อเหตุผลด้านความปลอดภัย - หากคุณระบุไดเรกทอรี กฎจะมีผลกับไฟล์ทั้งหมดในไดเรกทอรีและไดเรกทอรีย่อยที่เกิดซ้ำ
ใช้ BackupAgent
แอปที่ใช้การสำรองข้อมูลอัตโนมัติไม่จำเป็นต้องใช้ BackupAgent
แต่คุณเลือกใช้ BackupAgent
ที่กําหนดเองได้ โดยปกติแล้ว การทำเช่นนี้มีสาเหตุ 2 ประการ ได้แก่
คุณต้องการรับการแจ้งเตือนเกี่ยวกับเหตุการณ์การสำรองข้อมูล เช่น
onRestoreFinished()
และonQuotaExceeded(long, long)
ระบบจะเรียกใช้เมธอดการเรียกกลับเหล่านี้แม้ว่าแอปจะไม่ทํางานอยู่ก็ตามการแสดงชุดไฟล์ที่ต้องการสำรองข้อมูลด้วยกฎ XML เป็นเรื่องยาก ในกรณีที่เกิดขึ้นไม่บ่อยนักเหล่านี้ คุณสามารถใช้
BackupAgent
ที่ลบล้างonFullBackup(FullBackupDataOutput)
เพื่อจัดเก็บข้อมูลที่ต้องการ หากต้องการเก็บไว้ใช้กับการใช้งานเริ่มต้นของระบบ ให้เรียกใช้เมธอดที่เกี่ยวข้องในซุปเปอร์คลาสด้วยsuper.onFullBackup()
หากคุณใช้ BackupAgent
โดยค่าเริ่มต้น ระบบจะคาดหวังว่าแอปของคุณจะสํารองและกู้คืนคีย์-ค่า หากต้องการใช้การสำรองข้อมูลอัตโนมัติตามไฟล์แทน ให้ตั้งค่าแอตทริบิวต์ android:fullBackupOnly
เป็น true
ในไฟล์ Manifest ของแอป
ในระหว่างการดำเนินการสำรองและกู้คืนอัตโนมัติ ระบบจะเปิดแอปในโหมดที่จํากัดเพื่อทั้งป้องกันไม่ให้แอปเข้าถึงไฟล์ที่อาจทําให้เกิดข้อขัดแย้ง และเพื่อให้แอปเรียกใช้เมธอดการติดต่อกลับใน BackupAgent
ในโหมดที่จํากัดนี้ ระบบจะไม่เปิดใช้งานกิจกรรมหลักของแอปโดยอัตโนมัติ ผู้ให้บริการเนื้อหาจะไม่ได้รับการเริ่มต้น และระบบจะสร้างอินสแตนซ์ของคลาสพื้นฐาน Application
แทนการสร้างอินสแตนซ์ของคลาสย่อยที่ประกาศไว้ในไฟล์ Manifest ของแอป
BackupAgent
ต้องใช้เมธอด Abstract onBackup()
และ onRestore()
ซึ่งใช้สำหรับการสำรองข้อมูลคีย์-ค่า หากไม่ต้องการสำรองข้อมูลคีย์-ค่า ให้ปล่อยการใช้งานเมธอดเหล่านั้นว่างไว้
ดูข้อมูลเพิ่มเติมได้ที่ Extend BackupAgent