با پشتیبان‌گیری خودکار از اطلاعات کاربر نسخه پشتیبان تهیه کنید

پشتیبان‌گیری خودکار برای برنامه‌ها به‌طور خودکار از داده‌های کاربر از برنامه‌هایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار داده و اجرا می‌کنند، نسخه پشتیبان تهیه می‌کند. Android داده‌های برنامه را با آپلود آن در Google Drive کاربر حفظ می‌کند، جایی که توسط اعتبار حساب Google کاربر محافظت می‌شود. پشتیبان‌گیری در دستگاه‌های دارای Android 9 یا بالاتر با استفاده از پین، الگو یا رمز عبور دستگاه، رمزگذاری شده است. هر برنامه می تواند حداکثر 25 مگابایت داده پشتیبان را برای هر کاربر برنامه اختصاص دهد. هیچ هزینه ای برای ذخیره سازی داده های پشتیبان وجود ندارد. برنامه شما می‌تواند فرآیند پشتیبان‌گیری را سفارشی کند یا با غیرفعال کردن پشتیبان‌گیری، از آن انصراف دهد.

برای مروری بر گزینه‌های پشتیبان‌گیری Android و راهنمایی درباره اینکه کدام داده‌ها باید پشتیبان‌گیری و بازیابی شوند، به نمای کلی پشتیبان‌گیری از داده‌ها مراجعه کنید.

فایل هایی که بک آپ گرفته شده اند

به طور پیش‌فرض، پشتیبان‌گیری خودکار شامل فایل‌هایی در بیشتر فهرست‌های راهنمای سیستم می‌شود که به برنامه شما اختصاص داده شده‌اند:

  • فایل های ترجیحی مشترک

  • فایل‌هایی که در حافظه داخلی برنامه شما ذخیره می‌شوند و توسط getFilesDir() یا getDir(String, int) قابل دسترسی هستند.

  • فایل‌های موجود در دایرکتوری که توسط getDatabasePath(String) برگردانده می‌شوند، که شامل فایل‌های ایجاد شده با کلاس SQLiteOpenHelper نیز می‌شود.

  • فایل‌های موجود در حافظه خارجی در دایرکتوری که توسط getExternalFilesDir(String) برگردانده شده‌اند.

پشتیبان‌گیری خودکار فایل‌های موجود در فهرست‌های بازگردانده شده توسط getCacheDir() ، getCodeCacheDir() و getNoBackupFilesDir() را مستثنی می‌کند. فایل‌های ذخیره‌شده در این مکان‌ها فقط به‌طور موقت مورد نیاز هستند و عمداً از عملیات پشتیبان‌گیری حذف می‌شوند.

می‌توانید برنامه خود را طوری پیکربندی کنید که فایل‌های خاصی را شامل و حذف کند. برای اطلاعات بیشتر به بخش Include and Exclude files مراجعه کنید.

مکان پشتیبان گیری

داده های پشتیبان در یک پوشه خصوصی در حساب کاربری گوگل درایو کاربر ذخیره می شود که به ازای هر برنامه 25 مگابایت محدود می شود. داده های ذخیره شده در سهمیه Google Drive شخصی کاربر به حساب نمی آید. فقط آخرین نسخه پشتیبان ذخیره می شود. هنگامی که یک نسخه پشتیبان تهیه می شود، هر نسخه پشتیبان قبلی حذف می شود. داده های پشتیبان توسط کاربر یا سایر برنامه های دستگاه قابل خواندن نیست.

کاربران می‌توانند فهرستی از برنامه‌هایی را که در برنامه اندروید Google Drive پشتیبان‌گیری شده‌اند، مشاهده کنند. در دستگاه‌های مجهز به Android، کاربران می‌توانند این فهرست را در کشوی پیمایش برنامه Drive در زیر تنظیمات > پشتیبان‌گیری و بازنشانی پیدا کنند.

پشتیبان‌گیری‌ها از هر دستگاه-setup-lifetime در مجموعه داده‌های جداگانه ذخیره می‌شوند، همانطور که در مثال‌های زیر توضیح داده شده است:

  • اگر کاربر دارای دو دستگاه باشد، یک مجموعه داده پشتیبان برای هر دستگاه وجود دارد.

  • اگر کاربر دستگاهی را به تنظیمات کارخانه بازنشانی کند و سپس دستگاه را با همان حساب راه‌اندازی کند، نسخه پشتیبان در یک مجموعه داده جدید ذخیره می‌شود. مجموعه داده های منسوخ شده به طور خودکار پس از یک دوره عدم فعالیت حذف می شوند.

برنامه پشتیبان گیری

پشتیبان گیری به طور خودکار زمانی انجام می شود که تمام شرایط زیر برآورده شود:

  • کاربر پشتیبان گیری را در دستگاه فعال کرده است. در Android 9، این تنظیم در Settings > System > Backup قرار دارد.
  • حداقل 24 ساعت از آخرین پشتیبان گیری گذشته است.
  • دستگاه بیکار است.
  • دستگاه به یک شبکه Wi-Fi متصل است (اگر کاربر دستگاه از تهیه نسخه پشتیبان از داده های تلفن همراه استفاده نکرده باشد).

در عمل، این شرایط تقریباً هر شب اتفاق می‌افتد، اما ممکن است دستگاه هرگز پشتیبان‌گیری نکند (مثلاً اگر هرگز به شبکه وصل نشود). برای حفظ پهنای باند شبکه، آپلود فقط در صورتی انجام می‌شود که داده‌های برنامه تغییر کرده باشد.

در طول پشتیبان‌گیری خودکار، سیستم برنامه را خاموش می‌کند تا مطمئن شود که دیگر در سیستم فایل نمی‌نویسد. به‌طور پیش‌فرض، سیستم پشتیبان‌گیری برنامه‌هایی را که در پیش‌زمینه اجرا می‌شوند نادیده می‌گیرد تا از تجربه کاربری ضعیف جلوگیری کند. می‌توانید با تنظیم ویژگی android:backupInForeground روی true، رفتار پیش‌فرض را لغو کنید.

برای ساده‌سازی تست، اندروید شامل ابزارهایی می‌شود که به شما امکان می‌دهد به صورت دستی یک نسخه پشتیبان از برنامه خود را شروع کنید. برای اطلاعات بیشتر، تست پشتیبان‌گیری و بازیابی را ببینید.

بازیابی برنامه زمانی

هر زمان که برنامه نصب شود، داده ها بازیابی می شوند، چه از فروشگاه Play، در حین راه اندازی دستگاه (زمانی که سیستم برنامه های نصب شده قبلی را نصب می کند)، یا با اجرای نصب adb . عملیات بازیابی پس از نصب APK اما قبل از در دسترس قرار گرفتن برنامه برای راه اندازی توسط کاربر انجام می شود.

در طول ویزارد اولیه راه اندازی دستگاه، به کاربر لیستی از مجموعه داده های پشتیبان در دسترس نشان داده می شود و از آنها خواسته می شود که داده ها را از کدام یک بازیابی کند. هر کدام از مجموعه داده های پشتیبان انتخاب شود، به مجموعه داده اجدادی دستگاه تبدیل می شود. این دستگاه می‌تواند از پشتیبان‌های خود یا مجموعه داده‌های اجدادی خود را بازیابی کند. اگر نسخه‌های پشتیبان از هر دو منبع موجود باشد، دستگاه پشتیبان‌گیری خود را در اولویت قرار می‌دهد. اگر کاربر از طریق جادوگر راه اندازی دستگاه نرفته باشد، دستگاه فقط می تواند از نسخه پشتیبان خود بازیابی کند.

برای ساده‌سازی تست، اندروید شامل ابزارهایی است که به شما امکان می‌دهد بازیابی برنامه خود را به صورت دستی شروع کنید. برای اطلاعات بیشتر، تست پشتیبان‌گیری و بازیابی را ببینید.

بک آپ را فعال و غیرفعال کنید

برنامه‌هایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار می‌دهند، به‌طور خودکار در پشتیبان‌گیری خودکار شرکت می‌کنند. در فایل مانیفست برنامه خود، مقدار بولی android:allowBackup برای فعال یا غیرفعال کردن پشتیبان‌گیری تنظیم کنید. مقدار پیش‌فرض true است، اما توصیه می‌کنیم که مشخصه را به صراحت در مانیفست خود تنظیم کنید، همانطور که در مثال زیر نشان داده شده است:

<manifest ... >
    ...
    <application android:allowBackup="true" ... >
        ...
    </application>
</manifest>

با تنظیم android:allowBackup روی false می توانید پشتیبان گیری را غیرفعال کنید. اگر برنامه شما بتواند وضعیت خود را از طریق مکانیسم دیگری بازسازی کند یا اگر برنامه شما با اطلاعات حساس سروکار دارد، ممکن است بخواهید این کار را انجام دهید.

شامل و حذف فایل ها

به طور پیش فرض، سیستم تقریباً از تمام داده های برنامه نسخه پشتیبان تهیه می کند. برای اطلاعات بیشتر، به بخش مربوط به فایل‌هایی که پشتیبان‌گیری می‌شوند، مراجعه کنید.

