Packages système préinstallés

Android permet d'avoir plusieurs utilisateurs sur un même appareil. Pour en savoir plus, consultez la page Compatibilité avec plusieurs utilisateurs. Étant donné que tous les packages système ne sont pas utiles pour tous les types d’utilisateurs Android, vous Possibilité d'utiliser une liste d'autorisation pour spécifier les packages système à pré-installer pour chaque type d'utilisateur. En ne préinstallant pas les packages système inutiles, vous pouvez optimiser les temps de création et de démarrage des utilisateurs, ainsi que l'utilisation de la mémoire.

Utiliser des fichiers XML de configuration système, modélisés sur la base de frameworks/base/data/etc/preinstalled-packages-platform.xml pour déclarer les packages système à installer initialement pour les nouveaux utilisateurs en fonction de leur type d'utilisateur. Idéalement, tous les packages système de l'appareil doivent avoir une entrée dans un fichier XML (clé par son nom de fichier manifeste), à l'exception des superpositions statiques, qui sont traitées automatiquement en fonction de l'entrée de leur package cible de superposition correspondant. La façon dont l'appareil doit gérer les paquets système qui ne sont pas listés ici est contrôlée par le mode de configuration.

Types d'utilisateurs

Voici les types d'utilisateurs de base (chaque utilisateur appartient au moins à l'un d'entre eux) :

Type d’utilisateur Description
SYSTEM Utilisateur 0.
FULL Tout utilisateur humain non profilé.
PROFILE Un profil utilisateur humain.

La signification précise de chacun est définie dans frameworks/base/core/java/android/content/pm/UserInfo.java.

Vous pouvez obtenir un contrôle plus précis en spécifiant des types d'utilisateurs individuels, car chaque utilisateur correspond exactement à l'un de ces types, y compris les types d'utilisateurs AOSP définis dans frameworks/base/core/java/android/os/UserManager.java et les types d'utilisateurs personnalisés OEM définis dans frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java.. Pour en savoir plus, consultez la page Types d'utilisateurs. Actuellement, les types d'utilisateurs AOSP sont les suivants:

  • 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

Exemples

Les exemples suivants correspondent aux cas d'utilisation les plus courants :

  1. Pour qu'un package système soit préinstallé dans l'utilisateur 0 uniquement :
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
  2. Pour qu'un package système soit préinstallé sur tous les utilisateurs humains (tel qu'un navigateur Web), c'est-à-dire installé sur tout utilisateur de type FULL ou PROFILE, qui s'adresse à tous les utilisateurs humains :
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  3. Pour qu'un package système soit préinstallé sur tous les utilisateurs humains, à l'exception des utilisateurs de profil. Par exemple, cela peut s'appliquer à une application de fond d'écran:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
  4. Certains packages système doivent être installés sur tous les utilisateurs, quel que soit leur type. Dans ce cas, utilisez :
    <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. Des options plus précises sont également disponibles en spécifiant chaque utilisateur de données. Par exemple, l'exemple de code suivant installe ce package sur tous les utilisateurs dont le type d'utilisateur est un profil géré ou un invité, ou qui est de type de base 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>

balise "do-not-install-in"

Vous pouvez également empêcher la préinstallation de packages sur des types d'utilisateurs spécifiques à l'aide de la balise do-not-install-in. Notez que do-not-install-in remplacent les balises install-in dans tous les fichiers. Exemple :

<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>
Si un utilisateur est de type android.os.usertype.full.GUEST (sous-type de FULL), ce package n'est pas installé, car do-not-install-in est prioritaire sur install-in.

Contrôler le comportement avec config.xml

Valeur config_userTypePackageWhitelistMode de la ressource de configuration contrôle cette fonctionnalité et détermine la façon dont un appareil interprète les packages système qui ne comportent aucune entrée pour un type d'utilisateur. Pour en savoir plus, consultez frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode.

Dans frameworks/base/core/res/res/values/config.xml, définissez l'entier nommé config_userTypePackageWhitelistMode à une combinaison les valeurs suivantes. Ces indicateurs peuvent être combinés. Les options les plus importantes sont les suivantes:

Valeur Description
0 (0b0000) Désactiver. Installez tous les packages système.
1 (0b0001) Appliquez. Installer uniquement les packages système s'ils figurent sur la liste d'autorisation.
4 (0b0100) Considérez tout package qui n'est pas mentionné dans le fichier de liste d'autorisation comme étant implicitement autorisé.
8 (0b1000) Tous les packages non mentionnés dans le fichier de la liste d'autorisation comme étant implicitement ajoutés à la liste d'autorisation pour l'utilisateur SYSTEM.

La configuration suivante active la fonctionnalité (afin que les balises install-in et do-not-install-in soient respectées), mais traite tous les paquets système non mentionnés comme s'ils étaient install-in pour tous les utilisateurs :

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