স্বয়ংক্রিয় ব্যাকআপ দিয়ে ব্যবহারকারীর ডেটা ব্যাক আপ করুন

অ্যাপের জন্য অটো ব্যাকআপ ব্যবহারকারীর ডেটা স্বয়ংক্রিয়ভাবে ব্যাকআপ করে যা Android 6.0 (API লেভেল 23) বা তার বেশি ভার্সনের উপর লক্ষ্য করে এবং চালিত হয়। Android ব্যবহারকারীর Google ড্রাইভে অ্যাপ ডেটা আপলোড করে সংরক্ষণ করে, যেখানে এটি ব্যবহারকারীর Google অ্যাকাউন্ট শংসাপত্র দ্বারা সুরক্ষিত থাকে। ডিভাইসের পিন, প্যাটার্ন বা পাসওয়ার্ড ব্যবহার করে Android 9 বা তার বেশি ভার্সনের ডিভাইসগুলিতে ব্যাকআপটি এন্ড-টু-এন্ড এনক্রিপ্ট করা হয়। প্রতিটি অ্যাপ প্রতি অ্যাপ ব্যবহারকারীর জন্য 25 MB পর্যন্ত ব্যাকআপ ডেটা বরাদ্দ করতে পারে। ব্যাকআপ ডেটা সংরক্ষণের জন্য কোনও চার্জ নেই। আপনার অ্যাপ ব্যাকআপ প্রক্রিয়াটি কাস্টমাইজ করতে পারে অথবা ব্যাকআপ অক্ষম করে অপ্ট আউট করতে পারে।

অ্যান্ড্রয়েডের ব্যাকআপ বিকল্পগুলির একটি সারসংক্ষেপ এবং কোন ডেটা ব্যাকআপ এবং পুনরুদ্ধার করতে হবে সে সম্পর্কে নির্দেশিকা জানতে, ডেটা ব্যাকআপের সারসংক্ষেপ দেখুন।

ব্যাকআপ নেওয়া ফাইলগুলি

ডিফল্টরূপে, অটো ব্যাকআপে সিস্টেম দ্বারা আপনার অ্যাপে নির্ধারিত বেশিরভাগ ডিরেক্টরিতে ফাইল অন্তর্ভুক্ত থাকে:

  • শেয়ার করা পছন্দের ফাইলগুলি

  • আপনার অ্যাপের অভ্যন্তরীণ স্টোরেজে সংরক্ষিত ফাইলগুলি এবং getFilesDir() অথবা getDir(String, int) দ্বারা অ্যাক্সেস করা হয়

  • ডিরেক্টরিতে থাকা ফাইলগুলি getDatabasePath(String) দ্বারা ফেরত পাঠানো হয়, যার মধ্যে SQLiteOpenHelper ক্লাস দিয়ে তৈরি ফাইলগুলিও অন্তর্ভুক্ত থাকে।

  • getExternalFilesDir(String) দ্বারা ফেরত পাঠানো ডিরেক্টরিতে থাকা বাহ্যিক স্টোরেজের ফাইলগুলি

অটো ব্যাকআপ getCacheDir() , getCodeCacheDir() , এবং getNoBackupFilesDir() দ্বারা ফেরত পাঠানো ডিরেক্টরিগুলিতে থাকা ফাইলগুলিকে বাদ দেয়। এই অবস্থানগুলিতে সংরক্ষিত ফাইলগুলি কেবলমাত্র অস্থায়ীভাবে প্রয়োজন এবং ইচ্ছাকৃতভাবে ব্যাকআপ অপারেশন থেকে বাদ দেওয়া হয়।

আপনি নির্দিষ্ট ফাইল অন্তর্ভুক্ত এবং বাদ দেওয়ার জন্য আপনার অ্যাপটি কনফিগার করতে পারেন। আরও তথ্যের জন্য, ফাইল অন্তর্ভুক্ত এবং বাদ দিন বিভাগটি দেখুন।

ব্যাকআপ অবস্থান