این بخش به شما نشان می‌دهد که چگونه قوانین XML سفارشی را برای کنترل موارد پشتیبان‌گیری شده تعریف کنید. اگر برنامه شما Android 12 (سطح API 31) یا بالاتر را هدف قرار می‌دهد، باید مجموعه دیگری از قوانین پشتیبان‌گیری XML را مشخص کنید ، همانطور که در این بخش توضیح داده شده است تا از تغییرات بازیابی نسخه پشتیبان که برای دستگاه‌هایی که این نسخه‌های Android را اجرا می‌کنند، پشتیبانی کند.

پشتیبان‌گیری را در اندروید ۱۱ و پایین‌تر کنترل کنید

مراحل این بخش را دنبال کنید تا کنترل کنید از کدام فایل‌ها در دستگاه‌های دارای Android 11 (سطح API 30) یا پایین‌تر پشتیبان‌گیری شود.

  1. همانطور که در مثال زیر نشان داده شده است، در فایل AndroidManifest.xml ، ویژگی android:fullBackupContent را به عنصر <application> اضافه کنید. این ویژگی به یک فایل XML اشاره می کند که حاوی قوانین پشتیبان است.

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
  2. یک فایل 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) یا بالاتر اضافه کنید:

اگر دستگاه‌های توسعه‌دهنده خود را به اندروید 9 ارتقا داده‌اید، باید پشتیبان‌گیری از داده‌ها را غیرفعال کرده و پس از ارتقا دوباره فعال کنید. این به این دلیل است که اندروید تنها پس از اطلاع دادن به کاربران در تنظیمات یا جادوگر راه‌اندازی، پشتیبان‌گیری‌ها را با یک راز سمت کلاینت رمزگذاری می‌کند.

برای اعلام شرایط گنجاندن، ویژگی 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‌های_ FLAG_DEVICE_TO_DEVICE_TRANSFER این الزامات شرطی را برای منطق پشتیبان‌گیری خود اعمال کنید. .

قطعه کد زیر نمونه ای از استفاده از این روش را نشان می دهد:

کاتلین

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.
}

جاوا

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 یا بالاتر پشتیبان‌گیری شود.

  1. همانطور که در مثال زیر نشان داده شده است، در فایل AndroidManifest.xml ، ویژگی android:dataExtractionRules را به عنصر <application> اضافه کنید. این ویژگی به یک فایل XML اشاره می کند که حاوی قوانین پشتیبان است.

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
  2. یک فایل 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 برای فایل پیکربندی بسته به نسخه اندرویدی که برنامه شما در آن هدف قرار داده و اجرا می‌شود، متفاوت است.

اندروید 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>

اندروید 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 Drive حذف کنید، در حالی که همچنان آن را در حین انتقال دستگاه به دستگاه (D2D) منتقل می‌کنید. اگر فایل‌هایی دارید که برای پشتیبان‌گیری در فضای ابری خیلی بزرگ هستند، اما می‌توانند بدون مشکل بین دستگاه‌ها منتقل شوند، مفید است.

اگر قوانینی برای یک حالت پشتیبان خاص وجود نداشته باشد، مثلاً اگر بخش <device-transfer> وجود نداشته باشد، آن حالت برای همه محتوا به جز دایرکتوری‌های no-backup و cache کاملاً فعال می‌شود، همانطور که در فایل‌هایی که پشتیبان‌گیری می‌شوند توضیح داده شده است. بخش

برنامه شما می‌تواند پرچم disableIfNoEncryptionCapabilities را در بخش <cloud-backup> تنظیم کند تا مطمئن شود که پشتیبان‌گیری تنها در صورتی انجام می‌شود که بتوان آن را رمزگذاری کرد، مانند زمانی که کاربر صفحه قفل داشته باشد. اگر دستگاه کاربر نتواند از رمزگذاری پشتیبانی کند، تنظیم این محدودیت، ارسال نسخه پشتیبان به ابر را متوقف می‌کند، اما از آنجایی که انتقال‌های D2D به سرور ارسال نمی‌شوند، حتی در دستگاه‌هایی که از رمزگذاری پشتیبانی نمی‌کنند به کار خود ادامه می‌دهند.

نحو برای شامل و حذف عناصر

در داخل تگ‌های <full-backup-content> ، <cloud-backup> و <device-transfer> (بسته به نسخه Android دستگاه و targetSDKVersion برنامه شما)، می‌توانید عناصر <include> و <exclude> را تعریف کنید:

<include>

یک فایل یا پوشه را برای پشتیبان گیری مشخص می کند. به طور پیش فرض، پشتیبان گیری خودکار تقریباً همه فایل های برنامه را شامل می شود. اگر عنصر <include> را مشخص کنید، سیستم دیگر به طور پیش‌فرض شامل هیچ فایلی نمی‌شود و فقط از فایل‌های مشخص‌شده نسخه پشتیبان تهیه می‌کند. برای گنجاندن چندین فایل، از چندین عنصر <include> استفاده کنید.

در اندروید 11 و نسخه‌های پایین‌تر ، این عنصر همچنین می‌تواند حاوی ویژگی‌های requireFlags باشد، که در قسمتی که نحوه تعریف الزامات شرطی برای پشتیبان‌گیری را توضیح می‌دهد، با جزئیات بیشتری به آن پرداخته می‌شود.

فایل‌های موجود در دایرکتوری‌هایی که توسط getCacheDir() ، getCodeCacheDir() یا getNoBackupFilesDir() بازگردانده می‌شوند، همیشه حذف می‌شوند، حتی اگر بخواهید آنها را اضافه کنید.

<exclude>

