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

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

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

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

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

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

שירותים
הריצה שלך Service הוא כלום ולא מופעל מחדש לאחר טעינה מחדש של אחסון חיצוני. הגשת מועמדות שקשורים לשירות הזה יכולים להירשם ACTION_EXTERNAL_APPLICATIONS_AVAILABLE כוונת שידור, שמודיעה לכל האפליקציות ששלא מותקנת באחסון חיצוני כשהאפליקציות מותקנות במכשיר חיצוני נפח האחסון הפך שוב זמין למערכת. אחרי קבלת ההודעה הזו שידור, אפליקציות יכולות לנסות לקשר לשירות שלך.
שירותי אזעקה
ההתראות שנרשמו אצל AlarmManager יבוטלו. צריך לרשום מחדש באופן ידני כל התראה כשהתקן אחסון חיצוני מותקן מחדש.
מנועים של שיטות קלט
ה-IME שלך יהיה הוחלף ב-IME המוגדר כברירת מחדל. כשטוענים מחדש אחסון חיצוני, המשתמש יכול לפתוח את הגדרות המערכת כדי להפעיל שוב את ה-IME.
טפטים מונפשים
הטפט החי לריצה שלך יוחלף בטפט המונפש המוגדר כברירת מחדל. כשהתקן אחסון חיצוני נטען מחדש, המשתמש יכול בוחרים שוב את הטפט המונפש.
אפליקציות ווידג'ט
הווידג'ט של האפליקציה יוסר ממסך הבית. כשטוענים מחדש אחסון חיצוני, ווידג'ט האפליקציה לא למשתמש יכול לבחור עד שהמערכת תאפס את אפליקציית דף הבית (בדרך כלל לא עד להפעיל מחדש את המערכת).
מנהלי חשבונות
החשבונות שלך שנוצרו באמצעות AccountManager לא יופיעו עד האחסון החיצוני נטען מחדש.
מתאמי סנכרון
AbstractThreadedSyncAdapter וכל פונקציונליות הסנכרון שלו לא יפעלו עד לטעינה מחדש של האחסון החיצוני.
מנהלי מכשירים
DeviceAdminReceiver וכל יכולות הניהול שלו מושבתת, ועלולות להיות השלכות בלתי צפויות על פונקציונליות המכשיר, לא יישמרו לאחר טעינה מחדש של האחסון החיצוני.
מקלטי שידור מאזינים ל"האתחול הושלם"
המערכת מעבירה את השידור של ACTION_BOOT_COMPLETED לפני שהתקן האחסון החיצוני מותקן על המכשיר. אם האפליקציה שלכם מותקנת באחסון חיצוני, הוא לעולם לא יוכל לקבל את השידור הזה.

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

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

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

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

למידע נוסף בנושא, כדאי לעיין במאמרים הבאים: <manifest>