ব্যাকআপ ডেটা ব্যবহারকারীর Google ড্রাইভ অ্যাকাউন্টের একটি ব্যক্তিগত ফোল্ডারে সংরক্ষণ করা হয়, প্রতিটি অ্যাপের জন্য 25 MB পর্যন্ত সীমাবদ্ধ। সংরক্ষিত ডেটা ব্যবহারকারীর ব্যক্তিগত Google ড্রাইভ কোটায় গণনা করা হয় না। শুধুমাত্র সাম্প্রতিক ব্যাকআপটি সংরক্ষণ করা হয়। যখন একটি ব্যাকআপ নেওয়া হয়, তখন পূর্ববর্তী যেকোনো ব্যাকআপ মুছে ফেলা হয়। ব্যবহারকারী বা ডিভাইসের অন্যান্য অ্যাপ ব্যাকআপ ডেটা পড়তে পারে না।

ব্যবহারকারীরা Google Drive Android অ্যাপে ব্যাকআপ নেওয়া অ্যাপের তালিকা দেখতে পাবেন। Android-চালিত ডিভাইসে, ব্যবহারকারীরা ড্রাইভ অ্যাপের নেভিগেশন ড্রয়ারে Settings > Backup and reset এর অধীনে এই তালিকাটি খুঁজে পেতে পারেন।

প্রতিটি device-setup-lifetime থেকে ব্যাকআপগুলি পৃথক ডেটাসেটে সংরক্ষণ করা হয়, যেমনটি নিম্নলিখিত উদাহরণগুলিতে বর্ণিত হয়েছে:

  • যদি ব্যবহারকারীর দুটি ডিভাইস থাকে, তাহলে প্রতিটি ডিভাইসের জন্য একটি ব্যাকআপ ডেটাসেট বিদ্যমান।

  • যদি ব্যবহারকারী কোনও ডিভাইস ফ্যাক্টরি-রিসেট করে এবং তারপর একই অ্যাকাউন্ট দিয়ে ডিভাইসটি সেট আপ করে, তাহলে ব্যাকআপটি একটি নতুন ডেটাসেটে সংরক্ষণ করা হয়। অপ্রচলিত ডেটাসেটগুলি নিষ্ক্রিয়তার পরে স্বয়ংক্রিয়ভাবে মুছে ফেলা হয়।

ব্যাকআপ সময়সূচী

নিম্নলিখিত সমস্ত শর্ত পূরণ হলে ব্যাকআপ স্বয়ংক্রিয়ভাবে ঘটে:

  • ব্যবহারকারী ডিভাইসে ব্যাকআপ সক্ষম করেছেন। Android 9-এ, এই সেটিংটি সেটিংস > সিস্টেম > ব্যাকআপ এ রয়েছে।
  • শেষ ব্যাকআপের পর থেকে কমপক্ষে ২৪ ঘন্টা কেটে গেছে।
  • ডিভাইসটি অলস অবস্থায় আছে।
  • ডিভাইসটি একটি Wi-Fi নেটওয়ার্কের সাথে সংযুক্ত (যদি ডিভাইস ব্যবহারকারী মোবাইল-ডেটা ব্যাকআপ বেছে না নিয়ে থাকেন)।

বাস্তবে, এই অবস্থাগুলি প্রায় প্রতি রাতেই ঘটে, কিন্তু একটি ডিভাইস কখনও ব্যাকআপ নাও নিতে পারে (উদাহরণস্বরূপ, যদি এটি কখনও কোনও নেটওয়ার্কের সাথে সংযুক্ত না হয়)। নেটওয়ার্ক ব্যান্ডউইথ সংরক্ষণের জন্য, অ্যাপ ডেটা পরিবর্তিত হলেই আপলোড করা হয়।

