Pacchetti di sistema preinstallati

Android supporta la presenza di più utenti su un singolo dispositivo. Per saperne di più, consulta Supporto di più utenti. Poiché non tutti i pacchetti di sistema sono utili per tutti i tipi di utenti Android, puoi utilizzare una lista consentita per specificare quali pacchetti di sistema devono essere preinstallati su ogni tipo di utente. Se non preinstalli i pacchetti di sistema non necessari, puoi ottimizzare i tempi di creazione e di inizio degli utenti e l'utilizzo della memoria.

Utilizza i file XML di configurazione di sistema, basati su frameworks/base/data/etc/preinstalled-packages-platform.xml, per dichiarare quali pacchetti di sistema devono essere installati inizialmente per i nuovi utenti in base al loro tipo di utente. Idealmente, tutti i pacchetti di sistema sul dispositivo dovrebbero avere una voce in un file XML (in base al nome del manifest), ad eccezione degli overlay statici, che vengono invece trattati automaticamente in base alla voce del pacchetto di destinazione dell'overlay corrispondente. Il modo in cui il dispositivo deve gestire i pacchetti di sistema non elencati qui è controllato dalla modalità di configurazione.

Tipi di utenti

I tipi di utenti di base (ogni utente è almeno uno di questi tipi) sono:

Tipo di utente Descrizione
SYSTEM Utente 0.
FULL Qualsiasi utente umano non appartenente a un profilo.
PROFILE Un profilo utente umano.

Il significato preciso di ciascuno è definito in frameworks/base/core/java/android/content/pm/UserInfo.java.

È possibile ottenere un controllo più granulare specificando i singoli tipi di utente, poiché ogni utente è esattamente uno di questi tipi, inclusi i tipi di utente AOSP definiti in frameworks/base/core/java/android/os/UserManager.java e gli eventuali tipi di utente personalizzati OEM definiti in frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java.. Per ulteriori informazioni, consulta la pagina Tipi di utente. Attualmente, i tipi di utenti AOSP includono:

  • 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

Esempi

I seguenti esempi riguardano i casi d'uso più comuni:

  1. Affinché un pacchetto di sistema venga preinstallato solo nell'utente 0:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
  2. Affinché un pacchetto di sistema sia preinstallato su tutti gli utenti umani (ad esempio un browser web), ovvero per essere installato su qualsiasi utente di tipo FULL o PROFILE, che si rivolge a tutti gli utenti umani:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  3. Per un pacchetto di sistema da preinstallare su tutti gli utenti umani, ad eccezione degli utenti del profilo. Ad esempio, questo potrebbe essere applicato a un'app di sfondi:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
  4. Alcuni pacchetti di sistema devono essere installati su tutti gli utenti, indipendentemente dal tipo. In questi casi, utilizza:
    <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. Sono disponibili anche opzioni più granulari specificando i singoli tipi di utenti. Ad esempio, il seguente codice di esempio installa questo pacchetto su qualsiasi utente il cui tipo di utente è un profilo gestito o un ospite o è di un tipo di 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>

tag do-not-install-in

È anche possibile impedire la preinstallazione dei pacchetti su determinati tipi di utenti utilizzando il tag do-not-install-in. Tieni presente che i tag do-not-install-in sovrascrivono i tag install-in in qualsiasi file. Ad esempio:

<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>
Se un utente è di tipo android.os.usertype.full.GUEST (un sottotipo di FULL), questo pacchetto non viene installato perché il tag do-not-install-in ha la precedenza su install-in.

Controllare il comportamento con config.xml

Il valore della risorsa di configurazione config_userTypePackageWhitelistMode controlla questa funzionalità e determina in che modo un dispositivo interpreta i pacchetti di sistema che non hanno voci per nessun tipo di utente. Per ulteriori informazioni, consulta frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode.

In frameworks/base/core/res/res/values/config.xml, imposta l'intero denominato config_userTypePackageWhitelistMode su una combinazione di i seguenti valori. Questi flag possono essere combinati. I flag più importanti sono:

Valore Descrizione
0 (0b0000) Disattiva. Installa tutti i pacchetti di sistema.
1 (0b0001) Applica. Installa i pacchetti di sistema solo se inclusi nella lista consentita.
4 (0b0100) Qualsiasi pacchetto non menzionato nel file della lista consentita è considerato implicitamente incluso nella lista consentita.
8 (0b1000) Considera qualsiasi pacchetto non menzionato nel file della lista consentita come implicitamente incluso nella lista consentita solo per l'utente SYSTEM.

La seguente configurazione attiva la funzionalità (in modo che i tag install-in e do-not-install-in vengano rispettati), ma tratta i pacchetti di sistema non menzionati come se fossero install-in per tutti gli utenti:

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