מיקום ההתקנה של האפליקציה

החל מרמת API‏ 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 שעברו אופטימיזציה וקוד Native שחולץ נשמרים בזיכרון הפנימי של המכשיר.
  • המאגר הייחודי שבו האפליקציה מאוחסנת מוצפן באמצעות מפתח שנוצר באופן אקראי, ורק המכשיר שבו האפליקציה הותקנה במקור יכול לפענח אותו. לכן, אפליקציה שמותקנת בכרטיס SD פועלת רק במכשיר אחד.
  • המשתמש יכול להעביר את האפליקציה לאחסון הפנימי דרך הגדרות המערכת.

אזהרה: כשהמשתמש מפעיל אחסון USB בנפח גדול כדי לשתף קבצים עם מחשב או מבטל את הטעינה של כרטיס ה-SD דרך הגדרות המערכת, האחסון החיצוני מפסיק להיות מחובר למכשיר וכל האפליקציות שפועלות באחסון החיצוני נסגרות באופן מיידי.

תאימות לדורות קודמים

האפשרות להתקין את האפליקציה באחסון החיצוני היא תכונה שזמינה רק במכשירים עם רמת API‏ 8 (Android 2.2) ומעלה. אפליקציות קיימות שנבנו לפני רמת API 8 תמיד יותקנו באחסון הפנימי ולא ניתן להעביר אותן לאחסון החיצוני (גם במכשירים עם רמת API 8). עם זאת, אם האפליקציה שלכם מיועדת לתמיכה ברמת API נמוכה מ-8, אתם יכולים לבחור לתמוך בתכונה הזו במכשירים עם רמת API 8 ומעלה, ועדיין לשמור על תאימות למכשירים עם רמת API נמוכה מ-8.

כדי לאפשר התקנה באחסון חיצוני ולשמור על תאימות לגרסאות נמוכות מ-API ברמה 8:

  1. במקום זאת, צריך לכלול את מאפיין android:installLocation עם הערך auto או preferExternal ברכיב <manifest>.
  2. משאירים את מאפיין android:minSdkVersion כמו שהוא (ערך נמוך מ '8') ומוודאים שקוד האפליקציה משתמש רק בממשקי API שתואמים לרמה הזו.
  3. כדי לקמפל את האפליקציה, צריך לשנות את יעד הבנייה לרמת API 8. הדבר נחוץ כי ספריות Android ישנות יותר לא מבינות את המאפיין android:installLocation ולא יקמפלו את האפליקציה אם הוא קיים.

כשהאפליקציה מותקנת במכשיר עם רמת API נמוכה מ-8, המערכת מתעלמת מהמאפיין android:installLocation והאפליקציה מותקנת באחסון הפנימי.

זהירות: למרות שפלטפורמות ישנות יותר יתעלמו מתגי XML כאלה, צריך להיזהר ולא להשתמש בממשקי API לתכנות שהוצגו ברמת API 8 אם הערך של minSdkVersion נמוך מ-8, אלא אם מבצעים את הפעולות הנדרשות כדי לספק תאימות לאחור בקוד.

אפליקציות שאסור להתקין באחסון חיצוני

כשהמשתמש מפעיל אחסון נשלף ב-USB כדי לשתף קבצים עם המחשב (או מבטל את הטעינה של האחסון החיצוני או מסיר אותו), כל אפליקציה שמותקנת באחסון החיצוני ופועלת כרגע נסגרת. המערכת לא מודעת לאפליקציה עד להשבתת האחסון בנפח גדול ולהרכבה מחדש של האחסון החיצוני במכשיר. בנוסף להפסקת הפעולה של האפליקציה ולמניעת הגישה של המשתמש אליה, הפעולה הזו עלולה לגרום לבעיות חמורות יותר בסוגים מסוימים של אפליקציות. כדי שהאפליקציה תפעל באופן עקבי כמצופה, לא מומלץ לאפשר התקנה של האפליקציה באחסון החיצוני אם היא משתמשת באחד מהפיצ'רים הבאים, בגלל ההשלכות שמפורטות למטה כשמבטלים את הטעינה של האחסון החיצוני:

