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

بدءًا من المستوى 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 إلا على جهاز واحد.
  • يمكن للمستخدم نقل تطبيقك إلى وحدة التخزين الداخلية من خلال إعدادات النظام.

تحذير: عندما يفعّل المستخدم ميزة &quot;تخزين البيانات عبر USB&quot; لمشاركة الملفات مع جهاز كمبيوتر أو يلغي ربط بطاقة SD من خلال إعدادات النظام، يتم إلغاء ربط وحدة التخزين الخارجية بالجهاز ويتم إيقاف جميع التطبيقات التي تعمل على وحدة التخزين الخارجية على الفور.

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

إنّ إمكانية تثبيت تطبيقك على وحدة التخزين الخارجية هي ميزة لا تتوفّر إلا على الأجهزة التي تعمل بالمستوى 8 من واجهة برمجة التطبيقات (الإصدار 2.2 من نظام التشغيل Android) أو الإصدارات الأحدث. سيتم دائمًا تثبيت التطبيقات الحالية التي تم إنشاؤها قبل مستوى واجهة برمجة التطبيقات 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 التلقائية. عند إعادة تركيب وحدة التخزين الخارجية، يمكن للمستخدم فتح إعدادات النظام لتفعيل طريقة الإدخال مجددًا.
خلفيات متحركة
سيتم استبدال الخلفية المتحركة الحالية بالخلفية المتحركة التلقائية.
عند إعادة ربط وحدة التخزين الخارجية، يمكن للمستخدم اختيار خلفية الشاشة المتحركة مرة أخرى.
التطبيقات المصغَّرة
ستتم إزالة تطبيقك المصغّر من الشاشة الرئيسية. عند إعادة تحميل وحدة التخزين الخارجية، لن يكون &quot;أداة التطبيق&quot; غير متاحة للمستخدم إلى أن يعيد النظام ضبط تطبيق الشاشة الرئيسية (عادةً لا يحدث ذلك إلا عند إعادة تشغيل النظام).
Account Managers
ستختفي الحسابات التي تم إنشاؤها باستخدام AccountManager إلى أن تتم إعادة ربط وحدة التخزين الخارجية.
محوّلات المزامنة
لن يعمل جهاز AbstractThreadedSyncAdapter وجميع وظائف المزامنة فيه إلا بعد إعادة ربط وحدة التخزين الخارجية.
مشرفو الأجهزة
سيتم إيقاف DeviceAdminReceiver وجميع إمكانات المشرف، ما قد يؤدي إلى عواقب غير متوقّعة على وظائف الجهاز، وقد يستمر ذلك حتى بعد إعادة ربط وحدة التخزين الخارجية.
أدوات استقبال البث التي تستمع إلى "اكتملت عملية التشغيل"
يُرسِل النظام ACTION_BOOT_COMPLETED البث قبل ربط وحدة التخزين الخارجية بالجهاز. إذا كان تطبيقك مثبّتًا على مساحة التخزين الخارجية، لن يتمكّن مطلقًا من تلقّي عملية البث هذه.

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

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

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

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

للحصول على معلومات إضافية ذات صلة، يُرجى الرجوع إلى: <manifest>