স্টোরেজ

অ্যান্ড্রয়েড এক্সটার্নাল স্টোরেজ HAL আইকন

অ্যান্ড্রয়েড সময়ের সাথে সাথে বিভিন্ন ধরণের স্টোরেজ ডিভাইসের ধরন এবং বৈশিষ্ট্যগুলিকে সমর্থন করার জন্য বিবর্তিত হয়েছে। অ্যান্ড্রয়েডের সমস্ত সংস্করণ প্রথাগত স্টোরেজ সহ ডিভাইস সমর্থন করে, যার মধ্যে পোর্টেবল এবং এমুলেটেড স্টোরেজ রয়েছে। পোর্টেবল স্টোরেজ একটি SD কার্ড বা ইউএসবি এর মত ভৌত মিডিয়া দ্বারা প্রদান করা যেতে পারে, যা অস্থায়ী ডেটা স্থানান্তর/ফাইল স্টোরেজের জন্য। ভৌত মিডিয়া একটি বর্ধিত সময়ের জন্য ডিভাইসের সাথে থাকতে পারে, কিন্তু ডিভাইসের সাথে আবদ্ধ নয় এবং সরানো হতে পারে। অ্যান্ড্রয়েড 1.0 থেকে এসডি কার্ড পোর্টেবল স্টোরেজ হিসেবে পাওয়া যাচ্ছে; অ্যান্ড্রয়েড 6.0 ইউএসবি সমর্থন যোগ করেছে। এমুলেটেড স্টোরেজ একটি এমুলেশন লেয়ারের মাধ্যমে অভ্যন্তরীণ স্টোরেজের একটি অংশ উন্মুক্ত করে প্রদান করা হয় এবং এটি Android 3.0 থেকে উপলব্ধ।

অ্যান্ড্রয়েড 6.0 থেকে শুরু করে, অ্যান্ড্রয়েড গ্রহণযোগ্য সঞ্চয়স্থান সমর্থন করে, যা একটি SD কার্ড বা USB এর মতো শারীরিক মিডিয়া দ্বারা সরবরাহ করা হয়, যা অভ্যন্তরীণ স্টোরেজের মতো আচরণ করার জন্য এনক্রিপ্ট করা এবং ফর্ম্যাট করা হয়৷ গ্রহণযোগ্য স্টোরেজ সব ধরনের অ্যাপ্লিকেশন ডেটা সংরক্ষণ করতে পারে।

অনুমতি

বাহ্যিক সঞ্চয়স্থানে অ্যাক্সেস বিভিন্ন Android অনুমতি দ্বারা সুরক্ষিত। Android 1.0 থেকে শুরু করে, WRITE_EXTERNAL_STORAGE অনুমতি দিয়ে লেখার অ্যাক্সেস সুরক্ষিত। Android 4.1 থেকে শুরু করে, পড়ার অ্যাক্সেস READ_EXTERNAL_STORAGE অনুমতির সাথে সুরক্ষিত।

অ্যান্ড্রয়েড 4.4 থেকে শুরু করে, বাহ্যিক স্টোরেজ ডিভাইসে মালিক, গোষ্ঠী এবং ফাইলগুলির মোডগুলি এখন ডিরেক্টরি কাঠামোর উপর ভিত্তি করে সংশ্লেষিত হয়৷ এটি অ্যাপগুলিকে বাহ্যিক সঞ্চয়স্থানে তাদের প্যাকেজ-নির্দিষ্ট ডিরেক্টরিগুলি পরিচালনা করতে সক্ষম করে যাতে তারা বিস্তৃত WRITE_EXTERNAL_STORAGE অনুমতি না রাখে৷ উদাহরণস্বরূপ, com.example.foo প্যাকেজ নামের অ্যাপটি এখন কোনো অনুমতি ছাড়াই বাহ্যিক স্টোরেজ ডিভাইসে Android/data/com.example.foo/ অবাধে অ্যাক্সেস করতে পারে। এই সংশ্লেষিত অনুমতিগুলি একটি FUSE ডেমনে কাঁচা স্টোরেজ ডিভাইসগুলি মোড়ানোর মাধ্যমে সম্পন্ন করা হয়।

অ্যান্ড্রয়েড 10 থেকে শুরু করে, অ্যাপ্লিকেশানগুলি যেগুলি অ্যানড্রয়েড 9 এবং নিম্নতর ডিফল্ট লিগ্যাসি স্টোরেজকে লক্ষ্য করে এবং বিচ্ছিন্ন স্টোরেজ বেছে নিতে পারে। যে অ্যাপগুলি Android 10 টার্গেট করে এবং ডিফল্ট বিচ্ছিন্ন স্টোরেজ থেকে সাময়িকভাবে অপ্ট আউট করতে পারে৷ ডিফল্ট অবস্থা পরিবর্তন করতে ম্যানিফেস্ট অ্যাট্রিবিউট requestLegacyExternalStorage ব্যবহার করুন, যা স্টোরেজ মডেল নিয়ন্ত্রণ করে।

