پشتیبان‌گیری از داده‌های کاربر با «پشتیبان‌گیری خودکار»

پشتیبان‌گیری خودکار برای برنامه‌ها به‌طور خودکار از داده‌های کاربر در برنامه‌هایی که Android نسخه ۶.۰ (سطح میانای برنامه‌سازی کاربردی ۲۳) یا بالاتر را هدف قرار می‌دهند و در آن اجرا می‌شوند پشتیبان‌گیری می‌کند. Android داده‌های برنامه را با بارگذاری در Google Drive کاربر حفظ می‌کند، جایی که با اعتبارنامه «حساب Google» کاربر محافظت می‌شود. پشتیبان‌گیری در دستگاه‌های دارای Android نسخه ۹ یا بالاتر بااستفاده از پین، الگو، یا گذرواژه دستگاه به‌صورت سرتاسر رمزگذاری می‌شود. هر برنامه می‌تواند تا ۲۵ مگابایت داده پشتیبان‌گیری برای هر کاربر برنامه اختصاص دهد. برای ذخیره کردن داده‌های پشتیبان‌گیری هزینه‌ای دریافت نمی‌شود. برنامه شما می‌تواند فرایند پشتیبان‌گیری را سفارشی‌سازی کند یا با غیرفعال کردن پشتیبان‌گیری از آن انصراف دهد.

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

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

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

  • فایل‌های اولویت‌های هم‌رسانی‌شده

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

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

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

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

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

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

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

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

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

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

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

زمان‌بندی پشتیبان‌گیری

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

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

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

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

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

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

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

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

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

فعال و غیرفعال کردن پشتیبان‌گیری

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

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

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

گنجاندن و مستثنی کردن فایل‌ها

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

می‌توانید کنترل کنید کدام داده‌ها براساس نوع انتقال در نسخه پشتیبان گنجانده شوند. «پشتیبان‌گیری خودکار» از پشتیبان‌گیری ابری در Google Drive و انتقال مستقیم دستگاه به دستگاه (D2D) پشتیبانی می‌کند. روش‌های پیکربندی براساس نسخه Android و targetSdkVersion برنامه‌تان متفاوت است.

کنترل پشتیبان‌گیری در Android 11 و نسخه‌های پایین‌تر

مراحل این بخش را دنبال کنید تا کنترل کنید کدام فایل‌ها در دستگاه‌های دارای Android نسخه ۱۱ (سطح API‏ ۳۰) یا پایین‌تر پشتیبان‌گیری شوند.

  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‏ ۲۸) یا بالاتر اضافه کنید:

اگر دستگاه‌های توسعه‌دهنده خود را به 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 عامل پشتیبان‌گیری سفارشی‌تان بر منطق پشتیبان‌گیری‌تان اعمال کنید.

تکه‌کد زیر نمونه‌ای از استفاده از این روش را نشان می‌دهد:

کاتلین

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 نسخه ۱۲ یا بالاتر

اگر برنامه شما Android 12 (سطح میانای برنامه‌سازی کاربردی ۳۱) یا بالاتر را هدف قرار می‌دهد، مراحل این بخش را دنبال کنید تا کنترل کنید کدام فایل‌ها در دستگاه‌هایی که 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 برای فایل پیکربندی بسته به نسخه Android که برنامه شما هدف‌یابی می‌کند و روی آن اجرا می‌شود متفاوت است.

Android 11 یا نسخه‌های پایین‌تر

از نحو XML زیر برای فایل پیکربندی‌ای استفاده کنید که پشتیبان‌گیری را برای دستگاه‌های دارای Android 11 یا پایین‌تر کنترل می‌کند.

<full-backup-content>
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"
    requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] />
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string" />
</full-backup-content>

‫Android 12 یا بالاتر

اگر برنامه شما Android 12 (سطح میانای برنامه‌سازی کاربردی ۳۱) یا بالاتر را هدف قرار می‌دهد، از نحو 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>
  <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> استفاده کنید.

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

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

<exclude>

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

  • فایل‌هایی که شناسه‌های مختص دستگاه دارند، چه توسط سرور صادر شده باشند یا در دستگاه تولید شده باشند. برای مثال، پیام‌رسانی ابری Firebase (FCM) باید هربار که کاربر برنامه شما را در دستگاه جدیدی نصب می‌کند، یک کد ثبت ایجاد کند. اگر کد ثبت قدیمی بازیابی شود، ممکن است برنامه رفتار غیرمنتظره‌ای داشته باشد.

  • فایل‌های مربوط به اشکال‌زدایی برنامه.

  • فایل‌های بزرگی که باعث می‌شوند برنامه از سهمیه پشتیبان‌گیری ۲۵ مگابایتی فراتر رود.