অটো ব্যাকআপের সময়, সিস্টেমটি অ্যাপটি বন্ধ করে দেয় যাতে নিশ্চিত করা যায় যে এটি আর ফাইল সিস্টেমে লেখা হচ্ছে না। ডিফল্টরূপে, ব্যাকআপ সিস্টেমটি খারাপ ব্যবহারকারীর অভিজ্ঞতা এড়াতে ফোরগ্রাউন্ডে চলমান অ্যাপগুলিকে উপেক্ষা করে। আপনি android:backupInForeground অ্যাট্রিবিউটটিকে true এ সেট করে ডিফল্ট আচরণকে ওভাররাইড করতে পারেন।

পরীক্ষা সহজ করার জন্য, Android-এ এমন টুল রয়েছে যা আপনাকে আপনার অ্যাপের ব্যাকআপ ম্যানুয়ালি শুরু করতে দেয়। আরও তথ্যের জন্য, পরীক্ষা ব্যাকআপ এবং পুনরুদ্ধার দেখুন।

সময়সূচী পুনরুদ্ধার করুন

অ্যাপটি ইনস্টল করার সময়, প্লে স্টোর থেকে, ডিভাইস সেটআপের সময় (যখন সিস্টেম পূর্বে ইনস্টল করা অ্যাপগুলি ইনস্টল করে), অথবা adb ইনস্টল চালানোর মাধ্যমে ডেটা পুনরুদ্ধার করা হয়। APK ইনস্টল করার পরে কিন্তু ব্যবহারকারীর দ্বারা অ্যাপটি চালু করার আগে পুনরুদ্ধার অপারেশনটি ঘটে।

প্রাথমিক ডিভাইস সেটআপ উইজার্ডের সময়, ব্যবহারকারীকে উপলব্ধ ব্যাকআপ ডেটাসেটের একটি তালিকা দেখানো হয় এবং কোনটি থেকে ডেটা পুনরুদ্ধার করতে হবে তা জিজ্ঞাসা করা হয়। যে কোনও ব্যাকআপ ডেটাসেট নির্বাচন করা হলে তা ডিভাইসের জন্য পূর্বপুরুষ ডেটাসেট হয়ে যায়। ডিভাইসটি তার নিজস্ব ব্যাকআপ বা পূর্বপুরুষ ডেটাসেট থেকে পুনরুদ্ধার করতে পারে। যদি উভয় উৎস থেকে ব্যাকআপ উপলব্ধ থাকে, তাহলে ডিভাইসটি তার নিজস্ব ব্যাকআপকে অগ্রাধিকার দেয়। যদি ব্যবহারকারী ডিভাইস সেটআপ উইজার্ডটি না দেখে থাকেন, তাহলে ডিভাইসটি কেবল তার নিজস্ব ব্যাকআপ থেকে পুনরুদ্ধার করতে পারে।

পরীক্ষা সহজ করার জন্য, Android-এ এমন টুল রয়েছে যা আপনাকে আপনার অ্যাপের পুনরুদ্ধার ম্যানুয়ালি শুরু করতে দেয়। আরও তথ্যের জন্য, পরীক্ষা ব্যাকআপ এবং পুনরুদ্ধার দেখুন।

ব্যাকআপ সক্ষম এবং অক্ষম করুন

Android 6.0 (API লেভেল 23) বা তার বেশি ভার্সনের অ্যাপগুলি স্বয়ংক্রিয়ভাবে অটো ব্যাকআপে অংশগ্রহণ করে। আপনার অ্যাপ ম্যানিফেস্ট ফাইলে, ব্যাকআপ সক্ষম বা অক্ষম করার জন্য বুলিয়ান মান android:allowBackup সেট করুন। ডিফল্ট মান হল true , তবে আমরা আপনার ম্যানিফেস্টে অ্যাট্রিবিউটটি স্পষ্টভাবে সেট করার পরামর্শ দিচ্ছি, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

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

আপনি android:allowBackup কে false এ সেট করে ব্যাকআপ বন্ধ করতে পারেন। যদি আপনার অ্যাপটি অন্য কোনও পদ্ধতির মাধ্যমে তার অবস্থা পুনরায় তৈরি করতে পারে অথবা যদি আপনার অ্যাপটি সংবেদনশীল তথ্য নিয়ে কাজ করে তবে আপনি এটি করতে চাইতে পারেন।

