ذخیره سازی خارجی توسط ترکیبی از سرویس vold
init و سرویس سیستم StorageManagerService
مدیریت می شود. نصب حجمهای ذخیرهسازی خارجی فیزیکی توسط vold
انجام میشود، که عملیات مرحلهبندی را انجام میدهد تا رسانه را قبل از قرار دادن آن در معرض برنامهها آماده کند.
توجه: در اندروید 8.0، کلاس MountService
به StorageManagerService
تغییر نام داد.
نقشه برداری فایل
برای Android نسخه 4.2.2 و نسخههای قبلی، فایل پیکربندی vold.fstab
مخصوص دستگاه، نگاشتها را از دستگاههای sysfs به نقاط نصب فایل سیستم تعریف میکند و هر خط از این قالب پیروی میکند:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
-
label
: برچسب برای حجم. -
mount_point
: مسیر فایل سیستم که در آن حجم باید نصب شود. -
partition
: شماره پارتیشن (بر اساس 1)، یا "خودکار" برای اولین پارتیشن قابل استفاده. -
sysfs_path
: یک یا چند مسیر sysfs به دستگاههایی که میتوانند این نقطه اتصال را ارائه دهند. با فاصله از هم جدا شده و هر کدام باید با/
شروع شود. -
flags
: لیست پرچمها انتخابی جدا شده با کاما، نباید حاوی/
باشد. مقادیر ممکن شاملnonremovable
وencryptable
شود.
برای نسخههای Android نسخه 4.3 و بالاتر، فایلهای fstab مختلف که توسط init، ولد و بازیابی استفاده میشوند در فایل /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)، جزئیات پیکربندی به دو دسته تقسیم میشوند.
اندروید 5.x و بالاتر
فایل پیکربندی storage_list.xml
مخصوص دستگاه، که معمولاً از طریق یک پوشش frameworks/base
ارائه میشود، ویژگیها و محدودیتهای دستگاههای ذخیرهسازی را تعریف میکند. عنصر <StorageList>
حاوی یک یا چند عنصر <storage>
است که دقیقاً یکی از آنها باید به عنوان اصلی علامت گذاری شود. ویژگی های <storage>
عبارتند از:
-
mountPoint
: مسیر سیستم فایل این mount. -
storageDescription
: منبع رشته ای که این مانت را توصیف می کند. -
primary
: اگر این مانت حافظه خارجی اولیه باشد درست است. -
removable
: اگر این پایه دارای رسانه های قابل جابجایی باشد، مانند کارت SD فیزیکی، درست است. -
emulated
: اگر این مانت شبیه سازی شده باشد و توسط حافظه داخلی پشتیبانی می شود، احتمالاً با استفاده از دیمون FUSE درست است. -
mtp-reserve
: تعداد مگابایت فضای ذخیرهسازی که MTP باید برای ذخیرهسازی رایگان ذخیره کند. فقط زمانی استفاده می شود که mount به عنوان شبیه سازی شده علامت گذاری شده باشد. -
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
نیز باید به همان مکان، احتمالاً از طریق یک پیوند نمادین، حل شود. اگر دستگاهی مکان حافظه خارجی را بین بهروزرسانیهای پلتفرم تنظیم کند، باید پیوندهای نمادین ایجاد شود تا مسیرهای قدیمی به کار خود ادامه دهند.
اندروید 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
برای شناسایی انواع سیستم فایل قبل از نصب استفاده میکند و کاربران میتوانند زمانی که فایل سیستم پشتیبانی نمیشود، فرمت رسانه را انتخاب کنند.