ডাইরেক্ট বুট মোড সাপোর্ট করে

ডিভাইস চালু করা হলেও ব্যবহারকারী আনলক না করলে, Android 7.0 সুরক্ষিত, ডাইরেক্ট বুট মোডে রান করে। এটি করার জন্য, সিস্টেম ডেটার জন্য দুটি স্টোরেজ লোকেশন প্রদান করে:

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

ডিফল্ট হিসেবে, ডাইরেক্ট বুট মোড চলাকালীন অ্যাপ কাজ করে না। Direct Boot মোড চলাকালীন আপনার অ্যাপকে কোনও অ্যাকশন নিতে হলে, এই মোড চলাকালীন রান করার জন্য আপনি অ্যাপ কম্পোনেন্ট রেজিস্টার করতে পারবেন। ডাইরেক্ট বুট মোড চলাকালীন অ্যাপ চালানোর প্রয়োজনীয়তার কিছু সাধারণ উদাহরণ হল:

  • যেসব অ্যাপে বিজ্ঞপ্তি শিডিউল করা থাকে, যেমন অ্যালার্ম ক্লক অ্যাপ।
  • যেসব অ্যাপ ব্যবহারকারীকে গুরুত্বপূর্ণ বিজ্ঞপ্তি প্রদান করে, যেমন এসএমএস অ্যাপ।
  • টকব্যাকের মতো অ্যাক্সেসিবিলিটি পরিষেবা প্রদানকারী অ্যাপ।

ডাইরেক্ট বুট মোডে চলাকালীন আপনার অ্যাপকে ডেটা অ্যাক্সেস করতে হলে, ডিভাইস এনক্রিপ্টেড স্টোরেজ ব্যবহার করুন। ডিভাইসের এনক্রিপ্ট করা স্টোরেজে এমন ডেটা থাকে যা এমন একটি 'কী' দিয়ে এনক্রিপ্ট করা হয় যা ডিভাইসটি সফলভাবে যাচাই করা বুট করার পরেই উপলভ্য হয়।

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

ডাইরেক্ট বুট চলাকালীন রান করার জন্য অ্যাক্সেসের অনুরোধ করুন

অ্যাপকে ডাইরেক্ট বুট মোডে রান করতে বা ডিভাইস এনক্রিপ্টেড স্টোরেজ অ্যাক্সেস করতে হলে, তার আগে সিস্টেমের সাথে তার কম্পোনেন্ট রেজিস্টার করতে হবে। অ্যাপগুলি কম্পোনেন্টগুলিকে এনক্রিপশন সম্পর্কে সচেতন হিসেবে চিহ্নিত করে সিস্টেমের সাথে রেজিস্টার করে। আপনার কম্পোনেন্টকে এনক্রিপশন অ্যাওয়ার হিসেবে চিহ্নিত করতে, আপনার ম্যানিফেস্টে android:directBootAware অ্যাট্রিবিউটকে true হিসেবে সেট করুন।

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

নিম্নলিখিত কোড স্নিপেটটি হল একটি উদাহরণ যা দেখায় কীভাবে অ্যাপ ম্যানিফেস্টে BroadcastReceiver-কে এনক্রিপশন-সচেতন হিসেবে রেজিস্টার করতে হয় এবং ACTION_LOCKED_BOOT_COMPLETED-এর জন্য ইনটেন্ট ফিল্টার যোগ করতে হয়:

<receiver
  android:directBootAware="true" >
  ...
  <intent-filter>
    <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
  </intent-filter>
</receiver>

ব্যবহারকারী ডিভাইস আনলক করলে, সব কম্পোনেন্ট ডিভাইসের এনক্রিপ্ট করা স্টোরেজ এবং ক্রেডেনশিয়াল এনক্রিপ্ট করা স্টোরেজ, উভয়ই অ্যাক্সেস করতে পারবে।

ডিভাইসের এনক্রিপ্ট করা স্টোরেজ অ্যাক্সেস করে

ডিভাইসের এনক্রিপ্ট করা স্টোরেজ অ্যাক্সেস করতে, Context.createDeviceProtectedStorageContext()-এ কল করে Context-এর দ্বিতীয় ইনস্ট্যান্স তৈরি করুন। এই কনটেক্সট ব্যবহার করে করা সব স্টোরেজ API কল ডিভাইস এনক্রিপ্টেড স্টোরেজ অ্যাক্সেস করে। নিম্নলিখিত উদাহরণটি ডিভাইস এনক্রিপ্টেড স্টোরেজ অ্যাক্সেস করে এবং আগে থেকে থাকা অ্যাপ ডেটা ফাইল খোলে:

Kotlin

val directBootContext: Context = appContext.createDeviceProtectedStorageContext()
// Access appDataFilename that lives in device encrypted storage
val inStream: InputStream = directBootContext.openFileInput(appDataFilename)
// Use inStream to read content...

জাভা

Context directBootContext = appContext.createDeviceProtectedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...

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

ব্যবহারকারী আনলক করলে বিজ্ঞপ্তি পান

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

রিবুট করার পরে ব্যবহারকারী ডিভাইস আনলক করলে বিজ্ঞপ্তি পেতে, আনলক বিজ্ঞপ্তি মেসেজ শোনার জন্য চালু থাকা কম্পোনেন্ট থেকে BroadcastReceiver রেজিস্টার করুন। বুট করার পরে ব্যবহারকারী ডিভাইস আনলক করলে:

  • আপনার অ্যাপে যদি এমন কোনও ফোরগ্রাউন্ড প্রসেস থাকে যার জন্য অবিলম্বে বিজ্ঞপ্তি প্রয়োজন, তাহলে ACTION_USER_UNLOCKED মেসেজটি শুনুন।
  • আপনার অ্যাপ যদি শুধুমাত্র ব্যাকগ্রাউন্ড প্রসেস ব্যবহার করে যা দেরিতে আসা বিজ্ঞপ্তিতে কাজ করতে পারে, তাহলে ACTION_BOOT_COMPLETED মেসেজ শুনুন।

ব্যবহারকারী ডিভাইস আনলক করেছেন কিনা তা জানতে আপনি UserManager.isUserUnlocked()-এ কল করতে পারেন।

আগে থেকে থাকা ডেটা মাইগ্রেট করুন

কোনও ব্যবহারকারী ডাইরেক্ট বুট মোড ব্যবহার করার জন্য তার ডিভাইস আপডেট করলে, আপনার কাছে আগে থেকে থাকা ডেটা থাকতে পারে যা ডিভাইস এনক্রিপ্টেড স্টোরেজে মাইগ্রেট করতে হবে। ক্রেডেনশিয়াল এনক্রিপ্টেড স্টোরেজ এবং ডিভাইস এনক্রিপ্টেড স্টোরেজের মধ্যে পছন্দ এবং ডেটাবেস ডেটা মাইগ্রেট করতে, Context.moveSharedPreferencesFrom() এবং Context.moveDatabaseFrom() ব্যবহার করুন, যেখানে ডেস্টিনেশন কনটেক্সট মেথড কলার এবং সোর্স কনটেক্সট আর্গুমেন্ট হিসেবে কাজ করে।

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

আপনার এনক্রিপশন-অ্যাওয়ার অ্যাপ পরীক্ষা করুন

'ডাইরেক্ট বুট' মোড চালু করে আপনার এনক্রিপশন-সচেতন অ্যাপ পরীক্ষা করুন।

Android-এর সাম্প্রতিক ভার্সন চলছে এমন বেশিরভাগ ডিভাইসে ডাইরেক্ট বুট মোড চালু হয়ে যায় যখনই লকস্ক্রিন ক্রেডেনশিয়াল (পিন, প্যাটার্ন বা পাসওয়ার্ড) সেট করা হয়। বিশেষ করে, ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করে এমন সব ডিভাইসের ক্ষেত্রে এটি প্রযোজ্য। কোনও ডিভাইস ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করে কিনা তা চেক করতে, নিম্নলিখিত শেল কমান্ড রান করুন:

adb shell getprop ro.crypto.type

আউটপুট file হলে, ডিভাইসে ফাইল-ভিত্তিক এনক্রিপশন চালু আছে।

