محل نصب برنامه

با شروع API سطح ۸، می‌توانید به برنامه خود اجازه دهید که روی حافظه خارجی (مثلاً کارت SD دستگاه) نصب شود. این یک ویژگی اختیاری است که می‌توانید با ویژگی android:installLocation manifest برای برنامه خود اعلام کنید. اگر این ویژگی را اعلام نکنید ، برنامه شما فقط روی حافظه داخلی نصب می‌شود و نمی‌توان آن را به حافظه خارجی منتقل کرد.

برای اینکه سیستم بتواند برنامه شما را روی حافظه خارجی نصب کند، فایل مانیفست خود را طوری تغییر دهید که ویژگی android:installLocation در عنصر <manifest> با مقدار " preferExternal " یا " auto " درج کند. برای مثال:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    ... >

اگر شما " preferExternal " را اعلام کنید، درخواست می‌کنید که برنامه شما روی حافظه خارجی نصب شود، اما سیستم تضمین نمی‌کند که برنامه شما روی حافظه خارجی نصب شود. اگر حافظه خارجی پر باشد، سیستم آن را روی حافظه داخلی نصب می‌کند. کاربر همچنین می‌تواند برنامه شما را بین دو مکان جابجا کند.

اگر شما " auto " را اعلام کنید، نشان می‌دهید که برنامه شما ممکن است روی حافظه خارجی نصب شود، اما شما مکان نصب ترجیحی ندارید. سیستم بر اساس چندین عامل تصمیم می‌گیرد که برنامه شما کجا نصب شود. کاربر همچنین می‌تواند برنامه شما را بین دو مکان جابجا کند.

وقتی برنامه شما روی حافظه خارجی نصب شده است:

  • تا زمانی که حافظه خارجی روی دستگاه نصب باشد، هیچ تاثیری بر عملکرد برنامه ندارد.
  • فایل .apk در حافظه خارجی ذخیره می‌شود، اما تمام داده‌های خصوصی کاربر، پایگاه‌های داده، فایل‌های .dex بهینه شده و کد بومی استخراج شده در حافظه داخلی دستگاه ذخیره می‌شوند.
  • محفظه‌ی منحصر به فردی که برنامه‌ی شما در آن ذخیره می‌شود، با یک کلید تصادفی رمزگذاری می‌شود که فقط توسط دستگاهی که در ابتدا آن را نصب کرده است، قابل رمزگشایی است. بنابراین، یک برنامه‌ی نصب شده روی کارت SD فقط برای یک دستگاه کار می‌کند.
  • کاربر می‌تواند از طریق تنظیمات سیستم، برنامه خود را به حافظه داخلی منتقل کند.

هشدار: وقتی کاربر قابلیت اشتراک‌گذاری فایل‌ها با رایانه از طریق حافظه انبوه USB را فعال می‌کند یا کارت SD را از طریق تنظیمات سیستم از سیستم جدا می‌کند، حافظه خارجی از دستگاه جدا شده و تمام برنامه‌های در حال اجرا روی حافظه خارجی بلافاصله بسته می‌شوند.

سازگاری با نسخه‌های قبلی

قابلیت نصب برنامه شما روی حافظه خارجی، قابلیتی است که فقط در دستگاه‌هایی که API Level 8 (اندروید 2.2) یا بالاتر دارند، موجود است. برنامه‌های موجود که قبل از API Level 8 ساخته شده‌اند، همیشه روی حافظه داخلی نصب می‌شوند و نمی‌توان آنها را به حافظه خارجی منتقل کرد (حتی در دستگاه‌هایی با API Level 8). با این حال، اگر برنامه شما برای پشتیبانی از API Level پایین‌تر از 8 طراحی شده است، می‌توانید از این ویژگی برای دستگاه‌هایی با API Level 8 یا بالاتر پشتیبانی کنید و همچنان با دستگاه‌هایی که از API Level پایین‌تر از 8 استفاده می‌کنند، سازگار باشد.