فایل یا پوشه ای را برای حذف در حین پشتیبان گیری مشخص می کند. در اینجا چند فایل وجود دارد که معمولاً از پشتیبان‌گیری حذف می‌شوند:

  • فایل‌هایی که دارای شناسه‌های خاص دستگاه هستند، یا توسط سرور صادر شده یا در دستگاه تولید شده‌اند. به عنوان مثال، Firebase Cloud Messaging (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

فایل یا پوشه ای را برای گنجاندن یا حذف از پشتیبان تعیین می کند. به موارد زیر توجه کنید:

  • این ویژگی از دستور عام یا دستور عبارت منظم پشتیبانی نمی کند.
  • شما می توانید با استفاده از ./ به دایرکتوری فعلی ارجاع دهید، اما به دلایل امنیتی نمی توانید به دایرکتوری والد ارجاع دهید، مانند استفاده از .. .
  • اگر دایرکتوری را مشخص کنید، این قانون برای همه فایل‌های دایرکتوری و زیر شاخه‌های بازگشتی اعمال می‌شود.

BackupAgent را پیاده سازی کنید

برنامه‌هایی که پشتیبان‌گیری خودکار را پیاده‌سازی می‌کنند، نیازی به اجرای BackupAgent ندارند. با این حال، می توانید به صورت اختیاری یک BackupAgent سفارشی را پیاده سازی کنید. به طور معمول، دو دلیل برای انجام این کار وجود دارد:

  • می خواهید اعلان رویدادهای پشتیبان، مانند onRestoreFinished() و onQuotaExceeded(long, long) دریافت کنید. این روش‌های پاسخ به تماس حتی اگر برنامه در حال اجرا نباشد اجرا می‌شوند.

  • شما نمی توانید به راحتی مجموعه فایل هایی را که می خواهید از آنها نسخه پشتیبان تهیه کنید با قوانین XML بیان کنید. در این موارد نادر، می‌توانید یک BackupAgent پیاده‌سازی کنید که onFullBackup(FullBackupDataOutput) را لغو می‌کند تا آنچه را که می‌خواهید ذخیره کند. برای حفظ اجرای پیش‌فرض سیستم، متد مربوطه را در superclass با super.onFullBackup() فراخوانی کنید.

اگر یک BackupAgent پیاده‌سازی می‌کنید، به‌طور پیش‌فرض سیستم انتظار دارد که برنامه شما پشتیبان‌گیری و بازیابی کلید-مقدار را انجام دهد. برای استفاده از پشتیبان‌گیری خودکار مبتنی بر فایل، ویژگی android:fullBackupOnly را در مانیفست برنامه‌تان روی true تنظیم کنید.

در طول عملیات پشتیبان‌گیری و بازیابی خودکار، سیستم برنامه را در حالت محدود راه‌اندازی می‌کند تا هم از دسترسی برنامه به فایل‌هایی که ممکن است باعث تداخل می‌شود جلوگیری کند و هم به برنامه اجازه دهد روش‌های برگشت به تماس را در BackupAgent خود اجرا کند. در این حالت محدود، فعالیت اصلی برنامه به‌طور خودکار راه‌اندازی نمی‌شود، ارائه‌دهندگان محتوای آن مقداردهی اولیه نمی‌شوند، و به‌جای هر زیرکلاس اعلام‌شده در مانیفست برنامه، Application کلاس پایه نمونه‌سازی می‌شود.

BackupAgent شما باید متدهای انتزاعی onBackup() و onRestore() را پیاده سازی کند که برای پشتیبان گیری کلید-مقدار استفاده می شود. اگر نمی‌خواهید پشتیبان‌گیری با مقدار کلید انجام دهید، می‌توانید پیاده‌سازی آن روش‌ها را خالی بگذارید.

برای اطلاعات بیشتر، به Extend BackupAgent مراجعه کنید.

،

پشتیبان‌گیری خودکار برای برنامه‌ها به‌طور خودکار از داده‌های کاربر از برنامه‌هایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار داده و اجرا می‌کنند، نسخه پشتیبان تهیه می‌کند. Android داده‌های برنامه را با آپلود آن در Google Drive کاربر حفظ می‌کند، جایی که توسط اعتبار حساب Google کاربر محافظت می‌شود. پشتیبان‌گیری در دستگاه‌های دارای Android 9 یا بالاتر با استفاده از پین، الگو یا رمز عبور دستگاه، رمزگذاری شده است. هر برنامه می تواند حداکثر 25 مگابایت داده پشتیبان را برای هر کاربر برنامه اختصاص دهد. هیچ هزینه ای برای ذخیره سازی داده های پشتیبان وجود ندارد. برنامه شما می‌تواند فرآیند پشتیبان‌گیری را سفارشی کند یا با غیرفعال کردن پشتیبان‌گیری، از آن انصراف دهد.

برای مروری بر گزینه‌های پشتیبان‌گیری Android و راهنمایی درباره اینکه کدام داده‌ها باید پشتیبان‌گیری و بازیابی شوند، به نمای کلی پشتیبان‌گیری از داده‌ها مراجعه کنید.

فایل هایی که بک آپ گرفته شده اند

به طور پیش‌فرض، پشتیبان‌گیری خودکار شامل فایل‌هایی در بیشتر فهرست‌های راهنمای سیستم می‌شود که به برنامه شما اختصاص داده شده‌اند:

  • فایل های ترجیحی مشترک

  • فایل‌هایی که در حافظه داخلی برنامه شما ذخیره می‌شوند و توسط getFilesDir() یا getDir(String, int) قابل دسترسی هستند.

  • فایل‌های موجود در دایرکتوری که توسط getDatabasePath(String) برگردانده می‌شوند، که شامل فایل‌های ایجاد شده با کلاس SQLiteOpenHelper نیز می‌شود.

  • فایل‌های موجود در حافظه خارجی در دایرکتوری که توسط getExternalFilesDir(String) برگردانده شده‌اند.

پشتیبان‌گیری خودکار فایل‌های موجود در فهرست‌های بازگردانده شده توسط getCacheDir() ، getCodeCacheDir() و getNoBackupFilesDir() را مستثنی می‌کند. فایل‌های ذخیره‌شده در این مکان‌ها فقط به‌طور موقت مورد نیاز هستند و عمداً از عملیات پشتیبان‌گیری حذف می‌شوند.

می‌توانید برنامه خود را طوری پیکربندی کنید که فایل‌های خاصی را شامل و حذف کند. برای اطلاعات بیشتر به بخش Include and Exclude files مراجعه کنید.

مکان پشتیبان گیری

داده های پشتیبان در یک پوشه خصوصی در حساب کاربری گوگل درایو کاربر ذخیره می شود که به ازای هر برنامه 25 مگابایت محدود می شود. داده های ذخیره شده در سهمیه Google Drive شخصی کاربر به حساب نمی آید. فقط آخرین نسخه پشتیبان ذخیره می شود. هنگامی که یک نسخه پشتیبان تهیه می شود، هر نسخه پشتیبان قبلی حذف می شود. داده های پشتیبان توسط کاربر یا سایر برنامه های دستگاه قابل خواندن نیست.

کاربران می‌توانند فهرستی از برنامه‌هایی را که در برنامه اندروید Google Drive پشتیبان‌گیری شده‌اند، مشاهده کنند. در دستگاه‌های مجهز به Android، کاربران می‌توانند این فهرست را در کشوی پیمایش برنامه Drive در زیر تنظیمات > پشتیبان‌گیری و بازنشانی پیدا کنند.

پشتیبان‌گیری‌ها از هر دستگاه-setup-lifetime در مجموعه داده‌های جداگانه ذخیره می‌شوند، همانطور که در مثال‌های زیر توضیح داده شده است:

  • اگر کاربر دارای دو دستگاه باشد، یک مجموعه داده پشتیبان برای هر دستگاه وجود دارد.

  • اگر کاربر دستگاهی را به تنظیمات کارخانه بازنشانی کند و سپس دستگاه را با همان حساب راه‌اندازی کند، نسخه پشتیبان در یک مجموعه داده جدید ذخیره می‌شود. مجموعه داده های منسوخ شده به طور خودکار پس از یک دوره عدم فعالیت حذف می شوند.

برنامه پشتیبان گیری

پشتیبان گیری به طور خودکار زمانی انجام می شود که تمام شرایط زیر برآورده شود:

  • کاربر پشتیبان گیری را در دستگاه فعال کرده است. در Android 9، این تنظیم در Settings > System > Backup قرار دارد.
  • حداقل 24 ساعت از آخرین پشتیبان گیری گذشته است.
  • دستگاه بیکار است.
  • دستگاه به یک شبکه Wi-Fi متصل است (اگر کاربر دستگاه از تهیه نسخه پشتیبان از داده های تلفن همراه استفاده نکرده باشد).

در عمل، این شرایط تقریباً هر شب اتفاق می‌افتد، اما ممکن است دستگاه هرگز پشتیبان‌گیری نکند (مثلاً اگر هرگز به شبکه وصل نشود). برای حفظ پهنای باند شبکه، آپلود فقط در صورتی انجام می‌شود که داده‌های برنامه تغییر کرده باشد.

در طول پشتیبان‌گیری خودکار، سیستم برنامه را خاموش می‌کند تا مطمئن شود که دیگر در سیستم فایل نمی‌نویسد. به‌طور پیش‌فرض، سیستم پشتیبان‌گیری برنامه‌هایی را که در پیش‌زمینه اجرا می‌شوند نادیده می‌گیرد تا از تجربه کاربری ضعیف جلوگیری کند. می‌توانید با تنظیم ویژگی android:backupInForeground روی true، رفتار پیش‌فرض را لغو کنید.

برای ساده‌سازی تست، اندروید شامل ابزارهایی می‌شود که به شما امکان می‌دهد به صورت دستی یک نسخه پشتیبان از برنامه خود را شروع کنید. برای اطلاعات بیشتر، تست پشتیبان‌گیری و بازیابی را ببینید.

بازیابی برنامه زمانی

هر زمان که برنامه نصب شود، داده ها بازیابی می شوند، چه از فروشگاه Play، در حین راه اندازی دستگاه (زمانی که سیستم برنامه های نصب شده قبلی را نصب می کند)، یا با اجرای نصب adb . عملیات بازیابی پس از نصب APK اما قبل از در دسترس قرار گرفتن برنامه برای راه اندازی توسط کاربر انجام می شود.

در طول ویزارد اولیه راه اندازی دستگاه، به کاربر لیستی از مجموعه داده های پشتیبان در دسترس نشان داده می شود و از آنها خواسته می شود که داده ها را از کدام یک بازیابی کند. هر کدام از مجموعه داده های پشتیبان انتخاب شود، به مجموعه داده اجدادی دستگاه تبدیل می شود. این دستگاه می‌تواند از پشتیبان‌های خود یا مجموعه داده‌های اجدادی خود را بازیابی کند. اگر نسخه‌های پشتیبان از هر دو منبع موجود باشد، دستگاه پشتیبان‌گیری خود را در اولویت قرار می‌دهد. اگر کاربر از طریق جادوگر راه اندازی دستگاه نرفته باشد، دستگاه فقط می تواند از نسخه پشتیبان خود بازیابی کند.

برای ساده‌سازی تست، اندروید شامل ابزارهایی است که به شما امکان می‌دهد بازیابی برنامه خود را به صورت دستی شروع کنید. برای اطلاعات بیشتر، تست پشتیبان‌گیری و بازیابی را ببینید.

بک آپ را فعال و غیرفعال کنید

برنامه‌هایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار می‌دهند، به‌طور خودکار در پشتیبان‌گیری خودکار شرکت می‌کنند. در فایل مانیفست برنامه خود، مقدار بولی android:allowBackup برای فعال یا غیرفعال کردن پشتیبان‌گیری تنظیم کنید. مقدار پیش‌فرض true است، اما توصیه می‌کنیم که مشخصه را به صراحت در مانیفست خود تنظیم کنید، همانطور که در مثال زیر نشان داده شده است:

<manifest ... >
    ...
    <application android:allowBackup="true" ... >
        ...
    </application>
</manifest>

با تنظیم android:allowBackup روی false می توانید پشتیبان گیری را غیرفعال کنید. اگر برنامه شما بتواند وضعیت خود را از طریق مکانیسم دیگری بازسازی کند یا اگر برنامه شما با اطلاعات حساس سروکار دارد، ممکن است بخواهید این کار را انجام دهید.

شامل و حذف فایل ها

به طور پیش فرض، سیستم تقریباً از تمام داده های برنامه نسخه پشتیبان تهیه می کند. برای اطلاعات بیشتر، به بخش مربوط به فایل‌هایی که پشتیبان‌گیری می‌شوند، مراجعه کنید.

این بخش به شما نشان می‌دهد که چگونه قوانین XML سفارشی را برای کنترل موارد پشتیبان‌گیری شده تعریف کنید. اگر برنامه شما Android 12 (سطح API 31) یا بالاتر را هدف قرار می‌دهد، باید مجموعه دیگری از قوانین پشتیبان‌گیری XML را مشخص کنید ، همانطور که در این بخش توضیح داده شده است تا از تغییرات بازیابی نسخه پشتیبان که برای دستگاه‌هایی که این نسخه‌های Android را اجرا می‌کنند، پشتیبانی کند.

پشتیبان‌گیری را در اندروید ۱۱ و پایین‌تر کنترل کنید

مراحل این بخش را دنبال کنید تا کنترل کنید از کدام فایل‌ها در دستگاه‌های دارای Android 11 (سطح API 30) یا پایین‌تر پشتیبان‌گیری شود.

  1. همانطور که در مثال زیر نشان داده شده است، در فایل AndroidManifest.xml ، ویژگی android:fullBackupContent را به عنصر <application> اضافه کنید. این ویژگی به یک فایل XML اشاره می کند که حاوی قوانین پشتیبان است.

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
  2. یک فایل 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) یا بالاتر اضافه کنید:

اگر دستگاه‌های توسعه‌دهنده خود را به اندروید 9 ارتقا داده‌اید، باید پشتیبان‌گیری از داده‌ها را غیرفعال کرده و پس از ارتقا دوباره فعال کنید. این به این دلیل است که اندروید تنها پس از اطلاع دادن به کاربران در تنظیمات یا جادوگر راه‌اندازی، پشتیبان‌گیری‌ها را با یک راز سمت کلاینت رمزگذاری می‌کند.

برای اعلام شرایط گنجاندن، ویژگی 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‌های_ FLAG_DEVICE_TO_DEVICE_TRANSFER این الزامات شرطی را برای منطق پشتیبان‌گیری خود اعمال کنید. .

قطعه کد زیر نمونه ای از استفاده از این روش را نشان می دهد:

کاتلین

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.
}

جاوا

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 یا بالاتر پشتیبان‌گیری شود.

  1. همانطور که در مثال زیر نشان داده شده است، در فایل AndroidManifest.xml ، ویژگی android:dataExtractionRules را به عنصر <application> اضافه کنید. این ویژگی به یک فایل XML اشاره می کند که حاوی قوانین پشتیبان است.

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
  2. یک فایل 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 برای فایل پیکربندی بسته به نسخه اندرویدی که برنامه شما در آن هدف قرار داده و اجرا می‌شود، متفاوت است.

اندروید 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>

اندروید 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 Drive حذف کنید، در حالی که همچنان آن را در حین انتقال دستگاه به دستگاه (D2D) منتقل می‌کنید. اگر فایل‌هایی دارید که برای پشتیبان‌گیری در فضای ابری خیلی بزرگ هستند، اما می‌توانند بدون مشکل بین دستگاه‌ها منتقل شوند، مفید است.

اگر قوانینی برای یک حالت پشتیبان خاص وجود نداشته باشد، مثلاً اگر بخش <device-transfer> وجود نداشته باشد، آن حالت برای همه محتوا به جز دایرکتوری‌های no-backup و cache کاملاً فعال می‌شود، همانطور که در فایل‌هایی که پشتیبان‌گیری می‌شوند توضیح داده شده است. بخش

برنامه شما می‌تواند پرچم disableIfNoEncryptionCapabilities را در بخش <cloud-backup> تنظیم کند تا مطمئن شود که پشتیبان‌گیری تنها در صورتی انجام می‌شود که بتوان آن را رمزگذاری کرد، مانند زمانی که کاربر صفحه قفل داشته باشد. اگر دستگاه کاربر نتواند از رمزگذاری پشتیبانی کند، تنظیم این محدودیت، ارسال نسخه پشتیبان به ابر را متوقف می‌کند، اما از آنجایی که انتقال‌های D2D به سرور ارسال نمی‌شوند، حتی در دستگاه‌هایی که از رمزگذاری پشتیبانی نمی‌کنند به کار خود ادامه می‌دهند.

نحو برای شامل و حذف عناصر

در داخل تگ‌های <full-backup-content> ، <cloud-backup> و <device-transfer> (بسته به نسخه Android دستگاه و targetSDKVersion برنامه شما)، می‌توانید عناصر <include> و <exclude> را تعریف کنید:

<include>

یک فایل یا پوشه را برای پشتیبان گیری مشخص می کند. به طور پیش فرض، پشتیبان گیری خودکار تقریباً همه فایل های برنامه را شامل می شود. اگر عنصر <include> را مشخص کنید، سیستم دیگر به طور پیش‌فرض شامل هیچ فایلی نمی‌شود و فقط از فایل‌های مشخص‌شده نسخه پشتیبان تهیه می‌کند. برای گنجاندن چندین فایل، از چندین عنصر <include> استفاده کنید.

در اندروید 11 و نسخه‌های پایین‌تر ، این عنصر همچنین می‌تواند حاوی ویژگی‌های requireFlags باشد، که در قسمتی که نحوه تعریف الزامات شرطی برای پشتیبان‌گیری را توضیح می‌دهد، با جزئیات بیشتری به آن پرداخته می‌شود.

فایل‌های موجود در دایرکتوری‌هایی که توسط getCacheDir() ، getCodeCacheDir() یا getNoBackupFilesDir() بازگردانده می‌شوند، همیشه حذف می‌شوند، حتی اگر بخواهید آنها را اضافه کنید.

<exclude>