ফাইল অন্তর্ভুক্ত করুন এবং বাদ দিন

ডিফল্টরূপে, সিস্টেমটি প্রায় সমস্ত অ্যাপ ডেটা ব্যাকআপ করে। আরও তথ্যের জন্য, ব্যাকআপ নেওয়া ফাইলগুলি সম্পর্কে বিভাগটি দেখুন।

ট্রান্সফারের ধরণের উপর ভিত্তি করে আপনি ব্যাকআপে কোন ডেটা অন্তর্ভুক্ত করা হবে তা নিয়ন্ত্রণ করতে পারেন। অটো ব্যাকআপ গুগল ড্রাইভে ক্লাউড ব্যাকআপ এবং ডিভাইস-টু-ডিভাইস (D2D) ট্রান্সফারকে সমর্থন করে। অ্যান্ড্রয়েড সংস্করণ এবং আপনার অ্যাপের targetSdkVersion এর উপর ভিত্তি করে কনফিগারেশন পদ্ধতি পরিবর্তিত হয়।

Android 11 এবং তার আগের ভার্সনে ব্যাকআপ নিয়ন্ত্রণ করুন

Android 11 (API লেভেল 30) বা তার নিচের ভার্সনে চলমান ডিভাইসগুলিতে কোন ফাইলের ব্যাকআপ নেওয়া হবে তা নিয়ন্ত্রণ করতে এই বিভাগের ধাপগুলি অনুসরণ করুন।

  1. আপনার AndroidManifest.xml ফাইলে, নিম্নলিখিত উদাহরণে দেখানো হিসাবে, <application> উপাদানে android:fullBackupContent অ্যাট্রিবিউট যোগ করুন। এই অ্যাট্রিবিউটটি এমন একটি XML ফাইলের দিকে নির্দেশ করে যেখানে ব্যাকআপ নিয়ম রয়েছে।

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
  2. res/xml/ ডিরেক্টরিতে @xml/ backup_rules নামে একটি 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) বা উচ্চতর সংস্করণে নিম্নলিখিত শর্তাবলী যোগ করতে পারেন:

যদি আপনি আপনার ডেভেলপমেন্ট ডিভাইসগুলিকে Android 9 এ আপগ্রেড করে থাকেন, তাহলে আপগ্রেড করার পরে আপনাকে ডেটা ব্যাকআপ অক্ষম করে পুনরায় সক্ষম করতে হবে। এর কারণ হল Android শুধুমাত্র সেটিংস বা সেটআপ উইজার্ডে ব্যবহারকারীদের জানানোর পরে ক্লায়েন্ট-সাইড সিক্রেট দিয়ে ব্যাকআপ এনক্রিপ্ট করে।

অন্তর্ভুক্তির শর্তাবলী ঘোষণা করতে, requireFlags অ্যাট্রিবিউটটি আপনার ব্যাকআপ নিয়মের সেটের মধ্যে <include> উপাদানগুলির মধ্যে একটি নির্বাচিত মান বা মানগুলিতে সেট করুন:

ব্যাকআপ_রুলস.এক্সএমএল

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <!-- App data isn't included in user's backup
         unless client-side encryption is enabled. -->
    <include domain="file" path="."
             requireFlags="clientSideEncryption" />
</full-backup-content>

যদি আপনার অ্যাপটি একটি কী-মান ব্যাকআপ সিস্টেম প্রয়োগ করে অথবা আপনি নিজে BackupAgent প্রয়োগ করেন , তাহলে আপনি 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 12 বা তার পরবর্তী ভার্সনে ব্যাকআপ নিয়ন্ত্রণ করুন