שירותים
הפעולה Service מופסקת ולא מופעלת מחדש כשמבצעים טעינה מחדש של האחסון החיצוני. אפליקציות שמקושרות לשירות הזה יכולות להירשם ל-ACTION_EXTERNAL_APPLICATIONS_AVAILABLEbroadcast intent, שמיידע את כל האפליקציות שלא מותקנות באחסון חיצוני כשהאפליקציות שמותקנות באחסון חיצוני זמינות שוב למערכת. אחרי קבלת השידור הזה, האפליקציות יכולות לנסות להתחבר לשירות שלכם.
שירותי אזעקה
ההתראות שרשמת ב-AlarmManager יבוטלו. אם מנתקים את האחסון החיצוני ומחברים אותו מחדש, צריך לרשום מחדש את כל ההתראות באופן ידני.
עורכי שיטות קלט
ה-IME שלכם יוחלף ב-IME שמוגדר כברירת מחדל. כשמבטלים את הניתוק של האחסון החיצוני, המשתמש יכול לפתוח את הגדרות המערכת כדי להפעיל מחדש את ה-IME.
טפטים מונפשים
הטפט הדינמי שמוגדר כרגע יוחלף בטפט הדינמי שמוגדר כברירת מחדל. כשמבטלים את הניתוק של האחסון החיצוני ומחברים אותו מחדש, המשתמש יכול לבחור שוב את הטפט הדינמי.
אפליקציות ווידג'ט
הווידג'ט של האפליקציה יוסר ממסך הבית. כשמבצעים הרכבה מחדש של אחסון חיצוני, הווידג'ט של האפליקציה לא יהיה זמין לבחירה על ידי המשתמש עד שהמערכת תאפס את אפליקציית הבית (בדרך כלל רק אחרי הפעלה מחדש של המערכת).
Account Managers
החשבונות שנוצרו באמצעות AccountManager ייעלמו עד שתבצעו שוב את הפעולה של הרכבת האחסון החיצוני.
מתאמי סנכרון
הAbstractThreadedSyncAdapter וכל פונקציות הסנכרון שלו לא יפעלו עד שתתבצע הרכבה מחדש של האחסון החיצוני.
מנהלי מכשירים
האדמין של DeviceAdminReceiver ישבית את המכשיר ואת כל היכולות שלו, מה שעלול לגרום לבעיות בלתי צפויות בתפקוד המכשיר, גם אחרי שתחברו מחדש את האחסון החיצוני.
Broadcast Receivers (מקלט שידורים) שמקשיב ל-boot completed (הפעלה הושלמה)
המערכת מעבירה את השידור ACTION_BOOT_COMPLETEDלפני שהאחסון החיצוני מותקן במכשיר. אם האפליקציה מותקנת באחסון החיצוני, היא לא יכולה לקבל את השידור הזה.

אם האפליקציה שלכם משתמשת באחת מהתכונות שמפורטות למעלה, אל תאפשרו להתקין אותה באחסון חיצוני. כברירת מחדל, המערכת לא תאפשר להתקין את האפליקציה שלכם באחסון החיצוני, כך שלא צריך לדאוג לגבי האפליקציות הקיימות. עם זאת, אם אתם בטוחים שהאפליקציה שלכם אף פעם לא צריכה להיות מותקנת באחסון החיצוני, אתם צריכים להצהיר על כך באופן ברור באמצעות ההצהרה android:installLocation עם הערך internalOnly. למרות שההצהרה הזו לא משנה את התנהגות ברירת המחדל, היא מציינת במפורש שהאפליקציה שלכם צריכה להיות מותקנת רק באחסון הפנימי, ומשמשת כתזכורת לכם ולמפתחים אחרים שהתקבלה ההחלטה הזו.

אפליקציות שצריך להתקין באחסון חיצוני

במילים פשוטות, כל מה שלא משתמש בתכונות שמפורטות בקטע הקודם בטוח להתקנה באחסון חיצוני. בדרך כלל, משחקים גדולים הם סוג האפליקציות שצריך לאפשר התקנה שלהן באחסון חיצוני, כי משחקים בדרך כלל לא מספקים שירותים נוספים כשהם לא פעילים. כשאין אפשרות לגשת לאחסון חיצוני ותהליך של משחק מסוים מסתיים, לא אמורה להיות לכך השפעה גלויה כשמתאפשרת שוב גישה לאחסון והמשתמש מפעיל מחדש את המשחק (בהנחה שהמשחק שמר את המצב שלו בצורה תקינה במהלך מחזור החיים של הפעילות הרגיל).

אם האפליקציה שלכם דורשת כמה מגה-בייט לקובץ ה-APK, כדאי לשקול היטב אם להפעיל את האפשרות להתקנת האפליקציה באחסון החיצוני, כדי שהמשתמשים יוכלו לחסוך מקום באחסון הפנימי.

מידע נוסף בנושא אפשר לקרוא במאמרים הבאים: <manifest>