فایل یا پوشه ای را برای حذف در حین پشتیبان گیری مشخص می کند. در اینجا چند فایل وجود دارد که معمولاً از پشتیبان‌گیری حذف می‌شوند:

  • فایل‌هایی که دارای شناسه‌های خاص دستگاه هستند، یا توسط سرور صادر شده یا در دستگاه تولید شده‌اند. به عنوان مثال، Firebase Cloud Messaging (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

فایل یا پوشه ای را برای گنجاندن یا حذف از پشتیبان تعیین می کند. به موارد زیر توجه کنید:

  • این ویژگی از دستور عام یا دستور عبارت منظم پشتیبانی نمی کند.
  • شما می توانید با استفاده از ./ به دایرکتوری فعلی ارجاع دهید، اما به دلایل امنیتی نمی توانید به دایرکتوری والد ارجاع دهید، مانند استفاده از .. .
  • اگر دایرکتوری را مشخص کنید، این قانون برای همه فایل‌های دایرکتوری و زیر شاخه‌های بازگشتی اعمال می‌شود.

BackupAgent را پیاده سازی کنید

برنامه‌هایی که پشتیبان‌گیری خودکار را پیاده‌سازی می‌کنند، نیازی به اجرای BackupAgent ندارند. با این حال، می توانید به صورت اختیاری یک BackupAgent سفارشی را پیاده سازی کنید. به طور معمول، دو دلیل برای انجام این کار وجود دارد:

  • می خواهید اعلان رویدادهای پشتیبان، مانند onRestoreFinished() و onQuotaExceeded(long, long) دریافت کنید. این روش‌های پاسخ به تماس حتی اگر برنامه در حال اجرا نباشد اجرا می‌شوند.

  • شما نمی توانید به راحتی مجموعه فایل هایی را که می خواهید از آنها نسخه پشتیبان تهیه کنید با قوانین XML بیان کنید. در این موارد نادر، می‌توانید یک BackupAgent پیاده‌سازی کنید که onFullBackup(FullBackupDataOutput) را لغو می‌کند تا آنچه را که می‌خواهید ذخیره کند. برای حفظ اجرای پیش‌فرض سیستم، متد مربوطه را در superclass با super.onFullBackup() فراخوانی کنید.

اگر یک BackupAgent پیاده‌سازی می‌کنید، به‌طور پیش‌فرض سیستم انتظار دارد که برنامه شما پشتیبان‌گیری و بازیابی کلید-مقدار را انجام دهد. برای استفاده از پشتیبان‌گیری خودکار مبتنی بر فایل، ویژگی android:fullBackupOnly را در مانیفست برنامه‌تان روی true تنظیم کنید.

در طول عملیات پشتیبان‌گیری و بازیابی خودکار، سیستم برنامه را در حالت محدود راه‌اندازی می‌کند تا هم از دسترسی برنامه به فایل‌هایی که ممکن است باعث تداخل می‌شود جلوگیری کند و هم به برنامه اجازه دهد روش‌های برگشت به تماس را در BackupAgent خود اجرا کند. در این حالت محدود، فعالیت اصلی برنامه به‌طور خودکار راه‌اندازی نمی‌شود، ارائه‌دهندگان محتوای آن مقداردهی اولیه نمی‌شوند، و به‌جای هر زیرکلاس اعلام‌شده در مانیفست برنامه، Application کلاس پایه نمونه‌سازی می‌شود.

BackupAgent شما باید متدهای انتزاعی onBackup() و onRestore() را پیاده سازی کند که برای پشتیبان گیری کلید-مقدار استفاده می شود. اگر نمی‌خواهید پشتیبان‌گیری با مقدار کلید انجام دهید، می‌توانید پیاده‌سازی آن روش‌ها را خالی بگذارید.

برای اطلاعات بیشتر، به Extend BackupAgent مراجعه کنید.

،

پشتیبان‌گیری خودکار برای برنامه‌ها به‌طور خودکار از داده‌های کاربر از برنامه‌هایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار داده و اجرا می‌کنند، نسخه پشتیبان تهیه می‌کند. Android داده‌های برنامه را با آپلود آن در Google Drive کاربر حفظ می‌کند، جایی که توسط اعتبار حساب Google کاربر محافظت می‌شود. پشتیبان‌گیری در دستگاه‌های دارای Android 9 یا بالاتر با استفاده از پین، الگو یا رمز عبور دستگاه، رمزگذاری شده است. هر برنامه می تواند حداکثر 25 مگابایت داده پشتیبان را برای هر کاربر برنامه اختصاص دهد. هیچ هزینه ای برای ذخیره سازی داده های پشتیبان وجود ندارد. برنامه شما می‌تواند فرآیند پشتیبان‌گیری را سفارشی کند یا با غیرفعال کردن پشتیبان‌گیری، از آن انصراف دهد.

برای مروری بر گزینه‌های پشتیبان‌گیری Android و راهنمایی درباره اینکه کدام داده‌ها باید پشتیبان‌گیری و بازیابی شوند، به نمای کلی پشتیبان‌گیری از داده‌ها مراجعه کنید.

فایل هایی که بک آپ گرفته شده اند

به طور پیش‌فرض، پشتیبان‌گیری خودکار شامل فایل‌هایی در بیشتر فهرست‌های راهنمای سیستم می‌شود که به برنامه شما اختصاص داده شده‌اند:

  • فایل های ترجیحی مشترک

  • فایل‌هایی که در حافظه داخلی برنامه شما ذخیره می‌شوند و توسط getFilesDir() یا getDir(String, int) قابل دسترسی هستند.

  • فایل‌های موجود در دایرکتوری که توسط getDatabasePath(String) برگردانده می‌شوند، که شامل فایل‌های ایجاد شده با کلاس SQLiteOpenHelper نیز می‌شود.

  • فایل‌های موجود در حافظه خارجی در دایرکتوری که توسط getExternalFilesDir(String) برگردانده شده‌اند.

پشتیبان‌گیری خودکار فایل‌های موجود در فهرست‌های بازگردانده شده توسط getCacheDir() ، getCodeCacheDir() و getNoBackupFilesDir() را مستثنی می‌کند. فایل‌های ذخیره‌شده در این مکان‌ها فقط به‌طور موقت مورد نیاز هستند و عمداً از عملیات پشتیبان‌گیری حذف می‌شوند.

می‌توانید برنامه خود را طوری پیکربندی کنید که فایل‌های خاصی را شامل و حذف کند. برای اطلاعات بیشتر به بخش Include and Exclude files مراجعه کنید.

مکان پشتیبان گیری

داده های پشتیبان در یک پوشه خصوصی در حساب کاربری گوگل درایو کاربر ذخیره می شود که به ازای هر برنامه 25 مگابایت محدود می شود. داده های ذخیره شده در سهمیه Google Drive شخصی کاربر به حساب نمی آید. فقط آخرین نسخه پشتیبان ذخیره می شود. هنگامی که یک نسخه پشتیبان تهیه می شود، هر نسخه پشتیبان قبلی حذف می شود. داده های پشتیبان توسط کاربر یا سایر برنامه های دستگاه قابل خواندن نیست.

کاربران می‌توانند فهرستی از برنامه‌هایی را که در برنامه اندروید Google Drive پشتیبان‌گیری شده‌اند، مشاهده کنند. در دستگاه‌های مجهز به Android، کاربران می‌توانند این فهرست را در کشوی پیمایش برنامه Drive در زیر تنظیمات > پشتیبان‌گیری و بازنشانی پیدا کنند.

پشتیبان‌گیری‌ها از هر دستگاه-setup-lifetime در مجموعه داده‌های جداگانه ذخیره می‌شوند، همانطور که در مثال‌های زیر توضیح داده شده است:

  • اگر کاربر دارای دو دستگاه باشد، یک مجموعه داده پشتیبان برای هر دستگاه وجود دارد.

  • اگر کاربر دستگاهی را به تنظیمات کارخانه بازنشانی کند و سپس دستگاه را با همان حساب راه‌اندازی کند، نسخه پشتیبان در یک مجموعه داده جدید ذخیره می‌شود. مجموعه داده های منسوخ شده به طور خودکار پس از یک دوره عدم فعالیت حذف می شوند.

برنامه پشتیبان گیری

پشتیبان گیری به طور خودکار زمانی انجام می شود که تمام شرایط زیر برآورده شود:

  • کاربر پشتیبان گیری را در دستگاه فعال کرده است. در Android 9، این تنظیم در Settings > System > Backup قرار دارد.
  • حداقل 24 ساعت از آخرین پشتیبان گیری گذشته است.
  • دستگاه بیکار است.
  • دستگاه به یک شبکه Wi-Fi متصل است (اگر کاربر دستگاه از تهیه نسخه پشتیبان از داده های تلفن همراه استفاده نکرده باشد).

در عمل، این شرایط تقریباً هر شب اتفاق می‌افتد، اما ممکن است دستگاه هرگز پشتیبان‌گیری نکند (مثلاً اگر هرگز به شبکه وصل نشود). برای حفظ پهنای باند شبکه، آپلود فقط در صورتی انجام می‌شود که داده‌های برنامه تغییر کرده باشد.

در طول پشتیبان‌گیری خودکار، سیستم برنامه را خاموش می‌کند تا مطمئن شود که دیگر در سیستم فایل نمی‌نویسد. به‌طور پیش‌فرض، سیستم پشتیبان‌گیری برنامه‌هایی را که در پیش‌زمینه اجرا می‌شوند نادیده می‌گیرد تا از تجربه کاربری ضعیف جلوگیری کند. می‌توانید با تنظیم ویژگی android:backupInForeground روی true، رفتار پیش‌فرض را لغو کنید.

برای ساده‌سازی تست، اندروید شامل ابزارهایی می‌شود که به شما امکان می‌دهد به صورت دستی یک نسخه پشتیبان از برنامه خود را شروع کنید. برای اطلاعات بیشتر، تست پشتیبان‌گیری و بازیابی را ببینید.

بازیابی برنامه زمانی

هر زمان که برنامه نصب شود، داده ها بازیابی می شوند، چه از فروشگاه Play، در حین راه اندازی دستگاه (زمانی که سیستم برنامه های نصب شده قبلی را نصب می کند)، یا با اجرای نصب adb . عملیات بازیابی پس از نصب APK اما قبل از در دسترس قرار گرفتن برنامه برای راه اندازی توسط کاربر انجام می شود.

در طول ویزارد اولیه راه اندازی دستگاه، به کاربر لیستی از مجموعه داده های پشتیبان در دسترس نشان داده می شود و از آنها خواسته می شود که داده ها را از کدام یک بازیابی کند. هر کدام از مجموعه داده های پشتیبان انتخاب شود، به مجموعه داده اجدادی دستگاه تبدیل می شود. این دستگاه می‌تواند از پشتیبان‌های خود یا مجموعه داده‌های اجدادی خود را بازیابی کند. اگر نسخه‌های پشتیبان از هر دو منبع موجود باشد، دستگاه پشتیبان‌گیری خود را در اولویت قرار می‌دهد. اگر کاربر از طریق جادوگر راه اندازی دستگاه نرفته باشد، دستگاه فقط می تواند از نسخه پشتیبان خود بازیابی کند.

برای ساده‌سازی تست، اندروید شامل ابزارهایی است که به شما امکان می‌دهد بازیابی برنامه خود را به صورت دستی شروع کنید. برای اطلاعات بیشتر، تست پشتیبان‌گیری و بازیابی را ببینید.

بک آپ را فعال و غیرفعال کنید

برنامه‌هایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار می‌دهند، به‌طور خودکار در پشتیبان‌گیری خودکار شرکت می‌کنند. در فایل مانیفست برنامه خود، مقدار بولی android:allowBackup برای فعال یا غیرفعال کردن پشتیبان‌گیری تنظیم کنید. مقدار پیش‌فرض true است، اما توصیه می‌کنیم که مشخصه را به صراحت در مانیفست خود تنظیم کنید، همانطور که در مثال زیر نشان داده شده است:

<manifest ... >
    ...
    <application android:allowBackup="true" ... >
        ...
    </application>
</manifest>

با تنظیم android:allowBackup روی false می توانید پشتیبان گیری را غیرفعال کنید. اگر برنامه شما بتواند وضعیت خود را از طریق مکانیسم دیگری بازسازی کند یا اگر برنامه شما با اطلاعات حساس سروکار دارد، ممکن است بخواهید این کار را انجام دهید.

شامل و حذف فایل ها

به طور پیش فرض، سیستم تقریباً از تمام داده های برنامه نسخه پشتیبان تهیه می کند. برای اطلاعات بیشتر، به بخش مربوط به فایل‌هایی که پشتیبان‌گیری می‌شوند، مراجعه کنید.

این بخش به شما نشان می‌دهد که چگونه قوانین XML سفارشی را برای کنترل موارد پشتیبان‌گیری شده تعریف کنید. اگر برنامه شما Android 12 (سطح API 31) یا بالاتر را هدف قرار می‌دهد، باید مجموعه دیگری از قوانین پشتیبان‌گیری XML را مشخص کنید ، همانطور که در این بخش توضیح داده شده است تا از تغییرات بازیابی نسخه پشتیبان که برای دستگاه‌هایی که این نسخه‌های Android را اجرا می‌کنند، پشتیبانی کند.

پشتیبان‌گیری را در اندروید ۱۱ و پایین‌تر کنترل کنید

مراحل این بخش را دنبال کنید تا کنترل کنید از کدام فایل‌ها در دستگاه‌های دارای Android 11 (سطح API 30) یا پایین‌تر پشتیبان‌گیری شود.

  1. همانطور که در مثال زیر نشان داده شده است، در فایل AndroidManifest.xml ، ویژگی android:fullBackupContent را به عنصر <application> اضافه کنید. این ویژگی به یک فایل XML اشاره می کند که حاوی قوانین پشتیبان است.

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
  2. یک فایل 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) یا بالاتر اضافه کنید:

اگر دستگاه‌های توسعه‌دهنده خود را به اندروید 9 ارتقا داده‌اید، باید پشتیبان‌گیری از داده‌ها را غیرفعال کرده و پس از ارتقا دوباره فعال کنید. این به این دلیل است که اندروید تنها پس از اطلاع دادن به کاربران در تنظیمات یا جادوگر راه‌اندازی، پشتیبان‌گیری‌ها را با یک راز سمت کلاینت رمزگذاری می‌کند.

برای اعلام شرایط گنجاندن، ویژگی 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‌های_ FLAG_DEVICE_TO_DEVICE_TRANSFER این الزامات شرطی را برای منطق پشتیبان‌گیری خود اعمال کنید. .

قطعه کد زیر نمونه ای از استفاده از این روش را نشان می دهد:

کاتلین

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.
}

جاوا

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 یا بالاتر پشتیبان‌گیری شود.

  1. همانطور که در مثال زیر نشان داده شده است، در فایل AndroidManifest.xml ، ویژگی android:dataExtractionRules را به عنصر <application> اضافه کنید. این ویژگی به یک فایل XML اشاره می کند که حاوی قوانین پشتیبان است.

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
  2. یک فایل 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 برای فایل پیکربندی بسته به نسخه اندرویدی که برنامه شما در آن هدف قرار داده و اجرا می‌شود، متفاوت است.

اندروید 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>

اندروید 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 Drive حذف کنید، در حالی که همچنان آن را در حین انتقال دستگاه به دستگاه (D2D) منتقل می‌کنید. اگر فایل‌هایی دارید که برای پشتیبان‌گیری در فضای ابری خیلی بزرگ هستند، اما می‌توانند بدون مشکل بین دستگاه‌ها منتقل شوند، مفید است.

اگر قوانینی برای یک حالت پشتیبان خاص وجود نداشته باشد، مثلاً اگر بخش <device-transfer> وجود نداشته باشد، آن حالت برای همه محتوا به جز دایرکتوری‌های no-backup و cache کاملاً فعال می‌شود، همانطور که در فایل‌هایی که پشتیبان‌گیری می‌شوند توضیح داده شده است. بخش

برنامه شما می‌تواند پرچم disableIfNoEncryptionCapabilities را در بخش <cloud-backup> تنظیم کند تا مطمئن شود که پشتیبان‌گیری تنها در صورتی انجام می‌شود که بتوان آن را رمزگذاری کرد، مانند زمانی که کاربر صفحه قفل داشته باشد. اگر دستگاه کاربر نتواند از رمزگذاری پشتیبانی کند، تنظیم این محدودیت، ارسال نسخه پشتیبان به ابر را متوقف می‌کند، اما از آنجایی که انتقال‌های D2D به سرور ارسال نمی‌شوند، حتی در دستگاه‌هایی که از رمزگذاری پشتیبانی نمی‌کنند به کار خود ادامه می‌دهند.

نحو برای شامل و حذف عناصر

در داخل تگ‌های <full-backup-content> ، <cloud-backup> و <device-transfer> (بسته به نسخه Android دستگاه و targetSDKVersion برنامه شما)، می‌توانید عناصر <include> و <exclude> را تعریف کنید:

<include>

یک فایل یا پوشه را برای پشتیبان گیری مشخص می کند. به طور پیش فرض، پشتیبان گیری خودکار تقریباً همه فایل های برنامه را شامل می شود. اگر عنصر <include> را مشخص کنید، سیستم دیگر به طور پیش‌فرض شامل هیچ فایلی نمی‌شود و فقط از فایل‌های مشخص‌شده نسخه پشتیبان تهیه می‌کند. برای گنجاندن چندین فایل، از چندین عنصر <include> استفاده کنید.

در اندروید 11 و نسخه‌های پایین‌تر ، این عنصر همچنین می‌تواند حاوی ویژگی‌های requireFlags باشد، که در قسمتی که نحوه تعریف الزامات شرطی برای پشتیبان‌گیری را توضیح می‌دهد، با جزئیات بیشتری به آن پرداخته می‌شود.

فایل‌های موجود در دایرکتوری‌هایی که توسط getCacheDir() ، getCodeCacheDir() یا getNoBackupFilesDir() بازگردانده می‌شوند، همیشه حذف می‌شوند، حتی اگر بخواهید آنها را اضافه کنید.

<exclude>