যদি আপনার অ্যাপটি Android 12 (API লেভেল 31) বা তার উচ্চতর ভার্সনের জন্য উপযুক্ত হয়, তাহলে Android 12 বা তার উচ্চতর ভার্সনে চলমান ডিভাইসগুলিতে কোন ফাইলের ব্যাকআপ নেওয়া হবে তা নিয়ন্ত্রণ করতে এই বিভাগের ধাপগুলি অনুসরণ করুন।

  1. আপনার AndroidManifest.xml ফাইলে, নিম্নলিখিত উদাহরণে দেখানো হিসাবে, <application> উপাদানে android:dataExtractionRules অ্যাট্রিবিউট যোগ করুন। এই অ্যাট্রিবিউটটি এমন একটি XML ফাইলের দিকে নির্দেশ করে যেখানে ব্যাকআপ নিয়ম রয়েছে।

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
  2. res/xml/ ডিরেক্টরিতে backup_rules .xml নামে একটি 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 ভার্সনটিকে টার্গেট করছে এবং যে ভার্সনে চলছে তার উপর নির্ভর করে পরিবর্তিত হয়।

অ্যান্ড্রয়েড ১১ বা তার নিচের ভার্সন

অ্যান্ড্রয়েড ১১ বা তার নিচের ভার্সনে চলমান ডিভাইসের ব্যাকআপ নিয়ন্ত্রণকারী কনফিগারেশন ফাইলের জন্য নিম্নলিখিত XML সিনট্যাক্স ব্যবহার করুন।

<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 (API লেভেল 31) বা তার উচ্চতর ভার্সনের জন্য তৈরি হয়, তাহলে Android 12 বা তার উচ্চতর ভার্সনে চলমান ডিভাইসের ব্যাকআপ নিয়ন্ত্রণকারী কনফিগারেশন ফাইলের জন্য নিম্নলিখিত XML সিনট্যাক্স ব্যবহার করুন।

<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> ) এমন নিয়ম রয়েছে যা শুধুমাত্র সেই ধরণের স্থানান্তরের ক্ষেত্রে প্রযোজ্য। উদাহরণস্বরূপ, এই বিচ্ছেদ আপনাকে ডিভাইস-টু-ডিভাইস (D2D) স্থানান্তর বা ক্রস-প্ল্যাটফর্ম স্থানান্তরের সময় Google ড্রাইভ ব্যাকআপ থেকে কোনও ফাইল বা ডিরেক্টরি বাদ দিতে দেয়। যদি আপনার এমন ফাইল থাকে যা ক্লাউডে ব্যাকআপ নেওয়ার জন্য খুব বড় হয় তবে সমস্যা ছাড়াই ডিভাইসগুলির মধ্যে স্থানান্তর করা যেতে পারে তবে এটি কার্যকর।

যদি কোনও নির্দিষ্ট ব্যাকআপ মোডের জন্য কোনও নিয়ম না থাকে, যেমন <device-transfer> বিভাগটি অনুপস্থিত থাকে, তাহলে no-backup এবং cache ডিরেক্টরি ছাড়া সমস্ত সামগ্রীর জন্য সেই মোড সম্পূর্ণরূপে সক্ষম, যেমনটি ব্যাকআপ করা ফাইল বিভাগে বর্ণিত হয়েছে

আপনার অ্যাপ <cloud-backup> বিভাগে disableIfNoEncryptionCapabilities ফ্ল্যাগ সেট করতে পারে যাতে নিশ্চিত করা যায় যে ব্যাকআপটি কেবল তখনই হবে যখন এটি এনক্রিপ্ট করা সম্ভব, যেমন যখন ব্যবহারকারীর লক স্ক্রিন থাকে। এই সীমাবদ্ধতা সেট করলে ব্যবহারকারীর ডিভাইস এনক্রিপশন সমর্থন করতে না পারলে ব্যাকআপগুলি ক্লাউডে পাঠানো বন্ধ হয়ে যায়, কিন্তু যেহেতু D2D ট্রান্সফার সার্ভারে পাঠানো হয় না, তাই এনক্রিপশন সমর্থন করে না এমন ডিভাইসগুলিতেও এগুলি কাজ করতে থাকে।

