تعمل ميزة الاحتفاظ التلقائي بنسخة احتياطية من بيانات التطبيقات على الاحتفاظ تلقائيًا بنسخة احتياطية من بيانات المستخدم من التطبيقات التي تستهدف نظام التشغيل Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث وتعمل عليه. يحافظ Android على بيانات التطبيق من خلال تحميلها إلى Google Drive الخاص بالمستخدم، حيث تكون محمية ببيانات اعتماد حساب المستخدم على Google. يتم تشفير النسخة الاحتياطية تشفيرًا تامًا بين الأطراف على الأجهزة التي تعمل بنظام التشغيل Android 9 أو الإصدارات الأحدث باستخدام رقم التعريف الشخصي أو النقش أو كلمة المرور الخاصة بالجهاز. ويمكن لكل تطبيق تخصيص ما يصل إلى 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 أدوات تتيح لك بدء عملية الاحتفاظ بنسخة احتياطية من تطبيقك يدويًا. لمزيد من المعلومات، يُرجى الاطّلاع على اختبار الاحتفاظ بنسخة احتياطية والاستعادة.
استعادة الجدول الزمني
تتم استعادة البيانات عند تثبيت التطبيق، سواء من "متجر Google 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 في تطبيقك.
- بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 11 أو إصدار أقدم، يُرجى الاطّلاع على مقالة التحكّم في الاحتفاظ بنسخة احتياطية على الأجهزة التي تعمل بنظام التشغيل Android 11 أو إصدار أقدم.
- بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 12 أو الإصدارات الأحدث، تستخدم التطبيقات التي تستهدف المستوى 31 أو أعلى لواجهة برمجة التطبيقات تنسيق
data-extraction-rules. يُرجى الاطّلاع على مقالة التحكّم في الاحتفاظ بنسخة احتياطية على Android 12 أو الإصدارات الأحدث لمعرفة التفاصيل. - يتيح تنسيق
data-extraction-rulesأيضًا عمليات النقل من عدّة منصات (على سبيل المثال، إلى iOS). تتوفّر هذه الميزة اعتبارًا من الإصدار Android 16 QPR2. مزيد من المعلومات في مقالة ضبط عمليات النقل من عدّة منصات
التحكّم في الاحتفاظ بنسخة احتياطية على أجهزة Android 11 والإصدارات الأقدم
اتّبِع الخطوات الواردة في هذا القسم للتحكّم في الملفات التي يتم الاحتفاظ بنسخة احتياطية منها على الأجهزة التي تعمل بالإصدار 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.
}
التحكّم في الاحتفاظ بنسخة احتياطية على Android 12 أو الإصدارات الأحدث
إذا كان تطبيقك يستهدف الإصدار 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 التالية لملف الإعداد الذي يتحكّم في الاحتفاظ بنسخة احتياطية للأجهزة التي تعمل بنظام التشغيل 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>
الإصدار 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 مع الاستمرار في نقله أثناء عمليات النقل من جهاز إلى آخر
(D2D) أو عمليات النقل من عدّة منصات. هذا مفيد إذا كانت لديك ملفات كبيرة جدًا لا يمكن الاحتفاظ بنسخة احتياطية منها في السحابة الإلكترونية ولكن يمكن نقلها بين الأجهزة بدون مشكلة.
إذا لم تكن هناك قواعد لوضع نسخ احتياطي معيّن، مثلاً في حال عدم توفّر القسم <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 بالنسبة إلى جذر وجهة النقل،
استنادًا إلى Android domain:
Android domain |
المسار على 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 لإتاحة عمليات نقل البيانات من عدّة منصات بشكل أفضل.
New Transport Flag:
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();
}