فضای ذخیرهسازی خارجی با ترکیبی از سرویس
اولیه vold و سرویس سیستم StorageManagerService مدیریت میشود. vold نصب حجمهای ذخیرهسازی خارجی فیزیکی را مدیریت میکند،
و عملیات آمادهسازی را برای آماده کردن رسانه قبلاز نمایش آن به برنامهها انجام میدهد.
توجه: در Android 8.0، کلاس
MountService به
StorageManagerService تغییر نام داده است.
نگاشتهای فایل
برای Android نسخه ۴.۲.۲ و نسخههای قدیمیتر، فایل پیکربندی vold.fstab
ویژه دستگاه، نگاشتهای دستگاههای sysfs به نقاط نصب سیستم فایل را تعریف میکند
و هر خط از این قالب پیروی میکند:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
-
label: برچسب میزان صدا. -
mount_point: مسیر سیستم فایل که حجم باید در آن نصب شود. partition: شماره پارتیشن (مبنای ۱)، یا «خودکار» برای اولین پارتیشن قابلاستفاده.-
sysfs_path: یک یا چند مسیر sysfs به دستگاههایی که میتوانند این نقطه نصب را ارائه دهند. با فاصله از هم جدا شده باشند و هرکدام باید با/شروع شود. -
flags: فهرست اختیاری پرچمها که با کاما از هم جدا شدهاند، نباید حاوی/باشد. مقادیر ممکن شاملnonremovableوencryptableاست.
برای نسخههای Android 4.3 و بالاتر، فایلهای fstab مختلفی که توسط init، vold، و
بازیابی استفاده میشوند در فایل /fstab.<device> یکپارچه شدهاند. برای
حجمهای ذخیرهسازی خارجی که توسط vold مدیریت میشوند، ورودیها باید قالب زیر را داشته باشند:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src: مسیری در sysfs (معمولاً در /sys نصب میشود) به دستگاهی که میتواند نقطه نصب را ارائه دهد. مسیر باید با/شروع شود.-
mount_point: مسیر سیستم فایل که حجم باید در آن نصب شود. -
type: نوع سیستم فایل در درایو. برای کارتهای خارجی، این معمولاًvfatاست. -
mnt_flags:Voldاین فیلد را نادیده میگیرد و باید رویdefaultsتنظیم شود -
fs_mgr_flags:Voldهر خطی را در fstab یکپارچه که پرچمvoldmanaged=را در این فیلد نداشته باشد نادیده میگیرد. این پرچم باید با برچسبی که کارت را توصیف میکند و شماره پارتیشن یا کلمهautoدنبال شود. مثالی در اینجا آورده شده است:voldmanaged=sdcard:auto. پرچمهای احتمالی دیگر عبارتاند ازnonremovable،encryptable=sdcard،noemulatedsd، وencryptable=userdata.
جزئیات پیکربندی
تعاملات فضای ذخیرهسازی خارجی در سطح چارچوب و بالاتر از آن ازطریق StorageManagerService مدیریت میشود. بهدلیل تغییرات پیکربندی در
Android 6.0 (مانند حذف همپوشانی منبع storage_list.xml)،
جزئیات پیکربندی به دو دسته تقسیم میشوند.
Android 5.x و نسخههای قدیمیتر
فایل پیکربندی storage_list.xml مختص دستگاه که معمولاً ازطریق رونهاد frameworks/base ارائه میشود، ویژگیها و محدودیتهای دستگاههای ذخیرهسازی را تعریف میکند. عنصر <StorageList>
شامل یک یا چند عنصر <storage> است که دقیقاً یکی از آنها باید
بهعنوان اصلی علامتگذاری شود. مشخصههای <storage> عبارتاند از:
-
mountPoint: مسیر سیستم فایل این نصب. -
storageDescription: منبع رشتهای که این سوار کردن را توصیف میکند. -
primary: اگر این محل نصب فضای ذخیرهسازی خارجی اصلی باشد، درست است. removable: اگر این نصب دارای رسانه قابلحذف باشد، مثل کارت SD فیزیکی، درست است.emulated: اگر این سوار کردن شبیهسازی شده باشد و توسط فضای ذخیرهسازی داخلی پشتیبانی شود، احتمالاً بااستفاده از شبح FUSE، مقدار true خواهد بود.-
mtp-reserve: تعداد مگابایت فضای ذخیرهسازی که MTP باید برای فضای ذخیرهسازی رایگان رزرو کند. فقط زمانی استفاده میشود که نصب بهعنوان شبیهسازیشده علامتگذاری شده باشد. allowMassStorage: اگر این سوار کردن بتواند ازطریق ذخیره انبوه USB همرسانی شود، درست است.-
maxFileSize: حداکثر اندازه فایل به مگابایت.
دستگاهها ممکن است با شبیهسازی سیستم فایل بدون اجازه و غیرحساس به حروف بزرگ و کوچک که توسط فضای ذخیرهسازی داخلی پشتیبانی میشود، فضای ذخیرهسازی خارجی ارائه دهند. یکی از پیادهسازیهای ممکن را کارگزار FUSE در system/core/sdcard ارائه میدهد که میتواند بهعنوان سرویس init.rc مختص دستگاه اضافه شود:
# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
class late_start
که در آن source_path حافظه داخلی پشتیبان و dest_path نقطه نصب هدف است.
هنگام پیکربندی اسکریپت init.rc مختص دستگاه، متغیر محیطی EXTERNAL_STORAGE باید بهعنوان مسیر فضای ذخیرهسازی خارجی اصلی تعریف شود. مسیر /sdcard نیز باید به همان مکان، احتمالاً ازطریق پیوند نمادین، منتهی شود. اگر دستگاهی مکان فضای ذخیرهسازی خارجی را بین بهروزرسانیهای پلاتفرم تغییر دهد، باید پیوندهای نمادین ایجاد شود تا مسیرهای قدیمی همچنان کار کنند.
Android 6.0
پیکربندی زیرسیستم فضای ذخیرهسازی اکنون در فایل fstab مختص دستگاه متمرکز شده است، و چندین فایل/متغیر پیکربندی ایستا تاریخی برای پشتیبانی از عملکرد پویاتر برداشته شده است:
- همپوشانی منبع
storage_list.xmlبرداشته شده است و دیگر توسط چارچوب استفاده نمیشود. اکنون وقتیvoldدستگاههای ذخیرهسازی را شناسایی میکند، این دستگاهها بهصورت پویا پیکربندی میشوند. - متغیرهای محیطی
EMULATED_STORAGE_SOURCE/TARGETبرداشته شده است و دیگر Zygote از آنها برای پیکربندی نقاط نصب مختص کاربر استفاده نمیکند. درعوض، جداسازی کاربر اکنون با GIDهای مختص کاربر اعمال میشود، و فضای ذخیرهسازی مشترک اصلی در زمان اجرا توسطvoldدر مکان خود نصب میشود.- توسعهدهندگان میتوانند بسته به مورد استفاده خود، همچنان مسیرها را بهصورت پویا یا ایستا بسازند. گنجاندن UUID در مسیر، هر کارت را شناسایی میکند تا
مکان برای توسعهدهندگان واضحتر شود. (برای مثال،
/storage/ABCD-1234/report.txtبهوضوح فایلی متفاوت از/storage/DCBA-4321/report.txtاست.)
- توسعهدهندگان میتوانند بسته به مورد استفاده خود، همچنان مسیرها را بهصورت پویا یا ایستا بسازند. گنجاندن UUID در مسیر، هر کارت را شناسایی میکند تا
مکان برای توسعهدهندگان واضحتر شود. (برای مثال،
- خدمات FUSE کدبندیشده سخت از فایلهای
init.rcمختص دستگاه برداشته شده است و درعوض، درصورت نیاز بهطور پویا ازvoldانشعاب مییابد.
علاوهبر این تغییرات پیکربندی، Android 6.0 شامل مفهوم فضای ذخیرهسازی قابلانتقال است. برای دستگاههای Android 6.0، هر رسانه فیزیکی که پذیرفته نشده باشد بهعنوان قابلحمل درنظر گرفته میشود.
حافظه قابلپذیرش
برای نشان دادن دستگاه فضای ذخیرهسازی قابلانتقال در fstab، از مشخصه encryptable=userdata در فیلد fs_mgr_flags استفاده کنید. در اینجا یک تعریف معمول آورده شده است:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
وقتی دستگاه ذخیرهسازی پذیرفته میشود، پلاتفرم محتوا را پاک میکند و جدول پارتیشن GUID را مینویسد که دو پارتیشن را تعریف میکند:
- افراز
android_metaکوچکی که خالی است و برای استفاده در آینده رزرو شده است. GUID نوع پارتیشن 19A710A2-B3CA-11E4-B026-10604B889DCF است. - یک پارتیشن بزرگ
android_extکه بااستفاده از dm-crypt رمزگذاری شده است و بسته به قابلیتهای هسته، بااستفاده ازext4یاf2fsقالببندی شده است. GUID نوع جداکننده این است: 193D1EA4-B3CA-11E4-B075-10604B889DCF.
دستگاه ذخیرهسازی قابل حمل
در fstab، دستگاههای ذخیرهسازی با مشخصه voldmanaged بهطور پیشفرض قابلحمل درنظر گرفته میشوند، مگراینکه مشخصه دیگری
مثل encryptable=userdata تعریف شده باشد. برای مثال، در اینجا یک تعریف معمول برای دستگاههای USB OTG آورده شده است:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults
voldmanaged=usb:auto
پلاتفرم از blkid برای تشخیص انواع سیستم فایل قبلاز نصب استفاده میکند و کاربران میتوانند انتخاب کنند که
رسانه را درصورت پشتیبانی نشدن از سیستم فایل قالببندی کنند.