অন্তর্ভুক্ত এবং বাদ দেওয়া উপাদানের সিনট্যাক্স

<full-backup-content> , <cloud-backup> , এবং <device-transfer> ট্যাগের ভিতরে (ডিভাইসের অ্যান্ড্রয়েড সংস্করণ এবং আপনার অ্যাপের targetSDKVersion এর উপর নির্ভর করে), আপনি <include> এবং <exclude> উপাদানগুলি সংজ্ঞায়িত করতে পারেন:

<include>

ব্যাকআপ নেওয়ার জন্য একটি ফাইল বা ফোল্ডার নির্দিষ্ট করে। ডিফল্টরূপে, অটো ব্যাকআপে প্রায় সমস্ত অ্যাপ ফাইল অন্তর্ভুক্ত থাকে। যদি আপনি একটি <include> উপাদান নির্দিষ্ট করেন, তাহলে সিস্টেমটি আর ডিফল্টরূপে কোনও ফাইল অন্তর্ভুক্ত করে না এবং শুধুমাত্র নির্দিষ্ট করা ফাইলগুলির ব্যাকআপ নেয়। একাধিক ফাইল অন্তর্ভুক্ত করতে, একাধিক <include> উপাদান ব্যবহার করুন।

অ্যান্ড্রয়েড ১১ এবং তার নিচের ভার্সনে, এই উপাদানটিতে requireFlags অ্যাট্রিবিউটও থাকতে পারে, যা ব্যাকআপের জন্য শর্তসাপেক্ষ প্রয়োজনীয়তা কীভাবে সংজ্ঞায়িত করতে হয় তা বর্ণনাকারী বিভাগে আরও বিশদে আলোচনা করা হয়েছে।

getCacheDir() , getCodeCacheDir() , অথবা getNoBackupFilesDir() দ্বারা ফেরত দেওয়া ডিরেক্টরিগুলিতে থাকা ফাইলগুলি সর্বদা বাদ দেওয়া হয়, এমনকি যদি আপনি সেগুলি অন্তর্ভুক্ত করার চেষ্টা করেন।

<exclude>