فایل یا پوشه ای را برای حذف در حین پشتیبان گیری مشخص می کند. در اینجا چند فایل وجود دارد که معمولاً از پشتیبان‌گیری حذف می‌شوند:

  • فایل‌هایی که دارای شناسه‌های خاص دستگاه هستند، یا توسط سرور صادر شده یا در دستگاه تولید شده‌اند. به عنوان مثال، Firebase Cloud Messaging (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

فایل یا پوشه ای را برای گنجاندن یا حذف از پشتیبان تعیین می کند. به موارد زیر توجه کنید:

  • این ویژگی از دستور عام یا دستور عبارت منظم پشتیبانی نمی کند.
  • شما می توانید با استفاده از ./ به دایرکتوری فعلی ارجاع دهید، اما به دلایل امنیتی نمی توانید به دایرکتوری والد ارجاع دهید، مانند استفاده از .. .
  • اگر دایرکتوری را مشخص کنید، این قانون برای همه فایل‌های دایرکتوری و زیر شاخه‌های بازگشتی اعمال می‌شود.

BackupAgent را پیاده سازی کنید

برنامه‌هایی که پشتیبان‌گیری خودکار را پیاده‌سازی می‌کنند، نیازی به اجرای BackupAgent ندارند. با این حال، می توانید به صورت اختیاری یک BackupAgent سفارشی را پیاده سازی کنید. به طور معمول، دو دلیل برای انجام این کار وجود دارد:

  • می خواهید اعلان رویدادهای پشتیبان، مانند onRestoreFinished() و onQuotaExceeded(long, long) دریافت کنید. این روش‌های پاسخ به تماس حتی اگر برنامه در حال اجرا نباشد اجرا می‌شوند.

  • شما نمی توانید به راحتی مجموعه فایل هایی را که می خواهید از آنها نسخه پشتیبان تهیه کنید با قوانین XML بیان کنید. در این موارد نادر، می‌توانید یک BackupAgent پیاده‌سازی کنید که onFullBackup(FullBackupDataOutput) را لغو می‌کند تا آنچه را که می‌خواهید ذخیره کند. برای حفظ اجرای پیش‌فرض سیستم، متد مربوطه را در superclass با super.onFullBackup() فراخوانی کنید.

اگر یک BackupAgent پیاده‌سازی می‌کنید، به‌طور پیش‌فرض سیستم انتظار دارد که برنامه شما پشتیبان‌گیری و بازیابی کلید-مقدار را انجام دهد. برای استفاده از پشتیبان‌گیری خودکار مبتنی بر فایل، ویژگی android:fullBackupOnly را در مانیفست برنامه‌تان روی true تنظیم کنید.

در طول عملیات پشتیبان‌گیری و بازیابی خودکار، سیستم برنامه را در حالت محدود راه‌اندازی می‌کند تا هم از دسترسی برنامه به فایل‌هایی که ممکن است باعث تداخل می‌شود جلوگیری کند و هم به برنامه اجازه دهد روش‌های برگشت به تماس را در BackupAgent خود اجرا کند. در این حالت محدود، فعالیت اصلی برنامه به‌طور خودکار راه‌اندازی نمی‌شود، ارائه‌دهندگان محتوای آن مقداردهی اولیه نمی‌شوند، و به‌جای هر زیرکلاس اعلام‌شده در مانیفست برنامه، Application کلاس پایه نمونه‌سازی می‌شود.

BackupAgent شما باید متدهای انتزاعی onBackup() و onRestore() را پیاده سازی کند که برای پشتیبان گیری کلید-مقدار استفاده می شود. اگر نمی‌خواهید پشتیبان‌گیری با مقدار کلید انجام دهید، می‌توانید پیاده‌سازی آن روش‌ها را خالی بگذارید.

برای اطلاعات بیشتر، به Extend BackupAgent مراجعه کنید.

،

پشتیبان‌گیری خودکار برای برنامه‌ها به‌طور خودکار از داده‌های کاربر از برنامه‌هایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار داده و اجرا می‌کنند، نسخه پشتیبان تهیه می‌کند. Android داده‌های برنامه را با آپلود آن در Google Drive کاربر حفظ می‌کند، جایی که توسط اعتبار حساب Google کاربر محافظت می‌شود. پشتیبان‌گیری در دستگاه‌های دارای Android 9 یا بالاتر با استفاده از پین، الگو یا رمز عبور دستگاه، رمزگذاری شده است. هر برنامه می تواند حداکثر 25 مگابایت داده پشتیبان را برای هر کاربر برنامه اختصاص دهد. هیچ هزینه ای برای ذخیره سازی داده های پشتیبان وجود ندارد. برنامه شما می‌تواند فرآیند پشتیبان‌گیری را سفارشی کند یا با غیرفعال کردن پشتیبان‌گیری، از آن انصراف دهد.

برای مروری بر گزینه‌های پشتیبان‌گیری Android و راهنمایی درباره اینکه کدام داده‌ها باید پشتیبان‌گیری و بازیابی شوند، به نمای کلی پشتیبان‌گیری از داده‌ها مراجعه کنید.

فایل هایی که بک آپ گرفته شده اند

به طور پیش‌فرض، پشتیبان‌گیری خودکار شامل فایل‌هایی در بیشتر فهرست‌های راهنمای سیستم می‌شود که به برنامه شما اختصاص داده شده‌اند:

  • فایل های ترجیحی مشترک

  • فایل‌هایی که در حافظه داخلی برنامه شما ذخیره می‌شوند و توسط getFilesDir() یا getDir(String, int) قابل دسترسی هستند.

  • فایل‌های موجود در دایرکتوری که توسط getDatabasePath(String) برگردانده می‌شوند، که شامل فایل‌های ایجاد شده با کلاس SQLiteOpenHelper نیز می‌شود.

  • فایل‌های موجود در حافظه خارجی در دایرکتوری که توسط getExternalFilesDir(String) برگردانده شده‌اند.

پشتیبان‌گیری خودکار فایل‌های موجود در فهرست‌های بازگردانده شده توسط getCacheDir() ، getCodeCacheDir() و getNoBackupFilesDir() را مستثنی می‌کند. فایل‌های ذخیره‌شده در این مکان‌ها فقط به‌طور موقت مورد نیاز هستند و عمداً از عملیات پشتیبان‌گیری حذف می‌شوند.

می‌توانید برنامه خود را طوری پیکربندی کنید که فایل‌های خاصی را شامل و حذف کند. برای اطلاعات بیشتر به بخش Include and Exclude files مراجعه کنید.

مکان پشتیبان گیری

داده های پشتیبان در یک پوشه خصوصی در حساب کاربری گوگل درایو کاربر ذخیره می شود که به ازای هر برنامه 25 مگابایت محدود می شود. داده های ذخیره شده در سهمیه Google Drive شخصی کاربر به حساب نمی آید. فقط آخرین نسخه پشتیبان ذخیره می شود. هنگامی که یک نسخه پشتیبان تهیه می شود، هر نسخه پشتیبان قبلی حذف می شود. داده های پشتیبان توسط کاربر یا سایر برنامه های دستگاه قابل خواندن نیست.

کاربران می‌توانند فهرستی از برنامه‌هایی را که در برنامه اندروید Google Drive پشتیبان‌گیری شده‌اند، مشاهده کنند. در دستگاه‌های مجهز به Android، کاربران می‌توانند این فهرست را در کشوی پیمایش برنامه Drive در زیر تنظیمات > پشتیبان‌گیری و بازنشانی پیدا کنند.

پشتیبان‌گیری‌ها از هر دستگاه-setup-lifetime در مجموعه داده‌های جداگانه ذخیره می‌شوند، همانطور که در مثال‌های زیر توضیح داده شده است:

  • اگر کاربر دارای دو دستگاه باشد، یک مجموعه داده پشتیبان برای هر دستگاه وجود دارد.

  • اگر کاربر دستگاهی را به تنظیمات کارخانه بازنشانی کند و سپس دستگاه را با همان حساب راه‌اندازی کند، نسخه پشتیبان در یک مجموعه داده جدید ذخیره می‌شود. مجموعه داده های منسوخ شده به طور خودکار پس از یک دوره عدم فعالیت حذف می شوند.

برنامه پشتیبان گیری

پشتیبان گیری به طور خودکار زمانی انجام می شود که تمام شرایط زیر برآورده شود:

  • کاربر پشتیبان گیری را در دستگاه فعال کرده است. در Android 9، این تنظیم در Settings > System > Backup قرار دارد.
  • حداقل 24 ساعت از آخرین پشتیبان گیری گذشته است.
  • دستگاه بیکار است.
  • دستگاه به یک شبکه Wi-Fi متصل است (اگر کاربر دستگاه از تهیه نسخه پشتیبان از داده های تلفن همراه استفاده نکرده باشد).

در عمل، این شرایط تقریباً هر شب اتفاق می‌افتد، اما ممکن است دستگاه هرگز پشتیبان‌گیری نکند (مثلاً اگر هرگز به شبکه وصل نشود). برای حفظ پهنای باند شبکه، آپلود فقط در صورتی انجام می‌شود که داده‌های برنامه تغییر کرده باشد.

در طول پشتیبان‌گیری خودکار، سیستم برنامه را خاموش می‌کند تا مطمئن شود که دیگر در سیستم فایل نمی‌نویسد. به‌طور پیش‌فرض، سیستم پشتیبان‌گیری برنامه‌هایی را که در پیش‌زمینه اجرا می‌شوند نادیده می‌گیرد تا از تجربه کاربری ضعیف جلوگیری کند. می‌توانید با تنظیم ویژگی android:backupInForeground روی true، رفتار پیش‌فرض را لغو کنید.

برای ساده‌سازی تست، اندروید شامل ابزارهایی می‌شود که به شما امکان می‌دهد به صورت دستی یک نسخه پشتیبان از برنامه خود را شروع کنید. برای اطلاعات بیشتر، تست پشتیبان‌گیری و بازیابی را ببینید.

بازیابی برنامه زمانی

هر زمان که برنامه نصب شود، داده ها بازیابی می شوند، چه از فروشگاه Play، در حین راه اندازی دستگاه (زمانی که سیستم برنامه های نصب شده قبلی را نصب می کند)، یا با اجرای نصب adb . عملیات بازیابی پس از نصب APK اما قبل از در دسترس قرار گرفتن برنامه برای راه اندازی توسط کاربر انجام می شود.

در طول ویزارد اولیه راه اندازی دستگاه، به کاربر لیستی از مجموعه داده های پشتیبان در دسترس نشان داده می شود و از آنها خواسته می شود که داده ها را از کدام یک بازیابی کند. هر کدام از مجموعه داده های پشتیبان انتخاب شود، به مجموعه داده اجدادی دستگاه تبدیل می شود. این دستگاه می‌تواند از پشتیبان‌های خود یا مجموعه داده‌های اجدادی خود را بازیابی کند. اگر نسخه‌های پشتیبان از هر دو منبع موجود باشد، دستگاه پشتیبان‌گیری خود را در اولویت قرار می‌دهد. اگر کاربر از طریق جادوگر راه اندازی دستگاه نرفته باشد، دستگاه فقط می تواند از نسخه پشتیبان خود بازیابی کند.

برای ساده‌سازی تست، اندروید شامل ابزارهایی است که به شما امکان می‌دهد بازیابی برنامه خود را به صورت دستی شروع کنید. برای اطلاعات بیشتر، تست پشتیبان‌گیری و بازیابی را ببینید.

بک آپ را فعال و غیرفعال کنید

برنامه‌هایی که Android 6.0 (سطح API 23) یا بالاتر را هدف قرار می‌دهند، به‌طور خودکار در پشتیبان‌گیری خودکار شرکت می‌کنند. در فایل مانیفست برنامه خود، مقدار بولی android:allowBackup برای فعال یا غیرفعال کردن پشتیبان‌گیری تنظیم کنید. مقدار پیش‌فرض true است، اما توصیه می‌کنیم که مشخصه را به صراحت در مانیفست خود تنظیم کنید، همانطور که در مثال زیر نشان داده شده است:

<manifest ... >
    ...
    <application android:allowBackup="true" ... >
        ...
    </application>
</manifest>

با تنظیم android:allowBackup روی false می توانید پشتیبان گیری را غیرفعال کنید. اگر برنامه شما بتواند وضعیت خود را از طریق مکانیسم دیگری بازسازی کند یا اگر برنامه شما با اطلاعات حساس سروکار دارد، ممکن است بخواهید این کار را انجام دهید.

شامل و حذف فایل ها

به طور پیش فرض، سیستم تقریباً از تمام داده های برنامه نسخه پشتیبان تهیه می کند. برای اطلاعات بیشتر، به بخش مربوط به فایل‌هایی که پشتیبان‌گیری می‌شوند، مراجعه کنید.

این بخش به شما نشان می‌دهد که چگونه قوانین XML سفارشی را برای کنترل موارد پشتیبان‌گیری شده تعریف کنید. اگر برنامه شما Android 12 (سطح API 31) یا بالاتر را هدف قرار می‌دهد، باید مجموعه دیگری از قوانین پشتیبان‌گیری XML را مشخص کنید ، همانطور که در این بخش توضیح داده شده است تا از تغییرات بازیابی نسخه پشتیبان که برای دستگاه‌هایی که این نسخه‌های Android را اجرا می‌کنند، پشتیبانی کند.

پشتیبان‌گیری را در اندروید ۱۱ و پایین‌تر کنترل کنید

مراحل این بخش را دنبال کنید تا کنترل کنید از کدام فایل‌ها در دستگاه‌های دارای Android 11 (سطح API 30) یا پایین‌تر پشتیبان‌گیری شود.

  1. همانطور که در مثال زیر نشان داده شده است، در فایل AndroidManifest.xml ، ویژگی android:fullBackupContent را به عنصر <application> اضافه کنید. این ویژگی به یک فایل XML اشاره می کند که حاوی قوانین پشتیبان است.

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
  2. یک فایل 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) یا بالاتر اضافه کنید:

