تتيح ميزة النسخ الاحتياطي التلقائي للتطبيقات إجراء نسخ احتياطي تلقائي لبيانات المستخدمين من التطبيقات التي تستهدف الإصدار 6.0 من نظام التشغيل Android (المستوى 23 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث وتعمل عليها. يحافظ نظام التشغيل Android على بيانات التطبيقات من خلال تحميلها إلى حساب Google Drive الخاص بالمستخدم، حيث تتم حمايتها باستخدام بيانات اعتماد حساب Google الخاص بالمستخدم. يتم تشفير النسخة الاحتياطية بشكل تام بين الأطراف على الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android أو إصدار أحدث باستخدام رقم التعريف الشخصي أو النقش أو كلمة المرور الخاصة بالجهاز. يمكن لكل تطبيق تخصيص ما يصل إلى 25 ميغابايت من بيانات النسخ الاحتياطي لكل مستخدم للتطبيق. لا يتم تحصيل أي رسوم مقابل تخزين البيانات الاحتياطية. يمكن لتطبيقك تخصيص عملية الاحتفاظ بنسخة احتياطية أو إيقافها من خلال إيقاف عمليات الاحتفاظ بنسخ احتياطية.
للحصول على نظرة عامة على خيارات الاحتفاظ بنسخة احتياطية من البيانات في Android وإرشادات حول البيانات التي يجب الاحتفاظ بنسخة احتياطية منها واستعادتها، يمكنك الاطّلاع على نظرة عامة على الاحتفاظ بنسخة احتياطية من البيانات.
الملفات التي يتم الاحتفاظ بنسخة احتياطية منها
تتضمّن ميزة "النسخ الاحتياطي التلقائي" تلقائيًا الملفات في معظم الأدلة التي يحدّدها النظام لتطبيقك، وهي:
ملفات الإعدادات المفضّلة المشترَكة
الملفات المحفوظة في وحدة التخزين الداخلية لتطبيقك والتي يمكن الوصول إليها من خلال
getFilesDir()أوgetDir(String, int)الملفات في الدليل الذي تعرضه الدالة
getDatabasePath(String)، والتي تتضمّن أيضًا الملفات التي تم إنشاؤها باستخدام الفئةSQLiteOpenHelperالملفات الموجودة في وحدة التخزين الخارجية في الدليل الذي تم عرضه بواسطة
getExternalFilesDir(String)
يستثني "الاحتفاظ التلقائي بنسخة احتياطية" الملفات في الأدلة التي تعرضها getCacheDir() وgetCodeCacheDir() وgetNoBackupFilesDir(). الملفات المحفوظة في هذه المواقع الجغرافية مطلوبة بشكل مؤقت فقط، ويتم استبعادها عمدًا من عمليات النسخ الاحتياطي.
يمكنك ضبط تطبيقك لتضمين ملفات معيّنة واستبعاد أخرى. لمزيد من المعلومات، يُرجى الاطّلاع على قسم تضمين الملفات واستبعادها.
موقع الاحتفاظ بنسخة احتياطية
يتم تخزين بيانات النسخة الاحتياطية في مجلد خاص في حساب Google Drive الخاص بالمستخدم، بحد أقصى 25 ميغابايت لكل تطبيق، ولا يتم احتساب البيانات المحفوظة ضمن حصة مساحة التخزين الشخصية في Google Drive الخاصة بالمستخدم. يتم تخزين أحدث نسخة احتياطية فقط. عند إنشاء نسخة احتياطية، يتم حذف أي نسخة احتياطية سابقة. لا يمكن للمستخدم أو التطبيقات الأخرى على الجهاز قراءة بيانات النسخة الاحتياطية.
يمكن للمستخدمين الاطّلاع على قائمة بالتطبيقات التي تم الاحتفاظ بنسخة احتياطية منها في تطبيق Google Drive على Android. على جهاز يعمل بنظام التشغيل Android، يمكن للمستخدمين العثور على هذه القائمة في قائمة التنقّل الخاصة بتطبيق Drive ضمن الإعدادات > الاحتفاظ بنسخة احتياطية وإعادة الضبط.
يتم تخزين النُسخ الاحتياطية من كل عملية إعداد جهاز على مدار عمره في مجموعات بيانات منفصلة، كما هو موضّح في الأمثلة التالية:
إذا كان المستخدم يملك جهازَين، ستتوفّر مجموعة بيانات احتياطية لكل جهاز.
في حال أعاد المستخدم ضبط الجهاز على الإعدادات الأصلية ثم أعدّ الجهاز باستخدام الحساب نفسه، يتم تخزين النسخة الاحتياطية في مجموعة بيانات جديدة. يتم حذف مجموعات البيانات القديمة تلقائيًا بعد فترة من عدم النشاط.
الجدول الزمني للنسخ الاحتياطي
يتم الاحتفاظ بنسخة احتياطية تلقائيًا عند استيفاء جميع الشروط التالية:
- فعَّل المستخدم ميزة "الاحتفاظ بنسخة احتياطية" على الجهاز. في نظام التشغيل Android 9، يتوفّر هذا الإعداد في الإعدادات > النظام > الاحتفاظ بنسخة احتياطية.
- انقضاء 24 ساعة على الأقل منذ آخر عملية احتياطية
- الجهاز غير نشِط.
- أن يكون الجهاز متصلاً بشبكة Wi-Fi (إذا لم يفعّل مستخدم الجهاز خيار إجراء عمليات احتياطية باستخدام بيانات الجوّال).
في الواقع، تحدث هذه الشروط كل ليلة تقريبًا، ولكن قد لا يتم الاحتفاظ بنسخة احتياطية من بيانات الجهاز أبدًا (على سبيل المثال، إذا لم يتصل الجهاز بشبكة أبدًا). للحفاظ على معدل نقل البيانات على الشبكة، لا يتم التحميل إلا إذا تم تغيير بيانات التطبيق.
أثناء عملية "النسخ الاحتياطي التلقائي"، يوقف النظام التطبيق للتأكّد من أنّه لم يعُد يكتب في نظام الملفات. يتجاهل نظام النسخ الاحتياطي تلقائيًا التطبيقات التي تعمل في المقدّمة لتجنُّب تقديم تجربة سيئة للمستخدم. يمكنك إلغاء السلوك التلقائي عن طريق ضبط السمة android:backupInForeground على القيمة true.
لتسهيل الاختبار، يتضمّن نظام التشغيل Android أدوات تتيح لك بدء عملية احتياطية لتطبيقك يدويًا. لمزيد من المعلومات، اطّلِع على اختبار النسخ الاحتياطي والاستعادة.
استعادة الجدول الزمني
تتم استعادة البيانات كلما تم تثبيت التطبيق، سواء من "متجر Play" أو أثناء إعداد الجهاز (عندما يثبّت النظام التطبيقات المثبَّتة سابقًا) أو من خلال تنفيذ الأمر adb install. تحدث عملية الاستعادة بعد تثبيت حزمة APK
ولكن قبل أن يصبح التطبيق متاحًا للمستخدم لتشغيله.
أثناء معالج الإعداد الأوّلي للجهاز، يتم عرض قائمة على المستخدم بمجموعات بيانات النسخ الاحتياطي المتاحة، ويُطلب منه تحديد المجموعة التي يريد استعادة البيانات منها. ستصبح مجموعة البيانات الاحتياطية التي تم اختيارها هي مجموعة البيانات الأساسية للجهاز. يمكن للجهاز الاستعادة من النسخ الاحتياطية الخاصة به أو من مجموعة البيانات الأصلية. إذا كانت النُسخ الاحتياطية من كلا المصدرَين متاحة، يعطي الجهاز الأولوية لنسخته الاحتياطية. إذا لم يمر المستخدم بمراحل معالج إعداد الجهاز، لن يتمكّن الجهاز من الاستعادة إلا من النسخ الاحتياطية الخاصة به.
لتسهيل الاختبار، يتضمّن نظام التشغيل Android أدوات تتيح لك بدء عملية استعادة تطبيقك يدويًا. لمزيد من المعلومات، اطّلِع على اختبار النسخ الاحتياطي والاستعادة.
تفعيل ميزة "الاحتفاظ بنسخة احتياطية" وإيقافها
تشارك التطبيقات التي تستهدف الإصدار 6.0 من نظام التشغيل Android (المستوى 23 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث تلقائيًا في ميزة "النسخ الاحتياطي التلقائي". في ملف بيان التطبيق، اضبط القيمة المنطقية
android:allowBackup لتفعيل ميزة الاحتفاظ بنسخة احتياطية أو إيقافها. القيمة التلقائية هي
true، ولكن ننصحك بتحديد السمة بشكل صريح في ملف البيان، كما هو موضّح في المثال التالي:
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
يمكنك إيقاف النُسخ الاحتياطية من خلال ضبط android:allowBackup على false. قد تحتاج إلى إجراء ذلك إذا كان تطبيقك يمكنه إعادة إنشاء حالته من خلال آلية أخرى أو إذا كان تطبيقك يتعامل مع معلومات حساسة.
تضمين الملفات واستبعادها
يحتفظ النظام تلقائيًا بنسخة احتياطية من جميع بيانات التطبيقات تقريبًا. لمزيد من المعلومات، اطّلِع على القسم حول الملفات التي يتم الاحتفاظ بنسخة احتياطية منها.
يمكنك التحكّم في البيانات التي يتم تضمينها في النسخة الاحتياطية استنادًا إلى نوع النقل.
تتيح ميزة "الاحتفاظ التلقائي بنسخة احتياطية" الاحتفاظ بنسخ احتياطية في السحابة الإلكترونية على Google Drive ونقل البيانات مباشرةً من جهاز إلى آخر (D2D). تختلف طرق الضبط حسب إصدار Android وtargetSdkVersion لتطبيقك.
- بالنسبة إلى الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو إصدار أقدم، اطّلِع على التحكّم في عملية الاحتفاظ بنسخة احتياطية على الإصدار 11 من نظام التشغيل Android أو إصدار أقدم.
- بالنسبة إلى الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، تستخدم التطبيقات التي تستهدف المستوى 31 أو أعلى لواجهة برمجة التطبيقات تنسيق
data-extraction-rules. لمزيد من التفاصيل، يُرجى الاطّلاع على التحكّم في الاحتفاظ بنسخة احتياطية على أجهزة Android 12 أو الإصدارات الأحدث. - يتوافق تنسيق
data-extraction-rulesأيضًا مع عمليات النقل بين المنصات (مثل النقل إلى iOS). تتوفّر هذه الإمكانية بدءًا من Android 16 QPR2. يمكنك الاطّلاع على مزيد من المعلومات في مقالة ضبط عمليات النقل بين المنصات.
التحكّم في الاحتفاظ بنسخة احتياطية على الإصدار 11 من نظام التشغيل Android والإصدارات الأقدم
اتّبِع الخطوات الواردة في هذا القسم للتحكّم في الملفات التي يتم الاحتفاظ بنسخة احتياطية منها على الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android (المستوى 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>
تحديد شروط الجهاز المطلوبة لإجراء النسخ الاحتياطي
إذا كان تطبيقك يحفظ معلومات حسّاسة على الجهاز، يمكنك تحديد الشروط التي يتم بموجبها تضمين بيانات تطبيقك في النسخة الاحتياطية للمستخدم. يمكنك إضافة الشروط التالية في الإصدار 9 من نظام التشغيل Android (المستوى 28 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث:
-
clientSideEncryption: يتم تشفير النسخة الاحتياطية للمستخدم باستخدام مفتاح سري من جهة العميل. يتم تفعيل هذا النوع من التشفير على الأجهزة التي تعمل بنظام التشغيل Android 9 أو الإصدارات الأحدث طالما أنّ المستخدم فعّل ميزة الاحتفاظ بنسخة احتياطية في Android 9 أو الإصدارات الأحدث وضبط قفل شاشة (رقم تعريف شخصي أو نقش أو كلمة مرور) لجهازه. deviceToDeviceTransfer: ينقل المستخدم النسخة الاحتياطية إلى جهاز آخر يتيح النقل المحلي من جهاز إلى جهاز (مثل Google Pixel).
إذا كنت قد رقّيت أجهزة التطوير إلى Android 9، عليك إيقاف ميزة الاحتفاظ بنسخة احتياطية من البيانات ثم إعادة تفعيلها بعد الترقية. ويرجع ذلك إلى أنّ Android لا يشفّر النُسخ الاحتياطية إلا باستخدام سر من جهة العميل بعد إعلام المستخدمين بذلك في "الإعدادات" أو معالج الإعداد.
لتحديد شروط التضمين، اضبط السمة requireFlags على قيمة أو قيم مختارة في عناصر <include> ضمن مجموعة قواعد النسخ الاحتياطي:
backup_rules.xml
<?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 بنفسك، يمكنك أيضًا تطبيق هذه المتطلبات الشرطية
على منطق النسخ الاحتياطي من خلال إجراء مقارنة على مستوى البتات بين مجموعة علامات النقل الخاصة بكائن
BackupDataOutput وعلامات FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED أو
FLAG_DEVICE_TO_DEVICE_TRANSFER الخاصة بعميل النسخ الاحتياطي المخصّص.
يوضّح مقتطف الرمز التالي مثالاً على استخدام هذه الطريقة:
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. }
التحكّم في الاحتفاظ بنسخة احتياطية على الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث
إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، اتّبِع الخطوات الواردة في هذا القسم للتحكّم في الملفات التي يتم الاحتفاظ بنسخة احتياطية منها على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث.
في ملف
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 الذي يستهدفه تطبيقك ويعمل عليه.
الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم
استخدِم بنية XML التالية لملف الإعداد الذي يتحكّم في النسخ الاحتياطي للأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم.
<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>
الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث
إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android (المستوى 31 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، استخدِم بنية XML التالية لملف الإعداد الذي يتحكّم في عملية الاحتفاظ بنسخة احتياطية على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث.
<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> <cross-platform-transfer platform="ios"> ... <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"/> ... <platform-specific-params bundleId="string" teamId="string" contentVersion="string"/> ... </cross-platform-transfer> </data-extraction-rules>
يحتوي كل قسم من أقسام الإعداد (<cloud-backup> و<device-transfer> و<cross-platform-transfer>) على قواعد تنطبق فقط على هذا النوع من عمليات النقل. يتيح لك هذا الفصل، على سبيل المثال، استبعاد ملف أو دليل من عمليات الاحتفاظ بنسخة احتياطية من Google Drive مع مواصلة نقله أثناء عمليات النقل من جهاز إلى جهاز أو عمليات النقل بين الأنظمة الأساسية. يكون ذلك مفيدًا إذا كانت لديك ملفات كبيرة جدًا لا يمكن الاحتفاظ بنسخة احتياطية منها على السحابة الإلكترونية، ولكن يمكن نقلها بين الأجهزة بدون أي مشاكل.
إذا لم تتوفّر قواعد لوضع احتياطي معيّن، مثلاً إذا كان القسم
<device-transfer> غير متوفّر، سيتم تفعيل هذا الوضع بالكامل لجميع
المحتوى باستثناء المجلّدَين no-backup وcache، كما هو موضّح في القسم
الملفات التي يتم الاحتفاظ بنسخة احتياطية منها.
يمكن لتطبيقك ضبط العلامة disableIfNoEncryptionCapabilities في القسم <cloud-backup> للتأكّد من أنّ النسخ الاحتياطي لا يتم إلا إذا كان من الممكن تشفيره، مثلاً عندما يكون لدى المستخدم شاشة قفل. يؤدي ضبط هذا القيد إلى منع إرسال عمليات النسخ الاحتياطي إلى السحابة الإلكترونية إذا كان جهاز المستخدم لا يتيح التشفير، ولكن بما أنّ عمليات النقل من جهاز إلى آخر لا يتم إرسالها إلى الخادم، فإنّها تظل تعمل حتى على الأجهزة التي لا تتيح التشفير.
بنية عناصر التضمين والاستبعاد
داخل العلامات <full-backup-content> و<cloud-backup> و<device-transfer> (حسب إصدار Android على الجهاز وtargetSDKVersion في تطبيقك)، يمكنك تحديد العنصرَين <include> و<exclude>:
<include>تحدّد هذه السمة ملفًا أو مجلدًا للاحتفاظ بنسخة احتياطية منه. تتضمّن ميزة "النسخ الاحتياطي التلقائي" تلقائيًا جميع ملفات التطبيقات تقريبًا. في حال تحديد عنصر
<include>، لن يتضمّن النظام أي ملفات تلقائيًا، وسيتم الاحتفاظ بنسخة احتياطية من الملفات المحدّدة فقط. لتضمين ملفات متعددة، استخدِم عناصر<include>متعددة.في الإصدار 11 من نظام التشغيل Android والإصدارات الأقدم، يمكن أن يحتوي هذا العنصر أيضًا على السمة
requireFlags، التي يتناولها القسم الذي يوضّح كيفية تحديد المتطلبات الشرطية للنسخ الاحتياطي بمزيد من التفصيل.يتم دائمًا استبعاد الملفات في الأدلة التي تعرضها
getCacheDir()أوgetCodeCacheDir()أوgetNoBackupFilesDir()، حتى إذا حاولت تضمينها.<exclude>تحدّد هذه السمة ملفًا أو مجلدًا سيتم استبعاده أثناء الاحتفاظ بنسخة احتياطية. في ما يلي بعض الملفات التي يتم استبعادها عادةً من النسخ الاحتياطي:
الملفات التي تتضمّن معرّفات خاصة بالجهاز، سواء كانت صادرة عن خادم أو تم إنشاؤها على الجهاز على سبيل المثال، تحتاج خدمة المراسلة عبر السحابة الإلكترونية من Firebase (FCM) إلى إنشاء رمز تسجيل في كل مرة يثبِّت فيها أحد المستخدمين تطبيقك على جهاز جديد. إذا تمت استعادة رمز التسجيل القديم، قد يتصرف التطبيق بشكل غير متوقّع.
ملفات ذات صلة بتصحيح أخطاء التطبيق
الملفات الكبيرة التي تتسبب في تجاوز التطبيق لحصة النسخ الاحتياطي البالغة 25 ميغابايت
يجب أن يتضمّن كل من العنصرَين <include> و<exclude> السمتَين التاليتَين:
domainتحدّد هذه السمة موقع المرجع. تشمل القيم الصالحة لهذه السمة ما يلي:
root: هو الدليل الموجود على نظام الملفات والذي يتم فيه تخزين جميع الملفات الخاصة بهذا التطبيق.-
file: الأدلة التي تعرضهاgetFilesDir() -
database: الأدلة التي تعرضهاgetDatabasePath()يتم تخزين قواعد البيانات التي تم إنشاؤها باستخدامSQLiteOpenHelperهنا. sharedpref: الدليل الذي يتم فيه تخزينSharedPreferences-
external: الدليل الذي تعرضه الدالةgetExternalFilesDir() -
device_root: مثلrootولكن لمساحة التخزين المحمية على الجهاز -
device_file: مثلfileولكن لمساحة التخزين المحمية على الجهاز -
device_database: مثلdatabaseولكن لمساحة التخزين المحمية بالجهاز -
device_sharedpref: مثلsharedprefولكن لوحدة التخزين المحمية بالجهاز.
pathتحدّد هذه السمة ملفًا أو مجلدًا لتضمينه في النسخة الاحتياطية أو استبعاده منها. يُرجى مراعاة ما يلي:
- لا تتيح هذه السمة استخدام أحرف البدل أو بنية التعبيرات العادية.
- يمكنك الرجوع إلى الدليل الحالي باستخدام
./، ولكن لا يمكنك الرجوع إلى الدليل الرئيسي، مثلاً باستخدام..، وذلك لأسباب تتعلق بالأمان. - في حال تحديد دليل، تنطبق القاعدة على جميع الملفات في الدليل والأدلة الفرعية المتكررة.
ضبط عمليات النقل بين المنصات
بدءًا من الإصدار Android 16 QPR2 (المستوى 36.1 من واجهة برمجة التطبيقات)، يمكنك ضبط ميزة "النسخ الاحتياطي التلقائي" لنقل البيانات من أجهزة غير Android وإليها. لإجراء ذلك، أضِف العنصر <cross-platform-transfer> ضمن إعدادات <data-extraction-rules>، كما هو موضّح في بنية Android 12 أو الإصدارات الأحدث. يجب تحديد النظام الأساسي المستهدف باستخدام السمة platform المطلوبة. القيمة الوحيدة المسموح بها هي ios.
داخل هذا القسم، يمكنك استخدام عناصر <include> و<exclude> العادية كما هو موضّح في بنية عناصر التضمين والاستبعاد لتحديد البيانات التي سيتم نقلها.
بالإضافة إلى ذلك، يجب تضمين العنصر <platform-specific-params> للمساعدة في مطابقة نظامك مع التطبيق المقابل على المنصة المستهدَفة.
يحتوي هذا العنصر على السمات المطلوبة التالية:
bundleId: معرّف حزمة التطبيق على النظام الأساسي الآخر (مثلاً، معرّف حزمة تطبيقك على iOS).- استبدِل
teamIdبرقم تعريف الفريق الخاص بالتطبيق على المنصة الأخرى (مثل رقم تعريف الفريق الخاص بتطبيقك على iOS). contentVersion: سلسلة إصدار تحدّدها أنت، وتكون مرتبطة بتنسيق البيانات الذي يتم تصديره.
تُستخدَم السمتان bundleId وteamId للمساعدة في التحقّق من سلامة البيانات والمطابقة السليمة بين التطبيقات. وتضمن هذه الشهادات عدم نقل البيانات إلى التطبيق المحدّد على النظام الأساسي الآخر إلا أثناء عملية التصدير، وعدم استيراد تطبيق Android هذا للبيانات إلا من هذا التطبيق المحدّد أثناء عملية الاستيراد.
للحصول على تحكّم أكثر دقة في عملية تحويل البيانات ونقلها
بما يتجاوز ما توفّره قواعد XML، يمكنك تنفيذ
BackupAgent مخصّص واستخدام واجهات برمجة التطبيقات لنقل البيانات بين المنصات.
ربط الملفات لعمليات النقل على أجهزة iOS
عند نقل الملفات إلى iOS، يتم ربط domain وpath Android اللذين تحدّدهما في قواعد <include> ببنية دليل معيّنة. يعرض الجدول التالي مسارات الوجهة على iOS بالنسبة إلى جذر وجهة النقل، استنادًا إلى domain Android:
الإصدار domain من نظام التشغيل Android |
المسار على iOS (بالنسبة إلى جذر النقل) |
|---|---|
root |
app/ |
file |
app/files/ |
database |
app/databases/ |
sharedpref |
app/shared_prefs/ |
external |
external/files/ |
device_root |
device/app/ |
device_file |
device/app/files/ |
device_database |
device/app/databases/ |
device_sharedpref |
device/app/shared_prefs/ |
على سبيل المثال، سيكون الملف المضمّن مع <include domain="file"
path="my_settings.txt"/> متاحًا على جهاز iOS في app/files/my_settings.txt بالنسبة إلى جذر وجهة النقل.
تنفيذ BackupAgent
لا تحتاج التطبيقات التي تستخدم ميزة "الاحتفاظ بنسخة احتياطية تلقائيًا" إلى تنفيذ BackupAgent.
ومع ذلك، يمكنك تنفيذ BackupAgent مخصّص اختياريًا. عادةً، هناك سببان لإجراء ذلك:
تريد تلقّي إشعارات بأحداث النسخ الاحتياطي، مثل
onRestoreFinished()وonQuotaExceeded(). يتم تنفيذ طرق معاودة الاتصال هذه حتى إذا لم يكن التطبيق قيد التشغيل.لا يمكنك التعبير بسهولة عن مجموعة الملفات التي تريد الاحتفاظ بنسخة احتياطية منها باستخدام قواعد XML. في هذه الحالات النادرة، يمكنك تنفيذ
BackupAgentيتجاهلonFullBackup(FullBackupDataOutput)لتخزين ما تريد. للاحتفاظ بالتنفيذ التلقائي للنظام، استدعِ الطريقة المقابلة في الفئة الرئيسية باستخدامsuper.onFullBackup().
في حال تنفيذ BackupAgent، يتوقّع النظام تلقائيًا أن ينفّذ تطبيقك عملية الاحتفاظ بنسخة احتياطية من أزواج المفاتيح والقيم واستعادتها. لاستخدام ميزة "النسخ الاحتياطي التلقائي" المستندة إلى الملفات بدلاً من ذلك، اضبط السمة android:fullBackupOnly على true في بيان تطبيقك.
أثناء عمليات النسخ الاحتياطي والاستعادة التلقائية، يشغّل النظام التطبيق في وضع مقيّد لمنع التطبيق من الوصول إلى الملفات التي قد تتسبّب في حدوث تعارضات، وللسماح للتطبيق بتنفيذ طرق رد الاتصال في BackupAgent. في هذا الوضع المقيد، لا يتم تشغيل النشاط الرئيسي للتطبيق تلقائيًا، ولا يتم تهيئة موفّري المحتوى، ويتم إنشاء مثيل Application لفئة الأساس بدلاً من أي فئة فرعية تم تعريفها في ملف البيان الخاص بالتطبيق.
يجب أن تنفّذ BackupAgent الطريقتَين المجردتَين onBackup() وonRestore()، اللتَين تُستخدَمان لإنشاء نسخة احتياطية من قيم المفاتيح. إذا كنت لا تريد إجراء نسخة احتياطية من بيانات المفتاح والقيمة، يمكنك ترك تنفيذ هذه الطرق فارغًا.
لمزيد من المعلومات، يُرجى الاطّلاع على توسيع نطاق BackupAgent.
التعامل مع عمليات النقل بين المنصات في BackupAgent
اعتبارًا من الإصدار Android 16 QPR2 (المستوى 36.1 من واجهة برمجة التطبيقات)، تتوفّر عدة واجهات برمجة تطبيقات جديدة
في BackupAgent لتحسين عمليات نقل البيانات بين المنصات.
علامة النقل الجديدة:
FLAG_CROSS_PLATFORM_TRANSFER_IOS: تتم إضافة هذا الإبلاغ إلىtransportFlagsالمقدَّم إلىBackupAgent.- في
onFullBackup، يتم ضبط هذه العلامة إذا كانت عملية النسخ الاحتياطي الحالية جزءًا من عملية تصدير البيانات إلى جهاز iOS. - في الدالة الجديدة
onRestoreFile، يتم ضبط هذا العلم إذا كانت البيانات يتم استيرادها من جهاز iOS.
- في
طريقة onRestoreFile جديدة:
تم تقديم تحميل زائد جديد للدالة onRestoreFile، والذي يأخذ مَعلمة FullRestoreDataInput واحدة. يوفّر هذا العنصر المزيد من المعلومات عن عملية الاستعادة:
-
FullRestoreDataInput.getTransportFlags(): تعرض هذه السمة علامات النقل لعملية الاستعادة الحالية، والتي يمكن أن تتضمّنFLAG_CROSS_PLATFORM_TRANSFER_IOS. -
FullRestoreDataInput.getContentVersion(): تعرض هذه السمة سلسلة إصدار المحتوى التي يقدّمها التطبيق المصدر على المنصة الأخرى أثناء عملية نقل البيانات بين المنصات. تكون هذه القيمة سلسلة فارغة إذا لم يقدّمها المصدر.
طريقة جديدة لتقدير الحجم:
onEstimateFullBackupBytes(): تتيح لك هذه الطريقة تقديم حجم تقديري للبيانات التي ينوي تطبيقك إجراء نسخ احتياطي لها. ننصحك بشدة بتنفيذ هذه الخطوات إذا كان تطبيقك يجري عمليات تحويل كبيرة للبيانات أثناء إجراء النسخ الاحتياطي أو يتعامل مع كمية كبيرة من البيانات، لأنّ ذلك يمكن أن يحسّن الكفاءة من خلال تجنُّب التشغيل التجريبي التلقائي للنظام. بالنسبة إلى التطبيقات التي تتضمّن نسخًا احتياطية صغيرة ومباشرة، لا تكون هذه الطريقة ضرورية عادةً.
مثال على الاستخدام:
Kotlin
// In your custom BackupAgent class
override fun onFullBackup(out: FullBackupDataOutput) {
// Check if this is a cross-platform export to iOS
if ((out.transportFlags and FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
Log.d(TAG, "onFullBackup for iOS transfer")
// Your custom export logic here
// Call fullBackupFile() for files to include
}
}
override fun onRestoreFile(input: FullRestoreDataInput) {
if ((input.transportFlags and FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
val sourceContentVersion = input.contentVersion
Log.d(TAG, "onRestoreFile from iOS, content version: $sourceContentVersion")
// Your custom import logic here, using input.data, input.destination, etc.
}
}
// Optional: Provide an estimate of the backup size
override fun onEstimateFullBackupBytes(): Long {
return calculateEstimatedBackupSize()
}
Java
// In your custom BackupAgent class
@Override
public void onFullBackup(FullBackupDataOutput out) throws IOException {
// Check if this is a cross-platform export to iOS
if ((out.getTransportFlags() & FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
Log.d(TAG, "onFullBackup for iOS transfer");
// Your custom export logic here
// Call fullBackupFile() for files to include
}
}
@Override
public void onRestoreFile(FullRestoreDataInput input) {
if ((input.getTransportFlags() & FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
String sourceContentVersion = input.getContentVersion();
Log.d(TAG, "onRestoreFile from iOS, content version: " + sourceContentVersion);
// Your custom import logic here, using input.getData(), input.getDestination(), etc.
}
}
// Optional: Provide an estimate of the backup size
@Override
public long onEstimateFullBackupBytes() {
return calculateEstimatedBackupSize();
}