هر عنصر <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 (سطح API‏ ۳۶.۱) می‌توانید «پشتیبان‌گیری خودکار» را برای انتقال داده به دستگاه‌های غیرAndroid و از آن‌ها پیکربندی کنید. برای انجام این کار، عنصر <cross-platform-transfer> را در پیکربندی <data-extraction-rules> خود اضافه کنید، همان‌طور که در نحو Android 12 یا بالاتر نشان داده شده است. باید پلاتفرم هدف را بااستفاده از مشخصه الزامی platform مشخص کنید. تنها مقدار پشتیبانی‌شده ios است.

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

علاوه‌براین، باید عنصر <platform-specific-params> را اضافه کنید تا به سیستم کمک کنید برنامه‌تان را با برنامه متناظر در پلاتفرم هدف مطابقت دهد. این عنصر مشخصه‌های الزامی زیر را دارد:

  • bundleId: شناسه بسته برنامه در پلاتفرم دیگر (برای مثال، شناسه بسته برنامه iOS شما).
  • ‫teamId: شناسه تیم برنامه در پلاتفرم دیگر (برای مثال، شناسه تیم برنامه iOS شما).
  • ‫contentVersion: رشته نسخه‌ای که تعریف می‌کنید و با قالب داده‌ای که صادر می‌شود مرتبط است.

از مشخصه‌های bundleId و teamId برای کمک به درستی‌سنجی تمامیت داده‌ها و تطابق مناسب برنامه به برنامه استفاده می‌شود. این گواهی‌ها تضمین می‌کنند که داده‌ها درطول صادر کردن فقط به برنامه مشخص‌شده در پلاتفرم دیگر منتقل می‌شوند و این برنامه Android درطول وارد کردن فقط داده‌ها را از آن برنامه خاص وارد می‌کند.

برای کنترل دقیق‌تر بر فرایند تبدیل و انتقال داده‌ها فراتر از آنچه قوانین XML ارائه می‌دهند، می‌توانید یک BackupAgent سفارشی پیاده‌سازی کنید و از میاناهای برنامه‌سازی کاربردی انتقال چندسکویی استفاده کنید.

نگاشت فایل برای انتقال‌های iOS

هنگام انتقال فایل‌ها به iOS، domain و path Android که در قوانین <include> مشخص می‌کنید، به ساختار فهرست راهنمای خاصی نگاشت می‌شوند. جدول زیر مسیرهای مقصد را در iOS نسبت‌به ریشه مقصد انتقال براساس domain Android نشان می‌دهد:

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 (سطح API‏ ۳۶.۱) به بعد، چندین API جدید در BackupAgent دردسترس است تا از انتقال داده‌های چندسکویی بهتر پشتیبانی شود.

پرچم حمل‌ونقل جدید:

  • FLAG_CROSS_PLATFORM_TRANSFER_IOS: این پرچم به transportFlags ارائه‌شده به BackupAgent شما اضافه شده است.
    • در onFullBackup، اگر عملیات پشتیبان‌گیری فعلی بخشی از صادر کردن داده به دستگاه iOS باشد، این پرچم تنظیم می‌شود.
    • در سربارگذاری جدید onRestoreFile، اگر داده‌ها از دستگاه iOS وارد شود، این پرچم تنظیم می‌شود.

روش onRestoreFile جدید:

یک سربارگذاری جدید از onRestoreFile معرفی شده است که یک پارامتر FullRestoreDataInput تکی می‌گیرد. این شیء بافت بیشتری درباره عملیات بازیابی ارائه می‌دهد:

  • FullRestoreDataInput.getTransportFlags(): پرچم‌های انتقال را برای عملیات بازیابی فعلی برمی‌گرداند، که می‌تواند شامل FLAG_CROSS_PLATFORM_TRANSFER_IOS باشد.
  • FullRestoreDataInput.getContentVersion(): رشته نسخه محتوا را که برنامه منبع در پلاتفرم دیگر درطول انتقال چندسکویی ارائه کرده است برمی‌گرداند. اگر این مقدار توسط منبع ارائه نشده باشد، رشته‌ای خالی است.

روش جدید تخمین اندازه:

  • onEstimateFullBackupBytes(): این روش به شما امکان می‌دهد اندازه تخمینی داده‌هایی را که برنامه‌تان قصد دارد پشتیبان‌گیری کند ارائه دهید. اگر برنامه‌تان درطول پشتیبان‌گیری تبدیل‌های داده قابل‌توجهی انجام می‌دهد یا حجم زیادی از داده‌ها را مدیریت می‌کند، پیاده‌سازی اکیداً توصیه می‌شود، زیرا می‌تواند با اجتناب از اجرای آزمایشی سیستم پیش‌فرض، کارایی را بهبود بخشد. برای برنامه‌هایی که پشتیبان‌گیری‌های کوچک و ساده دارند، این روش معمولاً ضروری نیست.

نمونه استفاده:

کاتلین

// 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()
}

جاوا

// 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();
}