اگر دستگاه‌های توسعه‌دهنده خود را به اندروید 9 ارتقا داده‌اید، باید پشتیبان‌گیری از داده‌ها را غیرفعال کرده و پس از ارتقا دوباره فعال کنید. این به این دلیل است که اندروید تنها پس از اطلاع دادن به کاربران در تنظیمات یا جادوگر راه‌اندازی، پشتیبان‌گیری‌ها را با یک راز سمت کلاینت رمزگذاری می‌کند.

برای اعلام شرایط گنجاندن، ویژگی 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‌های_ FLAG_DEVICE_TO_DEVICE_TRANSFER این الزامات شرطی را برای منطق پشتیبان‌گیری خود اعمال کنید. .

قطعه کد زیر نمونه ای از استفاده از این روش را نشان می دهد:

کاتلین

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.
}

جاوا

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 یا بالاتر پشتیبان‌گیری شود.

  1. همانطور که در مثال زیر نشان داده شده است، در فایل AndroidManifest.xml ، ویژگی android:dataExtractionRules را به عنصر <application> اضافه کنید. این ویژگی به یک فایل XML اشاره می کند که حاوی قوانین پشتیبان است.

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
  2. یک فایل 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 برای فایل پیکربندی بسته به نسخه اندرویدی که برنامه شما در آن هدف قرار داده و اجرا می‌شود، متفاوت است.

اندروید 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>

اندروید 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 Drive حذف کنید، در حالی که همچنان آن را در حین انتقال دستگاه به دستگاه (D2D) منتقل می‌کنید. اگر فایل‌هایی دارید که برای پشتیبان‌گیری در فضای ابری خیلی بزرگ هستند، اما می‌توانند بدون مشکل بین دستگاه‌ها منتقل شوند، مفید است.

اگر قوانینی برای یک حالت پشتیبان خاص وجود نداشته باشد، مثلاً اگر بخش <device-transfer> وجود نداشته باشد، آن حالت برای همه محتوا به جز دایرکتوری‌های no-backup و cache کاملاً فعال می‌شود، همانطور که در فایل‌هایی که پشتیبان‌گیری می‌شوند توضیح داده شده است. بخش

برنامه شما می‌تواند پرچم disableIfNoEncryptionCapabilities را در بخش <cloud-backup> تنظیم کند تا مطمئن شود که پشتیبان‌گیری تنها در صورتی انجام می‌شود که بتوان آن را رمزگذاری کرد، مانند زمانی که کاربر صفحه قفل داشته باشد. اگر دستگاه کاربر نتواند از رمزگذاری پشتیبانی کند، تنظیم این محدودیت، ارسال نسخه پشتیبان به ابر را متوقف می‌کند، اما از آنجایی که انتقال‌های D2D به سرور ارسال نمی‌شوند، حتی در دستگاه‌هایی که از رمزگذاری پشتیبانی نمی‌کنند به کار خود ادامه می‌دهند.

نحو برای شامل و حذف عناصر

در داخل تگ‌های <full-backup-content> ، <cloud-backup> و <device-transfer> (بسته به نسخه Android دستگاه و targetSDKVersion برنامه شما)، می‌توانید عناصر <include> و <exclude> را تعریف کنید:

<include>

یک فایل یا پوشه را برای پشتیبان گیری مشخص می کند. به طور پیش فرض، پشتیبان گیری خودکار تقریباً همه فایل های برنامه را شامل می شود. اگر عنصر <include> را مشخص کنید، سیستم دیگر به طور پیش‌فرض شامل هیچ فایلی نمی‌شود و فقط از فایل‌های مشخص‌شده نسخه پشتیبان تهیه می‌کند. برای گنجاندن چندین فایل، از چندین عنصر <include> استفاده کنید.

در اندروید 11 و نسخه‌های پایین‌تر ، این عنصر همچنین می‌تواند حاوی ویژگی‌های requireFlags باشد، که در قسمتی که نحوه تعریف الزامات شرطی برای پشتیبان‌گیری را توضیح می‌دهد، با جزئیات بیشتری به آن پرداخته می‌شود.

فایل‌های موجود در دایرکتوری‌هایی که توسط getCacheDir() ، getCodeCacheDir() یا getNoBackupFilesDir() بازگردانده می‌شوند، همیشه حذف می‌شوند، حتی اگر بخواهید آنها را اضافه کنید.

<exclude>

فایل یا پوشه ای را برای حذف در حین پشتیبان گیری مشخص می کند. در اینجا چند فایل وجود دارد که معمولاً از پشتیبان‌گیری حذف می‌شوند:

  • فایل‌هایی که دارای شناسه‌های خاص دستگاه هستند، یا توسط سرور صادر شده یا در دستگاه تولید شده‌اند. به عنوان مثال، Firebase Cloud Messaging (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

فایل یا پوشه ای را برای گنجاندن یا حذف از پشتیبان تعیین می کند. به موارد زیر توجه کنید:

  • این ویژگی از دستور عام یا دستور عبارت منظم پشتیبانی نمی کند.
  • شما می توانید با استفاده از ./ به دایرکتوری فعلی ارجاع دهید، اما به دلایل امنیتی نمی توانید به دایرکتوری والد ارجاع دهید، مانند استفاده از .. .
  • اگر دایرکتوری را مشخص کنید، این قانون برای همه فایل‌های دایرکتوری و زیر شاخه‌های بازگشتی اعمال می‌شود.

BackupAgent را پیاده سازی کنید

برنامه‌هایی که پشتیبان‌گیری خودکار را پیاده‌سازی می‌کنند، نیازی به اجرای BackupAgent ندارند. با این حال، می توانید به صورت اختیاری یک BackupAgent سفارشی را پیاده سازی کنید. به طور معمول، دو دلیل برای انجام این کار وجود دارد:

  • می خواهید اعلان رویدادهای پشتیبان، مانند onRestoreFinished() و onQuotaExceeded(long, long) دریافت کنید. این روش‌های پاسخ به تماس حتی اگر برنامه در حال اجرا نباشد اجرا می‌شوند.

  • شما نمی توانید به راحتی مجموعه فایل هایی را که می خواهید از آنها نسخه پشتیبان تهیه کنید با قوانین XML بیان کنید. در این موارد نادر، می‌توانید یک BackupAgent پیاده‌سازی کنید که onFullBackup(FullBackupDataOutput) را لغو می‌کند تا آنچه را که می‌خواهید ذخیره کند. برای حفظ اجرای پیش‌فرض سیستم، متد مربوطه را در superclass با super.onFullBackup() فراخوانی کنید.

اگر یک BackupAgent پیاده‌سازی می‌کنید، به‌طور پیش‌فرض سیستم انتظار دارد که برنامه شما پشتیبان‌گیری و بازیابی کلید-مقدار را انجام دهد. برای استفاده از پشتیبان‌گیری خودکار مبتنی بر فایل، ویژگی android:fullBackupOnly را در مانیفست برنامه‌تان روی true تنظیم کنید.

در طول عملیات پشتیبان‌گیری و بازیابی خودکار، سیستم برنامه را در حالت محدود راه‌اندازی می‌کند تا هم از دسترسی برنامه به فایل‌هایی که ممکن است باعث تداخل می‌شود جلوگیری کند و هم به برنامه اجازه دهد روش‌های برگشت به تماس را در BackupAgent خود اجرا کند. در این حالت محدود، فعالیت اصلی برنامه به‌طور خودکار راه‌اندازی نمی‌شود، ارائه‌دهندگان محتوای آن مقداردهی اولیه نمی‌شوند، و به‌جای هر زیرکلاس اعلام‌شده در مانیفست برنامه، Application کلاس پایه نمونه‌سازی می‌شود.

BackupAgent شما باید متدهای انتزاعی onBackup() و onRestore() را پیاده سازی کند که برای پشتیبان گیری کلید-مقدار استفاده می شود. اگر نمی‌خواهید پشتیبان‌گیری با مقدار کلید انجام دهید، می‌توانید پیاده‌سازی آن روش‌ها را خالی بگذارید.

برای اطلاعات بیشتر، به Extend BackupAgent مراجعه کنید.