ব্যাকআপের সময় বাদ দেওয়ার জন্য একটি ফাইল বা ফোল্ডার নির্দিষ্ট করে। এখানে কিছু ফাইল রয়েছে যা সাধারণত ব্যাকআপ থেকে বাদ দেওয়া হয়:

  • যেসব ফাইলে ডিভাইস-নির্দিষ্ট শনাক্তকারী থাকে, সেগুলো হয় সার্ভার দ্বারা জারি করা হয় অথবা ডিভাইসে তৈরি করা হয়। উদাহরণস্বরূপ, Firebase Cloud Messaging (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

ব্যাকআপে অন্তর্ভুক্ত করার জন্য বা বাদ দেওয়ার জন্য একটি ফাইল বা ফোল্ডার নির্দিষ্ট করে। নিম্নলিখিত বিষয়গুলি লক্ষ্য করুন:

  • এই বৈশিষ্ট্যটি ওয়াইল্ডকার্ড বা রেগুলার এক্সপ্রেশন সিনট্যাক্স সমর্থন করে না।
  • আপনি বর্তমান ডিরেক্টরিটি ./ ব্যবহার করে উল্লেখ করতে পারেন, কিন্তু নিরাপত্তার কারণে আপনি মূল ডিরেক্টরিটি, যেমন .. ব্যবহার করে, উল্লেখ করতে পারবেন না।
  • যদি আপনি একটি ডিরেক্টরি নির্দিষ্ট করেন, তাহলে নিয়মটি ডিরেক্টরির সমস্ত ফাইল এবং পুনরাবৃত্ত সাবডিরেক্টরির ক্ষেত্রে প্রযোজ্য।

ক্রস-প্ল্যাটফর্ম স্থানান্তর কনফিগার করুন

অ্যান্ড্রয়েড ১৬ কিউপিআর২ (এপিআই লেভেল ৩৬.১) থেকে শুরু করে আপনি নন-অ্যান্ড্রয়েড ডিভাইসে এবং সেখান থেকে ডেটা ট্রান্সফারের জন্য অটো ব্যাকআপ কনফিগার করতে পারেন। এটি করার জন্য, অ্যান্ড্রয়েড ১২ বা উচ্চতর সিনট্যাক্সে দেখানো আপনার <data-extraction-rules> কনফিগারেশনের মধ্যে <cross-platform-transfer> উপাদানটি যোগ করুন। আপনাকে প্রয়োজনীয় platform অ্যাট্রিবিউট ব্যবহার করে লক্ষ্য প্ল্যাটফর্মটি নির্দিষ্ট করতে হবে। একমাত্র সমর্থিত মান হল ios

এই বিভাগের ভেতরে, আপনি কোন ডেটা স্থানান্তর করতে হবে তা নির্দিষ্ট করতে include এবং exclude উপাদানগুলির জন্য সিনট্যাক্সে বর্ণিত স্ট্যান্ডার্ড <include> এবং <exclude> উপাদানগুলি ব্যবহার করতে পারেন।

অতিরিক্তভাবে, সিস্টেমটিকে আপনার অ্যাপটিকে লক্ষ্য প্ল্যাটফর্মের সংশ্লিষ্ট অ্যাপের সাথে মেলাতে সাহায্য করার জন্য আপনাকে <platform-specific-params> উপাদানটি অন্তর্ভুক্ত করতে হবে। এই উপাদানটিতে নিম্নলিখিত প্রয়োজনীয় বৈশিষ্ট্য রয়েছে:

  • bundleId : অন্য প্ল্যাটফর্মে থাকা অ্যাপের বান্ডেল আইডি (যেমন, আপনার iOS অ্যাপের বান্ডেল আইডি)।
  • teamId : অন্য প্ল্যাটফর্মে থাকা অ্যাপের টিম আইডি (যেমন, আপনার iOS অ্যাপের টিম আইডি)।
  • contentVersion : আপনার সংজ্ঞায়িত একটি সংস্করণ স্ট্রিং, যা রপ্তানি করা ডেটা ফর্ম্যাটের সাথে সম্পর্কিত।

bundleId এবং teamId অ্যাট্রিবিউটগুলি ডেটা ইন্টিগ্রিটি যাচাই করতে এবং অ্যাপ-টু-অ্যাপের সঠিক মিল যাচাই করতে ব্যবহৃত হয়। তারা গ্যারান্টি দেয় যে এক্সপোর্টের সময় ডেটা কেবল অন্য প্ল্যাটফর্মের নির্দিষ্ট অ্যাপে স্থানান্তরিত হবে এবং এই অ্যান্ড্রয়েড অ্যাপটি আমদানির সময় কেবল সেই নির্দিষ্ট অ্যাপ থেকে ডেটা আমদানি করবে।

XML নিয়মের বাইরে ডেটা ট্রান্সফর্মেশন এবং ট্রান্সফার প্রক্রিয়ার উপর আরও সূক্ষ্ম নিয়ন্ত্রণের জন্য, আপনি একটি কাস্টম BackupAgent বাস্তবায়ন করতে পারেন এবং ক্রস-প্ল্যাটফর্ম ট্রান্সফার API ব্যবহার করতে পারেন।

iOS ট্রান্সফারের জন্য ফাইল ম্যাপিং

iOS-এ ফাইল স্থানান্তর করার সময়, <include> নিয়মগুলিতে আপনি যে Android domain এবং path নির্দিষ্ট করেন তা একটি নির্দিষ্ট ডিরেক্টরি কাঠামোর সাথে ম্যাপ করে। নিম্নলিখিত টেবিলটি Android domain উপর ভিত্তি করে স্থানান্তর গন্তব্য রুটের সাথে সম্পর্কিত iOS-এ গন্তব্য পাথগুলি দেখায়:

অ্যান্ড্রয়েড 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 ব্যবহার করতে পারেন। সাধারণত, এটি করার দুটি কারণ রয়েছে:

  • আপনি ব্যাকআপ ইভেন্টের বিজ্ঞপ্তি পেতে চান, যেমন onRestoreFinished() এবং onQuotaExceeded() । অ্যাপটি চালু না থাকলেও এই কলব্যাক পদ্ধতিগুলি কার্যকর করা হয়।

  • XML নিয়ম ব্যবহার করে আপনি যে ফাইলগুলির ব্যাকআপ নিতে চান তা সহজেই প্রকাশ করতে পারবেন না। এই বিরল ক্ষেত্রে, আপনি একটি BackupAgent প্রয়োগ করতে পারেন যা onFullBackup(FullBackupDataOutput) কে ওভাররাইড করে আপনার পছন্দের জিনিস সংরক্ষণ করে। সিস্টেমের ডিফল্ট বাস্তবায়ন বজায় রাখতে, superclass-এ super.onFullBackup() ব্যবহার করে সংশ্লিষ্ট পদ্ধতিটি কল করুন।

যদি আপনি একটি BackupAgent প্রয়োগ করেন, তাহলে ডিফল্টরূপে সিস্টেমটি আশা করে যে আপনার অ্যাপটি কী-মান ব্যাকআপ এবং পুনরুদ্ধার করবে। পরিবর্তে ফাইল-ভিত্তিক অটো ব্যাকআপ ব্যবহার করতে, আপনার অ্যাপের ম্যানিফেস্টে android:fullBackupOnly অ্যাট্রিবিউটটিকে true এ সেট করুন।

অটো ব্যাকআপ এবং রিস্টোর অপারেশনের সময়, সিস্টেমটি একটি সীমাবদ্ধ মোডে অ্যাপটি চালু করে যাতে অ্যাপটি দ্বন্দ্ব সৃষ্টি করতে পারে এমন ফাইলগুলিতে অ্যাক্সেস করতে না পারে এবং অ্যাপটিকে তার BackupAgent এ কলব্যাক পদ্ধতিগুলি কার্যকর করতে দেয়। এই সীমাবদ্ধ মোডে, অ্যাপের প্রধান কার্যকলাপ স্বয়ংক্রিয়ভাবে চালু হয় না, এর কন্টেন্ট প্রদানকারীরা শুরু হয় না এবং অ্যাপের ম্যানিফেস্টে ঘোষিত যেকোনো সাবক্লাসের পরিবর্তে বেস-ক্লাস Application তাত্ক্ষণিকভাবে চালু হয়।

আপনার BackupAgent অবশ্যই onBackup() এবং onRestore() বিমূর্ত পদ্ধতিগুলি বাস্তবায়ন করতে হবে, যা কী-মান ব্যাকআপের জন্য ব্যবহৃত হয়। যদি আপনি কী-মান ব্যাকআপ করতে না চান, তাহলে আপনি এই পদ্ধতিগুলির বাস্তবায়ন খালি রাখতে পারেন।

আরও তথ্যের জন্য, Extend BackupAgent দেখুন।

ব্যাকআপএজেন্টে ক্রস-প্ল্যাটফর্ম স্থানান্তর পরিচালনা করুন

অ্যান্ড্রয়েড ১৬ কিউপিআর২ (এপিআই লেভেল ৩৬.১) দিয়ে শুরু করে, ক্রস-প্ল্যাটফর্ম ডেটা ট্রান্সফারকে আরও ভালোভাবে সমর্থন করার জন্য BackupAgent বেশ কয়েকটি নতুন এপিআই উপলব্ধ।

নতুন পরিবহন পতাকা:

  • FLAG_CROSS_PLATFORM_TRANSFER_IOS : এই পতাকাটি আপনার BackupAgent এ প্রদত্ত transportFlags এ যোগ করা হয়েছে।
    • 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();
}