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

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

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

انواع کاربر

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

نوع کاربر توضیحات
SYSTEM کاربر 0.
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.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 برچسب‌های 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>