اگر تا به حال سعی کرده اید فایل ها را در دستگاه Androidی مدیریت کنید، احتمالا متوجه شده اید که بسته به نسخه Androidی که اجرا می کنید، کارها متفاوت است. با شروع Android 10، گوگل یک تغییر اساسی در نحوه تعامل برنامه ها با سیستم فایل ایجاد کرد. این تغییر که با نام Scoped Storage شناخته میشود، قوانین مربوط به خواندن و نوشتن فایلها در فضای ذخیرهسازی مشترک را دوباره تعریف کرد. برای کاربرانی که برنامهها را سایدلود میکنند، فایلهای OBB را مدیریت میکنند یا با مدیران فایل کار میکنند، درک فضای ذخیرهسازی محدوده ضروری است.
در این مقاله، بررسی خواهیم کرد که فضای ذخیرهسازی با محدوده چیست، چرا گوگل آن را پیادهسازی کرده است، چگونه بر کاربران و توسعهدهندگان روزمره تأثیر میگذارد، و برای افرادی که فایلهای APK یا XAPK را خارج از فروشگاه Play نصب میکنند چه معنایی دارد.
مشکل مدل ذخیره سازی قدیمی
قبل از Android 10، هر برنامهای که مجوز READ_EXTERNAL_STORAGE یا WRITE_EXTERNAL_STORAGE را درخواست میکرد، میتوانست تقریباً به هر فایلی در حافظه مشترک دستگاه دسترسی داشته باشد. این شامل عکسها، اسناد، بارگیریها و حتی فایلهای ایجاد شده توسط برنامههای دیگر بود. در حالی که این امر مدیریت فایل را راحت می کرد، نگرانی های جدی در مورد حریم خصوصی و امنیتی ایجاد کرد.
یک برنامه چراغ قوه ساده را در نظر بگیرید. در مدل قدیمی، اگر به آن اجازه ذخیرهسازی داده باشید، میتواند عکسهای شما را بیصدا بخواند، اسناد دانلود شدهتان را اسکن کند یا حتی فایلهای متعلق به برنامههای دیگر را تغییر دهد. هیچ کنترل دانه ای وجود نداشت. شما یا به یک برنامه دسترسی کامل به کل فضای ذخیرهسازی خود دادهاید یا آن را کاملاً رد کردهاید.
این دسترسی گسترده منجر به مشکلات دنیای واقعی شد. برخی از برنامه ها با اسکن فضای ذخیره سازی برای فایل های حساس، داده های کاربر را جمع آوری کردند. برخی دیگر فایلهای یتیمی را پشت سر گذاشتند که مدتها پس از حذف برنامه، دستگاه را به هم ریخته بود. گوگل به راه حلی نیاز داشت که قابلیت استفاده و حریم خصوصی را متعادل کند و فضای ذخیره سازی محدوده پاسخ آنها بود.
آنچه که Scoped Storage در واقع انجام می دهد
Scoped Storage به طور اساسی رابطه بین برنامه ها و سیستم فایل را تغییر می دهد. تحت این مدل، هر برنامه Sandbox خصوصی خود را در حافظه خارجی دریافت میکند که معمولاً در /Android/data/[package.name]/ قرار دارد. برنامهها میتوانند آزادانه در جعبه ماسهبازی خود بخوانند و بنویسند بدون اینکه به هیچ مجوزی نیاز داشته باشند.
با این حال، دسترسی به فایلهای خارج از این سندباکس نیاز به مرور APIهای کنترلشده دارد. در اینجا نحوه عملکرد مدل جدید آمده است:
فضای ذخیره سازی ویژه برنامه
هر برنامه دارای یک فهرست اختصاصی است که فقط خودش می تواند به آن دسترسی داشته باشد. هنگامی که برنامه حذف نصب می شود، این فهرست به طور خودکار پاک می شود. هیچ برنامه دیگری بدون دسترسی ریشه نمی تواند در این مکان بخواند یا بنویسد. این مشکل فایل های یتیم را از بین می برد و از جاسوسی داده های بین برنامه ای جلوگیری می کند.
مجموعه های رسانه ای
برای رسانههای مشترک مانند عکسها، ویدیوها و فایلهای صوتی، Android MediaStore API را ارائه میکند. برنامهها میتوانند رسانهها را به مجموعههای به اشتراکگذاشتهشده کمک کنند و رسانههای ایجاد شده توسط برنامههای دیگر را بخوانند، اما فقط از طریق این رابط ساختاریافته. یک برنامه میتواند رسانه خود را بدون هیچ مجوزی ببیند، اما دسترسی به رسانه برنامههای دیگر به مجوزهای READ_MEDIA_IMAGES، READ_MEDIA_VIDEO یا READ_MEDIA_AUDIO نیاز دارد که در Android 13 معرفی شدهاند.
چارچوب دسترسی به فضای ذخیره سازی
برای اسناد و سایر فایلهای غیر رسانهای، برنامهها باید از چارچوب دسترسی به فضای ذخیرهسازی (SAF) استفاده کنند. این یک انتخابگر فایل سیستمی را به کاربر ارائه می دهد، که به صراحت انتخاب می کند که برنامه به کدام فایل ها یا دایرکتوری ها دسترسی داشته باشد. این برنامه هرگز به کل سیستم فایل دسترسی ندارد.
مجوز MANAGE_EXTERNAL_STORAGE
برای برنامههایی که واقعاً به دسترسی گسترده به فایل نیاز دارند، مانند مدیریت فایل، ابزارهای پشتیبانگیری و نرمافزار آنتی ویروس، Android مجوز MANAGE_EXTERNAL_STORAGE را ارائه میکند. با این حال، این مجوز برای برنامههایی که از طریق Play Store توزیع میشوند، به تأیید ویژه از طرف Google نیاز دارد و کاربران باید بهجای یک گفتگوی ساده، آن را بهصورت دستی از طریق تنظیمات سیستم اعطا کنند.
جدول زمانی عرضه
Google یک شبه فضای ذخیرهسازی محدوده را اعمال نکرد. انتقال به تدریج اتفاق افتاد:
- Android 10 (API 29): فضای ذخیرهسازی Scoped معرفی شد اما برنامهها میتوانند از requestLegacyExternalStorage="true" در مانیفست خود استفاده نکنند. این به توسعه دهندگان زمان داد تا سازگار شوند.
- Android 11 (API 30): پرچم قدیمی برای برنامههایی که API 30 یا بالاتر را هدف قرار میدهند نادیده گرفته شد. فضای ذخیرهسازی Scoped برای برنامههای جدید و بهروزرسانیشده در Play Store اجباری شد.
- Android 12 و بالاتر: اصلاحات بیشتری انجام شد، از جمله مجوزهای رسانه دانه ای و بهبود عملکرد SAF.
- Android 13 (API 33): مجوز گسترده READ_EXTERNAL_STORAGE به نفع مجوزهای رسانه خاص منسوخ شد.
- Android 14 (API 34): دسترسی جزئی به عکس و ویدئو معرفی شد که به کاربران اجازه میداد به فایلهای خاص به جای کل کتابخانههای رسانه دسترسی داشته باشند.
چگونه Scoped Storage بر Sideloading تاثیر می گذارد
برای کاربرانی که برنامهها را از خارج از Play Store نصب میکنند، فضای ذخیرهسازی محدودهای چالشهای عملی را معرفی میکند که ارزش درک دارد.
دانلود و دسترسی به فایل های APK
هنگامی که یک فایل APK را از طریق مرورگر دانلود می کنید، معمولاً در پوشه دانلودها قرار می گیرد. تحت فضای ذخیرهسازی محدوده، برنامه مرورگر مالک آن فایل است. اگر می خواهید آن را با استفاده از یک برنامه دیگر، مانند یک مدیر فایل، نصب کنید، آن مدیر فایل نیاز به دسترسی مناسب دارد. اکثر فایل منیجرهای مدرن از طریق SAF به درستی این کار را انجام می دهند، اما قدیمی ترها ممکن است مشکل داشته باشند.
نصبکننده بسته سیستم همچنان میتواند به فایلهایی که شما صریحاً از طریق انتخابگر فایل انتخاب کردهاید دسترسی داشته باشد، بنابراین جریان اصلی دانلود و نصب یک APK همچنان کار میکند. با این حال، گردش کار نصب خودکار که به دسترسی مستقیم به مسیر فایل متکی است ممکن است خراب شود.
فایل های OBB و داده های بازی
این جایی است که ذخیره سازی محدوده بیشترین اصطکاک را برای سایدلودرها ایجاد می کند. بسیاری از بازی های بزرگ از فایل های OBB (Opaque Binary Blob) ذخیره شده در /Android/obb/[package.name]/ استفاده می کنند. در مدل قدیمی، شما به سادگی میتوانید فایلهای OBB را با استفاده از هر مدیر فایل در دایرکتوری درست کپی کنید.
با فضای ذخیره سازی محدوده، فهرست /Android/obb/ محدود می شود. در Android 11 و بالاتر، برنامههای معمولی نمیتوانند در فهرست OBB برنامه دیگری بنویسند. این بدان معنی است که اگر یک فایل XAPK را دانلود کنید که حاوی داده های OBB است، نصب کننده نیاز به مدیریت خاصی دارد تا آن فایل ها را به درستی قرار دهد.
ابزارهایی مانند استخراج کننده OBB ما میتوانند به شما کمک کنند فایلهای OBB را از بستههای XAPK استخراج کنید، اما قرار دادن آنها در دایرکتوری صحیح در نسخههای جدیدتر Android ممکن است نیاز به استفاده از یک مدیر فایل با مجوز MANAGE_EXTERNAL_STORAGE یا استفاده از دستورات ADB از رایانه داشته باشد.
ملاحظات نصب XAPK
فایلهای XAPK یک APK را با دادههای OBB همراه میکنند و گاهی تنظیمات APK را تقسیم میکنند. نصب این موارد در دستگاههای دارای Android 11 یا جدیدتر به نصبکنندهای نیاز دارد که محدودیتهای فضای ذخیرهسازی محدوده را درک کند. نصب کننده باید یا مجوز MANAGE_EXTERNAL_STORAGE را نگه دارد یا از API های مناسب برای قرار دادن فایل های OBB در محل صحیح استفاده کند.
این یکی از دلایلی است که تبدیل فایل های XAPK به فرمت استاندارد APK می تواند مفید باشد. یک APK مستقل نیازی به قرار دادن فایل OBB ندارد، که فرآیند نصب را در نسخههای جدیدتر Android ساده میکند. می توانید از تبدیل XAPK به APK ما برای استخراج APK پایه از یک بسته XAPK استفاده کنید.
آنچه توسعه دهندگان باید بدانند
اگر در حال توسعه برنامههای Android هستید، فضای ذخیرهسازی محدوده نیاز به بازنگری در نحوه مدیریت فایلها دارد:
- از دایرکتوری های مخصوص برنامه استفاده کنید برای هر فایلی که فقط برنامه شما به آن نیاز دارد. اینها به هیچ مجوزی نیاز ندارند و به طور خودکار در هنگام حذف پاک می شوند.
- از MediaStore استفاده کنید برای عکسها، فیلمها و صداهایی که باید برای برنامههای دیگر قابل مشاهده باشند و از حذف نصب بمانند.
- از SAF استفاده کنید زمانی که برنامه شما باید با اسناد یا فهرستهای انتخابی کاربر کار کند.
- از مسیرهای فایل سخت کد شده خودداری کنید. مسیرهایی مانند /sdcard/MyApp/ دیگر قابل اعتماد نیستند. به جای آن از Context.getExternalFilesDir() استفاده کنید.
- رفتار تست بر روی چندین سطح API. به طور قابل توجهی بین Android 10، 11، 13 و 14 متفاوت است.
استراتژی های مهاجرت
اگر برنامه شما قبلاً فایلها را در فضای ذخیرهسازی مشترک ذخیره میکرد، به یک طرح انتقال نیاز دارید. روش پیشنهادی این است که در اولین راهاندازی پس از بهروزرسانی، فایلهای موجود را در فضای ذخیرهسازی مخصوص برنامه کپی کنید، سپس نسخههای قدیمی را حذف کنید. از Environment.getExternalStorageDirectory() با پرچم قدیمی در طول دوره انتقال برای خواندن فایل های قدیمی استفاده کنید، سپس آنها را به مکان جدید منتقل کنید.
باورهای غلط رایج
"فضای ذخیره سازی محدوده به این معنی است که برنامه ها نمی توانند به هیچ فایلی دسترسی داشته باشند"
این دروغ است. برنامهها همچنان میتوانند آزادانه به فایلهای خود دسترسی داشته باشند، در مجموعههای رسانه مشترک مشارکت کنند و از طریق انتخابگر سیستم درخواست دسترسی به فایلهای خاص را داشته باشند. چیزی که تغییر کرد این است که برنامهها دیگر نمیتوانند به صورت بیصدا کل سیستم فایل را مرور کنند.
"مدیریت فایل در نسخه های جدید Android خراب است"
مدیر فایل هایی که درخواست MANAGE_EXTERNAL_STORAGE می کنند هنوز کار می کنند. کاربر فقط باید این مجوز ویژه را از طریق تنظیمات اعطا کند. اکثر مدیران فایل محبوب قبلاً با این نیاز سازگار شده اند.
"فضای ذخیره سازی محدوده فقط روی کارت SD تاثیر می گذارد"
فضای ذخیرهسازی دامنهدار برای همه فضای ذخیرهسازی مشترک، از جمله فضای ذخیرهسازی مشترک داخلی اعمال میشود. اصطلاح "حافظه خارجی" در Android به فضای ذخیره سازی مشترک اشاره دارد که برای چندین برنامه قابل دسترسی است، نه لزوما یک کارت SD فیزیکی.
نکات کاربردی برای کاربران
اگر به طور مرتب برنامهها را کنار گذاشته یا فایلها را در دستگاه Android خود مدیریت میکنید، در اینجا چند توصیه عملی وجود دارد:
- از یک مدیر فایل مدرن استفاده کنید که از MANAGE_EXTERNAL_STORAGE پشتیبانی می کند. برنامههایی مانند Solid Explorer، MiXplorer و Total Commander به خوبی با فضای ذخیرهسازی محدوده سازگار شدهاند.
- مجوزها را با دقت اعطا کنید. وقتی مدیر فایل درخواست «دسترسی به همه فایلها» میکند، بدانید که این مجوز MANAGE_EXTERNAL_STORAGE است و برای عملکرد کامل ضروری است.
- از ADB برای عملیات سرسخت فایل استفاده کنید. اگر نمیتوانید فایلهای OBB را از طریق مدیر فایل قرار دهید، اتصال دستگاه خود به رایانه و استفاده از adb push محدودیتهای فضای ذخیرهسازی را کاملاً دور میزند.
- بسته های پیچیده را به فرمت های ساده تر تبدیل کنید. اگر یک فایل XAPK در دستگاه جدیدتری برای شما مشکل ایجاد می کند، استخراج فقط جزء APK ممکن است مسیری با کمترین مقاومت باشد.
- برنامه های نصب کننده خود را به روز نگه دارید. نسخههای قدیمیتر نصبکنندههای XAPK ممکن است به درستی از فضای ذخیرهسازی استفاده نکنند.
آینده فضای ذخیره سازی Android
گوگل با هر نسخه Android به اصلاح مدل ذخیره سازی ادامه می دهد. Android 14 دسترسی جزئی به رسانه را معرفی کرد و به کاربران اجازه میداد عکسهای خاصی را با یک برنامه به اشتراک بگذارند تا کل کتابخانه خود. انتظار میرود Android 15 پیشرفتهای بیشتری در عملکرد و قابلیت استفاده چارچوب دسترسی به فضای ذخیرهسازی به همراه داشته باشد.
روند واضح است: Android به سمت مدلی در حال حرکت است که در آن کاربران کنترل دقیقی بر آنچه هر برنامه میتواند ببیند و تغییر دهد، داشته باشد. در حالی که این امر باعث ایجاد اصطکاک برای کاربران قدرتمند و سایدلودرها می شود، حریم خصوصی و امنیت را به طور قابل توجهی برای پایگاه کاربر گسترده تر بهبود می بخشد.
کار با Scoped Storage بدون شکستن داده های برنامه
فضای ذخیره سازی Scoped نشان دهنده یکی از مهم ترین تغییرات در معماری Android در سال های اخیر است. گوگل با محدود کردن برنامهها به جعبههای ایمنی خود و نیاز به رضایت صریح کاربر برای دسترسی گستردهتر، وضعیت حریم خصوصی پلتفرم را به طرز چشمگیری بهبود بخشیده است. برای کاربرانی که برنامهها را کناری بارگذاری میکنند و فایلها را به صورت دستی مدیریت میکنند، درک این محدودیتها به شما کمک میکند تا نقاط اصطکاک گاه به گاه را برطرف کنید. و برای توسعه دهندگان، تطبیق با فضای ذخیره سازی دامنه اختیاری نیست، بلکه یک نیاز اساسی برای توسعه Android مدرن است.
نصب فایلهای APK، قرار دادن فایلهای OBB، و مدیریت روزانه فضای ذخیرهسازی، همه در یک سیستم اجرا میشوند: فضای ذخیرهسازی محدوده. هنگامی که نحوه عملکرد آن را درک کردید، به جای اینکه تحت الحمایه برنامه هایی باشید که ممکن است از دسترسی گسترده به فایل سوء استفاده کنند، دستگاه خود را کنترل می کنید.