যেসব ডিভাইসে ডিফল্ট হিসেবে ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করা হয় না, সেগুলিতে 'ডাইরেক্ট বুট' মোড পরীক্ষা করার জন্য অন্যান্য বিকল্প থাকতে পারে:

  • সম্পূর্ণ ডিস্ক এনক্রিপশন (ro.crypto.type=block) ব্যবহার করে এবং Android 7.0 থেকে Android 12 ভার্সনে চলে এমন কিছু ডিভাইস ফাইল-ভিত্তিক এনক্রিপশনে কনভার্ট করা যেতে পারে। এই কাজটি করার জন্য দু'টি পদ্ধতি আছে:

      সতর্কতা: ফাইল-ভিত্তিক এনক্রিপশনে কনভার্ট করার যেকোনও পদ্ধতি ব্যবহার করলে ডিভাইসে থাকা ব্যবহারকারীর সব ডেটা মুছে যায়।

    • ডিভাইসে ডেভেলপার বিকল্প চালু না করে থাকলে, সেটিংস > ফোন সম্পর্কে বিকল্পে গিয়ে বিল্ড নম্বর বিকল্পে সাতবার ট্যাপ করে এটি চালু করুন। তারপর সেটিংস > ডেভেলপার বিকল্প-এ গিয়ে ফাইল এনক্রিপশনে কনভার্ট করুন বিকল্প বেছে নিন।
    • বিকল্প হিসেবে, নিম্নলিখিত শেল কমান্ড রান করুন:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • Android 13 বা তার আগের ভার্সনে চলা ডিভাইসে "এমুলেট করা" ডাইরেক্ট বুট মোড কাজ করে। এটি ফাইল অ্যাক্সেস করার পারমিশন ব্যবহার করে এনক্রিপ্ট করা ফাইল লক ও আনলক করার এফেক্ট সিমুলেট করে। ডেভেলপমেন্টের সময় শুধুমাত্র এমুলেটেড মোড ব্যবহার করুন; এর ফলে ডেটা হারিয়ে যেতে পারে। এমুলেট করা Direct Boot মোড চালু করতে, ডিভাইসে লক প্যাটার্ন সেট করুন, লক প্যাটার্ন সেট করার সময় নিরাপদ স্টার্ট-আপ স্ক্রিনের জন্য প্রম্পট করা হলে "না, ধন্যবাদ" বেছে নিন এবং তারপর নিম্নলিখিত শেল কমান্ড রান করুন:

    adb shell sm set-emulate-fbe true
    

    এমুলেট করা ডাইরেক্ট বুট মোড বন্ধ করতে, নিম্নলিখিত শেল কমান্ড রান করুন:

    adb shell sm set-emulate-fbe false
    

    এইসব কমান্ডের মধ্যে যেকোনও একটি রান করলে ডিভাইস রিবুট হয়।

ডিভাইস নীতি এনক্রিপশন স্ট্যাটাস চেক করুন

ডিভাইস অ্যাডমিনিস্ট্রেশন অ্যাপ DevicePolicyManager.getStorageEncryptionStatus() ব্যবহার করে ডিভাইসের বর্তমান এনক্রিপশন স্ট্যাটাস চেক করতে পারে।

আপনার অ্যাপ Android 7.0 (API 24)-এর থেকে কম API লেভেল টার্গেট করলে, getStorageEncryptionStatus() রিটার্ন করে ENCRYPTION_STATUS_ACTIVE যদি ডিভাইসটি সম্পূর্ণ-ডিস্ক এনক্রিপশন বা ডাইরেক্ট বুটের সাথে ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করে। এই দুটি ক্ষেত্রেই, ডেটা সবসময় স্টোর করে রাখা অবস্থায় এনক্রিপ্ট করা থাকে।

আপনার অ্যাপ Android 7.0 (API 24) বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে, getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE রিটার্ন করে যদি ডিভাইসটি সম্পূর্ণ ডিস্ক এনক্রিপশন ব্যবহার করে। ডিভাইসটি ডাইরেক্ট বুটের সাথে ফাইল-ভিত্তিক এনক্রিপশন ব্যবহার করলে, এটি ENCRYPTION_STATUS_ACTIVE_PER_USER রিটার্ন করে।

আপনি যদি Android 7.0-কে টার্গেট করে কোনও ডিভাইস অ্যাডমিনিস্ট্রেশন অ্যাপ তৈরি করেন, তাহলে ডিভাইসটি এনক্রিপ্ট করা আছে কিনা তা নির্ধারণ করতে ENCRYPTION_STATUS_ACTIVE এবং ENCRYPTION_STATUS_ACTIVE_PER_USER দুটিই চেক করতে ভুলবেন না।

অতিরিক্ত কোড স্যাম্পেল

DirectBoot স্যাম্পেল এই পৃষ্ঠায় কভার করা API-এর ব্যবহার আরও দেখায়।