موقع تثبيت التطبيق

بدءًا من المستوى 8 لواجهة برمجة التطبيقات، يمكنك السماح بتثبيت تطبيقك على وحدة التخزين الخارجية (على سبيل المثال، بطاقة SD للجهاز). هذه ميزة اختيارية يمكنك الإعلان عنها لتطبيقك باستخدام سمة البيان android:installLocation. إذا لم تحدّد هذه السمة، سيتم تثبيت تطبيقك على وحدة التخزين الداخلية فقط ولن يتم نقله إلى وحدة التخزين الخارجية.

للسماح للنظام بتثبيت تطبيقك على وحدة التخزين الخارجية، عدِّل ملف البيان ليتضمن السمة 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 من خلال إعدادات النظام، يتم إلغاء تثبيت وحدة التخزين الخارجية من الجهاز ويتم إيقاف جميع التطبيقات التي تعمل على وحدة التخزين الخارجية على الفور.

التوافق مع الأنظمة القديمة

إمكانية تثبيت تطبيقك على وحدة التخزين الخارجية هي ميزة متاحة فقط على الأجهزة التي تعمل بالمستوى 8 من واجهة برمجة التطبيقات (Android 2.2) أو الإصدارات الأحدث. وسيتم دائمًا تثبيت التطبيقات الحالية التي تم إنشاؤها قبل المستوى 8 لواجهة برمجة التطبيقات على وحدة التخزين الداخلية ولن يتم نقلها إلى وحدة التخزين الخارجية (حتى على الأجهزة ذات المستوى 8 من واجهة برمجة التطبيقات). ومع ذلك، إذا كان تطبيقك مصمّمًا للتوافق مع مستوى واجهة برمجة تطبيقات أقل من 8، يمكنك اختيار دعم هذه الميزة للأجهزة ذات المستوى 8 من واجهة برمجة التطبيقات أو مستوى أعلى والتي لا تزال متوافقة مع الأجهزة التي تستخدم مستوى واجهة برمجة تطبيقات أقل من 8.

للسماح بالتثبيت على وحدة التخزين الخارجية والاستمرار في التوافق مع الإصدارات الأقل من واجهة برمجة التطبيقات المستوى 8:

  1. ضمِّن السمة android:installLocation مع القيمة "auto" أو "preferExternal" في العنصر <manifest>.
  2. لا تغيّر سمة android:minSdkVersion (بقيمة أقل من "8") وتأكَّد من أنّ رمز تطبيقك لا يستخدم سوى واجهات برمجة التطبيقات المتوافقة مع ذلك المستوى.
  3. لتجميع تطبيقك، يجب تغيير هدف الإصدار إلى المستوى 8 من واجهة برمجة التطبيقات. وهذا الإجراء ضروري لأنّ مكتبات Android القديمة لا تفهم السمة android:installLocation ولن تجمع تطبيقك عند توفّره.

عند تثبيت تطبيقك على جهاز مستوى واجهة برمجة التطبيقات أقل من 8، يتم تجاهل السمة android:installLocation ويتم تثبيت التطبيق على وحدة التخزين الداخلية.

تنبيه: على الرغم من تجاهل الأنظمة الأساسية القديمة لترميز XML مثل هذا الترميز، يجب توخي الحذر من استخدام واجهات برمجة التطبيقات للبرمجة التي تم تقديمها في المستوى 8 لواجهة برمجة التطبيقات عندما تكون قيمة minSdkVersion أقل من "8"، إلا إذا نفذت الإجراءات اللازمة لتوفير توافق مع الأنظمة القديمة في الرموز البرمجية.

التطبيقات التي يجب عدم تثبيتها على وحدة تخزين خارجية

عندما يمكِّن المستخدم وحدة تخزين USB الكبيرة لمشاركة الملفات مع جهاز الكمبيوتر (أو إلغاء تثبيت وحدة التخزين الخارجية أو إزالتها)، يتم إنهاء أي تطبيق تم تثبيته على وحدة التخزين الخارجية وقيد التشغيل حاليًا. يصبح النظام غير مدرك بالتطبيق بشكل فعلي إلى أن يتم إيقاف مساحة التخزين الكبيرة وإعادة تحميل وحدة التخزين الخارجية على الجهاز. علاوة على إنهاء التطبيق وجعله غير متاح للمستخدم، قد يؤدي ذلك إلى تعطيل بعض أنواع التطبيقات بطريقة أكثر خطورة. لكي يعمل تطبيقك بشكل متسق كما هو متوقع، يجب عدم السماح بتثبيت تطبيقك على وحدة التخزين الخارجية إذا كان يستخدم أيًا من الميزات التالية، وذلك بسبب النتائج المذكورة عندما تكون وحدة التخزين الخارجية غير مثبتة:

الخدمات
تم إيقاف Service قيد التشغيل ولن تتم إعادة تشغيله عند إعادة تثبيت وحدة التخزين الخارجية. يمكن للتطبيقات المرتبطة بهذه الخدمة تسجيل الغرض من بث ACTION_EXTERNAL_APPLICATIONS_AVAILABLE الذي يُعلِمك بجميع التطبيقات التي غير مثبّتة على وحدة تخزين خارجية عندما تصبح التطبيقات المثبّتة على وحدة تخزين خارجية متاحة للنظام مرة أخرى. بعد تلقّي هذا البث، يمكن أن تحاول التطبيقات الربط بخدمتك.
خدمات التنبيه
سيتم إلغاء المنبهات المسجلة في AlarmManager. يجب إعادة تسجيل أي تنبيهات يدويًا عند إعادة تثبيت وحدة التخزين الخارجية.
محركات أسلوب الإدخال
سيتم استبدال أداة IME بأداة IME التلقائية. وعند إعادة تثبيت وحدة التخزين الخارجية، يمكن للمستخدم فتح إعدادات النظام لتفعيل أداة IME مرة أخرى.
خلفيات متحركة
سيتم استبدال الخلفية المتحركة قيد التشغيل بالخلفية المتحركة التلقائية. عند إعادة تثبيت وحدة التخزين الخارجية، يمكن للمستخدم اختيار الخلفية المتحركة مرة أخرى.
أدوات التطبيقات
ستتم إزالة أداة التطبيق من الشاشة الرئيسية. عند إعادة تثبيت وحدة التخزين الخارجية، لن تكون "أداة التطبيقات" متاحة للمستخدم للاختيار من بينها إلى أن يعيد النظام ضبط تطبيق Home (لن يتم ذلك عادةً إلى إعادة تشغيل النظام).
مدراء الحسابات
ستختفي حساباتك التي تم إنشاؤها باستخدام AccountManager إلى أن تتم إعادة تثبيت وحدة التخزين الخارجية.
مهايئات المزامنة
لن يعمل AbstractThreadedSyncAdapter وجميع وظائف المزامنة إلا بعد إعادة تثبيت وحدة التخزين الخارجية.
مشرفو الأجهزة
سيتم إيقاف DeviceAdminReceiver وجميع إمكانات المشرف الخاصة به، ما قد يؤدي إلى عواقب غير متوقَّعة على وظائف الجهاز والتي قد تستمرّ بعد إعادة تثبيت وحدة التخزين الخارجية.
أجهزة استقبال البث تستمع إلى عبارة "اكتملت عملية التشغيل"
يُسلم النظام بث ACTION_BOOT_COMPLETED قبل تثبيت وحدة التخزين الخارجية على الجهاز. إذا كان التطبيق مثبتًا على وحدة التخزين الخارجية، فلن يتمكن أبدًا من استقبال هذا البث.

إذا كان تطبيقك يستخدم أيًا من الميزات الواردة أعلاه، يجب عدم السماح بتثبيت تطبيقك على وحدة تخزين خارجية. بشكل افتراضي، لن يسمح النظام بتثبيت تطبيقك على وحدة التخزين الخارجية، لذا لا داعي للقلق بشأن تطبيقاتك الحالية. ومع ذلك، إذا كنت متأكّدًا من أنّه يجب عدم تثبيت تطبيقك مطلقًا على وحدة التخزين الخارجية، عليك توضيح ذلك من خلال تعريف android:installLocation بالقيمة "internalOnly". وعلى الرغم من أنّ هذا الإجراء لن يؤدي إلى تغيير السلوك التلقائي، فإنّه يشير صراحةً إلى أنّه يجب تثبيت تطبيقك على وحدة التخزين الداخلية فقط ويُ تذكيرك أنت والمطوّرين الآخرين بأنّ هذا القرار قد تم اتّخاذه.

التطبيقات التي يجب تثبيتها على وحدة التخزين الخارجية

بعبارات بسيطة، يكون أي شيء لا يستخدم الميزات المدرجة في القسم السابق آمنًا عند تثبيته على وحدة تخزين خارجية. وتُعد الألعاب الكبيرة أكثر شيوعًا من أنواع التطبيقات التي يجب أن تسمح بالتثبيت على وحدة التخزين الخارجية، لأن الألعاب لا تقدم عادةً خدمات إضافية في حالة عدم النشاط. عندما تصبح وحدة التخزين الخارجية غير متوفرة ويتم إنهاء إحدى عمليات اللعبة، لن يكون هناك تأثير مرئي عندما تتوفر مساحة التخزين مرة أخرى ويعيد المستخدم تشغيل اللعبة (بافتراض أن اللعبة حفظت حالتها بشكل صحيح أثناء دورة حياة النشاط العادية).

إذا كان تطبيقك يتطلب عدة وحدات ميغابايت لملف APK، يجب أن تفكّر مليًا في تفعيل التطبيق لتثبيته على وحدة التخزين الخارجية حتى يتمكن المستخدمون من الحفاظ على المساحة على وحدة التخزين الداخلية.

للحصول على مزيد من المعلومات ذات الصلة، يمكنك الرجوع إلى: <manifest>