חבילות מערכת שהותקנו מראש

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

משתמשים בקובצי XML של הגדרות המערכת, לפי המודל של frameworks/base/data/etc/preinstalled-packages-platform.xml, כדי להצהיר על חבילות המערכת שצריך להתקין בהתחלה למשתמשים חדשים על סמך סוג המשתמש שלהם. באופן אידיאלי, לכל חבילות המערכת במכשיר צריכה להיות רשומה בקובץ XML (מפתח לפי שם המניפסט), מלבד שכבות-על סטטיות, שבמקרה כזה הן מטופלות באופן אוטומטי בהתאם לרשומה של חבילת היעד של שכבת-העל התואמת. האופן שבו המכשיר יטפל בחבילות מערכת שלא מופיעות כאן נקבע על ידי config mode.

סוגי משתמשים

סוגי המשתמשים הבסיסיים (כל משתמש הוא לפחות אחד מהסוגים האלה) הם:

סוג המשתמש תיאור
SYSTEM משתמש 0.
FULL כל משתמש אנושי שאינו פרופיל.
PROFILE משתמש אנושי בפרופיל.

המשמעות המדויקת של כל אחת מהן מוגדרת בקטע frameworks/base/core/java/android/content/pm/UserInfo.java.

כדי לקבל שליטה מפורטת יותר, אפשר לציין סוגים ספציפיים של משתמשים, כי כל משתמש הוא בדיוק אחד מסוגי המשתמשים האלה, כולל סוגי המשתמשים של AOSP שמוגדרים בקובץ frameworks/base/core/java/android/os/UserManager.java וכל סוגי המשתמשים בהתאמה אישית של יצרני ציוד מקורי שמוגדרים בקובץ frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java.. מידע נוסף זמין בדף סוגי משתמשים. נכון לעכשיו, סוגי המשתמשים ב-AOSP כוללים:

  • android.os.usertype.full.SYSTEM
  • android.os.usertype.full.SECONDARY
  • android.os.usertype.full.GUEST
  • android.os.usertype.full.DEMO
  • android.os.usertype.full.RESTRICTED
  • android.os.usertype.profile.MANAGED
  • android.os.usertype.profile.PRIVATE
  • android.os.usertype.system.HEADLESS

דוגמאות

הדוגמאות הבאות מתייחסות לתרחישי השימוש הנפוצים ביותר:

  1. כדי לחבילת מערכת להיות מותקנת מראש במשתמש 0 בלבד:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
  2. כדי שחבילת מערכת תותקן מראש בכל המשתמשים האנושיים (כמו דפדפן אינטרנט), כלומר תותקן בכל משתמש מסוג FULL או PROFILE, שמתייחס לכל המשתמשים האנושיים:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  3. כדי לחבילת מערכת להיות מותקנת מראש בכל המשתמשים האנושיים, מלבד משתמשי פרופיל. לדוגמה, אפשר להחיל את המדיניות הזו על אפליקציית טפטים:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
  4. יש חבילות מערכת שחייבות להיות מותקנות אצל כל המשתמשים, ללא קשר לסוג שלהם. במקרים כאלה, צריך להשתמש באפשרויות הבאות:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  5. אפשר גם לציין סוגי משתמשים ספציפיים כדי לקבל אפשרויות מפורטות יותר. לדוגמה, הקוד לדוגמה הבא מתקין את החבילה הזו בכל משתמש שהסוג שלו הוא 'פרופיל מנוהל' או 'אורח', או שהוא מסוג הבסיס SYSTEM.
    <install-in-user-type package="com.android.example">
        <install-in user-type="android.os.usertype.profile.MANAGED" />
        <install-in user-type="android.os.usertype.full.GUEST" />
        <install-in user-type="SYSTEM">
    </install-in-user-type>

תג do-not-install-in

אפשר גם למנוע התקנה מראש של חבילות אצל סוגים מסוימים של משתמשים באמצעות התג do-not-install-in. חשוב לזכור שתגים מסוג do-not-install-in מבטלים תגים מסוג install-in בכל קובץ. לדוגמה:

<install-in-user-type package="com.android.example">
    <install-in user-type="FULL" />
    <do-not-install-in user-type="android.os.usertype.full.GUEST"/>
</install-in-user-type>
אם המשתמש הוא מסוג android.os.usertype.full.GUEST (תת-סוג של FULL), החבילה הזו לא מותקנת כי התג do-not-install-in עדיף על install-in.

שליטה בהתנהגות באמצעות config.xml

הערך של משאב התצורה config_userTypePackageWhitelistMode קובע איך המכשיר מפרש חבילות מערכת שאין להן רשומה של סוג משתמש כלשהו. מידע נוסף זמין במאמר frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode.

ב-frameworks/base/core/res/res/values/config.xml, מגדירים את המספר המלא בשם config_userTypePackageWhitelistMode לשילוב של הערכים הבאים. אפשר לשלב בין הדגלים האלה. הדגלים החשובים ביותר הם:

ערך תיאור
0 (0b0000) השבתה. מתקינים את כל חבילות המערכת.
1 (0b0001) אכיפה התקנת חבילות מערכת רק אם הן נמצאות ברשימת ההיתרים.
4 (0b0100) כל חבילה שלא מופיעה בקובץ רשימת ההיתרים נחשבת כחבילה שרשומה ברשימת ההיתרים באופן משתמע.
8 (0b1000) כל חבילה שלא מוזכרת בקובץ רשימת ההיתרים נחשבת כחבילה שרשומה ברשימת ההיתרים באופן משתמע, רק למשתמש SYSTEM.

ההגדרה הבאה מפעילה את התכונה (כך שתגים מסוג install-in ו-do-not-install-in יתקבלו), אבל כל חבילות המערכת שלא מוזכרות ייחשבו כ-install-in לכל המשתמשים:

<integer name="config_userTypePackageWhitelistMode">5</integer>