The UserSystemPackageInstaller (USPI) uninstalls system packages that are not needed, depending on the user type. When that determination changes (or the feature is disabled) it can also re-install those packages. This cl specifies when it is appropriate for USPI to actually perform the (un)installation. 1. Introduces uninstallReason: records the reason why a package was uninstalled from a given user. Right now, the only values are UNKNOWN and USER_TYPE. The latter indicates that the USPI system uninstalled the package. If the USPI whitelist changes (or the USPI feature is disabled), uninstalled packages will only be installed by USPI if the uninstallReason was USER_TYPE. Any further uninstalls (e.g. by ManagedProvisioning) will reset the uninstallReason to UNKNOWN, so USPI will no longer install such packages in the future. This prevents USPI from reinstalling system packages that other mechanisms (such as ManagedProvisioning) uninstalled. 2. USPI will uninstall a system package if it is blacklisted, but only if that system package is new, i.e in two circumstances: a. on first boot b. on an OTA where the package was not present prior to the OTA Bug: 143200798 Test: atest UserSystemPackageInstallerTest Test: Confirmed (un)installations during manually simulated OTAs Change-Id: Ia0714d1faa8f7c79082f2cc93a92ae36b9a4c918 Merged-In: Ia0714d1faa8f7c79082f2cc93a92ae36b9a4c918
113 lines
4.9 KiB
XML
113 lines
4.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- Copyright (C) 2019 The Android Open Source Project
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
-->
|
|
|
|
<!--
|
|
This XML file declares which system packages should be initially installed for new users based on
|
|
their user type. All system packages on the device should ideally have an entry in an xml file
|
|
(keyed by its manifest name).
|
|
|
|
Base user-types (every user will be at least one of these types) are:
|
|
SYSTEM (user 0)
|
|
FULL (any non-profile human user)
|
|
PROFILE (profile human user)
|
|
the precise meaning of which is defined in
|
|
frameworks/base/core/java/android/content/pm/UserInfo.java.
|
|
TODO(b/143784345): When UserInfo flags are categorized, reference the "base type" category here.
|
|
|
|
More granular control is also available by specifying individual user types (every user is exactly
|
|
one of these user types).
|
|
This includes AOSP user types defined in frameworks/base/core/java/android/os/UserManager.java, like
|
|
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
|
|
as well as any OEM custom user types defined using
|
|
frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java.
|
|
Any specified user types must be valid user types on the device (i.e. created in UserTypeFactory).
|
|
|
|
The following three examples should cover most normal cases:
|
|
|
|
1. For a system package to be pre-installed only in user 0:
|
|
|
|
<install-in-user-type package="com.android.example">
|
|
<install-in user-type="SYSTEM" />
|
|
</install-in-user-type>
|
|
|
|
|
|
2. For a system package to be pre-installed on all human users (e.g. a web browser), i.e. to be
|
|
installed on any user of type type FULL or PROFILE (since this covers all human users):
|
|
|
|
<install-in-user-type package="com.android.example">
|
|
<install-in user-type="FULL" />
|
|
<install-in user-type="PROFILE" />
|
|
</install-in-user-type>
|
|
|
|
|
|
3. For a system package to be pre-installed on all human users except for profile users (e.g. a
|
|
wallpaper app, since profiles cannot display wallpaper):
|
|
|
|
<install-in-user-type package="com.android.example">
|
|
<install-in user-type="FULL" />
|
|
</install-in-user-type>
|
|
|
|
|
|
Some system packages truly are required to be on all users, regardless of type, in which case use:
|
|
<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>
|
|
|
|
More fine-grained options are also available by specifying individual user types.
|
|
E.g.
|
|
<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>
|
|
which installs this package on any user whose user type is a managed profile or a guest, or is of
|
|
a SYSTEM base type.
|
|
|
|
Additionally, packages can blacklist user types. Blacklists override any whitelisting (in any file).
|
|
E.g.
|
|
<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>
|
|
If a user is of type android.os.usertype.full.GUEST (which itself is a subtype of FULL), this
|
|
package will NOT be installed, because the 'do-not-install-in' takes precedence over 'install-in'.
|
|
|
|
The way that a device treats system packages that do not have any entry (for any user type) at all
|
|
is determined by the config resource value config_userTypePackageWhitelistMode.
|
|
See frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode.
|
|
|
|
Changes to the whitelist during system updates can result in installing additional system packages
|
|
to pre-existing users, but cannot uninstall pre-existing system packages from pre-existing users.
|
|
-->
|
|
<config>
|
|
<install-in-user-type package="com.android.providers.settings">
|
|
<install-in user-type="SYSTEM" />
|
|
<install-in user-type="FULL" />
|
|
<install-in user-type="PROFILE" />
|
|
</install-in-user-type>
|
|
<install-in-user-type package="com.android.wallpaperbackup">
|
|
<install-in user-type="FULL" />
|
|
</install-in-user-type>
|
|
</config>
|