بسته‌های سیستم ازپیش‌نصب‌شده

‫Android از داشتن چند کاربر در یک دستگاه پشتیبانی می‌کند. برای اطلاعات بیشتر، پشتیبانی از چند کاربر را ببینید. ازآنجایی‌که همه بسته‌های سیستم برای همه انواع کاربران Android مفید نیستند، می‌توانید از فهرست مجاز برای مشخص کردن اینکه کدام بسته‌های سیستم باید در هر نوع کاربر ازپیش نصب شوند استفاده کنید. با پیش‌نصب نکردن بسته‌های سیستم غیرضروری، می‌توانید زمان ایجاد کاربر، زمان شروع، و استفاده از حافظه را بهینه‌سازی کنید.

از فایل‌های XML پیکربندی سیستم، که براساس frameworks/base/data/etc/preinstalled-packages-platform.xml مدل‌سازی شده‌اند، استفاده کنید تا مشخص کنید کدام بسته‌های سیستم باید در ابتدا برای کاربران جدید براساس نوع کاربرشان نصب شوند. همه بسته‌های سیستم در دستگاه باید در حالت ایده‌آل ورودی‌ای در فایل XML داشته باشند (با کلید نام مانیفست)، به‌جز رونهادهای ایستا، که درعوض به‌طور خودکار براساس ورودی بسته هدف رونهاد مربوطه رفتار می‌شوند. نحوه عملکرد دستگاه درخصوص بسته‌های سیستم که در اینجا فهرست نشده‌اند توسط حالت پیکربندی کنترل می‌شود.

انواع کاربر

انواع کاربر پایه (هر کاربر حداقل یکی از این انواع است) عبارتند از:

نوع کاربر شرح
SYSTEM کاربر ۰.
FULL هر کاربر انسانی غیرنمایه.
PROFILE نمایه کاربر انسانی.

معنی دقیق هرکدام در frameworks/base/core/java/android/content/pm/UserInfo.java تعریف شده است.

با مشخص کردن انواع کاربر به‌صورت جداگانه، می‌توان کنترل دقیق‌تری به‌دست آورد زیرا هر کاربر دقیقاً یکی از این انواع کاربر است، که شامل انواع کاربر AOSP تعریف‌شده در frameworks/base/core/java/android/os/UserManager.java و هر نوع کاربر سفارشی OEM تعریف‌شده در 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. برای اینکه بسته سیستمی فقط در کاربر ۰ ازپیش نصب شود:
    <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) هر بسته‌ای که در فایل فهرست مجازها ذکر نشده باشد، به‌عنوان فهرست مجاز ضمنی فقط برای کاربر «سیستم» درنظر گرفته می‌شود.

پیکربندی زیر ویژگی را فعال می‌کند (به‌طوری‌که از برچسب‌های install-in و do-not-install-in پیروی شود) اما با همه بسته‌های سیستم نامبرده‌نشده به‌گونه‌ای رفتار می‌کند که انگار برای همه کاربران install-in هستند:

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