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

অ্যাপের জন্য অটো ব্যাকআপ স্বয়ংক্রিয়ভাবে সেইসব অ্যাপ থেকে ব্যবহারকারীর ডেটা ব্যাকআপ করে, যেগুলো অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) বা তার উচ্চতর সংস্করণে চলে। অ্যান্ড্রয়েড ব্যবহারকারীর গুগল ড্রাইভে অ্যাপের ডেটা আপলোড করে তা সংরক্ষণ করে, যেখানে এটি ব্যবহারকারীর গুগল অ্যাকাউন্টের ক্রেডেনশিয়াল দ্বারা সুরক্ষিত থাকে। অ্যান্ড্রয়েড ৯ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলোতে এই ব্যাকআপ ডিভাইসের পিন, প্যাটার্ন বা পাসওয়ার্ড ব্যবহার করে এন্ড-টু-এন্ড এনক্রিপ্টেড থাকে। প্রতিটি অ্যাপ, প্রতি ব্যবহারকারীর জন্য ২৫ মেগাবাইট পর্যন্ত ব্যাকআপ ডেটা বরাদ্দ করতে পারে। ব্যাকআপ ডেটা সংরক্ষণের জন্য কোনো চার্জ নেই। আপনার অ্যাপ ব্যাকআপ প্রক্রিয়াটি কাস্টমাইজ করতে পারে অথবা ব্যাকআপ নিষ্ক্রিয় করে এটি থেকে বিরত থাকতে পারে।

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

যে ফাইলগুলি ব্যাক আপ করা হয়

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

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

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

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

  • getExternalFilesDir(String) দ্বারা ফেরত আসা ডিরেক্টরিতে এক্সটার্নাল স্টোরেজের ফাইলগুলো

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

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

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

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

ব্যবহারকারীরা গুগল ড্রাইভ অ্যান্ড্রয়েড অ্যাপে ব্যাকআপ করা অ্যাপগুলোর একটি তালিকা দেখতে পারেন। অ্যান্ড্রয়েড চালিত ডিভাইসে, ব্যবহারকারীরা ড্রাইভ অ্যাপের নেভিগেশন ড্রয়ারে সেটিংস > ব্যাকআপ এবং রিসেট- এর অধীনে এই তালিকাটি খুঁজে পাবেন।

নিম্নলিখিত উদাহরণগুলিতে বর্ণিত হিসাবে, প্রতিটি ডিভাইস-সেটআপ-জীবনকালের ব্যাকআপগুলি আলাদা ডেটাসেটে সংরক্ষণ করা হয়:

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

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

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

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

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

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

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

টেস্টিং সহজ করার জন্য, অ্যান্ড্রয়েডে এমন টুল রয়েছে যা আপনাকে ম্যানুয়ালি আপনার অ্যাপের ব্যাকআপ শুরু করতে দেয়। আরও তথ্যের জন্য, ‘টেস্ট ব্যাকআপ অ্যান্ড রিস্টোর’ দেখুন।

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

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

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

টেস্টিং সহজ করার জন্য, অ্যান্ড্রয়েডে এমন টুল রয়েছে যা আপনাকে ম্যানুয়ালি আপনার অ্যাপ রিস্টোর করার প্রক্রিয়া শুরু করতে দেয়। আরও তথ্যের জন্য, ‘টেস্ট ব্যাকআপ অ্যান্ড রিস্টোর’ দেখুন।

ব্যাকআপ সক্রিয় এবং নিষ্ক্রিয় করুন

যেসব অ্যাপ অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) বা তার উচ্চতর সংস্করণকে টার্গেট করে, সেগুলো স্বয়ংক্রিয়ভাবে অটো ব্যাকআপে অংশগ্রহণ করে। আপনার অ্যাপের ম্যানিফেস্ট ফাইলে, ব্যাকআপ চালু বা বন্ধ করতে android:allowBackup বুলিয়ান ভ্যালুটি সেট করুন। এর ডিফল্ট ভ্যালু হলো true , কিন্তু আমরা আপনার ম্যানিফেস্টে অ্যাট্রিবিউটটি স্পষ্টভাবে সেট করার পরামর্শ দিই, যেমনটি নিচের উদাহরণে দেখানো হয়েছে:

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

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

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

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

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

অ্যান্ড্রয়েড ১১ এবং এর নিচের সংস্করণগুলিতে ব্যাকআপ নিয়ন্ত্রণ করুন

Android 11 (API level 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>

ব্যাকআপের জন্য প্রয়োজনীয় ডিভাইসের শর্তাবলী নির্ধারণ করুন

আপনার অ্যাপ যদি ডিভাইসে সংবেদনশীল তথ্য সংরক্ষণ করে, তাহলে আপনি এমন শর্তাবলী নির্দিষ্ট করে দিতে পারেন যার অধীনে আপনার অ্যাপের ডেটা ব্যবহারকারীর ব্যাকআপে অন্তর্ভুক্ত হবে। অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) বা তার উচ্চতর সংস্করণে আপনি নিম্নলিখিত শর্তগুলো যোগ করতে পারেন:

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

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

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

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

অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণে ব্যাকআপ নিয়ন্ত্রণ করুন

আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলোতে কোন ফাইলগুলো ব্যাকআপ করা হবে তা নিয়ন্ত্রণ করতে এই বিভাগের ধাপগুলো অনুসরণ করুন।

  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 সিনট্যাক্স ব্যবহার করুন।

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

অ্যান্ড্রয়েড ১২ বা তার উচ্চতর

আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলোর ব্যাকআপ নিয়ন্ত্রণকারী কনফিগারেশন ফাইলের জন্য নিম্নলিখিত এক্সএমএল সিনট্যাক্সটি ব্যবহার করুন।

<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) বা ক্রস-প্ল্যাটফর্ম ট্রান্সফারের সময় সেটিকে ঠিকই স্থানান্তর করতে দেয়। এটি তখন কাজে আসে যখন আপনার এমন ফাইল থাকে যা ক্লাউডে ব্যাকআপ করার জন্য অনেক বড়, কিন্তু ডিভাইসগুলোর মধ্যে কোনো সমস্যা ছাড়াই স্থানান্তর করা যায়।

যদি কোনো নির্দিষ্ট ব্যাকআপ মোডের জন্য কোনো নিয়ম না থাকে, যেমন <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> নিয়মে যে অ্যান্ড্রয়েড domain এবং path নির্দিষ্ট করেন, তা একটি নির্দিষ্ট ডিরেক্টরি কাঠামোর সাথে ম্যাপ করা থাকে। নিচের সারণিটি অ্যান্ড্রয়েড 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) মেথডটিকে ওভাররাইড করে। সিস্টেমের ডিফল্ট ইমপ্লিমেন্টেশন বজায় রাখতে, super.onFullBackup() ব্যবহার করে সুপারক্লাসের সংশ্লিষ্ট মেথডটি কল করুন।

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

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

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

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

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