যেহেতু READ_EXTERNAL_STORAGE এবং WRITE_EXTERNAL_STORAGE উভয় অনুমতিই নরম-সীমাবদ্ধ, যদি ইনস্টলার অ্যাপটিকে সাদা তালিকাভুক্ত না করে, তবে অনুমতিটি শুধুমাত্র শ্রবণ এবং ভিজ্যুয়াল সংগ্রহগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করে, SD কার্ডে কোনও অ্যাক্সেস ছাড়াই৷ অ্যাপটি লিগ্যাসি স্টোরেজের অনুরোধ করলেও এটি প্রযোজ্য। হার্ড সীমাবদ্ধতা এবং নরম সীমাবদ্ধতা উভয় সম্পর্কে আরও তথ্যের জন্য , Android 10-এ হার্ড এবং নরম সীমাবদ্ধতা দেখুন।

যদি ইনস্টলার অনুমতিটিকে শ্বেত তালিকাভুক্ত করে থাকে, তাহলে লিগ্যাসি মোডে চলমান একটি অ্যাপ অনির্বাচিত অনুমতি আচরণ পায়। অনুমতি SD কার্ড অ্যাক্সেস নিয়ন্ত্রণ করে, এবং শ্রবণ এবং ভিজ্যুয়াল সংগ্রহ। এটি তখন ঘটে যখন হয় অ্যাপটি Android 9 বা তার নিচের সংস্করণগুলিকে লক্ষ্য করে এবং বিচ্ছিন্ন স্টোরেজ নির্বাচন না করে, অথবা এটি Android 10 কে লক্ষ্য করে এবং অপ্ট আউট করে৷

হোয়াইটলিস্টের অবস্থা শুধুমাত্র ইনস্টলের সময় নির্দিষ্ট করা যেতে পারে এবং অ্যাপটি ইনস্টল না হওয়া পর্যন্ত পরিবর্তন করা যাবে না।

READ_EXTERNAL_STORAGE অনুমতি সেট করার বিষয়ে আরও তথ্যের জন্য, PackageInstaller.SessionParams ক্লাসে setWhitelistedRestrictedPermissions() দেখুন।

রানটাইম অনুমতি

অ্যান্ড্রয়েড 6.0 একটি নতুন রানটাইম অনুমতি মডেল প্রবর্তন করে যেখানে অ্যাপগুলি রানটাইমের সময় প্রয়োজন হলে ক্ষমতার অনুরোধ করে। যেহেতু নতুন মডেলটিতে READ/WRITE_EXTERNAL_STORAGE অনুমতি রয়েছে, তাই প্ল্যাটফর্মটিকে ইতিমধ্যেই চলমান অ্যাপগুলিকে হত্যা বা পুনরায় চালু না করে গতিশীলভাবে স্টোরেজ অ্যাক্সেস প্রদান করতে হবে। এটি সমস্ত মাউন্ট করা স্টোরেজ ডিভাইসের তিনটি স্বতন্ত্র দৃষ্টিভঙ্গি বজায় রেখে এটি করে:

  • /mnt/runtime/default কোনো বিশেষ সঞ্চয়স্থানের অনুমতি ছাড়াই অ্যাপে এবং রুট নেমস্পেসে দেখানো হয় যেখানে adbd এবং অন্যান্য সিস্টেমের উপাদান থাকে।
  • READ_EXTERNAL_STORAGE সহ অ্যাপগুলিতে /mnt/runtime/read দেখানো হয় (Android 10 এর জন্য LEGACY_STORAGE সেট করুন)
  • WRITE_EXTERNAL_STORAGE সহ অ্যাপগুলিতে /mnt/runtime/write দেখানো হয়

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

এই বৈশিষ্ট্যটি বাস্তবায়নের জন্য ব্যবহৃত setns() কার্যকারিতার জন্য কমপক্ষে Linux 3.8 প্রয়োজন, কিন্তু প্যাচগুলি সফলভাবে Linux 3.4-এ ব্যাকপোর্ট করা হয়েছে। PermissionsHostTest CTS পরীক্ষাটি সঠিক কার্নেল আচরণ যাচাই করতে ব্যবহার করা যেতে পারে।