برای نصب روی حافظه خارجی و حفظ سازگاری با نسخه‌های پایین‌تر از API سطح ۸:

  1. ویژگی android:installLocation با مقدار " auto " یا " preferExternal " در عنصر <manifest> قرار دهید.
  2. ویژگی android:minSdkVersion خود را به همان صورت (چیزی کمتر از "8") باقی بگذارید و مطمئن شوید که کد برنامه شما فقط از API های سازگار با آن سطح استفاده می‌کند.
  3. برای کامپایل کردن برنامه‌تان، هدف ساخت (build target) خود را به API سطح ۸ تغییر دهید. این کار ضروری است زیرا کتابخانه‌های قدیمی‌تر اندروید ویژگی android:installLocation را درک نمی‌کنند و در صورت وجود آن، برنامه شما را کامپایل نمی‌کنند.

وقتی برنامه شما روی دستگاهی با سطح API پایین‌تر از ۸ نصب می‌شود، ویژگی android:installLocation نادیده گرفته می‌شود و برنامه روی حافظه داخلی نصب می‌شود.

احتیاط: اگرچه نشانه‌گذاری XML مانند این توسط پلتفرم‌های قدیمی‌تر نادیده گرفته می‌شود، اما باید مراقب باشید که از APIهای برنامه‌نویسی معرفی‌شده در API سطح ۸ در حالی که minSdkVersion شما کمتر از "۸" است استفاده نکنید، مگر اینکه کارهای لازم برای ایجاد سازگاری معکوس در کد خود را انجام دهید.

برنامه‌هایی که نباید روی حافظه خارجی نصب شوند

وقتی کاربر قابلیت ذخیره‌سازی انبوه USB را برای اشتراک‌گذاری فایل‌ها با رایانه خود فعال می‌کند (یا به هر طریق دیگری حافظه خارجی را از حالت مانت خارج یا حذف می‌کند)، هر برنامه‌ای که روی حافظه خارجی نصب شده و در حال اجرا است، از کار می‌افتد. سیستم عملاً از وجود برنامه بی‌اطلاع می‌شود تا زمانی که ذخیره‌سازی انبوه غیرفعال شود و حافظه خارجی دوباره روی دستگاه مانت شود. این کار علاوه بر از کار انداختن برنامه و خارج کردن آن از دسترس کاربر، می‌تواند برخی از انواع برنامه‌ها را به شکلی جدی‌تر مختل کند. برای اینکه برنامه شما به طور مداوم طبق انتظار رفتار کند، نباید اجازه دهید برنامه شما در صورت استفاده از هر یک از ویژگی‌های زیر، به دلیل عواقب ذکر شده در هنگام مانت نشدن حافظه خارجی، روی حافظه خارجی نصب شود:

خدمات
Service در حال اجرای شما از بین می‌رود و هنگام اتصال مجدد به حافظه خارجی، مجدداً راه‌اندازی نمی‌شود. برنامه‌های متصل به این سرویس می‌توانند برای اعلان ACTION_EXTERNAL_APPLICATIONS_AVAILABLE ثبت نام کنند، که به تمام برنامه‌هایی که روی حافظه خارجی نصب نشده‌اند ، اطلاع می‌دهد که چه زمانی برنامه‌های نصب شده روی حافظه خارجی دوباره در دسترس سیستم قرار گرفته‌اند. پس از دریافت این اعلان، برنامه‌ها می‌توانند برای اتصال به سرویس شما تلاش کنند.
خدمات دزدگیر
هشدارهای ثبت‌شده شما در AlarmManager لغو خواهند شد. هنگام اتصال مجدد حافظه خارجی، باید هشدارها را به‌طور دستی دوباره ثبت کنید.
ویرایشگرهای روش ورودی
IME شما با IME پیش‌فرض جایگزین خواهد شد. هنگام اتصال مجدد حافظه خارجی، کاربر می‌تواند تنظیمات سیستم را باز کند تا IME شما دوباره فعال شود.
تصاویر پس زمینه زنده
تصویر زمینه زنده در حال اجرا با تصویر زمینه زنده پیش فرض جایگزین خواهد شد. هنگامی که حافظه خارجی دوباره پر شود، کاربر می‌تواند تصویر زمینه زنده شما را دوباره انتخاب کند.
ابزارک‌های برنامه
ویجت برنامه شما از صفحه اصلی حذف خواهد شد. هنگامی که حافظه خارجی دوباره بارگذاری می‌شود، ویجت برنامه شما تا زمانی که سیستم برنامه اصلی را مجدداً تنظیم نکند (معمولاً تا زمانی که سیستم دوباره راه‌اندازی نشود) برای انتخاب کاربر در دسترس نخواهد بود.
مدیران حساب
حساب‌های کاربری ایجاد شده با AccountManager تا زمان بارگذاری مجدد حافظه خارجی ناپدید می‌شوند.
Sync Adapters
AbstractThreadedSyncAdapter و تمام قابلیت‌های همگام‌سازی آن تا زمانی که حافظه خارجی دوباره مانت نشود، کار نخواهند کرد.
مدیران دستگاه
DeviceAdminReceiver شما و تمام قابلیت‌های مدیریتی آن غیرفعال خواهد شد، که می‌تواند عواقب پیش‌بینی‌نشده‌ای برای عملکرد دستگاه داشته باشد، که ممکن است پس از اتصال مجدد حافظه خارجی نیز ادامه یابد.
گیرنده‌های پخش در حال گوش دادن به "بوت کامل شد"
سیستم قبل از اینکه حافظه خارجی روی دستگاه نصب شود، اعلان ACTION_BOOT_COMPLETED را ارسال می‌کند. اگر برنامه شما روی حافظه خارجی نصب شده باشد، هرگز نمی‌تواند این اعلان را دریافت کند.

اگر برنامه شما از هر یک از ویژگی‌های ذکر شده در بالا استفاده می‌کند، نباید اجازه دهید برنامه شما روی حافظه خارجی نصب شود. به طور پیش‌فرض، سیستم به برنامه شما اجازه نصب روی حافظه خارجی را نمی‌دهد ، بنابراین نیازی نیست نگران برنامه‌های موجود خود باشید. با این حال، اگر مطمئن هستید که برنامه شما هرگز نباید روی حافظه خارجی نصب شود، باید با اعلام android:installLocation با مقدار " internalOnly " این موضوع را روشن کنید. اگرچه این کار رفتار پیش‌فرض را تغییر نمی‌دهد، اما به صراحت بیان می‌کند که برنامه شما فقط باید روی حافظه داخلی نصب شود و به عنوان یادآوری برای شما و سایر توسعه‌دهندگان عمل می‌کند که این تصمیم گرفته شده است.

برنامه‌هایی که باید روی حافظه خارجی نصب شوند

به عبارت ساده، هر چیزی که از ویژگی‌های ذکر شده در بخش قبلی استفاده نکند، هنگام نصب روی حافظه خارجی ایمن است. بازی‌های بزرگ معمولاً از جمله برنامه‌هایی هستند که باید امکان نصب روی حافظه خارجی را داشته باشند، زیرا بازی‌ها معمولاً در حالت غیرفعال، خدمات اضافی ارائه نمی‌دهند. هنگامی که حافظه خارجی از دسترس خارج می‌شود و یک فرآیند بازی از بین می‌رود، نباید هیچ اثر قابل مشاهده‌ای هنگام در دسترس قرار گرفتن مجدد حافظه و شروع مجدد بازی توسط کاربر وجود داشته باشد (با فرض اینکه بازی به درستی وضعیت خود را در طول چرخه عمر عادی Activity ذخیره کرده باشد).

اگر برنامه شما برای فایل APK به چندین مگابایت نیاز دارد، باید با دقت بررسی کنید که آیا می‌توانید برنامه را روی حافظه خارجی نصب کنید تا کاربران بتوانند فضای حافظه داخلی خود را حفظ کنند یا خیر.

برای اطلاعات مرتبط بیشتر، به این آدرس مراجعه کنید: <manifest>