blob: d1e4537b9235a894324e552a8d276646d2da7038 [file] [log] [blame]
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.pm;
18
19import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
20import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
21import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
Todd Kennedy13715d52016-08-01 13:38:57 -070022import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
Todd Kennedy3cd658e2016-08-16 15:00:31 -070023import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
Fabrice Di Meglio07885952015-04-06 19:41:28 -070024import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080025import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070026import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
Jeff Sharkey184a0102013-07-10 16:19:52 -070027import static android.os.Process.PACKAGE_INFO_GID;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070028import static android.os.Process.SYSTEM_UID;
Jeff Sharkey2271ba32016-02-01 17:57:08 -070029
Christopher Tate72c10a22015-06-12 18:31:24 -070030import static com.android.server.pm.PackageManagerService.DEBUG_DOMAIN_VERIFICATION;
Suprabh Shukla021b57a2018-03-08 18:21:50 -080031import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070032
Xiaohui Chen594f2082015-08-18 11:04:20 -070033import android.annotation.NonNull;
Todd Kennedy13715d52016-08-01 13:38:57 -070034import android.annotation.Nullable;
Anton Hanssone870d0222019-03-26 14:35:58 +000035import android.annotation.UserIdInt;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070036import android.content.ComponentName;
37import android.content.Intent;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080038import android.content.IntentFilter;
39import android.content.pm.ActivityInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070040import android.content.pm.ApplicationInfo;
41import android.content.pm.ComponentInfo;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080042import android.content.pm.IntentFilterVerificationInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070043import android.content.pm.PackageManager;
Todd Kennedycf827032018-07-03 13:17:22 -070044import android.content.pm.PackageManagerInternal;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070045import android.content.pm.PackageParser;
46import android.content.pm.PackageUserState;
47import android.content.pm.PermissionInfo;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080048import android.content.pm.ResolveInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070049import android.content.pm.Signature;
Suprabh Shukla389cb6f2018-10-01 18:20:39 -070050import android.content.pm.SuspendDialogInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070051import android.content.pm.UserInfo;
52import android.content.pm.VerifierDeviceIdentity;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080053import android.net.Uri;
Narayan Kamathff110bd2014-07-04 18:30:45 +010054import android.os.Binder;
Jeff Sharkey4ed745d2014-07-15 20:39:15 -070055import android.os.Build;
Narayan Kamathff110bd2014-07-04 18:30:45 +010056import android.os.Environment;
57import android.os.FileUtils;
Svetoslavc6d1c342015-02-26 14:44:43 -080058import android.os.Handler;
59import android.os.Message;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080060import android.os.PatternMatcher;
Suprabh Shukla021b57a2018-03-08 18:21:50 -080061import android.os.PersistableBundle;
Narayan Kamathff110bd2014-07-04 18:30:45 +010062import android.os.Process;
Florian Mayerd4db9972019-03-21 13:57:42 +000063import android.os.SELinux;
Svetoslavc6d1c342015-02-26 14:44:43 -080064import android.os.SystemClock;
Narayan Kamathff110bd2014-07-04 18:30:45 +010065import android.os.UserHandle;
Amith Yamasani26f9ea32014-09-11 10:56:51 -070066import android.os.UserManager;
Paul Crowleybcf48ed2015-04-22 13:36:59 +010067import android.os.storage.StorageManager;
Netta P426cbef2017-02-10 14:38:39 -080068import android.service.pm.PackageServiceDumpProto;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080069import android.text.TextUtils;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070070import android.util.ArrayMap;
71import android.util.ArraySet;
72import android.util.AtomicFile;
73import android.util.Log;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080074import android.util.LogPrinter;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070075import android.util.Slog;
76import android.util.SparseArray;
Svetoslavc6d1c342015-02-26 14:44:43 -080077import android.util.SparseBooleanArray;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070078import android.util.SparseIntArray;
Svetoslavc6d1c342015-02-26 14:44:43 -080079import android.util.SparseLongArray;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070080import android.util.Xml;
Netta P426cbef2017-02-10 14:38:39 -080081import android.util.proto.ProtoOutputStream;
Christopher Tatee012a232015-04-01 17:18:50 -070082
Svetoslavc6d1c342015-02-26 14:44:43 -080083import com.android.internal.annotations.GuardedBy;
84import com.android.internal.os.BackgroundThread;
85import com.android.internal.util.ArrayUtils;
Makoto Onuki0a068582018-06-13 10:57:34 -070086import com.android.internal.util.CollectionUtils;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070087import com.android.internal.util.FastXmlSerializer;
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -070088import com.android.internal.util.IndentingPrintWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070089import com.android.internal.util.JournaledFile;
90import com.android.internal.util.XmlUtils;
Todd Kennedycf827032018-07-03 13:17:22 -070091import com.android.server.LocalServices;
Jeff Sharkey740f5232016-12-09 14:31:26 -070092import com.android.server.pm.Installer.InstallerException;
Todd Kennedy91a39d12017-09-27 12:37:04 -070093import com.android.server.pm.permission.BasePermission;
Todd Kennedy0eb97382017-10-03 16:57:22 -070094import com.android.server.pm.permission.PermissionSettings;
Todd Kennedy82b08422017-09-28 13:32:05 -070095import com.android.server.pm.permission.PermissionsState;
96import com.android.server.pm.permission.PermissionsState.PermissionState;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070097
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070098import libcore.io.IoUtils;
Alexandra Gherghina6e2ae252014-06-12 16:03:58 +010099
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700100import org.xmlpull.v1.XmlPullParser;
101import org.xmlpull.v1.XmlPullParserException;
102import org.xmlpull.v1.XmlSerializer;
103
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700104import java.io.BufferedInputStream;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700105import java.io.BufferedOutputStream;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700106import java.io.BufferedWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700107import java.io.File;
108import java.io.FileInputStream;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700109import java.io.FileNotFoundException;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700110import java.io.FileOutputStream;
111import java.io.IOException;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700112import java.io.InputStream;
113import java.io.OutputStreamWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700114import java.io.PrintWriter;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700115import java.nio.charset.Charset;
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +0100116import java.nio.charset.StandardCharsets;
Kenny Root447106f2011-03-23 11:00:15 -0700117import java.text.SimpleDateFormat;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700118import java.util.ArrayList;
119import java.util.Arrays;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700120import java.util.Collection;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800121import java.util.Collections;
Kenny Root447106f2011-03-23 11:00:15 -0700122import java.util.Date;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700123import java.util.Iterator;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700124import java.util.List;
Andy McFadden2f362292012-01-20 14:43:38 -0800125import java.util.Map;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700126import java.util.Map.Entry;
Jeff Sharkey84f12942014-07-10 17:48:11 -0700127import java.util.Objects;
Dianne Hackborn63092712012-10-07 14:45:35 -0700128import java.util.Set;
Kenny Root62539e92011-11-10 09:35:38 -0800129
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700130/**
131 * Holds information about dynamic settings.
132 */
Todd Kennedy91a39d12017-09-27 12:37:04 -0700133public final class Settings {
Kenny Root447106f2011-03-23 11:00:15 -0700134 private static final String TAG = "PackageSettings";
135
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700136 /**
137 * Current version of the package database. Set it to the latest version in
138 * the {@link DatabaseVersion} class below to ensure the database upgrade
139 * doesn't happen repeatedly.
140 * <p>
141 * Note that care should be taken to make sure all database upgrades are
142 * idempotent.
143 */
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700144 public static final int CURRENT_DATABASE_VERSION = DatabaseVersion.SIGNATURE_MALFORMED_RECOVER;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700145
146 /**
147 * This class contains constants that can be referred to from upgrade code.
148 * Insert constant values here that describe the upgrade reason. The version
149 * code must be monotonically increasing.
150 */
151 public static class DatabaseVersion {
152 /**
153 * The initial version of the database.
154 */
155 public static final int FIRST_VERSION = 1;
Kenny Roota8e65fd2014-04-24 11:44:47 -0700156
157 /**
158 * Migrating the Signature array from the entire certificate chain to
159 * just the signing certificate.
160 */
161 public static final int SIGNATURE_END_ENTITY = 2;
Jeff Sharkeyd68b87c2014-11-12 12:18:11 -0800162
163 /**
164 * There was a window of time in
165 * {@link android.os.Build.VERSION_CODES#LOLLIPOP} where we persisted
166 * certificates after potentially mutating them. To switch back to the
167 * original untouched certificates, we need to force a collection pass.
168 */
169 public static final int SIGNATURE_MALFORMED_RECOVER = 3;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700170 }
171
Kenny Root447106f2011-03-23 11:00:15 -0700172 private static final boolean DEBUG_STOPPED = false;
Amith Yamasani258848d2012-08-10 17:06:33 -0700173 private static final boolean DEBUG_MU = false;
Jeff Sharkey2271ba32016-02-01 17:57:08 -0700174 private static final boolean DEBUG_KERNEL = false;
Todd Kennedy788c8422016-08-10 10:52:34 -0700175 private static final boolean DEBUG_PARSER = false;
Kenny Root447106f2011-03-23 11:00:15 -0700176
Svetoslavc6d1c342015-02-26 14:44:43 -0800177 private static final String RUNTIME_PERMISSIONS_FILE_NAME = "runtime-permissions.xml";
178
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -0700179 private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage";
180 private static final String ATTR_ENFORCEMENT = "enforcement";
181
Todd Kennedy91a39d12017-09-27 12:37:04 -0700182 public static final String TAG_ITEM = "item";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700183 private static final String TAG_DISABLED_COMPONENTS = "disabled-components";
184 private static final String TAG_ENABLED_COMPONENTS = "enabled-components";
185 private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions";
186 private static final String TAG_PACKAGE = "pkg";
Svetoslavc6d1c342015-02-26 14:44:43 -0800187 private static final String TAG_SHARED_USER = "shared-user";
188 private static final String TAG_RUNTIME_PERMISSIONS = "runtime-permissions";
189 private static final String TAG_PERMISSIONS = "perms";
Svet Ganov354cd3c2015-12-17 11:35:04 -0800190 private static final String TAG_CHILD_PACKAGE = "child-package";
Svet Ganov67882122016-12-11 16:36:34 -0800191 private static final String TAG_USES_STATIC_LIB = "uses-static-lib";
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +0200192 private static final String TAG_BLOCK_UNINSTALL_PACKAGES = "block-uninstall-packages";
193 private static final String TAG_BLOCK_UNINSTALL = "block-uninstall";
Svet Ganov354cd3c2015-12-17 11:35:04 -0800194
Sander Alewijnseaf597622014-03-20 18:44:57 +0000195 private static final String TAG_PERSISTENT_PREFERRED_ACTIVITIES =
196 "persistent-preferred-activities";
Nicolas Prevot81948992014-05-16 18:25:26 +0100197 static final String TAG_CROSS_PROFILE_INTENT_FILTERS =
198 "crossProfile-intent-filters";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700199 private static final String TAG_DOMAIN_VERIFICATION = "domain-verification";
200 private static final String TAG_DEFAULT_APPS = "default-apps";
201 private static final String TAG_ALL_INTENT_FILTER_VERIFICATION =
Christopher Tate6038d152015-06-17 13:07:46 -0700202 "all-intent-filter-verifications";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700203 private static final String TAG_DEFAULT_BROWSER = "default-browser";
Robin Lee0dc591b2016-05-04 13:01:46 +0100204 private static final String TAG_DEFAULT_DIALER = "default-dialer";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700205 private static final String TAG_VERSION = "version";
Suprabh Shukla389cb6f2018-10-01 18:20:39 -0700206 private static final String TAG_SUSPENDED_DIALOG_INFO = "suspended-dialog-info";
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800207 private static final String TAG_SUSPENDED_APP_EXTRAS = "suspended-app-extras";
208 private static final String TAG_SUSPENDED_LAUNCHER_EXTRAS = "suspended-launcher-extras";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700209
Todd Kennedy91a39d12017-09-27 12:37:04 -0700210 public static final String ATTR_NAME = "name";
211 public static final String ATTR_PACKAGE = "package";
Svet Ganov8c7f7002015-05-07 10:48:44 -0700212 private static final String ATTR_GRANTED = "granted";
213 private static final String ATTR_FLAGS = "flags";
Svet Ganov67882122016-12-11 16:36:34 -0800214 private static final String ATTR_VERSION = "version";
Jeff Sharkey42884192016-04-09 16:12:01 -0600215
216 private static final String ATTR_CE_DATA_INODE = "ceDataInode";
217 private static final String ATTR_INSTALLED = "inst";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700218 private static final String ATTR_STOPPED = "stopped";
Jeff Sharkey42884192016-04-09 16:12:01 -0600219 private static final String ATTR_NOT_LAUNCHED = "nl";
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700220 // Legacy, here for reading older versions of the package-restrictions.
Amith Yamasani655d0e22013-06-12 14:19:10 -0700221 private static final String ATTR_BLOCKED = "blocked";
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700222 // New name for the above attribute.
223 private static final String ATTR_HIDDEN = "hidden";
Suprabh Shukla79000492018-12-24 17:03:02 -0800224 private static final String ATTR_DISTRACTION_FLAGS = "distraction_flags";
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000225 private static final String ATTR_SUSPENDED = "suspended";
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800226 private static final String ATTR_SUSPENDING_PACKAGE = "suspending-package";
Suprabh Shukla389cb6f2018-10-01 18:20:39 -0700227 /**
228 * @deprecated Legacy attribute, kept only for upgrading from P builds.
229 */
230 @Deprecated
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700231 private static final String ATTR_SUSPEND_DIALOG_MESSAGE = "suspend_dialog_message";
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +0200232 // Legacy, uninstall blocks are stored separately.
233 @Deprecated
Kenny Guyc13053b2014-05-29 14:17:17 +0100234 private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall";
Jeff Sharkey42884192016-04-09 16:12:01 -0600235 private static final String ATTR_ENABLED = "enabled";
236 private static final String ATTR_ENABLED_CALLER = "enabledCaller";
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800237 private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus";
Jeff Sharkey42884192016-04-09 16:12:01 -0600238 private static final String ATTR_APP_LINK_GENERATION = "app-link-generation";
Bartosz Fabianowskia34f53f2017-01-11 18:08:47 +0100239 private static final String ATTR_INSTALL_REASON = "install-reason";
Todd Kennedybe0b8892017-02-15 14:13:52 -0800240 private static final String ATTR_INSTANT_APP = "instant-app";
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700241 private static final String ATTR_VIRTUAL_PRELOAD = "virtual-preload";
Ben Gruver1ab3d6e2017-12-07 13:45:08 -0800242 private static final String ATTR_HARMFUL_APP_WARNING = "harmful-app-warning";
Jeff Sharkey42884192016-04-09 16:12:01 -0600243
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700244 private static final String ATTR_PACKAGE_NAME = "packageName";
Svet Ganovba3ba812015-06-26 10:54:06 -0700245 private static final String ATTR_FINGERPRINT = "fingerprint";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700246 private static final String ATTR_VOLUME_UUID = "volumeUuid";
247 private static final String ATTR_SDK_VERSION = "sdkVersion";
248 private static final String ATTR_DATABASE_VERSION = "databaseVersion";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700249
Svetoslavc6d1c342015-02-26 14:44:43 -0800250 private final Object mLock;
Svetoslavc6d1c342015-02-26 14:44:43 -0800251
252 private final RuntimePermissionPersistence mRuntimePermissionsPersistence;
253
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700254 private final File mSettingsFilename;
255 private final File mBackupSettingsFilename;
256 private final File mPackageListFilename;
257 private final File mStoppedPackagesFilename;
258 private final File mBackupStoppedPackagesFilename;
Amith Yamasani23ab7f52017-01-22 17:43:24 -0800259 /** The top level directory in configfs for sdcardfs to push the package->uid,userId mappings */
Jeff Sharkey2271ba32016-02-01 17:57:08 -0700260 private final File mKernelMappingFilename;
Jeff Sharkey184a0102013-07-10 16:19:52 -0700261
Jeff Sharkey2271ba32016-02-01 17:57:08 -0700262 /** Map from package name to settings */
263 final ArrayMap<String, PackageSetting> mPackages = new ArrayMap<>();
264
Sudheer Shanka29283372016-04-04 20:56:27 -0700265 /** List of packages that installed other packages */
266 final ArraySet<String> mInstallerPackages = new ArraySet<>();
267
Amith Yamasani23ab7f52017-01-22 17:43:24 -0800268 /** Map from package name to appId and excluded userids */
269 private final ArrayMap<String, KernelPackageState> mKernelMapping = new ArrayMap<>();
Christopher Tate6038d152015-06-17 13:07:46 -0700270
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700271 // List of replaced system applications
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700272 private final ArrayMap<String, PackageSetting> mDisabledSysPackages =
273 new ArrayMap<String, PackageSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700274
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +0200275 /** List of packages that are blocked for uninstall for specific users */
276 private final SparseArray<ArraySet<String>> mBlockUninstallPackages = new SparseArray<>();
277
Christopher Tate6038d152015-06-17 13:07:46 -0700278 // Set of restored intent-filter verification states
279 private final ArrayMap<String, IntentFilterVerificationInfo> mRestoredIntentFilterVerifications =
280 new ArrayMap<String, IntentFilterVerificationInfo>();
281
Amith Yamasani23ab7f52017-01-22 17:43:24 -0800282 private static final class KernelPackageState {
283 int appId;
284 int[] excludedUserIds;
285 }
286
Geremy Condra12c18382013-03-06 16:49:06 -0800287 private static int mFirstAvailableUid = 0;
288
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700289 /** Map from volume UUID to {@link VersionInfo} */
290 private ArrayMap<String, VersionInfo> mVersion = new ArrayMap<>();
Kenny Root0aaa0d92011-09-12 16:42:55 -0700291
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700292 /**
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700293 * Version details for a storage volume that may hold apps.
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700294 */
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700295 public static class VersionInfo {
296 /**
297 * These are the last platform API version we were using for the apps
298 * installed on internal and external storage. It is used to grant newer
299 * permissions one time during a system upgrade.
300 */
301 int sdkVersion;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700302
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700303 /**
304 * The current database version for apps on internal storage. This is
305 * used to upgrade the format of the packages.xml database not
306 * necessarily tied to an SDK version.
307 */
308 int databaseVersion;
309
310 /**
311 * Last known value of {@link Build#FINGERPRINT}. Used to determine when
312 * an system update has occurred, meaning we need to clear code caches.
313 */
314 String fingerprint;
315
316 /**
317 * Force all version information to match current system values,
318 * typically after resolving any required upgrade steps.
319 */
320 public void forceCurrent() {
321 sdkVersion = Build.VERSION.SDK_INT;
322 databaseVersion = CURRENT_DATABASE_VERSION;
323 fingerprint = Build.FINGERPRINT;
324 }
325 }
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700326
Jeff Sharkeyf5385772012-05-11 14:04:41 -0700327 Boolean mReadExternalStorageEnforced;
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -0700328
Kenny Root0aaa0d92011-09-12 16:42:55 -0700329 /** Device identity for the purpose of package verification. */
330 private VerifierDeviceIdentity mVerifierDeviceIdentity;
331
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700332 // The user's preferred activities associated with particular intent
333 // filters.
Dianne Hackborn63092712012-10-07 14:45:35 -0700334 final SparseArray<PreferredIntentResolver> mPreferredActivities =
335 new SparseArray<PreferredIntentResolver>();
336
Sander Alewijnsef475ca32014-02-17 15:13:58 +0000337 // The persistent preferred activities of the user's profile/device owner
338 // associated with particular intent filters.
339 final SparseArray<PersistentPreferredIntentResolver> mPersistentPreferredActivities =
340 new SparseArray<PersistentPreferredIntentResolver>();
341
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000342 // For every user, it is used to find to which other users the intent can be forwarded.
Nicolas Prevot81948992014-05-16 18:25:26 +0100343 final SparseArray<CrossProfileIntentResolver> mCrossProfileIntentResolvers =
344 new SparseArray<CrossProfileIntentResolver>();
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000345
Patrick Baumann649a8572018-11-20 11:16:58 -0800346 final ArrayMap<String, SharedUserSetting> mSharedUsers = new ArrayMap<>();
347 private final ArrayList<SettingBase> mAppIds = new ArrayList<>();
348 private final SparseArray<SettingBase> mOtherAppIds = new SparseArray<>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700349
350 // For reading/writing settings file.
351 private final ArrayList<Signature> mPastSignatures =
352 new ArrayList<Signature>();
dcashman8c04fac2015-03-23 11:39:42 -0700353 private final ArrayMap<Long, Integer> mKeySetRefs =
354 new ArrayMap<Long, Integer>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700355
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700356 // Packages that have been renamed since they were first installed.
357 // Keys are the new names of the packages, values are the original
Todd Kennedy13715d52016-08-01 13:38:57 -0700358 // names. The packages appear everywhere else under their original
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700359 // names.
Todd Kennedy13715d52016-08-01 13:38:57 -0700360 private final ArrayMap<String, String> mRenamedPackages = new ArrayMap<String, String>();
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700361
362 // For every user, it is used to find the package name of the default Browser App.
363 final SparseArray<String> mDefaultBrowserApp = new SparseArray<String>();
364
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700365 // App-link priority tracking, per-user
366 final SparseIntArray mNextAppLinkGeneration = new SparseIntArray();
367
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700368 final StringBuilder mReadMessages = new StringBuilder();
369
Kenny Root447106f2011-03-23 11:00:15 -0700370 /**
371 * Used to track packages that have a shared user ID that hasn't been read
372 * in yet.
373 * <p>
374 * TODO: make this just a local variable that is passed in during package
375 * scanning to make it less confusing.
376 */
Todd Kennedy788c8422016-08-10 10:52:34 -0700377 private final ArrayList<PackageSetting> mPendingPackages = new ArrayList<>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700378
Amith Yamasani483f3b02012-03-13 16:08:00 -0700379 private final File mSystemDir;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800380
dcashman55b10782014-04-09 14:20:38 -0700381 public final KeySetManagerService mKeySetManagerService = new KeySetManagerService(mPackages);
Todd Kennedy0eb97382017-10-03 16:57:22 -0700382 /** Settings and other information about permissions */
Todd Kennedyc8423932017-10-05 08:58:36 -0700383 final PermissionSettings mPermissions;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800384
Todd Kennedycf827032018-07-03 13:17:22 -0700385 Settings(File dataDir, PermissionSettings permission,
386 Object lock) {
Svetoslavc6d1c342015-02-26 14:44:43 -0800387 mLock = lock;
Todd Kennedy0eb97382017-10-03 16:57:22 -0700388 mPermissions = permission;
Svetoslavc6d1c342015-02-26 14:44:43 -0800389 mRuntimePermissionsPersistence = new RuntimePermissionPersistence(mLock);
390
Amith Yamasani483f3b02012-03-13 16:08:00 -0700391 mSystemDir = new File(dataDir, "system");
392 mSystemDir.mkdirs();
393 FileUtils.setPermissions(mSystemDir.toString(),
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700394 FileUtils.S_IRWXU|FileUtils.S_IRWXG
395 |FileUtils.S_IROTH|FileUtils.S_IXOTH,
396 -1, -1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700397 mSettingsFilename = new File(mSystemDir, "packages.xml");
398 mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
399 mPackageListFilename = new File(mSystemDir, "packages.list");
Jeff Sharkeyaebb65c2014-11-24 15:00:13 -0800400 FileUtils.setPermissions(mPackageListFilename, 0640, SYSTEM_UID, PACKAGE_INFO_GID);
Jeff Sharkey184a0102013-07-10 16:19:52 -0700401
Jeff Sharkey2271ba32016-02-01 17:57:08 -0700402 final File kernelDir = new File("/config/sdcardfs");
403 mKernelMappingFilename = kernelDir.exists() ? kernelDir : null;
404
Amith Yamasani483f3b02012-03-13 16:08:00 -0700405 // Deprecated: Needed for migration
406 mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
407 mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700408 }
409
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700410 PackageSetting getPackageLPr(String pkgName) {
Todd Kennedy13715d52016-08-01 13:38:57 -0700411 return mPackages.get(pkgName);
412 }
413
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700414 String getRenamedPackageLPr(String pkgName) {
Todd Kennedy13715d52016-08-01 13:38:57 -0700415 return mRenamedPackages.get(pkgName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700416 }
417
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700418 String addRenamedPackageLPw(String pkgName, String origPkgName) {
419 return mRenamedPackages.put(pkgName, origPkgName);
420 }
421
Todd Kennedy0eb97382017-10-03 16:57:22 -0700422 public boolean canPropagatePermissionToInstantApp(String permName) {
423 return mPermissions.canPropagatePermissionToInstantApp(permName);
424 }
425
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700426 void setInstallerPackageName(String pkgName, String installerPkgName) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700427 PackageSetting p = mPackages.get(pkgName);
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700428 if (p != null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700429 p.setInstallerPackageName(installerPkgName);
Sudheer Shanka29283372016-04-04 20:56:27 -0700430 if (installerPkgName != null) {
431 mInstallerPackages.add(installerPkgName);
432 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700433 }
434 }
435
Todd Kennedy13715d52016-08-01 13:38:57 -0700436 /** Gets and optionally creates a new shared user id. */
Todd Kennedyff35e662016-09-20 12:53:52 -0700437 SharedUserSetting getSharedUserLPw(String name, int pkgFlags, int pkgPrivateFlags,
438 boolean create) throws PackageManagerException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700439 SharedUserSetting s = mSharedUsers.get(name);
Todd Kennedyff35e662016-09-20 12:53:52 -0700440 if (s == null && create) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800441 s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags);
Patrick Baumann649a8572018-11-20 11:16:58 -0800442 s.userId = acquireAndRegisterNewAppIdLPw(s);
Todd Kennedyff35e662016-09-20 12:53:52 -0700443 if (s.userId < 0) {
444 // < 0 means we couldn't assign a userid; throw exception
445 throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE,
446 "Creating shared user " + name + " failed");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700447 }
Todd Kennedyff35e662016-09-20 12:53:52 -0700448 Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
449 mSharedUsers.put(name, s);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700450 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700451 return s;
452 }
453
Narayan Kamathdf6d6dc2014-04-28 14:18:34 +0100454 Collection<SharedUserSetting> getAllSharedUsersLPw() {
455 return mSharedUsers.values();
456 }
457
Svet Ganov354cd3c2015-12-17 11:35:04 -0800458 boolean disableSystemPackageLPw(String name, boolean replaced) {
Kenny Root447106f2011-03-23 11:00:15 -0700459 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700460 if(p == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -0700461 Log.w(PackageManagerService.TAG, "Package " + name + " is not an installed package");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700462 return false;
463 }
Kenny Root447106f2011-03-23 11:00:15 -0700464 final PackageSetting dp = mDisabledSysPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700465 // always make sure the system package code and resource paths dont change
Todd Kennedyc29b11a2017-10-23 15:55:59 -0700466 if (dp == null && p.pkg != null && p.pkg.isSystem() && !p.pkg.isUpdatedSystemApp()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700467 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
468 p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
469 }
Patrick4ccae942018-07-17 09:15:55 -0700470 final PackageSetting disabled;
Svet Ganov354cd3c2015-12-17 11:35:04 -0800471 if (replaced) {
472 // a little trick... when we install the new package, we don't
473 // want to modify the existing PackageSetting for the built-in
Patrick4ccae942018-07-17 09:15:55 -0700474 // version. so at this point we make a copy to place into the
475 // disabled set.
476 disabled = new PackageSetting(p);
477 } else {
478 disabled = p;
Svet Ganov354cd3c2015-12-17 11:35:04 -0800479 }
Patrick4ccae942018-07-17 09:15:55 -0700480 mDisabledSysPackages.put(name, disabled);
481
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700482 return true;
483 }
484 return false;
485 }
486
Kenny Root447106f2011-03-23 11:00:15 -0700487 PackageSetting enableSystemPackageLPw(String name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700488 PackageSetting p = mDisabledSysPackages.get(name);
489 if(p == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -0700490 Log.w(PackageManagerService.TAG, "Package " + name + " is not disabled");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700491 return null;
492 }
493 // Reset flag in ApplicationInfo object
494 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
495 p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
496 }
Kenny Root447106f2011-03-23 11:00:15 -0700497 PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100498 p.legacyNativeLibraryPathString, p.primaryCpuAbiString,
Selim Gurun5c8acb42016-04-07 16:34:02 -0700499 p.secondaryCpuAbiString, p.cpuAbiOverrideString,
Svet Ganov354cd3c2015-12-17 11:35:04 -0800500 p.appId, p.versionCode, p.pkgFlags, p.pkgPrivateFlags,
Svet Ganov67882122016-12-11 16:36:34 -0800501 p.parentPackageName, p.childPackageNames, p.usesStaticLibraries,
502 p.usesStaticLibrariesVersions);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700503 mDisabledSysPackages.remove(name);
504 return ret;
505 }
506
Kenny Rootc52d6fd2012-05-07 23:04:52 -0700507 boolean isDisabledSystemPackageLPr(String name) {
508 return mDisabledSysPackages.containsKey(name);
509 }
510
511 void removeDisabledSystemPackageLPw(String name) {
512 mDisabledSysPackages.remove(name);
513 }
514
Kenny Root447106f2011-03-23 11:00:15 -0700515 PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
Svet Ganovf4ff39c2016-02-04 14:27:05 -0800516 String legacyNativeLibraryPathString, String primaryCpuAbiString,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700517 String secondaryCpuAbiString, String cpuAbiOverrideString, int uid, long vc, int
Svet Ganovf4ff39c2016-02-04 14:27:05 -0800518 pkgFlags, int pkgPrivateFlags, String parentPackageName,
Svet Ganov67882122016-12-11 16:36:34 -0800519 List<String> childPackageNames, String[] usesStaticLibraries,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700520 long[] usesStaticLibraryNames) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700521 PackageSetting p = mPackages.get(name);
522 if (p != null) {
Amith Yamasani13593602012-03-22 16:16:17 -0700523 if (p.appId == uid) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700524 return p;
525 }
526 PackageManagerService.reportSettingsProblem(Log.ERROR,
527 "Adding duplicate package, keeping first: " + name);
528 return null;
529 }
Narayan Kamathff110bd2014-07-04 18:30:45 +0100530 p = new PackageSetting(name, realName, codePath, resourcePath,
Narayan Kamath4903f642014-08-11 13:33:45 +0100531 legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString,
Svet Ganov354cd3c2015-12-17 11:35:04 -0800532 cpuAbiOverrideString, vc, pkgFlags, pkgPrivateFlags, parentPackageName,
Svet Ganov67882122016-12-11 16:36:34 -0800533 childPackageNames, 0 /*userId*/, usesStaticLibraries, usesStaticLibraryNames);
Amith Yamasani13593602012-03-22 16:16:17 -0700534 p.appId = uid;
Patrick Baumann649a8572018-11-20 11:16:58 -0800535 if (registerExistingAppIdLPw(uid, p, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700536 mPackages.put(name, p);
537 return p;
538 }
539 return null;
540 }
541
Todd Kennedyc8423932017-10-05 08:58:36 -0700542 void addAppOpPackage(String permName, String packageName) {
543 mPermissions.addAppOpPackage(permName, packageName);
544 }
545
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800546 SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags, int pkgPrivateFlags) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700547 SharedUserSetting s = mSharedUsers.get(name);
548 if (s != null) {
549 if (s.userId == uid) {
550 return s;
551 }
552 PackageManagerService.reportSettingsProblem(Log.ERROR,
553 "Adding duplicate shared user, keeping first: " + name);
554 return null;
555 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800556 s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700557 s.userId = uid;
Patrick Baumann649a8572018-11-20 11:16:58 -0800558 if (registerExistingAppIdLPw(uid, s, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700559 mSharedUsers.put(name, s);
560 return s;
561 }
562 return null;
563 }
564
Christopher Tate86b391c2013-09-13 16:58:36 -0700565 void pruneSharedUsersLPw() {
566 ArrayList<String> removeStage = new ArrayList<String>();
567 for (Map.Entry<String,SharedUserSetting> entry : mSharedUsers.entrySet()) {
568 final SharedUserSetting sus = entry.getValue();
Todd Kennedy68f67152015-10-21 13:09:10 -0700569 if (sus == null) {
570 removeStage.add(entry.getKey());
571 continue;
572 }
573 // remove packages that are no longer installed
574 for (Iterator<PackageSetting> iter = sus.packages.iterator(); iter.hasNext();) {
575 PackageSetting ps = iter.next();
576 if (mPackages.get(ps.name) == null) {
577 iter.remove();
578 }
579 }
580 if (sus.packages.size() == 0) {
Christopher Tate86b391c2013-09-13 16:58:36 -0700581 removeStage.add(entry.getKey());
582 }
583 }
584 for (int i = 0; i < removeStage.size(); i++) {
585 mSharedUsers.remove(removeStage.get(i));
586 }
587 }
588
Todd Kennedy0eb97382017-10-03 16:57:22 -0700589 /**
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700590 * Creates a new {@code PackageSetting} object.
591 * Use this method instead of the constructor to ensure a settings object is created
592 * with the correct base.
Todd Kennedy13715d52016-08-01 13:38:57 -0700593 */
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700594 static @NonNull PackageSetting createNewSetting(String pkgName, PackageSetting originalPkg,
595 PackageSetting disabledPkg, String realPkgName, SharedUserSetting sharedUser,
596 File codePath, File resourcePath, String legacyNativeLibraryPath, String primaryCpuAbi,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700597 String secondaryCpuAbi, long versionCode, int pkgFlags, int pkgPrivateFlags,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700598 UserHandle installUser, boolean allowInstall, boolean instantApp,
599 boolean virtualPreload, String parentPkgName, List<String> childPkgNames,
600 UserManagerService userManager,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700601 String[] usesStaticLibraries, long[] usesStaticLibrariesVersions) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700602 final PackageSetting pkgSetting;
603 if (originalPkg != null) {
604 if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package "
605 + pkgName + " is adopting original package " + originalPkg.name);
606 pkgSetting = new PackageSetting(originalPkg, pkgName /*realPkgName*/);
607 pkgSetting.childPackageNames =
608 (childPkgNames != null) ? new ArrayList<>(childPkgNames) : null;
609 pkgSetting.codePath = codePath;
610 pkgSetting.legacyNativeLibraryPathString = legacyNativeLibraryPath;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700611 pkgSetting.parentPackageName = parentPkgName;
612 pkgSetting.pkgFlags = pkgFlags;
613 pkgSetting.pkgPrivateFlags = pkgPrivateFlags;
Todd Kennedy13715d52016-08-01 13:38:57 -0700614 pkgSetting.primaryCpuAbiString = primaryCpuAbi;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700615 pkgSetting.resourcePath = resourcePath;
Todd Kennedy13715d52016-08-01 13:38:57 -0700616 pkgSetting.secondaryCpuAbiString = secondaryCpuAbi;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700617 // NOTE: Create a deeper copy of the package signatures so we don't
618 // overwrite the signatures in the original package setting.
619 pkgSetting.signatures = new PackageSignatures();
620 pkgSetting.versionCode = versionCode;
Svet Ganov67882122016-12-11 16:36:34 -0800621 pkgSetting.usesStaticLibraries = usesStaticLibraries;
622 pkgSetting.usesStaticLibrariesVersions = usesStaticLibrariesVersions;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700623 // Update new package state.
624 pkgSetting.setTimeStamp(codePath.lastModified());
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700625 } else {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700626 pkgSetting = new PackageSetting(pkgName, realPkgName, codePath, resourcePath,
627 legacyNativeLibraryPath, primaryCpuAbi, secondaryCpuAbi,
628 null /*cpuAbiOverrideString*/, versionCode, pkgFlags, pkgPrivateFlags,
Svet Ganov67882122016-12-11 16:36:34 -0800629 parentPkgName, childPkgNames, 0 /*sharedUserId*/, usesStaticLibraries,
630 usesStaticLibrariesVersions);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700631 pkgSetting.setTimeStamp(codePath.lastModified());
632 pkgSetting.sharedUser = sharedUser;
633 // If this is not a system app, it starts out stopped.
634 if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
635 if (DEBUG_STOPPED) {
636 RuntimeException e = new RuntimeException("here");
637 e.fillInStackTrace();
638 Slog.i(PackageManagerService.TAG, "Stopping package " + pkgName, e);
639 }
Todd Kennedy13715d52016-08-01 13:38:57 -0700640 List<UserInfo> users = getAllUsers(userManager);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700641 final int installUserId = installUser != null ? installUser.getIdentifier() : 0;
642 if (users != null && allowInstall) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700643 for (UserInfo user : users) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700644 // By default we consider this app to be installed
645 // for the user if no user has been specified (which
646 // means to leave it at its original value, and the
647 // original default value is true), or we are being
648 // asked to install for all users, or this is the
649 // user we are installing for.
650 final boolean installed = installUser == null
651 || (installUserId == UserHandle.USER_ALL
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700652 && !isAdbInstallDisallowed(userManager, user.id))
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700653 || installUserId == user.id;
654 pkgSetting.setUserState(user.id, 0, COMPONENT_ENABLED_STATE_DEFAULT,
655 installed,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800656 true /*stopped*/,
657 true /*notLaunched*/,
658 false /*hidden*/,
Suprabh Shukla79000492018-12-24 17:03:02 -0800659 0 /*distractionFlags*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800660 false /*suspended*/,
Suprabh Shukla151b21b2018-04-27 19:30:30 -0700661 null /*suspendingPackage*/,
Suprabh Shukla389cb6f2018-10-01 18:20:39 -0700662 null /*dialogInfo*/,
Suprabh Shukla151b21b2018-04-27 19:30:30 -0700663 null /*suspendedAppExtras*/,
664 null /*suspendedLauncherExtras*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800665 instantApp,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700666 virtualPreload,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800667 null /*lastDisableAppCaller*/,
668 null /*enabledComponents*/,
669 null /*disabledComponents*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800670 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED,
Ben Gruver1ab3d6e2017-12-07 13:45:08 -0800671 0, PackageManager.INSTALL_REASON_UNKNOWN,
672 null /*harmfulAppWarning*/);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700673 }
674 }
675 }
676 if (sharedUser != null) {
677 pkgSetting.appId = sharedUser.userId;
678 } else {
679 // Clone the setting here for disabled system packages
680 if (disabledPkg != null) {
681 // For disabled packages a new setting is created
682 // from the existing user id. This still has to be
683 // added to list of user id's
684 // Copy signatures from previous setting
685 pkgSetting.signatures = new PackageSignatures(disabledPkg.signatures);
686 pkgSetting.appId = disabledPkg.appId;
687 // Clone permissions
688 pkgSetting.getPermissionsState().copyFrom(disabledPkg.getPermissionsState());
689 // Clone component info
690 List<UserInfo> users = getAllUsers(userManager);
691 if (users != null) {
692 for (UserInfo user : users) {
693 final int userId = user.id;
694 pkgSetting.setDisabledComponentsCopy(
695 disabledPkg.getDisabledComponents(userId), userId);
696 pkgSetting.setEnabledComponentsCopy(
697 disabledPkg.getEnabledComponents(userId), userId);
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700698 }
699 }
700 }
701 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700702 }
Todd Kennedy13715d52016-08-01 13:38:57 -0700703 return pkgSetting;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700704 }
705
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700706 /**
707 * Updates the given package setting using the provided information.
708 * <p>
709 * WARNING: The provided PackageSetting object may be mutated.
710 */
711 static void updatePackageSetting(@NonNull PackageSetting pkgSetting,
712 @Nullable PackageSetting disabledPkg, @Nullable SharedUserSetting sharedUser,
Todd Kennedy30a23a52018-01-04 13:27:49 -0800713 @NonNull File codePath, File resourcePath,
714 @Nullable String legacyNativeLibraryPath, @Nullable String primaryCpuAbi,
715 @Nullable String secondaryCpuAbi, int pkgFlags, int pkgPrivateFlags,
716 @Nullable List<String> childPkgNames, @NonNull UserManagerService userManager,
717 @Nullable String[] usesStaticLibraries, @Nullable long[] usesStaticLibrariesVersions)
718 throws PackageManagerException {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700719 final String pkgName = pkgSetting.name;
720 if (pkgSetting.sharedUser != sharedUser) {
721 PackageManagerService.reportSettingsProblem(Log.WARN,
722 "Package " + pkgName + " shared user changed from "
723 + (pkgSetting.sharedUser != null ? pkgSetting.sharedUser.name : "<nothing>")
724 + " to " + (sharedUser != null ? sharedUser.name : "<nothing>"));
725 throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
726 "Updating application package " + pkgName + " failed");
727 }
728
729 if (!pkgSetting.codePath.equals(codePath)) {
Todd Kennedy30a23a52018-01-04 13:27:49 -0800730 final boolean isSystem = pkgSetting.isSystem();
731 Slog.i(PackageManagerService.TAG,
732 "Update" + (isSystem ? " system" : "")
733 + " package " + pkgName
734 + " code path from " + pkgSetting.codePathString
735 + " to " + codePath.toString()
736 + "; Retain data and using new");
737 if (!isSystem) {
738 // The package isn't considered as installed if the application was
739 // first installed by another user. Update the installed flag when the
740 // application ever becomes part of the system.
741 if ((pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0 && disabledPkg == null) {
742 final List<UserInfo> allUserInfos = getAllUsers(userManager);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700743 if (allUserInfos != null) {
744 for (UserInfo userInfo : allUserInfos) {
745 pkgSetting.setInstalled(true, userInfo.id);
746 }
747 }
748 }
749
Todd Kennedy30a23a52018-01-04 13:27:49 -0800750 // Since we've changed paths, prefer the new native library path over
751 // the one stored in the package settings since we might have moved from
752 // internal to external storage or vice versa.
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700753 pkgSetting.legacyNativeLibraryPathString = legacyNativeLibraryPath;
754 }
Todd Kennedy30a23a52018-01-04 13:27:49 -0800755 pkgSetting.codePath = codePath;
756 pkgSetting.codePathString = codePath.toString();
757 }
758 if (!pkgSetting.resourcePath.equals(resourcePath)) {
759 final boolean isSystem = pkgSetting.isSystem();
760 Slog.i(PackageManagerService.TAG,
761 "Update" + (isSystem ? " system" : "")
762 + " package " + pkgName
763 + " resource path from " + pkgSetting.resourcePathString
764 + " to " + resourcePath.toString()
765 + "; Retain data and using new");
766 pkgSetting.resourcePath = resourcePath;
767 pkgSetting.resourcePathString = resourcePath.toString();
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700768 }
769 // If what we are scanning is a system (and possibly privileged) package,
770 // then make it so, regardless of whether it was previously installed only
Patrick Baumanna639d142018-05-02 15:00:59 -0700771 // in the data partition. Reset first.
772 pkgSetting.pkgFlags &= ~ApplicationInfo.FLAG_SYSTEM;
773 pkgSetting.pkgPrivateFlags &= ~(ApplicationInfo.PRIVATE_FLAG_PRIVILEGED
774 | ApplicationInfo.PRIVATE_FLAG_OEM
775 | ApplicationInfo.PRIVATE_FLAG_VENDOR
Dario Freni2bef1762018-06-01 14:02:08 +0100776 | ApplicationInfo.PRIVATE_FLAG_PRODUCT
Jeongik Chaf6629832019-07-04 21:12:06 +0900777 | ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT
MÃ¥rten Kongstad48c24cf2019-02-25 10:54:09 +0100778 | ApplicationInfo.PRIVATE_FLAG_ODM);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700779 pkgSetting.pkgFlags |= pkgFlags & ApplicationInfo.FLAG_SYSTEM;
780 pkgSetting.pkgPrivateFlags |=
781 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
Svet Ganov087dce22017-09-07 15:42:16 -0700782 pkgSetting.pkgPrivateFlags |=
783 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_OEM;
Jiyong Park002fdbd2017-02-13 20:50:31 +0900784 pkgSetting.pkgPrivateFlags |=
785 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR;
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900786 pkgSetting.pkgPrivateFlags |=
787 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT;
Dario Freni2bef1762018-06-01 14:02:08 +0100788 pkgSetting.pkgPrivateFlags |=
Jeongik Chaf6629832019-07-04 21:12:06 +0900789 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT;
MÃ¥rten Kongstad48c24cf2019-02-25 10:54:09 +0100790 pkgSetting.pkgPrivateFlags |=
791 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_ODM;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700792 pkgSetting.primaryCpuAbiString = primaryCpuAbi;
793 pkgSetting.secondaryCpuAbiString = secondaryCpuAbi;
794 if (childPkgNames != null) {
795 pkgSetting.childPackageNames = new ArrayList<>(childPkgNames);
796 }
Todd Kennedy30a23a52018-01-04 13:27:49 -0800797 // Update static shared library dependencies if needed
798 if (usesStaticLibraries != null && usesStaticLibrariesVersions != null
799 && usesStaticLibraries.length == usesStaticLibrariesVersions.length) {
800 pkgSetting.usesStaticLibraries = usesStaticLibraries;
801 pkgSetting.usesStaticLibrariesVersions = usesStaticLibrariesVersions;
802 } else {
803 pkgSetting.usesStaticLibraries = null;
804 pkgSetting.usesStaticLibrariesVersions = null;
Svet Ganov67882122016-12-11 16:36:34 -0800805 }
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700806 }
807
808 /**
809 * Registers a user ID with the system. Potentially allocates a new user ID.
Patrick Baumannb22e9162019-04-12 10:35:29 -0700810 * @return {@code true} if a new app ID was created in the process. {@code false} can be
811 * returned in the case that a shared user ID already exists or the explicit app ID is
812 * already registered.
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700813 * @throws PackageManagerException If a user ID could not be allocated.
814 */
Patrick Baumannb22e9162019-04-12 10:35:29 -0700815 boolean registerAppIdLPw(PackageSetting p) throws PackageManagerException {
816 final boolean createdNew;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700817 if (p.appId == 0) {
818 // Assign new user ID
Patrick Baumann649a8572018-11-20 11:16:58 -0800819 p.appId = acquireAndRegisterNewAppIdLPw(p);
Patrick Baumannb22e9162019-04-12 10:35:29 -0700820 createdNew = true;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700821 } else {
822 // Add new setting to list of user IDs
Patrick Baumannb22e9162019-04-12 10:35:29 -0700823 createdNew = registerExistingAppIdLPw(p.appId, p, p.name);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700824 }
825 if (p.appId < 0) {
826 PackageManagerService.reportSettingsProblem(Log.WARN,
Jeff Sharkeyf60d8ab2017-02-24 11:06:49 -0700827 "Package " + p.name + " could not be assigned a valid UID");
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700828 throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE,
Jeff Sharkeyf60d8ab2017-02-24 11:06:49 -0700829 "Package " + p.name + " could not be assigned a valid UID");
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700830 }
Patrick Baumannb22e9162019-04-12 10:35:29 -0700831 return createdNew;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700832 }
833
834 /**
835 * Writes per-user package restrictions if the user state has changed. If the user
836 * state has not changed, this does nothing.
837 */
Todd Kennedyff35e662016-09-20 12:53:52 -0700838 void writeUserRestrictionsLPw(PackageSetting newPackage, PackageSetting oldPackage) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700839 // package doesn't exist; do nothing
Todd Kennedy8cad6232016-10-06 11:27:07 -0700840 if (getPackageLPr(newPackage.name) == null) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700841 return;
842 }
843 // no users defined; do nothing
844 final List<UserInfo> allUsers = getAllUsers(UserManagerService.getInstance());
845 if (allUsers == null) {
846 return;
847 }
848 for (UserInfo user : allUsers) {
849 final PackageUserState oldUserState = oldPackage == null
850 ? PackageSettingBase.DEFAULT_USER_STATE
851 : oldPackage.readUserState(user.id);
852 if (!oldUserState.equals(newPackage.readUserState(user.id))) {
853 writePackageRestrictionsLPr(user.id);
854 }
855 }
856 }
857
Todd Kennedy13715d52016-08-01 13:38:57 -0700858 static boolean isAdbInstallDisallowed(UserManagerService userManager, int userId) {
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700859 return userManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES,
860 userId);
861 }
862
Todd Kennedy30a23a52018-01-04 13:27:49 -0800863 // TODO: Move to scanPackageOnlyLI() after verifying signatures are setup correctly
864 // by that time.
Kenny Root447106f2011-03-23 11:00:15 -0700865 void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
Amith Yamasani483f3b02012-03-13 16:08:00 -0700866 // Update signatures if needed.
Daniel Cashman77029c52018-01-18 16:19:29 -0800867 if (p.signatures.mSigningDetails.signatures == null) {
868 p.signatures.mSigningDetails = pkg.mSigningDetails;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700869 }
870 // If this app defines a shared user id initialize
871 // the shared user signatures as well.
Daniel Cashman77029c52018-01-18 16:19:29 -0800872 if (p.sharedUser != null && p.sharedUser.signatures.mSigningDetails.signatures == null) {
873 p.sharedUser.signatures.mSigningDetails = pkg.mSigningDetails;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700874 }
Todd Kennedy788c8422016-08-10 10:52:34 -0700875 addPackageSettingLPw(p, p.sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700876 }
877
878 // Utility method that adds a PackageSetting to mPackages and
Christopher Tate6038d152015-06-17 13:07:46 -0700879 // completes updating the shared user attributes and any restored
880 // app link verification state
Todd Kennedy788c8422016-08-10 10:52:34 -0700881 private void addPackageSettingLPw(PackageSetting p, SharedUserSetting sharedUser) {
882 mPackages.put(p.name, p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700883 if (sharedUser != null) {
884 if (p.sharedUser != null && p.sharedUser != sharedUser) {
885 PackageManagerService.reportSettingsProblem(Log.ERROR,
886 "Package " + p.name + " was user "
887 + p.sharedUser + " but is now " + sharedUser
888 + "; I am not changing its files so it will probably fail!");
Ben Gruverdd72c9e2013-08-06 12:34:17 -0700889 p.sharedUser.removePackage(p);
Amith Yamasani13593602012-03-22 16:16:17 -0700890 } else if (p.appId != sharedUser.userId) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700891 PackageManagerService.reportSettingsProblem(Log.ERROR,
Amith Yamasani13593602012-03-22 16:16:17 -0700892 "Package " + p.name + " was user id " + p.appId
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700893 + " but is now user " + sharedUser
894 + " with id " + sharedUser.userId
895 + "; I am not changing its files so it will probably fail!");
896 }
897
Ben Gruverdd72c9e2013-08-06 12:34:17 -0700898 sharedUser.addPackage(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700899 p.sharedUser = sharedUser;
Amith Yamasani13593602012-03-22 16:16:17 -0700900 p.appId = sharedUser.userId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700901 }
Svet Ganove7af1942015-08-04 11:13:44 -0700902
903 // If the we know about this user id, we have to update it as it
904 // has to point to the same PackageSetting instance as the package.
Patrick Baumann649a8572018-11-20 11:16:58 -0800905 Object userIdPs = getSettingLPr(p.appId);
Svet Ganove7af1942015-08-04 11:13:44 -0700906 if (sharedUser == null) {
907 if (userIdPs != null && userIdPs != p) {
Patrick Baumann649a8572018-11-20 11:16:58 -0800908 replaceAppIdLPw(p.appId, p);
Svet Ganove7af1942015-08-04 11:13:44 -0700909 }
910 } else {
911 if (userIdPs != null && userIdPs != sharedUser) {
Patrick Baumann649a8572018-11-20 11:16:58 -0800912 replaceAppIdLPw(p.appId, sharedUser);
Svet Ganove7af1942015-08-04 11:13:44 -0700913 }
914 }
915
Todd Kennedy788c8422016-08-10 10:52:34 -0700916 IntentFilterVerificationInfo ivi = mRestoredIntentFilterVerifications.get(p.name);
Christopher Tate6038d152015-06-17 13:07:46 -0700917 if (ivi != null) {
918 if (DEBUG_DOMAIN_VERIFICATION) {
Todd Kennedy788c8422016-08-10 10:52:34 -0700919 Slog.i(TAG, "Applying restored IVI for " + p.name + " : " + ivi.getStatusString());
Christopher Tate6038d152015-06-17 13:07:46 -0700920 }
Todd Kennedy788c8422016-08-10 10:52:34 -0700921 mRestoredIntentFilterVerifications.remove(p.name);
Christopher Tate6038d152015-06-17 13:07:46 -0700922 p.setIntentFilterVerificationInfo(ivi);
923 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700924 }
925
926 /*
Anton Hanssone870d0222019-03-26 14:35:58 +0000927 * Update the shared user setting when a package with a shared user id is removed. The gids
928 * associated with each permission of the deleted package are removed from the shared user'
929 * gid list only if its not in use by other permissions of packages in the shared user setting.
930 *
931 * @return the affected user id
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700932 */
Anton Hanssone870d0222019-03-26 14:35:58 +0000933 @UserIdInt
Svetoslavc6d1c342015-02-26 14:44:43 -0800934 int updateSharedUserPermsLPw(PackageSetting deletedPs, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -0700935 if ((deletedPs == null) || (deletedPs.pkg == null)) {
936 Slog.i(PackageManagerService.TAG,
937 "Trying to update info for null package. Just ignoring");
Svetoslavc6d1c342015-02-26 14:44:43 -0800938 return UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700939 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800940
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700941 // No sharedUserId
942 if (deletedPs.sharedUser == null) {
Svetoslavc6d1c342015-02-26 14:44:43 -0800943 return UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700944 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800945
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700946 SharedUserSetting sus = deletedPs.sharedUser;
Svetoslavc6d1c342015-02-26 14:44:43 -0800947
Anton Hanssone870d0222019-03-26 14:35:58 +0000948 int affectedUserId = UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700949 // Update permissions
Kenny Root447106f2011-03-23 11:00:15 -0700950 for (String eachPerm : deletedPs.pkg.requestedPermissions) {
Todd Kennedy0eb97382017-10-03 16:57:22 -0700951 BasePermission bp = mPermissions.getPermission(eachPerm);
Svetoslavc6d1c342015-02-26 14:44:43 -0800952 if (bp == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700953 continue;
954 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800955
Svetoslavc6d1c342015-02-26 14:44:43 -0800956 // Check if another package in the shared user needs the permission.
Svetoslav4a5f4a22015-07-07 18:18:15 -0700957 boolean used = false;
Svetoslavc6d1c342015-02-26 14:44:43 -0800958 for (PackageSetting pkg : sus.packages) {
959 if (pkg.pkg != null
960 && !pkg.pkg.packageName.equals(deletedPs.pkg.packageName)
961 && pkg.pkg.requestedPermissions.contains(eachPerm)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700962 used = true;
963 break;
964 }
965 }
Svetoslav4a5f4a22015-07-07 18:18:15 -0700966 if (used) {
967 continue;
968 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800969
Svetoslav4a5f4a22015-07-07 18:18:15 -0700970 PermissionsState permissionsState = sus.getPermissionsState();
971 PackageSetting disabledPs = getDisabledSystemPkgLPr(deletedPs.pkg.packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -0700972
Svetoslav4a5f4a22015-07-07 18:18:15 -0700973 // If the package is shadowing is a disabled system package,
974 // do not drop permissions that the shadowed package requests.
975 if (disabledPs != null) {
976 boolean reqByDisabledSysPkg = false;
977 for (String permission : disabledPs.pkg.requestedPermissions) {
978 if (permission.equals(eachPerm)) {
979 reqByDisabledSysPkg = true;
980 break;
981 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800982 }
Svetoslav4a5f4a22015-07-07 18:18:15 -0700983 if (reqByDisabledSysPkg) {
984 continue;
Svetoslavc6d1c342015-02-26 14:44:43 -0800985 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700986 }
Svetoslav4a5f4a22015-07-07 18:18:15 -0700987
988 // Try to revoke as an install permission which is for all users.
989 // The package is gone - no need to keep flags for applying policy.
990 permissionsState.updatePermissionFlags(bp, userId,
Philip P. Moltmann76597692019-03-02 13:18:41 -0800991 PackageManager.MASK_PERMISSION_FLAGS_ALL, 0);
Svetoslav4a5f4a22015-07-07 18:18:15 -0700992
993 if (permissionsState.revokeInstallPermission(bp) ==
994 PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
Anton Hanssone870d0222019-03-26 14:35:58 +0000995 affectedUserId = UserHandle.USER_ALL;
Svetoslav4a5f4a22015-07-07 18:18:15 -0700996 }
997
998 // Try to revoke as an install permission which is per user.
999 if (permissionsState.revokeRuntimePermission(bp, userId) ==
1000 PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
Anton Hanssone870d0222019-03-26 14:35:58 +00001001 if (affectedUserId == UserHandle.USER_NULL) {
1002 affectedUserId = userId;
1003 } else if (affectedUserId != userId) {
1004 // Multiple users affected.
1005 affectedUserId = UserHandle.USER_ALL;
1006 }
Svetoslav4a5f4a22015-07-07 18:18:15 -07001007 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001008 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001009
Anton Hanssone870d0222019-03-26 14:35:58 +00001010 return affectedUserId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001011 }
1012
Kenny Root447106f2011-03-23 11:00:15 -07001013 int removePackageLPw(String name) {
1014 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001015 if (p != null) {
1016 mPackages.remove(name);
Sudheer Shanka29283372016-04-04 20:56:27 -07001017 removeInstallerPackageStatus(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001018 if (p.sharedUser != null) {
Ben Gruverdd72c9e2013-08-06 12:34:17 -07001019 p.sharedUser.removePackage(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001020 if (p.sharedUser.packages.size() == 0) {
1021 mSharedUsers.remove(p.sharedUser.name);
Patrick Baumann649a8572018-11-20 11:16:58 -08001022 removeAppIdLPw(p.sharedUser.userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001023 return p.sharedUser.userId;
1024 }
1025 } else {
Patrick Baumann649a8572018-11-20 11:16:58 -08001026 removeAppIdLPw(p.appId);
Amith Yamasani13593602012-03-22 16:16:17 -07001027 return p.appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001028 }
1029 }
1030 return -1;
1031 }
1032
Sudheer Shanka29283372016-04-04 20:56:27 -07001033 /**
1034 * Checks if {@param packageName} is an installer package and if so, clear the installer
1035 * package name of the packages that are installed by this.
1036 */
1037 private void removeInstallerPackageStatus(String packageName) {
1038 // Check if the package to be removed is an installer package.
1039 if (!mInstallerPackages.contains(packageName)) {
1040 return;
1041 }
1042 for (int i = 0; i < mPackages.size(); i++) {
1043 final PackageSetting ps = mPackages.valueAt(i);
1044 final String installerPackageName = ps.getInstallerPackageName();
1045 if (installerPackageName != null
1046 && installerPackageName.equals(packageName)) {
1047 ps.setInstallerPackageName(null);
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07001048 ps.isOrphaned = true;
Sudheer Shanka29283372016-04-04 20:56:27 -07001049 }
1050 }
1051 mInstallerPackages.remove(packageName);
1052 }
1053
Patrick Baumann649a8572018-11-20 11:16:58 -08001054 /** Returns true if the requested AppID was valid and not already registered. */
1055 private boolean registerExistingAppIdLPw(int appId, SettingBase obj, Object name) {
1056 if (appId > Process.LAST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001057 return false;
1058 }
1059
Patrick Baumann649a8572018-11-20 11:16:58 -08001060 if (appId >= Process.FIRST_APPLICATION_UID) {
1061 int size = mAppIds.size();
1062 final int index = appId - Process.FIRST_APPLICATION_UID;
1063 // fill the array until our index becomes valid
1064 while (index >= size) {
1065 mAppIds.add(null);
1066 size++;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001067 }
Patrick Baumann649a8572018-11-20 11:16:58 -08001068 if (mAppIds.get(index) != null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001069 PackageManagerService.reportSettingsProblem(Log.ERROR,
Patrick Baumann649a8572018-11-20 11:16:58 -08001070 "Adding duplicate app id: " + appId
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001071 + " name=" + name);
1072 return false;
1073 }
Patrick Baumann649a8572018-11-20 11:16:58 -08001074 mAppIds.set(index, obj);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001075 } else {
Patrick Baumann649a8572018-11-20 11:16:58 -08001076 if (mOtherAppIds.get(appId) != null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001077 PackageManagerService.reportSettingsProblem(Log.ERROR,
Patrick Baumann649a8572018-11-20 11:16:58 -08001078 "Adding duplicate shared id: " + appId
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001079 + " name=" + name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001080 return false;
1081 }
Patrick Baumann649a8572018-11-20 11:16:58 -08001082 mOtherAppIds.put(appId, obj);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001083 }
1084 return true;
1085 }
1086
Patrick Baumann649a8572018-11-20 11:16:58 -08001087 /** Gets the setting associated with the provided App ID */
1088 public SettingBase getSettingLPr(int appId) {
1089 if (appId >= Process.FIRST_APPLICATION_UID) {
1090 final int size = mAppIds.size();
1091 final int index = appId - Process.FIRST_APPLICATION_UID;
1092 return index < size ? mAppIds.get(index) : null;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001093 } else {
Patrick Baumann649a8572018-11-20 11:16:58 -08001094 return mOtherAppIds.get(appId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001095 }
1096 }
1097
Patrick Baumann649a8572018-11-20 11:16:58 -08001098 /** Unregisters the provided app ID. */
1099 void removeAppIdLPw(int appId) {
1100 if (appId >= Process.FIRST_APPLICATION_UID) {
1101 final int size = mAppIds.size();
1102 final int index = appId - Process.FIRST_APPLICATION_UID;
1103 if (index < size) mAppIds.set(index, null);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001104 } else {
Patrick Baumann649a8572018-11-20 11:16:58 -08001105 mOtherAppIds.remove(appId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001106 }
Patrick Baumann649a8572018-11-20 11:16:58 -08001107 setFirstAvailableUid(appId + 1);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001108 }
1109
Patrick Baumann649a8572018-11-20 11:16:58 -08001110 private void replaceAppIdLPw(int appId, SettingBase obj) {
1111 if (appId >= Process.FIRST_APPLICATION_UID) {
1112 final int size = mAppIds.size();
1113 final int index = appId - Process.FIRST_APPLICATION_UID;
1114 if (index < size) mAppIds.set(index, obj);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001115 } else {
Patrick Baumann649a8572018-11-20 11:16:58 -08001116 mOtherAppIds.put(appId, obj);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001117 }
1118 }
1119
Dianne Hackborn63092712012-10-07 14:45:35 -07001120 PreferredIntentResolver editPreferredActivitiesLPw(int userId) {
1121 PreferredIntentResolver pir = mPreferredActivities.get(userId);
1122 if (pir == null) {
1123 pir = new PreferredIntentResolver();
1124 mPreferredActivities.put(userId, pir);
1125 }
1126 return pir;
1127 }
1128
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001129 PersistentPreferredIntentResolver editPersistentPreferredActivitiesLPw(int userId) {
1130 PersistentPreferredIntentResolver ppir = mPersistentPreferredActivities.get(userId);
1131 if (ppir == null) {
1132 ppir = new PersistentPreferredIntentResolver();
1133 mPersistentPreferredActivities.put(userId, ppir);
1134 }
1135 return ppir;
1136 }
1137
Nicolas Prevot81948992014-05-16 18:25:26 +01001138 CrossProfileIntentResolver editCrossProfileIntentResolverLPw(int userId) {
1139 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(userId);
1140 if (cpir == null) {
1141 cpir = new CrossProfileIntentResolver();
1142 mCrossProfileIntentResolvers.put(userId, cpir);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001143 }
Nicolas Prevot81948992014-05-16 18:25:26 +01001144 return cpir;
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001145 }
1146
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001147 /**
1148 * The following functions suppose that you have a lock for managing access to the
1149 * mIntentFiltersVerifications map.
1150 */
1151
1152 /* package protected */
1153 IntentFilterVerificationInfo getIntentFilterVerificationLPr(String packageName) {
1154 PackageSetting ps = mPackages.get(packageName);
1155 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001156 if (DEBUG_DOMAIN_VERIFICATION) {
1157 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1158 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001159 return null;
1160 }
1161 return ps.getIntentFilterVerificationInfo();
1162 }
1163
1164 /* package protected */
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001165 IntentFilterVerificationInfo createIntentFilterVerificationIfNeededLPw(String packageName,
Todd Kennedy788c8422016-08-10 10:52:34 -07001166 ArraySet<String> domains) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001167 PackageSetting ps = mPackages.get(packageName);
1168 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001169 if (DEBUG_DOMAIN_VERIFICATION) {
1170 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1171 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001172 return null;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001173 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001174 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1175 if (ivi == null) {
1176 ivi = new IntentFilterVerificationInfo(packageName, domains);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001177 ps.setIntentFilterVerificationInfo(ivi);
Christopher Tate72c10a22015-06-12 18:31:24 -07001178 if (DEBUG_DOMAIN_VERIFICATION) {
1179 Slog.d(PackageManagerService.TAG,
1180 "Creating new IntentFilterVerificationInfo for pkg: " + packageName);
1181 }
Fabrice Di Meglio1de3f0d2015-04-29 19:42:41 -07001182 } else {
1183 ivi.setDomains(domains);
Christopher Tate72c10a22015-06-12 18:31:24 -07001184 if (DEBUG_DOMAIN_VERIFICATION) {
1185 Slog.d(PackageManagerService.TAG,
1186 "Setting domains to existing IntentFilterVerificationInfo for pkg: " +
1187 packageName + " and with domains: " + ivi.getDomainsString());
1188 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001189 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001190 return ivi;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001191 }
1192
1193 int getIntentFilterVerificationStatusLPr(String packageName, int userId) {
1194 PackageSetting ps = mPackages.get(packageName);
1195 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001196 if (DEBUG_DOMAIN_VERIFICATION) {
1197 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1198 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001199 return INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
1200 }
Christopher Tated85a6642015-07-17 15:39:08 -07001201 return (int)(ps.getDomainVerificationStatusForUser(userId) >> 32);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001202 }
1203
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001204 boolean updateIntentFilterVerificationStatusLPw(String packageName, final int status, int userId) {
Fabrice Di Meglio07885952015-04-06 19:41:28 -07001205 // Update the status for the current package
1206 PackageSetting current = mPackages.get(packageName);
1207 if (current == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001208 if (DEBUG_DOMAIN_VERIFICATION) {
1209 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1210 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001211 return false;
1212 }
Christopher Tate050aee22015-07-01 16:50:43 -07001213
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001214 final int alwaysGeneration;
1215 if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
1216 alwaysGeneration = mNextAppLinkGeneration.get(userId) + 1;
1217 mNextAppLinkGeneration.put(userId, alwaysGeneration);
1218 } else {
1219 alwaysGeneration = 0;
1220 }
1221
1222 current.setDomainVerificationStatusForUser(status, alwaysGeneration, userId);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001223 return true;
1224 }
1225
1226 /**
Fabrice Di Meglio07885952015-04-06 19:41:28 -07001227 * Used for Settings App and PackageManagerService dump. Should be read only.
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001228 */
1229 List<IntentFilterVerificationInfo> getIntentFilterVerificationsLPr(
1230 String packageName) {
1231 if (packageName == null) {
1232 return Collections.<IntentFilterVerificationInfo>emptyList();
1233 }
1234 ArrayList<IntentFilterVerificationInfo> result = new ArrayList<>();
1235 for (PackageSetting ps : mPackages.values()) {
1236 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1237 if (ivi == null || TextUtils.isEmpty(ivi.getPackageName()) ||
1238 !ivi.getPackageName().equalsIgnoreCase(packageName)) {
1239 continue;
1240 }
1241 result.add(ivi);
1242 }
1243 return result;
1244 }
1245
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001246 boolean removeIntentFilterVerificationLPw(String packageName, int userId) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001247 PackageSetting ps = mPackages.get(packageName);
1248 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001249 if (DEBUG_DOMAIN_VERIFICATION) {
1250 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1251 }
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001252 return false;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001253 }
1254 ps.clearDomainVerificationStatusForUser(userId);
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001255 return true;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001256 }
1257
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001258 boolean removeIntentFilterVerificationLPw(String packageName, int[] userIds) {
1259 boolean result = false;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001260 for (int userId : userIds) {
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001261 result |= removeIntentFilterVerificationLPw(packageName, userId);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001262 }
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001263 return result;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001264 }
1265
Hai Zhanga22cd832019-01-30 13:38:43 -08001266 String removeDefaultBrowserPackageNameLPw(int userId) {
1267 return (userId == UserHandle.USER_ALL) ? null : mDefaultBrowserApp.removeReturnOld(userId);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001268 }
1269
Amith Yamasani483f3b02012-03-13 16:08:00 -07001270 private File getUserPackagesStateFile(int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08001271 // TODO: Implement a cleaner solution when adding tests.
1272 // This instead of Environment.getUserSystemDirectory(userId) to support testing.
1273 File userDir = new File(new File(mSystemDir, "users"), Integer.toString(userId));
1274 return new File(userDir, "package-restrictions.xml");
1275 }
1276
1277 private File getUserRuntimePermissionsFile(int userId) {
1278 // TODO: Implement a cleaner solution when adding tests.
1279 // This instead of Environment.getUserSystemDirectory(userId) to support testing.
1280 File userDir = new File(new File(mSystemDir, "users"), Integer.toString(userId));
1281 return new File(userDir, RUNTIME_PERMISSIONS_FILE_NAME);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001282 }
1283
1284 private File getUserPackagesStateBackupFile(int userId) {
Amith Yamasani61f57372012-08-31 12:12:28 -07001285 return new File(Environment.getUserSystemDirectory(userId),
1286 "package-restrictions-backup.xml");
Amith Yamasani483f3b02012-03-13 16:08:00 -07001287 }
1288
1289 void writeAllUsersPackageRestrictionsLPr() {
Todd Kennedy13715d52016-08-01 13:38:57 -07001290 List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
Amith Yamasani483f3b02012-03-13 16:08:00 -07001291 if (users == null) return;
1292
1293 for (UserInfo user : users) {
1294 writePackageRestrictionsLPr(user.id);
1295 }
1296 }
1297
Svetoslavc6d1c342015-02-26 14:44:43 -08001298 void writeAllRuntimePermissionsLPr() {
1299 for (int userId : UserManagerService.getInstance().getUserIds()) {
1300 mRuntimePermissionsPersistence.writePermissionsForUserAsyncLPr(userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001301 }
1302 }
1303
Svet Ganovba3ba812015-06-26 10:54:06 -07001304 boolean areDefaultRuntimePermissionsGrantedLPr(int userId) {
1305 return mRuntimePermissionsPersistence
Svet Ganovd8eb8b22019-04-05 18:52:08 -07001306 .areDefaultRuntimePermissionsGrantedLPr(userId);
Svet Ganovba3ba812015-06-26 10:54:06 -07001307 }
1308
Philip P. Moltmann5f5783e2019-05-22 14:57:18 -07001309 void setRuntimePermissionsFingerPrintLPr(@NonNull String fingerPrint, @UserIdInt int userId) {
1310 mRuntimePermissionsPersistence.setRuntimePermissionsFingerPrintLPr(fingerPrint, userId);
Svet Ganovba3ba812015-06-26 10:54:06 -07001311 }
1312
Svet Ganovd8eb8b22019-04-05 18:52:08 -07001313 int getDefaultRuntimePermissionsVersionLPr(int userId) {
1314 return mRuntimePermissionsPersistence.getVersionLPr(userId);
1315 }
1316
1317 void setDefaultRuntimePermissionsVersionLPr(int version, int userId) {
1318 mRuntimePermissionsPersistence.setVersionLPr(version, userId);
1319 }
1320
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001321 public VersionInfo findOrCreateVersion(String volumeUuid) {
1322 VersionInfo ver = mVersion.get(volumeUuid);
1323 if (ver == null) {
1324 ver = new VersionInfo();
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001325 mVersion.put(volumeUuid, ver);
1326 }
1327 return ver;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001328 }
1329
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001330 public VersionInfo getInternalVersion() {
1331 return mVersion.get(StorageManager.UUID_PRIVATE_INTERNAL);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001332 }
1333
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001334 public VersionInfo getExternalVersion() {
1335 return mVersion.get(StorageManager.UUID_PRIMARY_PHYSICAL);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001336 }
1337
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001338 public void onVolumeForgotten(String fsUuid) {
1339 mVersion.remove(fsUuid);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001340 }
1341
Christopher Tatee012a232015-04-01 17:18:50 -07001342 /**
1343 * Applies the preferred activity state described by the given XML. This code
1344 * also supports the restore-from-backup code path.
1345 *
1346 * @see PreferredActivityBackupHelper
1347 */
1348 void readPreferredActivitiesLPw(XmlPullParser parser, int userId)
Dianne Hackborn63092712012-10-07 14:45:35 -07001349 throws XmlPullParserException, IOException {
1350 int outerDepth = parser.getDepth();
1351 int type;
1352 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1353 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1354 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1355 continue;
1356 }
1357
1358 String tagName = parser.getName();
1359 if (tagName.equals(TAG_ITEM)) {
1360 PreferredActivity pa = new PreferredActivity(parser);
1361 if (pa.mPref.getParseError() == null) {
1362 editPreferredActivitiesLPw(userId).addFilter(pa);
1363 } else {
1364 PackageManagerService.reportSettingsProblem(Log.WARN,
1365 "Error in package manager settings: <preferred-activity> "
1366 + pa.mPref.getParseError() + " at "
1367 + parser.getPositionDescription());
1368 }
1369 } else {
1370 PackageManagerService.reportSettingsProblem(Log.WARN,
1371 "Unknown element under <preferred-activities>: " + parser.getName());
1372 XmlUtils.skipCurrentTag(parser);
1373 }
1374 }
1375 }
1376
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001377 private void readPersistentPreferredActivitiesLPw(XmlPullParser parser, int userId)
1378 throws XmlPullParserException, IOException {
1379 int outerDepth = parser.getDepth();
1380 int type;
1381 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1382 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1383 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1384 continue;
1385 }
1386 String tagName = parser.getName();
1387 if (tagName.equals(TAG_ITEM)) {
1388 PersistentPreferredActivity ppa = new PersistentPreferredActivity(parser);
1389 editPersistentPreferredActivitiesLPw(userId).addFilter(ppa);
1390 } else {
1391 PackageManagerService.reportSettingsProblem(Log.WARN,
Sander Alewijnseaf597622014-03-20 18:44:57 +00001392 "Unknown element under <" + TAG_PERSISTENT_PREFERRED_ACTIVITIES + ">: "
1393 + parser.getName());
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001394 XmlUtils.skipCurrentTag(parser);
1395 }
1396 }
1397 }
1398
Nicolas Prevot81948992014-05-16 18:25:26 +01001399 private void readCrossProfileIntentFiltersLPw(XmlPullParser parser, int userId)
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001400 throws XmlPullParserException, IOException {
1401 int outerDepth = parser.getDepth();
1402 int type;
1403 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1404 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1405 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1406 continue;
1407 }
Christopher Tate6038d152015-06-17 13:07:46 -07001408 final String tagName = parser.getName();
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001409 if (tagName.equals(TAG_ITEM)) {
Nicolas Prevot81948992014-05-16 18:25:26 +01001410 CrossProfileIntentFilter cpif = new CrossProfileIntentFilter(parser);
1411 editCrossProfileIntentResolverLPw(userId).addFilter(cpif);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001412 } else {
Nicolas Prevot81948992014-05-16 18:25:26 +01001413 String msg = "Unknown element under " + TAG_CROSS_PROFILE_INTENT_FILTERS + ": " +
Christopher Tate6038d152015-06-17 13:07:46 -07001414 tagName;
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001415 PackageManagerService.reportSettingsProblem(Log.WARN, msg);
1416 XmlUtils.skipCurrentTag(parser);
1417 }
1418 }
1419 }
1420
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001421 private void readDomainVerificationLPw(XmlPullParser parser, PackageSettingBase packageSetting)
1422 throws XmlPullParserException, IOException {
1423 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1424 packageSetting.setIntentFilterVerificationInfo(ivi);
Todd Kennedy788c8422016-08-10 10:52:34 -07001425 if (DEBUG_PARSER) {
1426 Log.d(TAG, "Read domain verification for package: " + ivi.getPackageName());
1427 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001428 }
1429
Christopher Tate6038d152015-06-17 13:07:46 -07001430 private void readRestoredIntentFilterVerifications(XmlPullParser parser)
1431 throws XmlPullParserException, IOException {
1432 int outerDepth = parser.getDepth();
1433 int type;
1434 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1435 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1436 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1437 continue;
1438 }
1439 final String tagName = parser.getName();
1440 if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
1441 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1442 if (DEBUG_DOMAIN_VERIFICATION) {
1443 Slog.i(TAG, "Restored IVI for " + ivi.getPackageName()
1444 + " status=" + ivi.getStatusString());
1445 }
1446 mRestoredIntentFilterVerifications.put(ivi.getPackageName(), ivi);
1447 } else {
1448 Slog.w(TAG, "Unknown element: " + tagName);
1449 XmlUtils.skipCurrentTag(parser);
1450 }
1451 }
1452 }
1453
1454 void readDefaultAppsLPw(XmlPullParser parser, int userId)
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001455 throws XmlPullParserException, IOException {
1456 int outerDepth = parser.getDepth();
1457 int type;
1458 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1459 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1460 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1461 continue;
1462 }
1463 String tagName = parser.getName();
1464 if (tagName.equals(TAG_DEFAULT_BROWSER)) {
1465 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
1466 mDefaultBrowserApp.put(userId, packageName);
Robin Lee0dc591b2016-05-04 13:01:46 +01001467 } else if (tagName.equals(TAG_DEFAULT_DIALER)) {
Hai Zhangc1399272019-05-07 15:50:58 -07001468 // Ignored.
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001469 } else {
1470 String msg = "Unknown element under " + TAG_DEFAULT_APPS + ": " +
1471 parser.getName();
1472 PackageManagerService.reportSettingsProblem(Log.WARN, msg);
1473 XmlUtils.skipCurrentTag(parser);
1474 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001475 }
1476 }
1477
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001478 void readBlockUninstallPackagesLPw(XmlPullParser parser, int userId)
1479 throws XmlPullParserException, IOException {
1480 int outerDepth = parser.getDepth();
1481 int type;
1482 ArraySet<String> packages = new ArraySet<>();
1483 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1484 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1485 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1486 continue;
1487 }
1488 String tagName = parser.getName();
1489 if (tagName.equals(TAG_BLOCK_UNINSTALL)) {
1490 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
1491 packages.add(packageName);
1492 } else {
1493 String msg = "Unknown element under " + TAG_BLOCK_UNINSTALL_PACKAGES + ": " +
1494 parser.getName();
1495 PackageManagerService.reportSettingsProblem(Log.WARN, msg);
1496 XmlUtils.skipCurrentTag(parser);
1497 }
1498 }
1499 if (packages.isEmpty()) {
1500 mBlockUninstallPackages.remove(userId);
1501 } else {
1502 mBlockUninstallPackages.put(userId, packages);
1503 }
1504 }
1505
Amith Yamasani483f3b02012-03-13 16:08:00 -07001506 void readPackageRestrictionsLPr(int userId) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001507 if (DEBUG_MU) {
1508 Log.i(TAG, "Reading package restrictions for user=" + userId);
1509 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07001510 FileInputStream str = null;
1511 File userPackagesStateFile = getUserPackagesStateFile(userId);
1512 File backupFile = getUserPackagesStateBackupFile(userId);
1513 if (backupFile.exists()) {
1514 try {
1515 str = new FileInputStream(backupFile);
1516 mReadMessages.append("Reading from backup stopped packages file\n");
1517 PackageManagerService.reportSettingsProblem(Log.INFO,
1518 "Need to read from backup stopped packages file");
1519 if (userPackagesStateFile.exists()) {
1520 // If both the backup and normal file exist, we
1521 // ignore the normal one since it might have been
1522 // corrupted.
1523 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
1524 + userPackagesStateFile);
1525 userPackagesStateFile.delete();
1526 }
1527 } catch (java.io.IOException e) {
1528 // We'll try for the normal settings file.
1529 }
1530 }
1531
1532 try {
1533 if (str == null) {
1534 if (!userPackagesStateFile.exists()) {
1535 mReadMessages.append("No stopped packages file found\n");
1536 PackageManagerService.reportSettingsProblem(Log.INFO,
1537 "No stopped packages file; "
1538 + "assuming all started");
1539 // At first boot, make sure no packages are stopped.
1540 // We usually want to have third party apps initialize
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001541 // in the stopped state, but not at first boot. Also
1542 // consider all applications to be installed.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001543 for (PackageSetting pkg : mPackages.values()) {
Jeff Sharkey42884192016-04-09 16:12:01 -06001544 pkg.setUserState(userId, 0, COMPONENT_ENABLED_STATE_DEFAULT,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001545 true /*installed*/,
1546 false /*stopped*/,
1547 false /*notLaunched*/,
1548 false /*hidden*/,
Suprabh Shukla79000492018-12-24 17:03:02 -08001549 0 /*distractionFlags*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001550 false /*suspended*/,
Suprabh Shukla151b21b2018-04-27 19:30:30 -07001551 null /*suspendingPackage*/,
Suprabh Shukla389cb6f2018-10-01 18:20:39 -07001552 null /*dialogInfo*/,
Suprabh Shukla151b21b2018-04-27 19:30:30 -07001553 null /*suspendedAppExtras*/,
1554 null /*suspendedLauncherExtras*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001555 false /*instantApp*/,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07001556 false /*virtualPreload*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001557 null /*lastDisableAppCaller*/,
1558 null /*enabledComponents*/,
1559 null /*disabledComponents*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001560 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED,
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08001561 0, PackageManager.INSTALL_REASON_UNKNOWN,
1562 null /*harmfulAppWarning*/);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001563 }
1564 return;
1565 }
1566 str = new FileInputStream(userPackagesStateFile);
1567 }
1568 final XmlPullParser parser = Xml.newPullParser();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01001569 parser.setInput(str, StandardCharsets.UTF_8.name());
Amith Yamasani483f3b02012-03-13 16:08:00 -07001570
1571 int type;
1572 while ((type=parser.next()) != XmlPullParser.START_TAG
1573 && type != XmlPullParser.END_DOCUMENT) {
1574 ;
1575 }
1576
1577 if (type != XmlPullParser.START_TAG) {
1578 mReadMessages.append("No start tag found in package restrictions file\n");
1579 PackageManagerService.reportSettingsProblem(Log.WARN,
1580 "No start tag found in package manager stopped packages");
1581 return;
1582 }
1583
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001584 int maxAppLinkGeneration = 0;
1585
Amith Yamasani483f3b02012-03-13 16:08:00 -07001586 int outerDepth = parser.getDepth();
1587 PackageSetting ps = null;
1588 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1589 && (type != XmlPullParser.END_TAG
1590 || parser.getDepth() > outerDepth)) {
1591 if (type == XmlPullParser.END_TAG
1592 || type == XmlPullParser.TEXT) {
1593 continue;
1594 }
1595
1596 String tagName = parser.getName();
1597 if (tagName.equals(TAG_PACKAGE)) {
1598 String name = parser.getAttributeValue(null, ATTR_NAME);
1599 ps = mPackages.get(name);
1600 if (ps == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -07001601 Slog.w(PackageManagerService.TAG, "No package known for stopped package "
Amith Yamasani483f3b02012-03-13 16:08:00 -07001602 + name);
1603 XmlUtils.skipCurrentTag(parser);
1604 continue;
1605 }
Jeff Sharkey42884192016-04-09 16:12:01 -06001606
1607 final long ceDataInode = XmlUtils.readLongAttribute(parser, ATTR_CE_DATA_INODE,
1608 0);
1609 final boolean installed = XmlUtils.readBooleanAttribute(parser, ATTR_INSTALLED,
1610 true);
1611 final boolean stopped = XmlUtils.readBooleanAttribute(parser, ATTR_STOPPED,
1612 false);
1613 final boolean notLaunched = XmlUtils.readBooleanAttribute(parser,
1614 ATTR_NOT_LAUNCHED, false);
1615
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001616 // For backwards compatibility with the previous name of "blocked", which
1617 // now means hidden, read the old attribute as well.
Amith Yamasani655d0e22013-06-12 14:19:10 -07001618 final String blockedStr = parser.getAttributeValue(null, ATTR_BLOCKED);
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001619 boolean hidden = blockedStr == null
Amith Yamasani655d0e22013-06-12 14:19:10 -07001620 ? false : Boolean.parseBoolean(blockedStr);
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001621 final String hiddenStr = parser.getAttributeValue(null, ATTR_HIDDEN);
1622 hidden = hiddenStr == null
1623 ? hidden : Boolean.parseBoolean(hiddenStr);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001624
Suprabh Shukla79000492018-12-24 17:03:02 -08001625 final int distractionFlags = XmlUtils.readIntAttribute(parser,
1626 ATTR_DISTRACTION_FLAGS, 0);
Jeff Sharkey42884192016-04-09 16:12:01 -06001627 final boolean suspended = XmlUtils.readBooleanAttribute(parser, ATTR_SUSPENDED,
1628 false);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001629 String suspendingPackage = parser.getAttributeValue(null,
1630 ATTR_SUSPENDING_PACKAGE);
Suprabh Shukla3c3af142018-03-30 00:28:37 -07001631 final String dialogMessage = parser.getAttributeValue(null,
1632 ATTR_SUSPEND_DIALOG_MESSAGE);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001633 if (suspended && suspendingPackage == null) {
1634 suspendingPackage = PLATFORM_PACKAGE_NAME;
1635 }
1636
Jeff Sharkey42884192016-04-09 16:12:01 -06001637 final boolean blockUninstall = XmlUtils.readBooleanAttribute(parser,
1638 ATTR_BLOCK_UNINSTALL, false);
Todd Kennedybe0b8892017-02-15 14:13:52 -08001639 final boolean instantApp = XmlUtils.readBooleanAttribute(parser,
1640 ATTR_INSTANT_APP, false);
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07001641 final boolean virtualPreload = XmlUtils.readBooleanAttribute(parser,
1642 ATTR_VIRTUAL_PRELOAD, false);
Jeff Sharkey42884192016-04-09 16:12:01 -06001643 final int enabled = XmlUtils.readIntAttribute(parser, ATTR_ENABLED,
1644 COMPONENT_ENABLED_STATE_DEFAULT);
1645 final String enabledCaller = parser.getAttributeValue(null,
1646 ATTR_ENABLED_CALLER);
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08001647 final String harmfulAppWarning =
1648 parser.getAttributeValue(null, ATTR_HARMFUL_APP_WARNING);
Jeff Sharkey42884192016-04-09 16:12:01 -06001649 final int verifState = XmlUtils.readIntAttribute(parser,
1650 ATTR_DOMAIN_VERIFICATON_STATE,
1651 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED);
1652 final int linkGeneration = XmlUtils.readIntAttribute(parser,
1653 ATTR_APP_LINK_GENERATION, 0);
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001654 if (linkGeneration > maxAppLinkGeneration) {
1655 maxAppLinkGeneration = linkGeneration;
1656 }
Bartosz Fabianowskia34f53f2017-01-11 18:08:47 +01001657 final int installReason = XmlUtils.readIntAttribute(parser,
1658 ATTR_INSTALL_REASON, PackageManager.INSTALL_REASON_UNKNOWN);
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001659
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001660 ArraySet<String> enabledComponents = null;
1661 ArraySet<String> disabledComponents = null;
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001662 PersistableBundle suspendedAppExtras = null;
1663 PersistableBundle suspendedLauncherExtras = null;
Suprabh Shukla389cb6f2018-10-01 18:20:39 -07001664 SuspendDialogInfo suspendDialogInfo = null;
Amith Yamasani483f3b02012-03-13 16:08:00 -07001665
1666 int packageDepth = parser.getDepth();
1667 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1668 && (type != XmlPullParser.END_TAG
1669 || parser.getDepth() > packageDepth)) {
1670 if (type == XmlPullParser.END_TAG
1671 || type == XmlPullParser.TEXT) {
1672 continue;
1673 }
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001674 switch (parser.getName()) {
1675 case TAG_ENABLED_COMPONENTS:
1676 enabledComponents = readComponentsLPr(parser);
1677 break;
1678 case TAG_DISABLED_COMPONENTS:
1679 disabledComponents = readComponentsLPr(parser);
1680 break;
1681 case TAG_SUSPENDED_APP_EXTRAS:
1682 suspendedAppExtras = PersistableBundle.restoreFromXml(parser);
1683 break;
1684 case TAG_SUSPENDED_LAUNCHER_EXTRAS:
1685 suspendedLauncherExtras = PersistableBundle.restoreFromXml(parser);
1686 break;
Suprabh Shukla389cb6f2018-10-01 18:20:39 -07001687 case TAG_SUSPENDED_DIALOG_INFO:
1688 suspendDialogInfo = SuspendDialogInfo.restoreFromXml(parser);
1689 break;
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001690 default:
1691 Slog.wtf(TAG, "Unknown tag " + parser.getName() + " under tag "
1692 + TAG_PACKAGE);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001693 }
1694 }
Suprabh Shukla389cb6f2018-10-01 18:20:39 -07001695 if (suspendDialogInfo == null && !TextUtils.isEmpty(dialogMessage)) {
1696 suspendDialogInfo = new SuspendDialogInfo.Builder()
1697 .setMessage(dialogMessage)
1698 .build();
1699 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001700
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001701 if (blockUninstall) {
1702 setBlockUninstallLPw(userId, name, true);
1703 }
Jeff Sharkey42884192016-04-09 16:12:01 -06001704 ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched,
Suprabh Shukla79000492018-12-24 17:03:02 -08001705 hidden, distractionFlags, suspended, suspendingPackage,
1706 suspendDialogInfo,
Suprabh Shukla389cb6f2018-10-01 18:20:39 -07001707 suspendedAppExtras, suspendedLauncherExtras, instantApp, virtualPreload,
1708 enabledCaller, enabledComponents, disabledComponents, verifState,
1709 linkGeneration, installReason, harmfulAppWarning);
Dianne Hackborn63092712012-10-07 14:45:35 -07001710 } else if (tagName.equals("preferred-activities")) {
1711 readPreferredActivitiesLPw(parser, userId);
Sander Alewijnseaf597622014-03-20 18:44:57 +00001712 } else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) {
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001713 readPersistentPreferredActivitiesLPw(parser, userId);
Nicolas Prevot29762c32014-07-29 18:51:32 +01001714 } else if (tagName.equals(TAG_CROSS_PROFILE_INTENT_FILTERS)) {
Nicolas Prevot81948992014-05-16 18:25:26 +01001715 readCrossProfileIntentFiltersLPw(parser, userId);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001716 } else if (tagName.equals(TAG_DEFAULT_APPS)) {
1717 readDefaultAppsLPw(parser, userId);
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001718 } else if (tagName.equals(TAG_BLOCK_UNINSTALL_PACKAGES)) {
1719 readBlockUninstallPackagesLPw(parser, userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001720 } else {
1721 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
1722 + parser.getName());
1723 XmlUtils.skipCurrentTag(parser);
1724 }
1725 }
1726
1727 str.close();
1728
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001729 mNextAppLinkGeneration.put(userId, maxAppLinkGeneration + 1);
1730
Amith Yamasani483f3b02012-03-13 16:08:00 -07001731 } catch (XmlPullParserException e) {
1732 mReadMessages.append("Error reading: " + e.toString());
1733 PackageManagerService.reportSettingsProblem(Log.ERROR,
1734 "Error reading stopped packages: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07001735 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
1736 e);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001737
1738 } catch (java.io.IOException e) {
1739 mReadMessages.append("Error reading: " + e.toString());
1740 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07001741 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
1742 e);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001743 }
1744 }
1745
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001746 void setBlockUninstallLPw(int userId, String packageName, boolean blockUninstall) {
1747 ArraySet<String> packages = mBlockUninstallPackages.get(userId);
1748 if (blockUninstall) {
1749 if (packages == null) {
1750 packages = new ArraySet<String>();
1751 mBlockUninstallPackages.put(userId, packages);
1752 }
1753 packages.add(packageName);
1754 } else if (packages != null) {
1755 packages.remove(packageName);
1756 if (packages.isEmpty()) {
1757 mBlockUninstallPackages.remove(userId);
1758 }
1759 }
1760 }
1761
1762 boolean getBlockUninstallLPr(int userId, String packageName) {
1763 ArraySet<String> packages = mBlockUninstallPackages.get(userId);
1764 if (packages == null) {
1765 return false;
1766 }
1767 return packages.contains(packageName);
1768 }
1769
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001770 private ArraySet<String> readComponentsLPr(XmlPullParser parser)
Amith Yamasani483f3b02012-03-13 16:08:00 -07001771 throws IOException, XmlPullParserException {
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001772 ArraySet<String> components = null;
Amith Yamasani483f3b02012-03-13 16:08:00 -07001773 int type;
1774 int outerDepth = parser.getDepth();
1775 String tagName;
1776 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1777 && (type != XmlPullParser.END_TAG
1778 || parser.getDepth() > outerDepth)) {
1779 if (type == XmlPullParser.END_TAG
1780 || type == XmlPullParser.TEXT) {
1781 continue;
1782 }
1783 tagName = parser.getName();
1784 if (tagName.equals(TAG_ITEM)) {
1785 String componentName = parser.getAttributeValue(null, ATTR_NAME);
1786 if (componentName != null) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001787 if (components == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001788 components = new ArraySet<String>();
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001789 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07001790 components.add(componentName);
1791 }
1792 }
1793 }
1794 return components;
1795 }
1796
Christopher Tatee012a232015-04-01 17:18:50 -07001797 /**
1798 * Record the state of preferred activity configuration into XML. This is used both
1799 * for recording packages.xml internally and for supporting backup/restore of the
1800 * preferred activity configuration.
1801 */
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08001802 void writePreferredActivitiesLPr(XmlSerializer serializer, int userId, boolean full)
Dianne Hackborn63092712012-10-07 14:45:35 -07001803 throws IllegalArgumentException, IllegalStateException, IOException {
1804 serializer.startTag(null, "preferred-activities");
1805 PreferredIntentResolver pir = mPreferredActivities.get(userId);
1806 if (pir != null) {
1807 for (final PreferredActivity pa : pir.filterSet()) {
1808 serializer.startTag(null, TAG_ITEM);
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08001809 pa.writeToXml(serializer, full);
Dianne Hackborn63092712012-10-07 14:45:35 -07001810 serializer.endTag(null, TAG_ITEM);
1811 }
1812 }
1813 serializer.endTag(null, "preferred-activities");
1814 }
1815
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001816 void writePersistentPreferredActivitiesLPr(XmlSerializer serializer, int userId)
1817 throws IllegalArgumentException, IllegalStateException, IOException {
Sander Alewijnseaf597622014-03-20 18:44:57 +00001818 serializer.startTag(null, TAG_PERSISTENT_PREFERRED_ACTIVITIES);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001819 PersistentPreferredIntentResolver ppir = mPersistentPreferredActivities.get(userId);
1820 if (ppir != null) {
1821 for (final PersistentPreferredActivity ppa : ppir.filterSet()) {
1822 serializer.startTag(null, TAG_ITEM);
1823 ppa.writeToXml(serializer);
1824 serializer.endTag(null, TAG_ITEM);
1825 }
1826 }
Sander Alewijnseaf597622014-03-20 18:44:57 +00001827 serializer.endTag(null, TAG_PERSISTENT_PREFERRED_ACTIVITIES);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001828 }
1829
Nicolas Prevot81948992014-05-16 18:25:26 +01001830 void writeCrossProfileIntentFiltersLPr(XmlSerializer serializer, int userId)
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001831 throws IllegalArgumentException, IllegalStateException, IOException {
Nicolas Prevot81948992014-05-16 18:25:26 +01001832 serializer.startTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
1833 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(userId);
1834 if (cpir != null) {
1835 for (final CrossProfileIntentFilter cpif : cpir.filterSet()) {
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001836 serializer.startTag(null, TAG_ITEM);
Nicolas Prevot81948992014-05-16 18:25:26 +01001837 cpif.writeToXml(serializer);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001838 serializer.endTag(null, TAG_ITEM);
1839 }
1840 }
Nicolas Prevot81948992014-05-16 18:25:26 +01001841 serializer.endTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001842 }
1843
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001844 void writeDomainVerificationsLPr(XmlSerializer serializer,
1845 IntentFilterVerificationInfo verificationInfo)
1846 throws IllegalArgumentException, IllegalStateException, IOException {
1847 if (verificationInfo != null && verificationInfo.getPackageName() != null) {
1848 serializer.startTag(null, TAG_DOMAIN_VERIFICATION);
1849 verificationInfo.writeToXml(serializer);
Christopher Tate72c10a22015-06-12 18:31:24 -07001850 if (DEBUG_DOMAIN_VERIFICATION) {
1851 Slog.d(TAG, "Wrote domain verification for package: "
1852 + verificationInfo.getPackageName());
1853 }
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001854 serializer.endTag(null, TAG_DOMAIN_VERIFICATION);
1855 }
1856 }
1857
Christopher Tate6038d152015-06-17 13:07:46 -07001858 // Specifically for backup/restore
1859 void writeAllDomainVerificationsLPr(XmlSerializer serializer, int userId)
1860 throws IllegalArgumentException, IllegalStateException, IOException {
1861 serializer.startTag(null, TAG_ALL_INTENT_FILTER_VERIFICATION);
1862 final int N = mPackages.size();
1863 for (int i = 0; i < N; i++) {
1864 PackageSetting ps = mPackages.valueAt(i);
1865 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1866 if (ivi != null) {
1867 writeDomainVerificationsLPr(serializer, ivi);
1868 }
1869 }
1870 serializer.endTag(null, TAG_ALL_INTENT_FILTER_VERIFICATION);
1871 }
1872
1873 // Specifically for backup/restore
1874 void readAllDomainVerificationsLPr(XmlPullParser parser, int userId)
1875 throws XmlPullParserException, IOException {
1876 mRestoredIntentFilterVerifications.clear();
1877
1878 int outerDepth = parser.getDepth();
1879 int type;
1880 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1881 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1882 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1883 continue;
1884 }
1885
1886 String tagName = parser.getName();
1887 if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
1888 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1889 final String pkgName = ivi.getPackageName();
1890 final PackageSetting ps = mPackages.get(pkgName);
1891 if (ps != null) {
1892 // known/existing package; update in place
1893 ps.setIntentFilterVerificationInfo(ivi);
1894 if (DEBUG_DOMAIN_VERIFICATION) {
1895 Slog.d(TAG, "Restored IVI for existing app " + pkgName
1896 + " status=" + ivi.getStatusString());
1897 }
1898 } else {
1899 mRestoredIntentFilterVerifications.put(pkgName, ivi);
1900 if (DEBUG_DOMAIN_VERIFICATION) {
1901 Slog.d(TAG, "Restored IVI for pending app " + pkgName
1902 + " status=" + ivi.getStatusString());
1903 }
1904 }
1905 } else {
1906 PackageManagerService.reportSettingsProblem(Log.WARN,
1907 "Unknown element under <all-intent-filter-verification>: "
1908 + parser.getName());
1909 XmlUtils.skipCurrentTag(parser);
1910 }
1911 }
1912 }
1913
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001914 void writeDefaultAppsLPr(XmlSerializer serializer, int userId)
1915 throws IllegalArgumentException, IllegalStateException, IOException {
1916 serializer.startTag(null, TAG_DEFAULT_APPS);
Robin Lee0dc591b2016-05-04 13:01:46 +01001917 String defaultBrowser = mDefaultBrowserApp.get(userId);
1918 if (!TextUtils.isEmpty(defaultBrowser)) {
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001919 serializer.startTag(null, TAG_DEFAULT_BROWSER);
Robin Lee0dc591b2016-05-04 13:01:46 +01001920 serializer.attribute(null, ATTR_PACKAGE_NAME, defaultBrowser);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001921 serializer.endTag(null, TAG_DEFAULT_BROWSER);
1922 }
1923 serializer.endTag(null, TAG_DEFAULT_APPS);
1924 }
1925
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001926 void writeBlockUninstallPackagesLPr(XmlSerializer serializer, int userId)
1927 throws IOException {
1928 ArraySet<String> packages = mBlockUninstallPackages.get(userId);
1929 if (packages != null) {
1930 serializer.startTag(null, TAG_BLOCK_UNINSTALL_PACKAGES);
1931 for (int i = 0; i < packages.size(); i++) {
1932 serializer.startTag(null, TAG_BLOCK_UNINSTALL);
1933 serializer.attribute(null, ATTR_PACKAGE_NAME, packages.valueAt(i));
1934 serializer.endTag(null, TAG_BLOCK_UNINSTALL);
1935 }
1936 serializer.endTag(null, TAG_BLOCK_UNINSTALL_PACKAGES);
1937 }
1938 }
1939
Amith Yamasani483f3b02012-03-13 16:08:00 -07001940 void writePackageRestrictionsLPr(int userId) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001941 if (DEBUG_MU) {
1942 Log.i(TAG, "Writing package restrictions for user=" + userId);
1943 }
Dianne Hackborne17b4452018-01-10 13:15:40 -08001944 final long startTime = SystemClock.uptimeMillis();
1945
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001946 // Keep the old stopped packages around until we know the new ones have
1947 // been successfully written.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001948 File userPackagesStateFile = getUserPackagesStateFile(userId);
1949 File backupFile = getUserPackagesStateBackupFile(userId);
1950 new File(userPackagesStateFile.getParent()).mkdirs();
1951 if (userPackagesStateFile.exists()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001952 // Presence of backup settings file indicates that we failed
1953 // to persist packages earlier. So preserve the older
1954 // backup for future reference since the current packages
1955 // might have been corrupted.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001956 if (!backupFile.exists()) {
1957 if (!userPackagesStateFile.renameTo(backupFile)) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07001958 Slog.wtf(PackageManagerService.TAG,
1959 "Unable to backup user packages state file, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001960 + "current changes will be lost at reboot");
1961 return;
1962 }
1963 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001964 userPackagesStateFile.delete();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001965 Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
1966 }
1967 }
1968
1969 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001970 final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile);
Kenny Root447106f2011-03-23 11:00:15 -07001971 final BufferedOutputStream str = new BufferedOutputStream(fstr);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001972
Kenny Root447106f2011-03-23 11:00:15 -07001973 final XmlSerializer serializer = new FastXmlSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01001974 serializer.setOutput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001975 serializer.startDocument(null, true);
1976 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
1977
Amith Yamasani483f3b02012-03-13 16:08:00 -07001978 serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001979
Kenny Root447106f2011-03-23 11:00:15 -07001980 for (final PackageSetting pkg : mPackages.values()) {
Jeff Sharkey42884192016-04-09 16:12:01 -06001981 final PackageUserState ustate = pkg.readUserState(userId);
1982 if (DEBUG_MU) Log.i(TAG, " pkg=" + pkg.name + ", state=" + ustate.enabled);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001983
Jeff Sharkey42884192016-04-09 16:12:01 -06001984 serializer.startTag(null, TAG_PACKAGE);
1985 serializer.attribute(null, ATTR_NAME, pkg.name);
1986 if (ustate.ceDataInode != 0) {
1987 XmlUtils.writeLongAttribute(serializer, ATTR_CE_DATA_INODE, ustate.ceDataInode);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001988 }
Jeff Sharkey42884192016-04-09 16:12:01 -06001989 if (!ustate.installed) {
1990 serializer.attribute(null, ATTR_INSTALLED, "false");
1991 }
1992 if (ustate.stopped) {
1993 serializer.attribute(null, ATTR_STOPPED, "true");
1994 }
1995 if (ustate.notLaunched) {
1996 serializer.attribute(null, ATTR_NOT_LAUNCHED, "true");
1997 }
1998 if (ustate.hidden) {
1999 serializer.attribute(null, ATTR_HIDDEN, "true");
2000 }
Suprabh Shukla79000492018-12-24 17:03:02 -08002001 if (ustate.distractionFlags != 0) {
2002 serializer.attribute(null, ATTR_DISTRACTION_FLAGS,
2003 Integer.toString(ustate.distractionFlags));
2004 }
Jeff Sharkey42884192016-04-09 16:12:01 -06002005 if (ustate.suspended) {
2006 serializer.attribute(null, ATTR_SUSPENDED, "true");
Suprabh Shukla3c3af142018-03-30 00:28:37 -07002007 if (ustate.suspendingPackage != null) {
2008 serializer.attribute(null, ATTR_SUSPENDING_PACKAGE,
2009 ustate.suspendingPackage);
2010 }
Suprabh Shukla389cb6f2018-10-01 18:20:39 -07002011 if (ustate.dialogInfo != null) {
2012 serializer.startTag(null, TAG_SUSPENDED_DIALOG_INFO);
2013 ustate.dialogInfo.saveToXml(serializer);
2014 serializer.endTag(null, TAG_SUSPENDED_DIALOG_INFO);
Suprabh Shukla3c3af142018-03-30 00:28:37 -07002015 }
Suprabh Shukla021b57a2018-03-08 18:21:50 -08002016 if (ustate.suspendedAppExtras != null) {
2017 serializer.startTag(null, TAG_SUSPENDED_APP_EXTRAS);
2018 try {
2019 ustate.suspendedAppExtras.saveToXml(serializer);
2020 } catch (XmlPullParserException xmle) {
2021 Slog.wtf(TAG, "Exception while trying to write suspendedAppExtras for "
2022 + pkg + ". Will be lost on reboot", xmle);
2023 }
2024 serializer.endTag(null, TAG_SUSPENDED_APP_EXTRAS);
2025 }
2026 if (ustate.suspendedLauncherExtras != null) {
2027 serializer.startTag(null, TAG_SUSPENDED_LAUNCHER_EXTRAS);
2028 try {
2029 ustate.suspendedLauncherExtras.saveToXml(serializer);
2030 } catch (XmlPullParserException xmle) {
2031 Slog.wtf(TAG, "Exception while trying to write suspendedLauncherExtras"
2032 + " for " + pkg + ". Will be lost on reboot", xmle);
2033 }
2034 serializer.endTag(null, TAG_SUSPENDED_LAUNCHER_EXTRAS);
2035 }
Jeff Sharkey42884192016-04-09 16:12:01 -06002036 }
Todd Kennedybe0b8892017-02-15 14:13:52 -08002037 if (ustate.instantApp) {
2038 serializer.attribute(null, ATTR_INSTANT_APP, "true");
2039 }
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07002040 if (ustate.virtualPreload) {
2041 serializer.attribute(null, ATTR_VIRTUAL_PRELOAD, "true");
2042 }
Jeff Sharkey42884192016-04-09 16:12:01 -06002043 if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
2044 serializer.attribute(null, ATTR_ENABLED,
2045 Integer.toString(ustate.enabled));
2046 if (ustate.lastDisableAppCaller != null) {
2047 serializer.attribute(null, ATTR_ENABLED_CALLER,
2048 ustate.lastDisableAppCaller);
2049 }
2050 }
2051 if (ustate.domainVerificationStatus !=
2052 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED) {
2053 XmlUtils.writeIntAttribute(serializer, ATTR_DOMAIN_VERIFICATON_STATE,
2054 ustate.domainVerificationStatus);
2055 }
2056 if (ustate.appLinkGeneration != 0) {
2057 XmlUtils.writeIntAttribute(serializer, ATTR_APP_LINK_GENERATION,
2058 ustate.appLinkGeneration);
2059 }
Bartosz Fabianowskia34f53f2017-01-11 18:08:47 +01002060 if (ustate.installReason != PackageManager.INSTALL_REASON_UNKNOWN) {
2061 serializer.attribute(null, ATTR_INSTALL_REASON,
2062 Integer.toString(ustate.installReason));
2063 }
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08002064 if (ustate.harmfulAppWarning != null) {
2065 serializer.attribute(null, ATTR_HARMFUL_APP_WARNING,
2066 ustate.harmfulAppWarning);
2067 }
Jeff Sharkey42884192016-04-09 16:12:01 -06002068 if (!ArrayUtils.isEmpty(ustate.enabledComponents)) {
2069 serializer.startTag(null, TAG_ENABLED_COMPONENTS);
2070 for (final String name : ustate.enabledComponents) {
2071 serializer.startTag(null, TAG_ITEM);
2072 serializer.attribute(null, ATTR_NAME, name);
2073 serializer.endTag(null, TAG_ITEM);
2074 }
2075 serializer.endTag(null, TAG_ENABLED_COMPONENTS);
2076 }
2077 if (!ArrayUtils.isEmpty(ustate.disabledComponents)) {
2078 serializer.startTag(null, TAG_DISABLED_COMPONENTS);
2079 for (final String name : ustate.disabledComponents) {
2080 serializer.startTag(null, TAG_ITEM);
2081 serializer.attribute(null, ATTR_NAME, name);
2082 serializer.endTag(null, TAG_ITEM);
2083 }
2084 serializer.endTag(null, TAG_DISABLED_COMPONENTS);
2085 }
2086
2087 serializer.endTag(null, TAG_PACKAGE);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002088 }
2089
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08002090 writePreferredActivitiesLPr(serializer, userId, true);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00002091 writePersistentPreferredActivitiesLPr(serializer, userId);
Nicolas Prevot81948992014-05-16 18:25:26 +01002092 writeCrossProfileIntentFiltersLPr(serializer, userId);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002093 writeDefaultAppsLPr(serializer, userId);
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02002094 writeBlockUninstallPackagesLPr(serializer, userId);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002095
Amith Yamasani483f3b02012-03-13 16:08:00 -07002096 serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002097
2098 serializer.endDocument();
2099
2100 str.flush();
2101 FileUtils.sync(fstr);
2102 str.close();
2103
2104 // New settings successfully written, old ones are no longer
2105 // needed.
Amith Yamasani483f3b02012-03-13 16:08:00 -07002106 backupFile.delete();
2107 FileUtils.setPermissions(userPackagesStateFile.toString(),
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002108 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08002109 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002110 -1, -1);
2111
Dianne Hackborne17b4452018-01-10 13:15:40 -08002112 com.android.internal.logging.EventLogTags.writeCommitSysConfigFile(
2113 "package-user-" + userId, SystemClock.uptimeMillis() - startTime);
2114
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002115 // Done, all is good!
2116 return;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002117 } catch(java.io.IOException e) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002118 Slog.wtf(PackageManagerService.TAG,
Amith Yamasani483f3b02012-03-13 16:08:00 -07002119 "Unable to write package manager user packages state, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002120 + " current changes will be lost at reboot", e);
2121 }
2122
2123 // Clean up partially written files
Amith Yamasani483f3b02012-03-13 16:08:00 -07002124 if (userPackagesStateFile.exists()) {
2125 if (!userPackagesStateFile.delete()) {
2126 Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: "
2127 + mStoppedPackagesFilename);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002128 }
2129 }
2130 }
2131
Svetoslavc6d1c342015-02-26 14:44:43 -08002132 void readInstallPermissionsLPr(XmlPullParser parser,
2133 PermissionsState permissionsState) throws IOException, XmlPullParserException {
2134 int outerDepth = parser.getDepth();
2135 int type;
2136 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
2137 && (type != XmlPullParser.END_TAG
2138 || parser.getDepth() > outerDepth)) {
2139 if (type == XmlPullParser.END_TAG
2140 || type == XmlPullParser.TEXT) {
2141 continue;
2142 }
2143 String tagName = parser.getName();
2144 if (tagName.equals(TAG_ITEM)) {
2145 String name = parser.getAttributeValue(null, ATTR_NAME);
2146
Todd Kennedy0eb97382017-10-03 16:57:22 -07002147 BasePermission bp = mPermissions.getPermission(name);
Svetoslavc6d1c342015-02-26 14:44:43 -08002148 if (bp == null) {
2149 Slog.w(PackageManagerService.TAG, "Unknown permission: " + name);
2150 XmlUtils.skipCurrentTag(parser);
2151 continue;
2152 }
2153
Svet Ganov8c7f7002015-05-07 10:48:44 -07002154 String grantedStr = parser.getAttributeValue(null, ATTR_GRANTED);
2155 final boolean granted = grantedStr == null
2156 || Boolean.parseBoolean(grantedStr);
2157
2158 String flagsStr = parser.getAttributeValue(null, ATTR_FLAGS);
2159 final int flags = (flagsStr != null)
2160 ? Integer.parseInt(flagsStr, 16) : 0;
2161
2162 if (granted) {
2163 if (permissionsState.grantInstallPermission(bp) ==
2164 PermissionsState.PERMISSION_OPERATION_FAILURE) {
2165 Slog.w(PackageManagerService.TAG, "Permission already added: " + name);
2166 XmlUtils.skipCurrentTag(parser);
2167 } else {
2168 permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
Philip P. Moltmann76597692019-03-02 13:18:41 -08002169 PackageManager.MASK_PERMISSION_FLAGS_ALL, flags);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002170 }
2171 } else {
2172 if (permissionsState.revokeInstallPermission(bp) ==
2173 PermissionsState.PERMISSION_OPERATION_FAILURE) {
2174 Slog.w(PackageManagerService.TAG, "Permission already added: " + name);
2175 XmlUtils.skipCurrentTag(parser);
2176 } else {
2177 permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
Philip P. Moltmann76597692019-03-02 13:18:41 -08002178 PackageManager.MASK_PERMISSION_FLAGS_ALL, flags);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002179 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002180 }
2181 } else {
2182 Slog.w(PackageManagerService.TAG, "Unknown element under <permissions>: "
2183 + parser.getName());
2184 XmlUtils.skipCurrentTag(parser);
2185 }
2186 }
2187 }
2188
Svet Ganov8c7f7002015-05-07 10:48:44 -07002189 void writePermissionsLPr(XmlSerializer serializer, List<PermissionState> permissionStates)
Svetoslavc6d1c342015-02-26 14:44:43 -08002190 throws IOException {
Svet Ganov8c7f7002015-05-07 10:48:44 -07002191 if (permissionStates.isEmpty()) {
Svetoslavc6d1c342015-02-26 14:44:43 -08002192 return;
2193 }
2194
2195 serializer.startTag(null, TAG_PERMISSIONS);
2196
Svet Ganov8c7f7002015-05-07 10:48:44 -07002197 for (PermissionState permissionState : permissionStates) {
Svetoslavc6d1c342015-02-26 14:44:43 -08002198 serializer.startTag(null, TAG_ITEM);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002199 serializer.attribute(null, ATTR_NAME, permissionState.getName());
2200 serializer.attribute(null, ATTR_GRANTED, String.valueOf(permissionState.isGranted()));
2201 serializer.attribute(null, ATTR_FLAGS, Integer.toHexString(permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08002202 serializer.endTag(null, TAG_ITEM);
2203 }
2204
2205 serializer.endTag(null, TAG_PERMISSIONS);
2206 }
2207
Svet Ganov354cd3c2015-12-17 11:35:04 -08002208 void writeChildPackagesLPw(XmlSerializer serializer, List<String> childPackageNames)
2209 throws IOException {
2210 if (childPackageNames == null) {
2211 return;
2212 }
2213 final int childCount = childPackageNames.size();
2214 for (int i = 0; i < childCount; i++) {
2215 String childPackageName = childPackageNames.get(i);
2216 serializer.startTag(null, TAG_CHILD_PACKAGE);
2217 serializer.attribute(null, ATTR_NAME, childPackageName);
2218 serializer.endTag(null, TAG_CHILD_PACKAGE);
2219 }
2220 }
2221
Svet Ganov67882122016-12-11 16:36:34 -08002222 void readUsesStaticLibLPw(XmlPullParser parser, PackageSetting outPs)
2223 throws IOException, XmlPullParserException {
2224 int outerDepth = parser.getDepth();
2225 int type;
2226 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2227 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2228 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2229 continue;
2230 }
2231 String libName = parser.getAttributeValue(null, ATTR_NAME);
2232 String libVersionStr = parser.getAttributeValue(null, ATTR_VERSION);
2233
Dianne Hackborn3accca02013-09-20 09:32:11 -07002234 long libVersion = -1;
Svet Ganov67882122016-12-11 16:36:34 -08002235 try {
Dianne Hackborn3accca02013-09-20 09:32:11 -07002236 libVersion = Long.parseLong(libVersionStr);
Svet Ganov67882122016-12-11 16:36:34 -08002237 } catch (NumberFormatException e) {
2238 // ignore
2239 }
2240
2241 if (libName != null && libVersion >= 0) {
2242 outPs.usesStaticLibraries = ArrayUtils.appendElement(String.class,
2243 outPs.usesStaticLibraries, libName);
Dianne Hackborn3accca02013-09-20 09:32:11 -07002244 outPs.usesStaticLibrariesVersions = ArrayUtils.appendLong(
Svet Ganov67882122016-12-11 16:36:34 -08002245 outPs.usesStaticLibrariesVersions, libVersion);
2246 }
2247
2248 XmlUtils.skipCurrentTag(parser);
2249 }
2250 }
2251
2252 void writeUsesStaticLibLPw(XmlSerializer serializer, String[] usesStaticLibraries,
Dianne Hackborn3accca02013-09-20 09:32:11 -07002253 long[] usesStaticLibraryVersions) throws IOException {
Svet Ganov67882122016-12-11 16:36:34 -08002254 if (ArrayUtils.isEmpty(usesStaticLibraries) || ArrayUtils.isEmpty(usesStaticLibraryVersions)
2255 || usesStaticLibraries.length != usesStaticLibraryVersions.length) {
2256 return;
2257 }
2258 final int libCount = usesStaticLibraries.length;
2259 for (int i = 0; i < libCount; i++) {
2260 final String libName = usesStaticLibraries[i];
Dianne Hackborn3accca02013-09-20 09:32:11 -07002261 final long libVersion = usesStaticLibraryVersions[i];
Svet Ganov67882122016-12-11 16:36:34 -08002262 serializer.startTag(null, TAG_USES_STATIC_LIB);
2263 serializer.attribute(null, ATTR_NAME, libName);
Dianne Hackborn3accca02013-09-20 09:32:11 -07002264 serializer.attribute(null, ATTR_VERSION, Long.toString(libVersion));
Svet Ganov67882122016-12-11 16:36:34 -08002265 serializer.endTag(null, TAG_USES_STATIC_LIB);
2266 }
2267 }
2268
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002269 // Note: assumed "stopped" field is already cleared in all packages.
Amith Yamasani483f3b02012-03-13 16:08:00 -07002270 // Legacy reader, used to read in the old file format after an upgrade. Not used after that.
Kenny Root447106f2011-03-23 11:00:15 -07002271 void readStoppedLPw() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002272 FileInputStream str = null;
2273 if (mBackupStoppedPackagesFilename.exists()) {
2274 try {
2275 str = new FileInputStream(mBackupStoppedPackagesFilename);
2276 mReadMessages.append("Reading from backup stopped packages file\n");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002277 PackageManagerService.reportSettingsProblem(Log.INFO,
2278 "Need to read from backup stopped packages file");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002279 if (mSettingsFilename.exists()) {
2280 // If both the backup and normal file exist, we
2281 // ignore the normal one since it might have been
2282 // corrupted.
2283 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
2284 + mStoppedPackagesFilename);
2285 mStoppedPackagesFilename.delete();
2286 }
2287 } catch (java.io.IOException e) {
2288 // We'll try for the normal settings file.
2289 }
2290 }
2291
2292 try {
2293 if (str == null) {
2294 if (!mStoppedPackagesFilename.exists()) {
2295 mReadMessages.append("No stopped packages file found\n");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002296 PackageManagerService.reportSettingsProblem(Log.INFO,
2297 "No stopped packages file file; assuming all started");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002298 // At first boot, make sure no packages are stopped.
2299 // We usually want to have third party apps initialize
2300 // in the stopped state, but not at first boot.
2301 for (PackageSetting pkg : mPackages.values()) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002302 pkg.setStopped(false, 0);
2303 pkg.setNotLaunched(false, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002304 }
2305 return;
2306 }
2307 str = new FileInputStream(mStoppedPackagesFilename);
2308 }
Kenny Root447106f2011-03-23 11:00:15 -07002309 final XmlPullParser parser = Xml.newPullParser();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002310 parser.setInput(str, null);
2311
2312 int type;
2313 while ((type=parser.next()) != XmlPullParser.START_TAG
2314 && type != XmlPullParser.END_DOCUMENT) {
2315 ;
2316 }
2317
2318 if (type != XmlPullParser.START_TAG) {
2319 mReadMessages.append("No start tag found in stopped packages file\n");
2320 PackageManagerService.reportSettingsProblem(Log.WARN,
2321 "No start tag found in package manager stopped packages");
2322 return;
2323 }
2324
2325 int outerDepth = parser.getDepth();
2326 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
2327 && (type != XmlPullParser.END_TAG
2328 || parser.getDepth() > outerDepth)) {
2329 if (type == XmlPullParser.END_TAG
2330 || type == XmlPullParser.TEXT) {
2331 continue;
2332 }
2333
2334 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002335 if (tagName.equals(TAG_PACKAGE)) {
2336 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002337 PackageSetting ps = mPackages.get(name);
2338 if (ps != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002339 ps.setStopped(true, 0);
2340 if ("1".equals(parser.getAttributeValue(null, ATTR_NOT_LAUNCHED))) {
2341 ps.setNotLaunched(true, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002342 }
2343 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002344 Slog.w(PackageManagerService.TAG,
Jeff Sharkeye06b4d12016-01-06 14:51:50 -07002345 "No package known for stopped package " + name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002346 }
2347 XmlUtils.skipCurrentTag(parser);
2348 } else {
2349 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
2350 + parser.getName());
2351 XmlUtils.skipCurrentTag(parser);
2352 }
2353 }
2354
2355 str.close();
2356
Amith Yamasani483f3b02012-03-13 16:08:00 -07002357 } catch (XmlPullParserException e) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002358 mReadMessages.append("Error reading: " + e.toString());
Amith Yamasani483f3b02012-03-13 16:08:00 -07002359 PackageManagerService.reportSettingsProblem(Log.ERROR,
2360 "Error reading stopped packages: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07002361 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
2362 e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002363
Amith Yamasani483f3b02012-03-13 16:08:00 -07002364 } catch (java.io.IOException e) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002365 mReadMessages.append("Error reading: " + e.toString());
2366 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07002367 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
2368 e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002369
2370 }
2371 }
2372
Kenny Root447106f2011-03-23 11:00:15 -07002373 void writeLPr() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002374 //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
2375
Dianne Hackborne17b4452018-01-10 13:15:40 -08002376 final long startTime = SystemClock.uptimeMillis();
2377
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002378 // Keep the old settings around until we know the new ones have
2379 // been successfully written.
2380 if (mSettingsFilename.exists()) {
2381 // Presence of backup settings file indicates that we failed
2382 // to persist settings earlier. So preserve the older
2383 // backup for future reference since the current settings
2384 // might have been corrupted.
2385 if (!mBackupSettingsFilename.exists()) {
2386 if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002387 Slog.wtf(PackageManagerService.TAG,
2388 "Unable to backup package manager settings, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002389 + " current changes will be lost at reboot");
2390 return;
2391 }
2392 } else {
2393 mSettingsFilename.delete();
2394 Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
2395 }
2396 }
2397
2398 mPastSignatures.clear();
2399
2400 try {
2401 FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
2402 BufferedOutputStream str = new BufferedOutputStream(fstr);
2403
2404 //XmlSerializer serializer = XmlUtils.serializerInstance();
2405 XmlSerializer serializer = new FastXmlSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01002406 serializer.setOutput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002407 serializer.startDocument(null, true);
2408 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
2409
2410 serializer.startTag(null, "packages");
2411
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002412 for (int i = 0; i < mVersion.size(); i++) {
2413 final String volumeUuid = mVersion.keyAt(i);
2414 final VersionInfo ver = mVersion.valueAt(i);
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002415
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002416 serializer.startTag(null, TAG_VERSION);
2417 XmlUtils.writeStringAttribute(serializer, ATTR_VOLUME_UUID, volumeUuid);
2418 XmlUtils.writeIntAttribute(serializer, ATTR_SDK_VERSION, ver.sdkVersion);
2419 XmlUtils.writeIntAttribute(serializer, ATTR_DATABASE_VERSION, ver.databaseVersion);
2420 XmlUtils.writeStringAttribute(serializer, ATTR_FINGERPRINT, ver.fingerprint);
2421 serializer.endTag(null, TAG_VERSION);
2422 }
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07002423
Kenny Root0aaa0d92011-09-12 16:42:55 -07002424 if (mVerifierDeviceIdentity != null) {
2425 serializer.startTag(null, "verifier");
2426 serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
2427 serializer.endTag(null, "verifier");
2428 }
2429
Jeff Sharkeyf5385772012-05-11 14:04:41 -07002430 if (mReadExternalStorageEnforced != null) {
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002431 serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
2432 serializer.attribute(
Jeff Sharkey5d32e772012-04-12 15:59:23 -07002433 null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0");
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002434 serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE);
2435 }
2436
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002437 serializer.startTag(null, "permission-trees");
Todd Kennedyc8423932017-10-05 08:58:36 -07002438 mPermissions.writePermissionTrees(serializer);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002439 serializer.endTag(null, "permission-trees");
2440
2441 serializer.startTag(null, "permissions");
Todd Kennedy0eb97382017-10-03 16:57:22 -07002442 mPermissions.writePermissions(serializer);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002443 serializer.endTag(null, "permissions");
2444
Kenny Root447106f2011-03-23 11:00:15 -07002445 for (final PackageSetting pkg : mPackages.values()) {
2446 writePackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002447 }
2448
Kenny Root447106f2011-03-23 11:00:15 -07002449 for (final PackageSetting pkg : mDisabledSysPackages.values()) {
2450 writeDisabledSysPackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002451 }
2452
Kenny Root447106f2011-03-23 11:00:15 -07002453 for (final SharedUserSetting usr : mSharedUsers.values()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002454 serializer.startTag(null, "shared-user");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002455 serializer.attribute(null, ATTR_NAME, usr.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002456 serializer.attribute(null, "userId",
2457 Integer.toString(usr.userId));
2458 usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002459 writePermissionsLPr(serializer, usr.getPermissionsState()
2460 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002461 serializer.endTag(null, "shared-user");
2462 }
2463
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002464 if (mRenamedPackages.size() > 0) {
Andy McFadden2f362292012-01-20 14:43:38 -08002465 for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002466 serializer.startTag(null, "renamed-package");
2467 serializer.attribute(null, "new", e.getKey());
2468 serializer.attribute(null, "old", e.getValue());
2469 serializer.endTag(null, "renamed-package");
2470 }
2471 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002472
Christopher Tate6038d152015-06-17 13:07:46 -07002473 final int numIVIs = mRestoredIntentFilterVerifications.size();
2474 if (numIVIs > 0) {
2475 if (DEBUG_DOMAIN_VERIFICATION) {
2476 Slog.i(TAG, "Writing restored-ivi entries to packages.xml");
2477 }
2478 serializer.startTag(null, "restored-ivi");
2479 for (int i = 0; i < numIVIs; i++) {
2480 IntentFilterVerificationInfo ivi = mRestoredIntentFilterVerifications.valueAt(i);
2481 writeDomainVerificationsLPr(serializer, ivi);
2482 }
2483 serializer.endTag(null, "restored-ivi");
2484 } else {
2485 if (DEBUG_DOMAIN_VERIFICATION) {
2486 Slog.i(TAG, " no restored IVI entries to write");
2487 }
2488 }
2489
dcashman55b10782014-04-09 14:20:38 -07002490 mKeySetManagerService.writeKeySetManagerServiceLPr(serializer);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002491
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002492 serializer.endTag(null, "packages");
2493
2494 serializer.endDocument();
2495
2496 str.flush();
2497 FileUtils.sync(fstr);
2498 str.close();
2499
2500 // New settings successfully written, old ones are no longer
2501 // needed.
2502 mBackupSettingsFilename.delete();
2503 FileUtils.setPermissions(mSettingsFilename.toString(),
2504 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08002505 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002506 -1, -1);
2507
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002508 writeKernelMappingLPr();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002509 writePackageListLPr();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002510 writeAllUsersPackageRestrictionsLPr();
Svetoslavc6d1c342015-02-26 14:44:43 -08002511 writeAllRuntimePermissionsLPr();
Dianne Hackborne17b4452018-01-10 13:15:40 -08002512 com.android.internal.logging.EventLogTags.writeCommitSysConfigFile(
2513 "package", SystemClock.uptimeMillis() - startTime);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002514 return;
2515
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002516 } catch(java.io.IOException e) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002517 Slog.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002518 + "current changes will be lost at reboot", e);
2519 }
2520 // Clean up partially written files
2521 if (mSettingsFilename.exists()) {
2522 if (!mSettingsFilename.delete()) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002523 Slog.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
Amith Yamasani483f3b02012-03-13 16:08:00 -07002524 + mSettingsFilename);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002525 }
2526 }
2527 //Debug.stopMethodTracing();
2528 }
2529
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002530 private void writeKernelRemoveUserLPr(int userId) {
2531 if (mKernelMappingFilename == null) return;
2532
2533 File removeUserIdFile = new File(mKernelMappingFilename, "remove_userid");
2534 if (DEBUG_KERNEL) Slog.d(TAG, "Writing " + userId + " to " + removeUserIdFile
2535 .getAbsolutePath());
2536 writeIntToFile(removeUserIdFile, userId);
2537 }
2538
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002539 void writeKernelMappingLPr() {
2540 if (mKernelMappingFilename == null) return;
2541
2542 final String[] known = mKernelMappingFilename.list();
2543 final ArraySet<String> knownSet = new ArraySet<>(known.length);
2544 for (String name : known) {
2545 knownSet.add(name);
2546 }
2547
2548 for (final PackageSetting ps : mPackages.values()) {
2549 // Package is actively claimed
2550 knownSet.remove(ps.name);
2551 writeKernelMappingLPr(ps);
2552 }
2553
2554 // Remove any unclaimed mappings
2555 for (int i = 0; i < knownSet.size(); i++) {
2556 final String name = knownSet.valueAt(i);
2557 if (DEBUG_KERNEL) Slog.d(TAG, "Dropping mapping " + name);
2558
2559 mKernelMapping.remove(name);
Jeff Sharkey800efcc2016-02-25 17:08:11 -07002560 new File(mKernelMappingFilename, name).delete();
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002561 }
2562 }
2563
2564 void writeKernelMappingLPr(PackageSetting ps) {
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002565 if (mKernelMappingFilename == null || ps == null || ps.name == null) return;
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002566
Sudheer Shanka12783cb2018-10-18 08:53:02 -07002567 writeKernelMappingLPr(ps.name, ps.appId, ps.getNotInstalledUserIds());
Sudheer Shanka12783cb2018-10-18 08:53:02 -07002568 }
2569
2570 void writeKernelMappingLPr(String name, int appId, int[] excludedUserIds) {
2571 KernelPackageState cur = mKernelMapping.get(name);
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002572 final boolean firstTime = cur == null;
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002573 final boolean userIdsChanged = firstTime
2574 || !Arrays.equals(excludedUserIds, cur.excludedUserIds);
2575
2576 // Package directory
Sudheer Shanka12783cb2018-10-18 08:53:02 -07002577 final File dir = new File(mKernelMappingFilename, name);
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002578
2579 if (firstTime) {
2580 dir.mkdir();
2581 // Create a new mapping state
2582 cur = new KernelPackageState();
Sudheer Shanka12783cb2018-10-18 08:53:02 -07002583 mKernelMapping.put(name, cur);
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002584 }
2585
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002586 // If mapping is incorrect or non-existent, write the appid file
Sudheer Shanka12783cb2018-10-18 08:53:02 -07002587 if (cur.appId != appId) {
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002588 final File appIdFile = new File(dir, "appid");
Sudheer Shanka12783cb2018-10-18 08:53:02 -07002589 writeIntToFile(appIdFile, appId);
2590 if (DEBUG_KERNEL) Slog.d(TAG, "Mapping " + name + " to " + appId);
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002591 }
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002592
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002593 if (userIdsChanged) {
2594 // Build the exclusion list -- the ids to add to the exclusion list
2595 for (int i = 0; i < excludedUserIds.length; i++) {
2596 if (cur.excludedUserIds == null || !ArrayUtils.contains(cur.excludedUserIds,
2597 excludedUserIds[i])) {
2598 writeIntToFile(new File(dir, "excluded_userids"), excludedUserIds[i]);
2599 if (DEBUG_KERNEL) Slog.d(TAG, "Writing " + excludedUserIds[i] + " to "
Sudheer Shanka12783cb2018-10-18 08:53:02 -07002600 + name + "/excluded_userids");
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002601 }
2602 }
2603 // Build the inclusion list -- the ids to remove from the exclusion list
2604 if (cur.excludedUserIds != null) {
2605 for (int i = 0; i < cur.excludedUserIds.length; i++) {
2606 if (!ArrayUtils.contains(excludedUserIds, cur.excludedUserIds[i])) {
2607 writeIntToFile(new File(dir, "clear_userid"),
2608 cur.excludedUserIds[i]);
2609 if (DEBUG_KERNEL) Slog.d(TAG, "Writing " + cur.excludedUserIds[i] + " to "
Sudheer Shanka12783cb2018-10-18 08:53:02 -07002610 + name + "/clear_userid");
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002611
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002612 }
2613 }
2614 }
2615 cur.excludedUserIds = excludedUserIds;
2616 }
2617 }
2618
2619 private void writeIntToFile(File file, int value) {
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002620 try {
Narayan Kamath6d051fc2016-11-22 20:20:00 +00002621 FileUtils.bytesToFile(file.getAbsolutePath(),
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002622 Integer.toString(value).getBytes(StandardCharsets.US_ASCII));
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002623 } catch (IOException ignored) {
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002624 Slog.w(TAG, "Couldn't write " + value + " to " + file.getAbsolutePath());
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002625 }
2626 }
2627
Jeff Sharkey91edde22015-05-20 12:04:42 -07002628 void writePackageListLPr() {
2629 writePackageListLPr(-1);
2630 }
2631
2632 void writePackageListLPr(int creatingUserId) {
Florian Mayerd4db9972019-03-21 13:57:42 +00002633 String filename = mPackageListFilename.getAbsolutePath();
2634 String ctx = SELinux.fileSelabelLookup(filename);
2635 if (ctx == null) {
2636 Slog.wtf(TAG, "Failed to get SELinux context for " +
2637 mPackageListFilename.getAbsolutePath());
2638 }
2639
2640 if (!SELinux.setFSCreateContext(ctx)) {
2641 Slog.wtf(TAG, "Failed to set packages.list SELinux context");
2642 }
2643 try {
2644 writePackageListLPrInternal(creatingUserId);
2645 } finally {
2646 SELinux.setFSCreateContext(null);
2647 }
2648 }
2649
2650 private void writePackageListLPrInternal(int creatingUserId) {
Jeff Sharkey91edde22015-05-20 12:04:42 -07002651 // Only derive GIDs for active users (not dying)
Amith Yamasanie7446692019-04-19 13:39:51 -07002652 final List<UserInfo> users = getUsers(UserManagerService.getInstance(), true);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002653 int[] userIds = new int[users.size()];
2654 for (int i = 0; i < userIds.length; i++) {
2655 userIds[i] = users.get(i).id;
2656 }
2657 if (creatingUserId != -1) {
2658 userIds = ArrayUtils.appendInt(userIds, creatingUserId);
2659 }
2660
2661 // Write package list file now, use a JournaledFile.
2662 File tempFile = new File(mPackageListFilename.getAbsolutePath() + ".tmp");
2663 JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
2664
2665 final File writeTarget = journal.chooseForWrite();
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002666 FileOutputStream fstr;
2667 BufferedWriter writer = null;
Jeff Sharkey91edde22015-05-20 12:04:42 -07002668 try {
2669 fstr = new FileOutputStream(writeTarget);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002670 writer = new BufferedWriter(new OutputStreamWriter(fstr, Charset.defaultCharset()));
Jeff Sharkey91edde22015-05-20 12:04:42 -07002671 FileUtils.setPermissions(fstr.getFD(), 0640, SYSTEM_UID, PACKAGE_INFO_GID);
2672
2673 StringBuilder sb = new StringBuilder();
2674 for (final PackageSetting pkg : mPackages.values()) {
Jeff Sharkeye17ac152015-11-06 22:40:29 -08002675 if (pkg.pkg == null || pkg.pkg.applicationInfo == null
2676 || pkg.pkg.applicationInfo.dataDir == null) {
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002677 if (!"android".equals(pkg.name)) {
2678 Slog.w(TAG, "Skipping " + pkg + " due to missing metadata");
2679 }
Jeff Sharkey91edde22015-05-20 12:04:42 -07002680 continue;
2681 }
2682
2683 final ApplicationInfo ai = pkg.pkg.applicationInfo;
Jeff Sharkeye84bdd32016-02-08 12:16:00 -07002684 final String dataPath = ai.dataDir;
Jeff Sharkey91edde22015-05-20 12:04:42 -07002685 final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
2686 final int[] gids = pkg.getPermissionsState().computeGids(userIds);
2687
2688 // Avoid any application that has a space in its path.
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002689 if (dataPath.indexOf(' ') >= 0)
Jeff Sharkey91edde22015-05-20 12:04:42 -07002690 continue;
2691
2692 // we store on each line the following information for now:
2693 //
2694 // pkgName - package name
2695 // userId - application-specific user id
2696 // debugFlag - 0 or 1 if the package is debuggable.
2697 // dataPath - path to package's data path
2698 // seinfo - seinfo label for the app (assigned at install time)
2699 // gids - supplementary gids this app launches with
Yabin Cui1ced4ce2019-01-10 23:23:00 +00002700 // profileableFromShellFlag - 0 or 1 if the package is profileable from shell.
Florian Mayeraedbca82019-01-28 14:40:34 +00002701 // longVersionCode - integer version of the package.
Jeff Sharkey91edde22015-05-20 12:04:42 -07002702 //
2703 // NOTE: We prefer not to expose all ApplicationInfo flags for now.
2704 //
2705 // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
2706 // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
Yabin Cui1ced4ce2019-01-10 23:23:00 +00002707 // system/core/libpackagelistparser
Jeff Sharkey91edde22015-05-20 12:04:42 -07002708 //
2709 sb.setLength(0);
2710 sb.append(ai.packageName);
2711 sb.append(" ");
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002712 sb.append(ai.uid);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002713 sb.append(isDebug ? " 1 " : " 0 ");
2714 sb.append(dataPath);
2715 sb.append(" ");
Todd Kennedybe0b8892017-02-15 14:13:52 -08002716 sb.append(ai.seInfo);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002717 sb.append(" ");
2718 if (gids != null && gids.length > 0) {
2719 sb.append(gids[0]);
2720 for (int i = 1; i < gids.length; i++) {
2721 sb.append(",");
2722 sb.append(gids[i]);
2723 }
2724 } else {
2725 sb.append("none");
2726 }
Yabin Cui1ced4ce2019-01-10 23:23:00 +00002727 sb.append(" ");
2728 sb.append(ai.isProfileableByShell() ? "1" : "0");
Florian Mayeraedbca82019-01-28 14:40:34 +00002729 sb.append(" ");
2730 sb.append(String.valueOf(ai.longVersionCode));
Jeff Sharkey91edde22015-05-20 12:04:42 -07002731 sb.append("\n");
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002732 writer.append(sb);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002733 }
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002734 writer.flush();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002735 FileUtils.sync(fstr);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002736 writer.close();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002737 journal.commit();
2738 } catch (Exception e) {
2739 Slog.wtf(TAG, "Failed to write packages.list", e);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002740 IoUtils.closeQuietly(writer);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002741 journal.rollback();
2742 }
2743 }
2744
Kenny Root447106f2011-03-23 11:00:15 -07002745 void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002746 throws java.io.IOException {
2747 serializer.startTag(null, "updated-package");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002748 serializer.attribute(null, ATTR_NAME, pkg.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002749 if (pkg.realName != null) {
2750 serializer.attribute(null, "realName", pkg.realName);
2751 }
2752 serializer.attribute(null, "codePath", pkg.codePathString);
2753 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
2754 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
2755 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
2756 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
2757 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
2758 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
2759 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002760 if (pkg.legacyNativeLibraryPathString != null) {
2761 serializer.attribute(null, "nativeLibraryPath", pkg.legacyNativeLibraryPathString);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002762 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002763 if (pkg.primaryCpuAbiString != null) {
2764 serializer.attribute(null, "primaryCpuAbi", pkg.primaryCpuAbiString);
Narayan Kamath9e289d72014-04-10 09:26:59 +00002765 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002766 if (pkg.secondaryCpuAbiString != null) {
2767 serializer.attribute(null, "secondaryCpuAbi", pkg.secondaryCpuAbiString);
2768 }
Narayan Kamath4903f642014-08-11 13:33:45 +01002769 if (pkg.cpuAbiOverrideString != null) {
2770 serializer.attribute(null, "cpuAbiOverride", pkg.cpuAbiOverrideString);
2771 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002772
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002773 if (pkg.sharedUser == null) {
Amith Yamasani13593602012-03-22 16:16:17 -07002774 serializer.attribute(null, "userId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002775 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07002776 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002777 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002778
Svet Ganov354cd3c2015-12-17 11:35:04 -08002779 if (pkg.parentPackageName != null) {
2780 serializer.attribute(null, "parentPackageName", pkg.parentPackageName);
2781 }
2782
2783 writeChildPackagesLPw(serializer, pkg.childPackageNames);
2784
Svet Ganov67882122016-12-11 16:36:34 -08002785 writeUsesStaticLibLPw(serializer, pkg.usesStaticLibraries, pkg.usesStaticLibrariesVersions);
2786
Svetoslavc6d1c342015-02-26 14:44:43 -08002787 // If this is a shared user, the permissions will be written there.
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002788 if (pkg.sharedUser == null) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07002789 writePermissionsLPr(serializer, pkg.getPermissionsState()
2790 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002791 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002792
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002793 serializer.endTag(null, "updated-package");
2794 }
2795
Kenny Root447106f2011-03-23 11:00:15 -07002796 void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002797 throws java.io.IOException {
2798 serializer.startTag(null, "package");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002799 serializer.attribute(null, ATTR_NAME, pkg.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002800 if (pkg.realName != null) {
2801 serializer.attribute(null, "realName", pkg.realName);
2802 }
2803 serializer.attribute(null, "codePath", pkg.codePathString);
2804 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
2805 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
2806 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002807
2808 if (pkg.legacyNativeLibraryPathString != null) {
2809 serializer.attribute(null, "nativeLibraryPath", pkg.legacyNativeLibraryPathString);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002810 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002811 if (pkg.primaryCpuAbiString != null) {
2812 serializer.attribute(null, "primaryCpuAbi", pkg.primaryCpuAbiString);
Narayan Kamath9e289d72014-04-10 09:26:59 +00002813 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002814 if (pkg.secondaryCpuAbiString != null) {
2815 serializer.attribute(null, "secondaryCpuAbi", pkg.secondaryCpuAbiString);
2816 }
Narayan Kamath4903f642014-08-11 13:33:45 +01002817 if (pkg.cpuAbiOverrideString != null) {
2818 serializer.attribute(null, "cpuAbiOverride", pkg.cpuAbiOverrideString);
2819 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002820
Alex Klyubinb9f8a522015-02-03 11:12:59 -08002821 serializer.attribute(null, "publicFlags", Integer.toString(pkg.pkgFlags));
2822 serializer.attribute(null, "privateFlags", Integer.toString(pkg.pkgPrivateFlags));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002823 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
2824 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
2825 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
2826 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
2827 if (pkg.sharedUser == null) {
Amith Yamasani13593602012-03-22 16:16:17 -07002828 serializer.attribute(null, "userId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002829 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07002830 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002831 }
2832 if (pkg.uidError) {
2833 serializer.attribute(null, "uidError", "true");
2834 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002835 if (pkg.installerPackageName != null) {
2836 serializer.attribute(null, "installer", pkg.installerPackageName);
2837 }
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07002838 if (pkg.isOrphaned) {
2839 serializer.attribute(null, "isOrphaned", "true");
2840 }
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07002841 if (pkg.volumeUuid != null) {
2842 serializer.attribute(null, "volumeUuid", pkg.volumeUuid);
2843 }
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07002844 if (pkg.categoryHint != ApplicationInfo.CATEGORY_UNDEFINED) {
2845 serializer.attribute(null, "categoryHint",
2846 Integer.toString(pkg.categoryHint));
2847 }
Svet Ganov354cd3c2015-12-17 11:35:04 -08002848 if (pkg.parentPackageName != null) {
2849 serializer.attribute(null, "parentPackageName", pkg.parentPackageName);
2850 }
Todd Kennedyab532892017-03-08 14:19:49 -08002851 if (pkg.updateAvailable) {
2852 serializer.attribute(null, "updateAvailable", "true");
2853 }
Svet Ganov354cd3c2015-12-17 11:35:04 -08002854
2855 writeChildPackagesLPw(serializer, pkg.childPackageNames);
2856
Svet Ganov67882122016-12-11 16:36:34 -08002857 writeUsesStaticLibLPw(serializer, pkg.usesStaticLibraries, pkg.usesStaticLibrariesVersions);
2858
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002859 pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002860
2861 writePermissionsLPr(serializer, pkg.getPermissionsState()
2862 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002863
dcashman8c04fac2015-03-23 11:39:42 -07002864 writeSigningKeySetLPr(serializer, pkg.keySetData);
dcashman55b10782014-04-09 14:20:38 -07002865 writeUpgradeKeySetsLPr(serializer, pkg.keySetData);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002866 writeKeySetAliasesLPr(serializer, pkg.keySetData);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002867 writeDomainVerificationsLPr(serializer, pkg.verificationInfo);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002868
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002869 serializer.endTag(null, "package");
2870 }
2871
dcashman8c04fac2015-03-23 11:39:42 -07002872 void writeSigningKeySetLPr(XmlSerializer serializer,
Geremy Condraf1bcca82013-01-07 22:35:24 -08002873 PackageKeySetData data) throws IOException {
dcashman8c04fac2015-03-23 11:39:42 -07002874 serializer.startTag(null, "proper-signing-keyset");
2875 serializer.attribute(null, "identifier",
2876 Long.toString(data.getProperSigningKeySet()));
2877 serializer.endTag(null, "proper-signing-keyset");
dcashman55b10782014-04-09 14:20:38 -07002878 }
2879
2880 void writeUpgradeKeySetsLPr(XmlSerializer serializer,
2881 PackageKeySetData data) throws IOException {
2882 if (data.isUsingUpgradeKeySets()) {
2883 for (long id : data.getUpgradeKeySets()) {
2884 serializer.startTag(null, "upgrade-keyset");
2885 serializer.attribute(null, "identifier", Long.toString(id));
2886 serializer.endTag(null, "upgrade-keyset");
2887 }
Geremy Condraf1bcca82013-01-07 22:35:24 -08002888 }
2889 }
2890
2891 void writeKeySetAliasesLPr(XmlSerializer serializer,
2892 PackageKeySetData data) throws IOException {
2893 for (Map.Entry<String, Long> e: data.getAliases().entrySet()) {
2894 serializer.startTag(null, "defined-keyset");
2895 serializer.attribute(null, "alias", e.getKey());
2896 serializer.attribute(null, "identifier", Long.toString(e.getValue()));
2897 serializer.endTag(null, "defined-keyset");
2898 }
2899 }
2900
Todd Kennedy91a39d12017-09-27 12:37:04 -07002901 void writePermissionLPr(XmlSerializer serializer, BasePermission bp) throws IOException {
2902 bp.writeLPr(serializer);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002903 }
2904
Xiaohui Chen594f2082015-08-18 11:04:20 -07002905 boolean readLPw(@NonNull List<UserInfo> users) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002906 FileInputStream str = null;
2907 if (mBackupSettingsFilename.exists()) {
2908 try {
2909 str = new FileInputStream(mBackupSettingsFilename);
2910 mReadMessages.append("Reading from backup settings file\n");
2911 PackageManagerService.reportSettingsProblem(Log.INFO,
2912 "Need to read from backup settings file");
2913 if (mSettingsFilename.exists()) {
2914 // If both the backup and settings file exist, we
2915 // ignore the settings since it might have been
2916 // corrupted.
2917 Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
2918 + mSettingsFilename);
2919 mSettingsFilename.delete();
2920 }
2921 } catch (java.io.IOException e) {
2922 // We'll try for the normal settings file.
2923 }
2924 }
2925
Kenny Root447106f2011-03-23 11:00:15 -07002926 mPendingPackages.clear();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002927 mPastSignatures.clear();
dcashman8c04fac2015-03-23 11:39:42 -07002928 mKeySetRefs.clear();
Sudheer Shanka29283372016-04-04 20:56:27 -07002929 mInstallerPackages.clear();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002930
2931 try {
2932 if (str == null) {
2933 if (!mSettingsFilename.exists()) {
2934 mReadMessages.append("No settings file found\n");
2935 PackageManagerService.reportSettingsProblem(Log.INFO,
2936 "No settings file; creating initial state");
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002937 // It's enough to just touch version details to create them
2938 // with default values
longhaibc62b212016-01-29 14:22:22 +08002939 findOrCreateVersion(StorageManager.UUID_PRIVATE_INTERNAL).forceCurrent();
2940 findOrCreateVersion(StorageManager.UUID_PRIMARY_PHYSICAL).forceCurrent();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002941 return false;
2942 }
2943 str = new FileInputStream(mSettingsFilename);
2944 }
2945 XmlPullParser parser = Xml.newPullParser();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01002946 parser.setInput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002947
2948 int type;
2949 while ((type = parser.next()) != XmlPullParser.START_TAG
2950 && type != XmlPullParser.END_DOCUMENT) {
2951 ;
2952 }
2953
2954 if (type != XmlPullParser.START_TAG) {
2955 mReadMessages.append("No start tag found in settings file\n");
2956 PackageManagerService.reportSettingsProblem(Log.WARN,
2957 "No start tag found in package manager settings");
Dianne Hackborn8d051722014-10-01 14:59:58 -07002958 Slog.wtf(PackageManagerService.TAG,
Dianne Hackborn58f42a52011-10-10 13:46:34 -07002959 "No start tag found in package manager settings");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002960 return false;
2961 }
2962
2963 int outerDepth = parser.getDepth();
2964 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2965 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2966 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2967 continue;
2968 }
2969
2970 String tagName = parser.getName();
2971 if (tagName.equals("package")) {
Kenny Root447106f2011-03-23 11:00:15 -07002972 readPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002973 } else if (tagName.equals("permissions")) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07002974 mPermissions.readPermissions(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002975 } else if (tagName.equals("permission-trees")) {
Todd Kennedyc8423932017-10-05 08:58:36 -07002976 mPermissions.readPermissionTrees(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002977 } else if (tagName.equals("shared-user")) {
Kenny Root447106f2011-03-23 11:00:15 -07002978 readSharedUserLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002979 } else if (tagName.equals("preferred-packages")) {
2980 // no longer used.
2981 } else if (tagName.equals("preferred-activities")) {
Dianne Hackborn63092712012-10-07 14:45:35 -07002982 // Upgrading from old single-user implementation;
2983 // these are the preferred activities for user 0.
2984 readPreferredActivitiesLPw(parser, 0);
Sander Alewijnseaf597622014-03-20 18:44:57 +00002985 } else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) {
Sander Alewijnsef475ca32014-02-17 15:13:58 +00002986 // TODO: check whether this is okay! as it is very
2987 // similar to how preferred-activities are treated
2988 readPersistentPreferredActivitiesLPw(parser, 0);
Nicolas Prevot29762c32014-07-29 18:51:32 +01002989 } else if (tagName.equals(TAG_CROSS_PROFILE_INTENT_FILTERS)) {
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002990 // TODO: check whether this is okay! as it is very
2991 // similar to how preferred-activities are treated
Nicolas Prevot81948992014-05-16 18:25:26 +01002992 readCrossProfileIntentFiltersLPw(parser, 0);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002993 } else if (tagName.equals(TAG_DEFAULT_BROWSER)) {
2994 readDefaultAppsLPw(parser, 0);
2995 } else if (tagName.equals("updated-package")) {
Kenny Root447106f2011-03-23 11:00:15 -07002996 readDisabledSysPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002997 } else if (tagName.equals("renamed-package")) {
2998 String nname = parser.getAttributeValue(null, "new");
2999 String oname = parser.getAttributeValue(null, "old");
3000 if (nname != null && oname != null) {
3001 mRenamedPackages.put(nname, oname);
3002 }
Christopher Tate6038d152015-06-17 13:07:46 -07003003 } else if (tagName.equals("restored-ivi")) {
3004 readRestoredIntentFilterVerifications(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003005 } else if (tagName.equals("last-platform-version")) {
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003006 // Upgrade from older XML schema
3007 final VersionInfo internal = findOrCreateVersion(
3008 StorageManager.UUID_PRIVATE_INTERNAL);
3009 final VersionInfo external = findOrCreateVersion(
3010 StorageManager.UUID_PRIMARY_PHYSICAL);
Svet Ganovadc1cf42015-06-15 16:36:24 -07003011
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003012 internal.sdkVersion = XmlUtils.readIntAttribute(parser, "internal", 0);
3013 external.sdkVersion = XmlUtils.readIntAttribute(parser, "external", 0);
3014 internal.fingerprint = external.fingerprint =
3015 XmlUtils.readStringAttribute(parser, "fingerprint");
3016
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07003017 } else if (tagName.equals("database-version")) {
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003018 // Upgrade from older XML schema
3019 final VersionInfo internal = findOrCreateVersion(
3020 StorageManager.UUID_PRIVATE_INTERNAL);
3021 final VersionInfo external = findOrCreateVersion(
3022 StorageManager.UUID_PRIMARY_PHYSICAL);
3023
3024 internal.databaseVersion = XmlUtils.readIntAttribute(parser, "internal", 0);
3025 external.databaseVersion = XmlUtils.readIntAttribute(parser, "external", 0);
3026
Kenny Root0aaa0d92011-09-12 16:42:55 -07003027 } else if (tagName.equals("verifier")) {
3028 final String deviceIdentity = parser.getAttributeValue(null, "device");
3029 try {
3030 mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
3031 } catch (IllegalArgumentException e) {
3032 Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
3033 + e.getMessage());
3034 }
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07003035 } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) {
3036 final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT);
Todd Kennedy91a39d12017-09-27 12:37:04 -07003037 mReadExternalStorageEnforced =
3038 "1".equals(enforcement) ? Boolean.TRUE : Boolean.FALSE;
Geremy Condraf1bcca82013-01-07 22:35:24 -08003039 } else if (tagName.equals("keyset-settings")) {
dcashman8c04fac2015-03-23 11:39:42 -07003040 mKeySetManagerService.readKeySetsLPw(parser, mKeySetRefs);
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003041 } else if (TAG_VERSION.equals(tagName)) {
3042 final String volumeUuid = XmlUtils.readStringAttribute(parser,
3043 ATTR_VOLUME_UUID);
3044 final VersionInfo ver = findOrCreateVersion(volumeUuid);
3045 ver.sdkVersion = XmlUtils.readIntAttribute(parser, ATTR_SDK_VERSION);
khmel80bdce02018-01-02 16:39:05 -08003046 ver.databaseVersion = XmlUtils.readIntAttribute(parser, ATTR_DATABASE_VERSION);
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003047 ver.fingerprint = XmlUtils.readStringAttribute(parser, ATTR_FINGERPRINT);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003048 } else {
3049 Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
3050 + parser.getName());
3051 XmlUtils.skipCurrentTag(parser);
3052 }
3053 }
3054
3055 str.close();
3056
3057 } catch (XmlPullParserException e) {
3058 mReadMessages.append("Error reading: " + e.toString());
3059 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07003060 Slog.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003061
3062 } catch (java.io.IOException e) {
3063 mReadMessages.append("Error reading: " + e.toString());
3064 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07003065 Slog.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
Amith Yamasani258848d2012-08-10 17:06:33 -07003066 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003067
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003068 // If the build is setup to drop runtime permissions
3069 // on update drop the files before loading them.
3070 if (PackageManagerService.CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE) {
3071 final VersionInfo internal = getInternalVersion();
3072 if (!Build.FINGERPRINT.equals(internal.fingerprint)) {
Xiaohui Chen594f2082015-08-18 11:04:20 -07003073 for (UserInfo user : users) {
3074 mRuntimePermissionsPersistence.deleteUserRuntimePermissionsFile(user.id);
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003075 }
3076 }
3077 }
3078
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003079 final int N = mPendingPackages.size();
dcashman8c04fac2015-03-23 11:39:42 -07003080
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003081 for (int i = 0; i < N; i++) {
Todd Kennedy788c8422016-08-10 10:52:34 -07003082 final PackageSetting p = mPendingPackages.get(i);
3083 final int sharedUserId = p.getSharedUserId();
Patrick Baumann649a8572018-11-20 11:16:58 -08003084 final Object idObj = getSettingLPr(sharedUserId);
Todd Kennedy788c8422016-08-10 10:52:34 -07003085 if (idObj instanceof SharedUserSetting) {
3086 final SharedUserSetting sharedUser = (SharedUserSetting) idObj;
3087 p.sharedUser = sharedUser;
3088 p.appId = sharedUser.userId;
3089 addPackageSettingLPw(p, sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003090 } else if (idObj != null) {
Todd Kennedy788c8422016-08-10 10:52:34 -07003091 String msg = "Bad package setting: package " + p.name + " has shared uid "
3092 + sharedUserId + " that is not a shared uid\n";
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003093 mReadMessages.append(msg);
3094 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
3095 } else {
Todd Kennedy788c8422016-08-10 10:52:34 -07003096 String msg = "Bad package setting: package " + p.name + " has shared uid "
3097 + sharedUserId + " that is not defined\n";
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003098 mReadMessages.append(msg);
3099 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
3100 }
3101 }
3102 mPendingPackages.clear();
3103
Amith Yamasanif031f232012-10-26 15:35:21 -07003104 if (mBackupStoppedPackagesFilename.exists()
3105 || mStoppedPackagesFilename.exists()) {
3106 // Read old file
3107 readStoppedLPw();
3108 mBackupStoppedPackagesFilename.delete();
3109 mStoppedPackagesFilename.delete();
3110 // Migrate to new file format
Xiaohui Chen594f2082015-08-18 11:04:20 -07003111 writePackageRestrictionsLPr(UserHandle.USER_SYSTEM);
Amith Yamasanif031f232012-10-26 15:35:21 -07003112 } else {
Xiaohui Chen594f2082015-08-18 11:04:20 -07003113 for (UserInfo user : users) {
3114 readPackageRestrictionsLPr(user.id);
Amith Yamasanif031f232012-10-26 15:35:21 -07003115 }
3116 }
3117
Xiaohui Chen594f2082015-08-18 11:04:20 -07003118 for (UserInfo user : users) {
3119 mRuntimePermissionsPersistence.readStateForUserSyncLPr(user.id);
Svet Ganovadc1cf42015-06-15 16:36:24 -07003120 }
3121
Kenny Root1d1b4892011-04-08 14:25:24 -07003122 /*
3123 * Make sure all the updated system packages have their shared users
3124 * associated with them.
3125 */
3126 final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
3127 while (disabledIt.hasNext()) {
3128 final PackageSetting disabledPs = disabledIt.next();
Patrick Baumann649a8572018-11-20 11:16:58 -08003129 final Object id = getSettingLPr(disabledPs.appId);
Kenny Root1d1b4892011-04-08 14:25:24 -07003130 if (id != null && id instanceof SharedUserSetting) {
3131 disabledPs.sharedUser = (SharedUserSetting) id;
3132 }
3133 }
3134
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003135 mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
3136 + mSharedUsers.size() + " shared uids\n");
3137
Jeff Sharkey2271ba32016-02-01 17:57:08 -07003138 writeKernelMappingLPr();
3139
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003140 return true;
3141 }
3142
Todd Kennedycf827032018-07-03 13:17:22 -07003143 void applyDefaultPreferredAppsLPw(int userId) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003144 // First pull data from any pre-installed apps.
Todd Kennedycf827032018-07-03 13:17:22 -07003145 final PackageManagerInternal pmInternal =
3146 LocalServices.getService(PackageManagerInternal.class);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003147 for (PackageSetting ps : mPackages.values()) {
3148 if ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0 && ps.pkg != null
3149 && ps.pkg.preferredActivityFilters != null) {
3150 ArrayList<PackageParser.ActivityIntentInfo> intents
3151 = ps.pkg.preferredActivityFilters;
3152 for (int i=0; i<intents.size(); i++) {
3153 PackageParser.ActivityIntentInfo aii = intents.get(i);
Todd Kennedycf827032018-07-03 13:17:22 -07003154 applyDefaultPreferredActivityLPw(pmInternal, aii, new ComponentName(
3155 ps.name, aii.activity.className), userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003156 }
3157 }
3158 }
3159
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07003160 // Read preferred apps from .../etc/preferred-apps directory.
3161 File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps");
3162 if (!preferredDir.exists() || !preferredDir.isDirectory()) {
3163 return;
3164 }
3165 if (!preferredDir.canRead()) {
3166 Slog.w(TAG, "Directory " + preferredDir + " cannot be read");
3167 return;
3168 }
3169
3170 // Iterate over the files in the directory and scan .xml files
3171 for (File f : preferredDir.listFiles()) {
3172 if (!f.getPath().endsWith(".xml")) {
3173 Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring");
3174 continue;
3175 }
3176 if (!f.canRead()) {
3177 Slog.w(TAG, "Preferred apps file " + f + " cannot be read");
3178 continue;
3179 }
3180
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003181 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Reading default preferred " + f);
Fyodor Kupolovb35b34c2015-12-17 14:16:51 -08003182 InputStream str = null;
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07003183 try {
Fyodor Kupolovb35b34c2015-12-17 14:16:51 -08003184 str = new BufferedInputStream(new FileInputStream(f));
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07003185 XmlPullParser parser = Xml.newPullParser();
3186 parser.setInput(str, null);
3187
3188 int type;
3189 while ((type = parser.next()) != XmlPullParser.START_TAG
3190 && type != XmlPullParser.END_DOCUMENT) {
3191 ;
3192 }
3193
3194 if (type != XmlPullParser.START_TAG) {
3195 Slog.w(TAG, "Preferred apps file " + f + " does not have start tag");
3196 continue;
3197 }
3198 if (!"preferred-activities".equals(parser.getName())) {
3199 Slog.w(TAG, "Preferred apps file " + f
3200 + " does not start with 'preferred-activities'");
3201 continue;
3202 }
Todd Kennedycf827032018-07-03 13:17:22 -07003203 readDefaultPreferredActivitiesLPw(parser, userId);
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07003204 } catch (XmlPullParserException e) {
3205 Slog.w(TAG, "Error reading apps file " + f, e);
3206 } catch (IOException e) {
3207 Slog.w(TAG, "Error reading apps file " + f, e);
3208 } finally {
3209 if (str != null) {
3210 try {
3211 str.close();
3212 } catch (IOException e) {
3213 }
3214 }
3215 }
3216 }
3217 }
3218
Todd Kennedycf827032018-07-03 13:17:22 -07003219 private void applyDefaultPreferredActivityLPw(
3220 PackageManagerInternal pmInternal, IntentFilter tmpPa, ComponentName cn, int userId) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003221 // The initial preferences only specify the target activity
3222 // component and intent-filter, not the set of matches. So we
3223 // now need to query for the matches to build the correct
3224 // preferred activity entry.
3225 if (PackageManagerService.DEBUG_PREFERRED) {
3226 Log.d(TAG, "Processing preferred:");
3227 tmpPa.dump(new LogPrinter(Log.DEBUG, TAG), " ");
3228 }
3229 Intent intent = new Intent();
Jeff Sharkey8a372a02016-03-16 16:25:45 -06003230 int flags = PackageManager.MATCH_DIRECT_BOOT_AWARE
3231 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003232 intent.setAction(tmpPa.getAction(0));
3233 for (int i=0; i<tmpPa.countCategories(); i++) {
3234 String cat = tmpPa.getCategory(i);
3235 if (cat.equals(Intent.CATEGORY_DEFAULT)) {
Jeff Sharkey2a90f6732016-01-06 12:26:11 -07003236 flags |= MATCH_DEFAULT_ONLY;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003237 } else {
3238 intent.addCategory(cat);
3239 }
3240 }
3241
3242 boolean doNonData = true;
Christopher Tate2298ef22013-11-04 17:02:10 -08003243 boolean hasSchemes = false;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003244
Todd Kennedycf827032018-07-03 13:17:22 -07003245 final int dataSchemesCount = tmpPa.countDataSchemes();
3246 for (int ischeme = 0; ischeme < dataSchemesCount; ischeme++) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003247 boolean doScheme = true;
Todd Kennedycf827032018-07-03 13:17:22 -07003248 final String scheme = tmpPa.getDataScheme(ischeme);
Christopher Tate2298ef22013-11-04 17:02:10 -08003249 if (scheme != null && !scheme.isEmpty()) {
3250 hasSchemes = true;
3251 }
Todd Kennedycf827032018-07-03 13:17:22 -07003252 final int dataSchemeSpecificPartsCount = tmpPa.countDataSchemeSpecificParts();
3253 for (int issp = 0; issp < dataSchemeSpecificPartsCount; issp++) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003254 Uri.Builder builder = new Uri.Builder();
3255 builder.scheme(scheme);
3256 PatternMatcher ssp = tmpPa.getDataSchemeSpecificPart(issp);
3257 builder.opaquePart(ssp.getPath());
3258 Intent finalIntent = new Intent(intent);
3259 finalIntent.setData(builder.build());
Todd Kennedycf827032018-07-03 13:17:22 -07003260 applyDefaultPreferredActivityLPw(pmInternal, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003261 scheme, ssp, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003262 doScheme = false;
3263 }
Todd Kennedycf827032018-07-03 13:17:22 -07003264 final int dataAuthoritiesCount = tmpPa.countDataAuthorities();
3265 for (int iauth = 0; iauth < dataAuthoritiesCount; iauth++) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003266 boolean doAuth = true;
Todd Kennedycf827032018-07-03 13:17:22 -07003267 final IntentFilter.AuthorityEntry auth = tmpPa.getDataAuthority(iauth);
3268 final int dataPathsCount = tmpPa.countDataPaths();
3269 for (int ipath = 0; ipath < dataPathsCount; ipath++) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003270 Uri.Builder builder = new Uri.Builder();
3271 builder.scheme(scheme);
3272 if (auth.getHost() != null) {
3273 builder.authority(auth.getHost());
3274 }
3275 PatternMatcher path = tmpPa.getDataPath(ipath);
3276 builder.path(path.getPath());
3277 Intent finalIntent = new Intent(intent);
3278 finalIntent.setData(builder.build());
Todd Kennedycf827032018-07-03 13:17:22 -07003279 applyDefaultPreferredActivityLPw(pmInternal, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003280 scheme, null, auth, path, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003281 doAuth = doScheme = false;
3282 }
3283 if (doAuth) {
3284 Uri.Builder builder = new Uri.Builder();
3285 builder.scheme(scheme);
3286 if (auth.getHost() != null) {
3287 builder.authority(auth.getHost());
3288 }
3289 Intent finalIntent = new Intent(intent);
3290 finalIntent.setData(builder.build());
Todd Kennedycf827032018-07-03 13:17:22 -07003291 applyDefaultPreferredActivityLPw(pmInternal, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003292 scheme, null, auth, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003293 doScheme = false;
3294 }
3295 }
3296 if (doScheme) {
3297 Uri.Builder builder = new Uri.Builder();
3298 builder.scheme(scheme);
3299 Intent finalIntent = new Intent(intent);
3300 finalIntent.setData(builder.build());
Todd Kennedycf827032018-07-03 13:17:22 -07003301 applyDefaultPreferredActivityLPw(pmInternal, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003302 scheme, null, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003303 }
3304 doNonData = false;
3305 }
3306
3307 for (int idata=0; idata<tmpPa.countDataTypes(); idata++) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003308 String mimeType = tmpPa.getDataType(idata);
Christopher Tate2298ef22013-11-04 17:02:10 -08003309 if (hasSchemes) {
3310 Uri.Builder builder = new Uri.Builder();
3311 for (int ischeme=0; ischeme<tmpPa.countDataSchemes(); ischeme++) {
3312 String scheme = tmpPa.getDataScheme(ischeme);
3313 if (scheme != null && !scheme.isEmpty()) {
3314 Intent finalIntent = new Intent(intent);
3315 builder.scheme(scheme);
3316 finalIntent.setDataAndType(builder.build(), mimeType);
Todd Kennedycf827032018-07-03 13:17:22 -07003317 applyDefaultPreferredActivityLPw(pmInternal, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003318 scheme, null, null, null, userId);
Christopher Tate2298ef22013-11-04 17:02:10 -08003319 }
3320 }
3321 } else {
3322 Intent finalIntent = new Intent(intent);
3323 finalIntent.setType(mimeType);
Todd Kennedycf827032018-07-03 13:17:22 -07003324 applyDefaultPreferredActivityLPw(pmInternal, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003325 null, null, null, null, userId);
Christopher Tate2298ef22013-11-04 17:02:10 -08003326 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003327 doNonData = false;
3328 }
3329
3330 if (doNonData) {
Todd Kennedycf827032018-07-03 13:17:22 -07003331 applyDefaultPreferredActivityLPw(pmInternal, intent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003332 null, null, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003333 }
3334 }
3335
Todd Kennedycf827032018-07-03 13:17:22 -07003336 private void applyDefaultPreferredActivityLPw(PackageManagerInternal pmInternal, Intent intent,
3337 int flags, ComponentName cn, String scheme, PatternMatcher ssp,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003338 IntentFilter.AuthorityEntry auth, PatternMatcher path, int userId) {
Todd Kennedycf827032018-07-03 13:17:22 -07003339 final List<ResolveInfo> ri =
Patrick Baumann3fa88532019-11-18 13:43:11 -08003340 pmInternal.queryIntentActivities(
3341 intent, intent.getType(), flags, Binder.getCallingUid(), 0);
Todd Kennedycf827032018-07-03 13:17:22 -07003342 if (PackageManagerService.DEBUG_PREFERRED) {
3343 Log.d(TAG, "Queried " + intent + " results: " + ri);
3344 }
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003345 int systemMatch = 0;
3346 int thirdPartyMatch = 0;
Todd Kennedycf827032018-07-03 13:17:22 -07003347 final int numMatches = (ri == null ? 0 : ri.size());
3348 if (numMatches <= 1) {
3349 Slog.w(TAG, "No potential matches found for " + intent
3350 + " while setting preferred " + cn.flattenToShortString());
3351 return;
3352 }
3353 boolean haveAct = false;
3354 ComponentName haveNonSys = null;
3355 ComponentName[] set = new ComponentName[ri.size()];
3356 for (int i = 0; i < numMatches; i++) {
3357 final ActivityInfo ai = ri.get(i).activityInfo;
3358 set[i] = new ComponentName(ai.packageName, ai.name);
3359 if ((ai.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
3360 if (ri.get(i).match >= thirdPartyMatch) {
3361 // Keep track of the best match we find of all third
3362 // party apps, for use later to determine if we actually
3363 // want to set a preferred app for this intent.
3364 if (PackageManagerService.DEBUG_PREFERRED) {
3365 Log.d(TAG, "Result " + ai.packageName + "/" + ai.name + ": non-system!");
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003366 }
Todd Kennedycf827032018-07-03 13:17:22 -07003367 haveNonSys = set[i];
3368 break;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003369 }
Todd Kennedycf827032018-07-03 13:17:22 -07003370 } else if (cn.getPackageName().equals(ai.packageName)
3371 && cn.getClassName().equals(ai.name)) {
3372 if (PackageManagerService.DEBUG_PREFERRED) {
3373 Log.d(TAG, "Result " + ai.packageName + "/" + ai.name + ": default!");
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003374 }
Todd Kennedycf827032018-07-03 13:17:22 -07003375 haveAct = true;
3376 systemMatch = ri.get(i).match;
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003377 } else {
Todd Kennedycf827032018-07-03 13:17:22 -07003378 if (PackageManagerService.DEBUG_PREFERRED) {
3379 Log.d(TAG, "Result " + ai.packageName + "/" + ai.name + ": skipped");
3380 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003381 }
Todd Kennedycf827032018-07-03 13:17:22 -07003382 }
3383 if (haveNonSys != null && thirdPartyMatch < systemMatch) {
3384 // If we have a matching third party app, but its match is not as
3385 // good as the built-in system app, then we don't want to actually
3386 // consider it a match because presumably the built-in app is still
3387 // the thing we want users to see by default.
3388 haveNonSys = null;
3389 }
3390 if (haveAct && haveNonSys == null) {
3391 IntentFilter filter = new IntentFilter();
3392 if (intent.getAction() != null) {
3393 filter.addAction(intent.getAction());
3394 }
3395 if (intent.getCategories() != null) {
3396 for (String cat : intent.getCategories()) {
3397 filter.addCategory(cat);
3398 }
3399 }
3400 if ((flags & MATCH_DEFAULT_ONLY) != 0) {
3401 filter.addCategory(Intent.CATEGORY_DEFAULT);
3402 }
3403 if (scheme != null) {
3404 filter.addDataScheme(scheme);
3405 }
3406 if (ssp != null) {
3407 filter.addDataSchemeSpecificPart(ssp.getPath(), ssp.getType());
3408 }
3409 if (auth != null) {
3410 filter.addDataAuthority(auth);
3411 }
3412 if (path != null) {
3413 filter.addDataPath(path);
3414 }
3415 if (intent.getType() != null) {
3416 try {
3417 filter.addDataType(intent.getType());
3418 } catch (IntentFilter.MalformedMimeTypeException ex) {
3419 Slog.w(TAG, "Malformed mimetype " + intent.getType() + " for " + cn);
3420 }
3421 }
3422 PreferredActivity pa = new PreferredActivity(filter, systemMatch, set, cn, true);
3423 editPreferredActivitiesLPw(userId).addFilter(pa);
3424 } else if (haveNonSys == null) {
3425 StringBuilder sb = new StringBuilder();
3426 sb.append("No component ");
3427 sb.append(cn.flattenToShortString());
3428 sb.append(" found setting preferred ");
3429 sb.append(intent);
3430 sb.append("; possible matches are ");
3431 for (int i = 0; i < set.length; i++) {
3432 if (i > 0) sb.append(", ");
3433 sb.append(set[i].flattenToShortString());
3434 }
3435 Slog.w(TAG, sb.toString());
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003436 } else {
Todd Kennedycf827032018-07-03 13:17:22 -07003437 Slog.i(TAG, "Not setting preferred " + intent + "; found third party match "
3438 + haveNonSys.flattenToShortString());
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003439 }
3440 }
3441
Todd Kennedycf827032018-07-03 13:17:22 -07003442 private void readDefaultPreferredActivitiesLPw(XmlPullParser parser, int userId)
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003443 throws XmlPullParserException, IOException {
Todd Kennedycf827032018-07-03 13:17:22 -07003444 final PackageManagerInternal pmInternal =
3445 LocalServices.getService(PackageManagerInternal.class);
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003446 int outerDepth = parser.getDepth();
3447 int type;
3448 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3449 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3450 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3451 continue;
3452 }
3453
3454 String tagName = parser.getName();
3455 if (tagName.equals(TAG_ITEM)) {
3456 PreferredActivity tmpPa = new PreferredActivity(parser);
3457 if (tmpPa.mPref.getParseError() == null) {
Todd Kennedycf827032018-07-03 13:17:22 -07003458 applyDefaultPreferredActivityLPw(
3459 pmInternal, tmpPa, tmpPa.mPref.mComponent, userId);
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003460 } else {
3461 PackageManagerService.reportSettingsProblem(Log.WARN,
3462 "Error in package manager settings: <preferred-activity> "
3463 + tmpPa.mPref.getParseError() + " at "
3464 + parser.getPositionDescription());
3465 }
3466 } else {
3467 PackageManagerService.reportSettingsProblem(Log.WARN,
3468 "Unknown element under <preferred-activities>: " + parser.getName());
3469 XmlUtils.skipCurrentTag(parser);
3470 }
3471 }
3472 }
3473
Kenny Root447106f2011-03-23 11:00:15 -07003474 private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003475 IOException {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003476 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003477 String realName = parser.getAttributeValue(null, "realName");
3478 String codePathStr = parser.getAttributeValue(null, "codePath");
3479 String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003480
3481 String legacyCpuAbiStr = parser.getAttributeValue(null, "requiredCpuAbi");
3482 String legacyNativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
3483
Svet Ganov354cd3c2015-12-17 11:35:04 -08003484 String parentPackageName = parser.getAttributeValue(null, "parentPackageName");
3485
Narayan Kamathff110bd2014-07-04 18:30:45 +01003486 String primaryCpuAbiStr = parser.getAttributeValue(null, "primaryCpuAbi");
3487 String secondaryCpuAbiStr = parser.getAttributeValue(null, "secondaryCpuAbi");
Narayan Kamath4903f642014-08-11 13:33:45 +01003488 String cpuAbiOverrideStr = parser.getAttributeValue(null, "cpuAbiOverride");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003489
3490 if (primaryCpuAbiStr == null && legacyCpuAbiStr != null) {
3491 primaryCpuAbiStr = legacyCpuAbiStr;
3492 }
Narayan Kamath9e289d72014-04-10 09:26:59 +00003493
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003494 if (resourcePathStr == null) {
3495 resourcePathStr = codePathStr;
3496 }
3497 String version = parser.getAttributeValue(null, "version");
Dianne Hackborn3accca02013-09-20 09:32:11 -07003498 long versionCode = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003499 if (version != null) {
3500 try {
Dianne Hackborn3accca02013-09-20 09:32:11 -07003501 versionCode = Long.parseLong(version);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003502 } catch (NumberFormatException e) {
3503 }
3504 }
3505
3506 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003507 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003508 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
Dario Freni787471a2019-10-22 14:14:00 +01003509 if (codePathStr.contains("/priv-app/")) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003510 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
Christopher Tate628946a2013-10-18 18:11:05 -07003511 }
Todd Kennedyddaaf4c2017-11-07 10:01:25 -08003512 PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
Narayan Kamathff110bd2014-07-04 18:30:45 +01003513 new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiStr,
Svet Ganov354cd3c2015-12-17 11:35:04 -08003514 secondaryCpuAbiStr, cpuAbiOverrideStr, versionCode, pkgFlags, pkgPrivateFlags,
Svet Ganov67882122016-12-11 16:36:34 -08003515 parentPackageName, null /*childPackageNames*/, 0 /*sharedUserId*/, null, null);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003516 String timeStampStr = parser.getAttributeValue(null, "ft");
3517 if (timeStampStr != null) {
3518 try {
3519 long timeStamp = Long.parseLong(timeStampStr, 16);
3520 ps.setTimeStamp(timeStamp);
3521 } catch (NumberFormatException e) {
3522 }
3523 } else {
3524 timeStampStr = parser.getAttributeValue(null, "ts");
3525 if (timeStampStr != null) {
3526 try {
3527 long timeStamp = Long.parseLong(timeStampStr);
3528 ps.setTimeStamp(timeStamp);
3529 } catch (NumberFormatException e) {
3530 }
3531 }
3532 }
3533 timeStampStr = parser.getAttributeValue(null, "it");
3534 if (timeStampStr != null) {
3535 try {
3536 ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
3537 } catch (NumberFormatException e) {
3538 }
3539 }
3540 timeStampStr = parser.getAttributeValue(null, "ut");
3541 if (timeStampStr != null) {
3542 try {
3543 ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
3544 } catch (NumberFormatException e) {
3545 }
3546 }
3547 String idStr = parser.getAttributeValue(null, "userId");
Amith Yamasani13593602012-03-22 16:16:17 -07003548 ps.appId = idStr != null ? Integer.parseInt(idStr) : 0;
3549 if (ps.appId <= 0) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003550 String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
Amith Yamasani13593602012-03-22 16:16:17 -07003551 ps.appId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003552 }
Svetoslavc6d1c342015-02-26 14:44:43 -08003553
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003554 int outerDepth = parser.getDepth();
3555 int type;
3556 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3557 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3558 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3559 continue;
3560 }
3561
Svetoslavc6d1c342015-02-26 14:44:43 -08003562 if (parser.getName().equals(TAG_PERMISSIONS)) {
3563 readInstallPermissionsLPr(parser, ps.getPermissionsState());
Svet Ganov354cd3c2015-12-17 11:35:04 -08003564 } else if (parser.getName().equals(TAG_CHILD_PACKAGE)) {
3565 String childPackageName = parser.getAttributeValue(null, ATTR_NAME);
3566 if (ps.childPackageNames == null) {
3567 ps.childPackageNames = new ArrayList<>();
3568 }
3569 ps.childPackageNames.add(childPackageName);
Svet Ganov67882122016-12-11 16:36:34 -08003570 } else if (parser.getName().equals(TAG_USES_STATIC_LIB)) {
3571 readUsesStaticLibLPw(parser, ps);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003572 } else {
3573 PackageManagerService.reportSettingsProblem(Log.WARN,
3574 "Unknown element under <updated-package>: " + parser.getName());
3575 XmlUtils.skipCurrentTag(parser);
3576 }
3577 }
Christopher Tate628946a2013-10-18 18:11:05 -07003578
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003579 mDisabledSysPackages.put(name, ps);
3580 }
3581
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003582 private static int PRE_M_APP_INFO_FLAG_HIDDEN = 1<<27;
3583 private static int PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE = 1<<28;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003584 private static int PRE_M_APP_INFO_FLAG_PRIVILEGED = 1<<30;
3585
Kenny Root447106f2011-03-23 11:00:15 -07003586 private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003587 String name = null;
3588 String realName = null;
3589 String idStr = null;
3590 String sharedIdStr = null;
3591 String codePathStr = null;
3592 String resourcePathStr = null;
Narayan Kamathff110bd2014-07-04 18:30:45 +01003593 String legacyCpuAbiString = null;
3594 String legacyNativeLibraryPathStr = null;
3595 String primaryCpuAbiString = null;
3596 String secondaryCpuAbiString = null;
Narayan Kamath4903f642014-08-11 13:33:45 +01003597 String cpuAbiOverrideString = null;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003598 String systemStr = null;
3599 String installerPackageName = null;
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07003600 String isOrphaned = null;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003601 String volumeUuid = null;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07003602 String categoryHintString = null;
Todd Kennedyab532892017-03-08 14:19:49 -08003603 String updateAvailable = null;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07003604 int categoryHint = ApplicationInfo.CATEGORY_UNDEFINED;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003605 String uidError = null;
3606 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003607 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003608 long timeStamp = 0;
3609 long firstInstallTime = 0;
3610 long lastUpdateTime = 0;
Todd Kennedy788c8422016-08-10 10:52:34 -07003611 PackageSetting packageSetting = null;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003612 String version = null;
Dianne Hackborn3accca02013-09-20 09:32:11 -07003613 long versionCode = 0;
Svet Ganov354cd3c2015-12-17 11:35:04 -08003614 String parentPackageName;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003615 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003616 name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003617 realName = parser.getAttributeValue(null, "realName");
3618 idStr = parser.getAttributeValue(null, "userId");
3619 uidError = parser.getAttributeValue(null, "uidError");
3620 sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
3621 codePathStr = parser.getAttributeValue(null, "codePath");
3622 resourcePathStr = parser.getAttributeValue(null, "resourcePath");
Narayan Kamath9e289d72014-04-10 09:26:59 +00003623
Narayan Kamathff110bd2014-07-04 18:30:45 +01003624 legacyCpuAbiString = parser.getAttributeValue(null, "requiredCpuAbi");
3625
Svet Ganov354cd3c2015-12-17 11:35:04 -08003626 parentPackageName = parser.getAttributeValue(null, "parentPackageName");
3627
Narayan Kamathff110bd2014-07-04 18:30:45 +01003628 legacyNativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
3629 primaryCpuAbiString = parser.getAttributeValue(null, "primaryCpuAbi");
3630 secondaryCpuAbiString = parser.getAttributeValue(null, "secondaryCpuAbi");
Narayan Kamath4903f642014-08-11 13:33:45 +01003631 cpuAbiOverrideString = parser.getAttributeValue(null, "cpuAbiOverride");
Todd Kennedyab532892017-03-08 14:19:49 -08003632 updateAvailable = parser.getAttributeValue(null, "updateAvailable");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003633
3634 if (primaryCpuAbiString == null && legacyCpuAbiString != null) {
3635 primaryCpuAbiString = legacyCpuAbiString;
3636 }
Svetoslavc6d1c342015-02-26 14:44:43 -08003637
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003638 version = parser.getAttributeValue(null, "version");
3639 if (version != null) {
3640 try {
Dianne Hackborn3accca02013-09-20 09:32:11 -07003641 versionCode = Long.parseLong(version);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003642 } catch (NumberFormatException e) {
3643 }
3644 }
3645 installerPackageName = parser.getAttributeValue(null, "installer");
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07003646 isOrphaned = parser.getAttributeValue(null, "isOrphaned");
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003647 volumeUuid = parser.getAttributeValue(null, "volumeUuid");
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07003648 categoryHintString = parser.getAttributeValue(null, "categoryHint");
3649 if (categoryHintString != null) {
3650 try {
3651 categoryHint = Integer.parseInt(categoryHintString);
3652 } catch (NumberFormatException e) {
3653 }
3654 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003655
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003656 systemStr = parser.getAttributeValue(null, "publicFlags");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003657 if (systemStr != null) {
3658 try {
3659 pkgFlags = Integer.parseInt(systemStr);
3660 } catch (NumberFormatException e) {
3661 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003662 systemStr = parser.getAttributeValue(null, "privateFlags");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003663 if (systemStr != null) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003664 try {
3665 pkgPrivateFlags = Integer.parseInt(systemStr);
3666 } catch (NumberFormatException e) {
3667 }
3668 }
3669 } else {
3670 // Pre-M -- both public and private flags were stored in one "flags" field.
3671 systemStr = parser.getAttributeValue(null, "flags");
3672 if (systemStr != null) {
3673 try {
3674 pkgFlags = Integer.parseInt(systemStr);
3675 } catch (NumberFormatException e) {
3676 }
3677 if ((pkgFlags & PRE_M_APP_INFO_FLAG_HIDDEN) != 0) {
3678 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_HIDDEN;
3679 }
3680 if ((pkgFlags & PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE) != 0) {
3681 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE;
3682 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003683 if ((pkgFlags & PRE_M_APP_INFO_FLAG_PRIVILEGED) != 0) {
3684 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
3685 }
3686 pkgFlags &= ~(PRE_M_APP_INFO_FLAG_HIDDEN
3687 | PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003688 | PRE_M_APP_INFO_FLAG_PRIVILEGED);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003689 } else {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003690 // For backward compatibility
3691 systemStr = parser.getAttributeValue(null, "system");
3692 if (systemStr != null) {
3693 pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
3694 : 0;
3695 } else {
3696 // Old settings that don't specify system... just treat
3697 // them as system, good enough.
3698 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
3699 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003700 }
3701 }
3702 String timeStampStr = parser.getAttributeValue(null, "ft");
3703 if (timeStampStr != null) {
3704 try {
3705 timeStamp = Long.parseLong(timeStampStr, 16);
3706 } catch (NumberFormatException e) {
3707 }
3708 } else {
3709 timeStampStr = parser.getAttributeValue(null, "ts");
3710 if (timeStampStr != null) {
3711 try {
3712 timeStamp = Long.parseLong(timeStampStr);
3713 } catch (NumberFormatException e) {
3714 }
3715 }
3716 }
3717 timeStampStr = parser.getAttributeValue(null, "it");
3718 if (timeStampStr != null) {
3719 try {
3720 firstInstallTime = Long.parseLong(timeStampStr, 16);
3721 } catch (NumberFormatException e) {
3722 }
3723 }
3724 timeStampStr = parser.getAttributeValue(null, "ut");
3725 if (timeStampStr != null) {
3726 try {
3727 lastUpdateTime = Long.parseLong(timeStampStr, 16);
3728 } catch (NumberFormatException e) {
3729 }
3730 }
3731 if (PackageManagerService.DEBUG_SETTINGS)
3732 Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
3733 + " sharedUserId=" + sharedIdStr);
Todd Kennedy788c8422016-08-10 10:52:34 -07003734 final int userId = idStr != null ? Integer.parseInt(idStr) : 0;
3735 final int sharedUserId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003736 if (resourcePathStr == null) {
3737 resourcePathStr = codePathStr;
3738 }
3739 if (realName != null) {
3740 realName = realName.intern();
3741 }
3742 if (name == null) {
3743 PackageManagerService.reportSettingsProblem(Log.WARN,
3744 "Error in package manager settings: <package> has no name at "
3745 + parser.getPositionDescription());
3746 } else if (codePathStr == null) {
3747 PackageManagerService.reportSettingsProblem(Log.WARN,
3748 "Error in package manager settings: <package> has no codePath at "
3749 + parser.getPositionDescription());
3750 } else if (userId > 0) {
Kenny Root447106f2011-03-23 11:00:15 -07003751 packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
Narayan Kamathff110bd2014-07-04 18:30:45 +01003752 new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003753 secondaryCpuAbiString, cpuAbiOverrideString, userId, versionCode, pkgFlags,
Svet Ganov67882122016-12-11 16:36:34 -08003754 pkgPrivateFlags, parentPackageName, null /*childPackageNames*/,
3755 null /*usesStaticLibraries*/, null /*usesStaticLibraryVersions*/);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003756 if (PackageManagerService.DEBUG_SETTINGS)
3757 Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
3758 + userId + " pkg=" + packageSetting);
3759 if (packageSetting == null) {
3760 PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
3761 + userId + " while parsing settings at "
3762 + parser.getPositionDescription());
3763 } else {
3764 packageSetting.setTimeStamp(timeStamp);
3765 packageSetting.firstInstallTime = firstInstallTime;
3766 packageSetting.lastUpdateTime = lastUpdateTime;
3767 }
3768 } else if (sharedIdStr != null) {
Todd Kennedy788c8422016-08-10 10:52:34 -07003769 if (sharedUserId > 0) {
3770 packageSetting = new PackageSetting(name.intern(), realName, new File(
Narayan Kamathff110bd2014-07-04 18:30:45 +01003771 codePathStr), new File(resourcePathStr), legacyNativeLibraryPathStr,
Narayan Kamath4903f642014-08-11 13:33:45 +01003772 primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString,
Todd Kennedy788c8422016-08-10 10:52:34 -07003773 versionCode, pkgFlags, pkgPrivateFlags, parentPackageName,
Svet Ganov67882122016-12-11 16:36:34 -08003774 null /*childPackageNames*/, sharedUserId,
3775 null /*usesStaticLibraries*/, null /*usesStaticLibraryVersions*/);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003776 packageSetting.setTimeStamp(timeStamp);
3777 packageSetting.firstInstallTime = firstInstallTime;
3778 packageSetting.lastUpdateTime = lastUpdateTime;
Todd Kennedy788c8422016-08-10 10:52:34 -07003779 mPendingPackages.add(packageSetting);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003780 if (PackageManagerService.DEBUG_SETTINGS)
3781 Log.i(PackageManagerService.TAG, "Reading package " + name
Todd Kennedy788c8422016-08-10 10:52:34 -07003782 + ": sharedUserId=" + sharedUserId + " pkg=" + packageSetting);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003783 } else {
3784 PackageManagerService.reportSettingsProblem(Log.WARN,
3785 "Error in package manager settings: package " + name
3786 + " has bad sharedId " + sharedIdStr + " at "
3787 + parser.getPositionDescription());
3788 }
3789 } else {
3790 PackageManagerService.reportSettingsProblem(Log.WARN,
3791 "Error in package manager settings: package " + name + " has bad userId "
3792 + idStr + " at " + parser.getPositionDescription());
3793 }
3794 } catch (NumberFormatException e) {
3795 PackageManagerService.reportSettingsProblem(Log.WARN,
3796 "Error in package manager settings: package " + name + " has bad userId "
3797 + idStr + " at " + parser.getPositionDescription());
3798 }
3799 if (packageSetting != null) {
3800 packageSetting.uidError = "true".equals(uidError);
3801 packageSetting.installerPackageName = installerPackageName;
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07003802 packageSetting.isOrphaned = "true".equals(isOrphaned);
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003803 packageSetting.volumeUuid = volumeUuid;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07003804 packageSetting.categoryHint = categoryHint;
Narayan Kamathff110bd2014-07-04 18:30:45 +01003805 packageSetting.legacyNativeLibraryPathString = legacyNativeLibraryPathStr;
3806 packageSetting.primaryCpuAbiString = primaryCpuAbiString;
3807 packageSetting.secondaryCpuAbiString = secondaryCpuAbiString;
Todd Kennedyab532892017-03-08 14:19:49 -08003808 packageSetting.updateAvailable = "true".equals(updateAvailable);
Amith Yamasani483f3b02012-03-13 16:08:00 -07003809 // Handle legacy string here for single-user mode
3810 final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003811 if (enabledStr != null) {
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003812 try {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003813 packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003814 } catch (NumberFormatException e) {
3815 if (enabledStr.equalsIgnoreCase("true")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003816 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003817 } else if (enabledStr.equalsIgnoreCase("false")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003818 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003819 } else if (enabledStr.equalsIgnoreCase("default")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003820 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003821 } else {
3822 PackageManagerService.reportSettingsProblem(Log.WARN,
3823 "Error in package manager settings: package " + name
3824 + " has bad enabled value: " + idStr + " at "
3825 + parser.getPositionDescription());
3826 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003827 }
3828 } else {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003829 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003830 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07003831
Sudheer Shanka29283372016-04-04 20:56:27 -07003832 if (installerPackageName != null) {
3833 mInstallerPackages.add(installerPackageName);
3834 }
3835
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003836 int outerDepth = parser.getDepth();
3837 int type;
3838 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3839 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3840 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3841 continue;
3842 }
3843
3844 String tagName = parser.getName();
Selim Gurun5c8acb42016-04-07 16:34:02 -07003845 // Legacy
Amith Yamasani483f3b02012-03-13 16:08:00 -07003846 if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
3847 readDisabledComponentsLPw(packageSetting, parser, 0);
3848 } else if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
3849 readEnabledComponentsLPw(packageSetting, parser, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003850 } else if (tagName.equals("sigs")) {
3851 packageSetting.signatures.readXml(parser, mPastSignatures);
Svetoslavc6d1c342015-02-26 14:44:43 -08003852 } else if (tagName.equals(TAG_PERMISSIONS)) {
3853 readInstallPermissionsLPr(parser,
3854 packageSetting.getPermissionsState());
Svetoslavcf959f62015-03-26 20:53:34 -07003855 packageSetting.installPermissionsFixed = true;
dcashman3a0dbfb2014-07-07 13:53:36 -07003856 } else if (tagName.equals("proper-signing-keyset")) {
3857 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
dcashman8c04fac2015-03-23 11:39:42 -07003858 Integer refCt = mKeySetRefs.get(id);
3859 if (refCt != null) {
3860 mKeySetRefs.put(id, refCt + 1);
3861 } else {
3862 mKeySetRefs.put(id, 1);
3863 }
dcashman3a0dbfb2014-07-07 13:53:36 -07003864 packageSetting.keySetData.setProperSigningKeySet(id);
Geremy Condraf1bcca82013-01-07 22:35:24 -08003865 } else if (tagName.equals("signing-keyset")) {
dcashman8c04fac2015-03-23 11:39:42 -07003866 // from v1 of keysetmanagerservice - no longer used
dcashman55b10782014-04-09 14:20:38 -07003867 } else if (tagName.equals("upgrade-keyset")) {
3868 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
3869 packageSetting.keySetData.addUpgradeKeySetById(id);
Geremy Condraf1bcca82013-01-07 22:35:24 -08003870 } else if (tagName.equals("defined-keyset")) {
3871 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
3872 String alias = parser.getAttributeValue(null, "alias");
dcashman8c04fac2015-03-23 11:39:42 -07003873 Integer refCt = mKeySetRefs.get(id);
3874 if (refCt != null) {
3875 mKeySetRefs.put(id, refCt + 1);
3876 } else {
3877 mKeySetRefs.put(id, 1);
3878 }
Geremy Condraf1bcca82013-01-07 22:35:24 -08003879 packageSetting.keySetData.addDefinedKeySet(id, alias);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08003880 } else if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
3881 readDomainVerificationLPw(parser, packageSetting);
Svet Ganov354cd3c2015-12-17 11:35:04 -08003882 } else if (tagName.equals(TAG_CHILD_PACKAGE)) {
3883 String childPackageName = parser.getAttributeValue(null, ATTR_NAME);
3884 if (packageSetting.childPackageNames == null) {
3885 packageSetting.childPackageNames = new ArrayList<>();
3886 }
3887 packageSetting.childPackageNames.add(childPackageName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003888 } else {
3889 PackageManagerService.reportSettingsProblem(Log.WARN,
3890 "Unknown element under <package>: " + parser.getName());
3891 XmlUtils.skipCurrentTag(parser);
3892 }
3893 }
3894 } else {
3895 XmlUtils.skipCurrentTag(parser);
3896 }
3897 }
3898
Amith Yamasani483f3b02012-03-13 16:08:00 -07003899 private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
3900 int userId) throws IOException, XmlPullParserException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003901 int outerDepth = parser.getDepth();
3902 int type;
3903 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3904 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3905 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3906 continue;
3907 }
3908
3909 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003910 if (tagName.equals(TAG_ITEM)) {
3911 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003912 if (name != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003913 packageSetting.addDisabledComponent(name.intern(), userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003914 } else {
3915 PackageManagerService.reportSettingsProblem(Log.WARN,
3916 "Error in package manager settings: <disabled-components> has"
3917 + " no name at " + parser.getPositionDescription());
3918 }
3919 } else {
3920 PackageManagerService.reportSettingsProblem(Log.WARN,
3921 "Unknown element under <disabled-components>: " + parser.getName());
3922 }
3923 XmlUtils.skipCurrentTag(parser);
3924 }
3925 }
3926
Amith Yamasani483f3b02012-03-13 16:08:00 -07003927 private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
3928 int userId) throws IOException, XmlPullParserException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003929 int outerDepth = parser.getDepth();
3930 int type;
3931 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3932 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3933 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3934 continue;
3935 }
3936
3937 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003938 if (tagName.equals(TAG_ITEM)) {
3939 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003940 if (name != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003941 packageSetting.addEnabledComponent(name.intern(), userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003942 } else {
3943 PackageManagerService.reportSettingsProblem(Log.WARN,
3944 "Error in package manager settings: <enabled-components> has"
3945 + " no name at " + parser.getPositionDescription());
3946 }
3947 } else {
3948 PackageManagerService.reportSettingsProblem(Log.WARN,
3949 "Unknown element under <enabled-components>: " + parser.getName());
3950 }
3951 XmlUtils.skipCurrentTag(parser);
3952 }
3953 }
3954
Amith Yamasani483f3b02012-03-13 16:08:00 -07003955 private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003956 String name = null;
3957 String idStr = null;
3958 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003959 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003960 SharedUserSetting su = null;
3961 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003962 name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003963 idStr = parser.getAttributeValue(null, "userId");
3964 int userId = idStr != null ? Integer.parseInt(idStr) : 0;
3965 if ("true".equals(parser.getAttributeValue(null, "system"))) {
3966 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
3967 }
3968 if (name == null) {
3969 PackageManagerService.reportSettingsProblem(Log.WARN,
3970 "Error in package manager settings: <shared-user> has no name at "
3971 + parser.getPositionDescription());
3972 } else if (userId == 0) {
3973 PackageManagerService.reportSettingsProblem(Log.WARN,
3974 "Error in package manager settings: shared-user " + name
3975 + " has bad userId " + idStr + " at "
3976 + parser.getPositionDescription());
3977 } else {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003978 if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags, pkgPrivateFlags))
3979 == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003980 PackageManagerService
3981 .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
3982 + parser.getPositionDescription());
3983 }
3984 }
3985 } catch (NumberFormatException e) {
3986 PackageManagerService.reportSettingsProblem(Log.WARN,
3987 "Error in package manager settings: package " + name + " has bad userId "
3988 + idStr + " at " + parser.getPositionDescription());
3989 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003990
3991 if (su != null) {
3992 int outerDepth = parser.getDepth();
3993 int type;
3994 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3995 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3996 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3997 continue;
3998 }
3999
4000 String tagName = parser.getName();
4001 if (tagName.equals("sigs")) {
4002 su.signatures.readXml(parser, mPastSignatures);
4003 } else if (tagName.equals("perms")) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004004 readInstallPermissionsLPr(parser, su.getPermissionsState());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004005 } else {
4006 PackageManagerService.reportSettingsProblem(Log.WARN,
4007 "Unknown element under <shared-user>: " + parser.getName());
4008 XmlUtils.skipCurrentTag(parser);
4009 }
4010 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004011 } else {
4012 XmlUtils.skipCurrentTag(parser);
4013 }
4014 }
4015
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004016 void createNewUserLI(@NonNull PackageManagerService service, @NonNull Installer installer,
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07004017 int userHandle, String[] disallowedPackages) {
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004018 String[] volumeUuids;
4019 String[] names;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004020 int[] appIds;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004021 String[] seinfos;
Janis Danisevskisf3409742016-01-12 14:46:33 +00004022 int[] targetSdkVersions;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004023 int packagesCount;
4024 synchronized (mPackages) {
4025 Collection<PackageSetting> packages = mPackages.values();
4026 packagesCount = packages.size();
4027 volumeUuids = new String[packagesCount];
4028 names = new String[packagesCount];
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004029 appIds = new int[packagesCount];
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004030 seinfos = new String[packagesCount];
Janis Danisevskisf3409742016-01-12 14:46:33 +00004031 targetSdkVersions = new int[packagesCount];
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004032 Iterator<PackageSetting> packagesIterator = packages.iterator();
4033 for (int i = 0; i < packagesCount; i++) {
4034 PackageSetting ps = packagesIterator.next();
4035 if (ps.pkg == null || ps.pkg.applicationInfo == null) {
4036 continue;
4037 }
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07004038 final boolean shouldInstall = ps.isSystem() &&
Rhed Jaocd47c262018-06-13 11:16:16 +08004039 !ArrayUtils.contains(disallowedPackages, ps.name) &&
4040 !ps.pkg.applicationInfo.hiddenUntilInstalled;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004041 // Only system apps are initially installed.
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07004042 ps.setInstalled(shouldInstall, userHandle);
Amith Yamasani23ab7f52017-01-22 17:43:24 -08004043 if (!shouldInstall) {
4044 writeKernelMappingLPr(ps);
4045 }
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004046 // Need to create a data directory for all apps under this user. Accumulate all
4047 // required args and call the installer after mPackages lock has been released
4048 volumeUuids[i] = ps.volumeUuid;
4049 names[i] = ps.name;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004050 appIds[i] = ps.appId;
Todd Kennedybe0b8892017-02-15 14:13:52 -08004051 seinfos[i] = ps.pkg.applicationInfo.seInfo;
Janis Danisevskisf3409742016-01-12 14:46:33 +00004052 targetSdkVersions[i] = ps.pkg.applicationInfo.targetSdkVersion;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004053 }
4054 }
4055 for (int i = 0; i < packagesCount; i++) {
4056 if (names[i] == null) {
Amith Yamasani41cd5772014-07-10 15:26:00 -07004057 continue;
4058 }
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004059 // TODO: triage flags!
Jeff Sharkey47f71082016-02-01 17:03:54 -07004060 final int flags = StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004061 try {
4062 installer.createAppData(volumeUuids[i], names[i], userHandle, flags, appIds[i],
Janis Danisevskisf3409742016-01-12 14:46:33 +00004063 seinfos[i], targetSdkVersions[i]);
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004064 } catch (InstallerException e) {
4065 Slog.w(TAG, "Failed to prepare app data", e);
4066 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004067 }
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004068 synchronized (mPackages) {
Todd Kennedycf827032018-07-03 13:17:22 -07004069 applyDefaultPreferredAppsLPw(userHandle);
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004070 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004071 }
4072
Alexandra Gherghina539a7ef2014-07-07 12:27:54 +01004073 void removeUserLPw(int userId) {
Dianne Hackborn63092712012-10-07 14:45:35 -07004074 Set<Entry<String, PackageSetting>> entries = mPackages.entrySet();
4075 for (Entry<String, PackageSetting> entry : entries) {
4076 entry.getValue().removeUser(userId);
4077 }
4078 mPreferredActivities.remove(userId);
Amith Yamasani13593602012-03-22 16:16:17 -07004079 File file = getUserPackagesStateFile(userId);
4080 file.delete();
4081 file = getUserPackagesStateBackupFile(userId);
4082 file.delete();
Nicolas Prevote7024042014-07-08 15:47:17 +01004083 removeCrossProfileIntentFiltersLPw(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08004084
Fyodor Kupolov69542592016-05-23 14:22:38 -07004085 mRuntimePermissionsPersistence.onUserRemovedLPw(userId);
Jeff Sharkey91edde22015-05-20 12:04:42 -07004086
4087 writePackageListLPr();
Amith Yamasani23ab7f52017-01-22 17:43:24 -08004088
4089 // Inform kernel that the user was removed, so that packages are marked uninstalled
4090 // for sdcardfs
4091 writeKernelRemoveUserLPr(userId);
Nicolas Prevota0f48852014-05-27 11:21:11 +01004092 }
4093
Nicolas Prevote7024042014-07-08 15:47:17 +01004094 void removeCrossProfileIntentFiltersLPw(int userId) {
4095 synchronized (mCrossProfileIntentResolvers) {
4096 // userId is the source user
4097 if (mCrossProfileIntentResolvers.get(userId) != null) {
4098 mCrossProfileIntentResolvers.remove(userId);
4099 writePackageRestrictionsLPr(userId);
Nicolas Prevota0f48852014-05-27 11:21:11 +01004100 }
Nicolas Prevote7024042014-07-08 15:47:17 +01004101 // userId is the target user
4102 int count = mCrossProfileIntentResolvers.size();
4103 for (int i = 0; i < count; i++) {
4104 int sourceUserId = mCrossProfileIntentResolvers.keyAt(i);
4105 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId);
4106 boolean needsWriting = false;
Jeff Sharkey9f837a92014-10-24 12:07:24 -07004107 ArraySet<CrossProfileIntentFilter> cpifs =
4108 new ArraySet<CrossProfileIntentFilter>(cpir.filterSet());
Nicolas Prevote7024042014-07-08 15:47:17 +01004109 for (CrossProfileIntentFilter cpif : cpifs) {
4110 if (cpif.getTargetUserId() == userId) {
4111 needsWriting = true;
4112 cpir.removeFilter(cpif);
4113 }
4114 }
4115 if (needsWriting) {
4116 writePackageRestrictionsLPr(sourceUserId);
4117 }
Nicolas Prevota0f48852014-05-27 11:21:11 +01004118 }
4119 }
Amith Yamasani13593602012-03-22 16:16:17 -07004120 }
4121
Geremy Condra12c18382013-03-06 16:49:06 -08004122 // This should be called (at least) whenever an application is removed
4123 private void setFirstAvailableUid(int uid) {
4124 if (uid > mFirstAvailableUid) {
4125 mFirstAvailableUid = uid;
4126 }
4127 }
4128
Patrick Baumann649a8572018-11-20 11:16:58 -08004129 /** Returns a new AppID or -1 if we could not find an available AppID to assign */
4130 private int acquireAndRegisterNewAppIdLPw(SettingBase obj) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004131 // Let's be stupidly inefficient for now...
Patrick Baumann649a8572018-11-20 11:16:58 -08004132 final int size = mAppIds.size();
4133 for (int i = mFirstAvailableUid; i < size; i++) {
4134 if (mAppIds.get(i) == null) {
4135 mAppIds.set(i, obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08004136 return Process.FIRST_APPLICATION_UID + i;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004137 }
4138 }
4139
4140 // None left?
Patrick Baumann649a8572018-11-20 11:16:58 -08004141 if (size > (Process.LAST_APPLICATION_UID - Process.FIRST_APPLICATION_UID)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004142 return -1;
4143 }
4144
Patrick Baumann649a8572018-11-20 11:16:58 -08004145 mAppIds.add(obj);
4146 return Process.FIRST_APPLICATION_UID + size;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004147 }
4148
Kenny Root0aaa0d92011-09-12 16:42:55 -07004149 public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
4150 if (mVerifierDeviceIdentity == null) {
4151 mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
4152
4153 writeLPr();
4154 }
4155
4156 return mVerifierDeviceIdentity;
4157 }
4158
Todd Kennedyff35e662016-09-20 12:53:52 -07004159 boolean hasOtherDisabledSystemPkgWithChildLPr(String parentPackageName,
Svet Ganov354cd3c2015-12-17 11:35:04 -08004160 String childPackageName) {
4161 final int packageCount = mDisabledSysPackages.size();
4162 for (int i = 0; i < packageCount; i++) {
4163 PackageSetting disabledPs = mDisabledSysPackages.valueAt(i);
4164 if (disabledPs.childPackageNames == null || disabledPs.childPackageNames.isEmpty()) {
4165 continue;
4166 }
4167 if (disabledPs.name.equals(parentPackageName)) {
4168 continue;
4169 }
4170 final int childCount = disabledPs.childPackageNames.size();
4171 for (int j = 0; j < childCount; j++) {
4172 String currChildPackageName = disabledPs.childPackageNames.get(j);
4173 if (currChildPackageName.equals(childPackageName)) {
4174 return true;
4175 }
4176 }
4177 }
4178 return false;
4179 }
4180
Patrick Baumann41407832018-11-09 15:02:38 -08004181 /**
4182 * Returns the disabled {@link PackageSetting} for the provided package name if one exists,
4183 * {@code null} otherwise.
4184 */
4185 @Nullable
Kenny Root447106f2011-03-23 11:00:15 -07004186 public PackageSetting getDisabledSystemPkgLPr(String name) {
4187 PackageSetting ps = mDisabledSysPackages.get(name);
4188 return ps;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004189 }
4190
Patrick Baumann41407832018-11-09 15:02:38 -08004191 /**
4192 * Returns the disabled {@link PackageSetting} for the provided enabled {@link PackageSetting}
4193 * if one exists, {@code null} otherwise.
4194 */
4195 @Nullable
4196 public PackageSetting getDisabledSystemPkgLPr(PackageSetting enabledPackageSetting) {
4197 if (enabledPackageSetting == null) {
4198 return null;
4199 }
4200 return getDisabledSystemPkgLPr(enabledPackageSetting.name);
4201 }
4202
4203 /**
4204 * Fetches an array of the child {@link PackageSetting}s for all child package names referenced
4205 * by the provided parent {@link PackageSetting} or {@code null} if no children are referenced.
4206 *
4207 * Note: Any child packages not found will be null in the returned array.
4208 */
4209 @Nullable
4210 public PackageSetting[] getChildSettingsLPr(PackageSetting parentPackageSetting) {
4211 if (parentPackageSetting == null || !parentPackageSetting.hasChildPackages()) {
4212 return null;
4213 }
4214 final int childCount = parentPackageSetting.childPackageNames.size();
4215 PackageSetting[] children =
4216 new PackageSetting[childCount];
4217 for (int i = 0; i < childCount; i++) {
4218 children[i] = mPackages.get(parentPackageSetting.childPackageNames.get(i));
4219 }
4220 return children;
4221 }
4222
Jeff Sharkey5217cac2015-12-20 15:34:01 -07004223 boolean isEnabledAndMatchLPr(ComponentInfo componentInfo, int flags, int userId) {
Jeff Sharkey2bd31db2016-01-09 16:58:14 -07004224 final PackageSetting ps = mPackages.get(componentInfo.packageName);
4225 if (ps == null) return false;
Jeff Sharkeye17ac152015-11-06 22:40:29 -08004226
Jeff Sharkey2bd31db2016-01-09 16:58:14 -07004227 final PackageUserState userState = ps.readUserState(userId);
4228 return userState.isMatch(componentInfo, flags);
Jeff Sharkeye17ac152015-11-06 22:40:29 -08004229 }
4230
Kenny Root447106f2011-03-23 11:00:15 -07004231 String getInstallerPackageNameLPr(String packageName) {
4232 final PackageSetting pkg = mPackages.get(packageName);
4233 if (pkg == null) {
4234 throw new IllegalArgumentException("Unknown package: " + packageName);
4235 }
4236 return pkg.installerPackageName;
4237 }
4238
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07004239 boolean isOrphaned(String packageName) {
4240 final PackageSetting pkg = mPackages.get(packageName);
4241 if (pkg == null) {
4242 throw new IllegalArgumentException("Unknown package: " + packageName);
4243 }
4244 return pkg.isOrphaned;
4245 }
4246
Amith Yamasani483f3b02012-03-13 16:08:00 -07004247 int getApplicationEnabledSettingLPr(String packageName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07004248 final PackageSetting pkg = mPackages.get(packageName);
4249 if (pkg == null) {
4250 throw new IllegalArgumentException("Unknown package: " + packageName);
4251 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004252 return pkg.getEnabled(userId);
Kenny Root447106f2011-03-23 11:00:15 -07004253 }
4254
Amith Yamasani483f3b02012-03-13 16:08:00 -07004255 int getComponentEnabledSettingLPr(ComponentName componentName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07004256 final String packageName = componentName.getPackageName();
4257 final PackageSetting pkg = mPackages.get(packageName);
4258 if (pkg == null) {
4259 throw new IllegalArgumentException("Unknown component: " + componentName);
4260 }
4261 final String classNameStr = componentName.getClassName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07004262 return pkg.getCurrentEnabledStateLPr(classNameStr, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004263 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004264
Svet Ganov973edd192016-09-08 20:15:55 -07004265 boolean wasPackageEverLaunchedLPr(String packageName, int userId) {
4266 final PackageSetting pkgSetting = mPackages.get(packageName);
4267 if (pkgSetting == null) {
4268 throw new IllegalArgumentException("Unknown package: " + packageName);
4269 }
4270 return !pkgSetting.getNotLaunched(userId);
4271 }
4272
Christopher Tate5cf55782016-04-25 17:08:56 -07004273 boolean setPackageStoppedStateLPw(PackageManagerService pm, String packageName,
Jeff Sharkeybd0e9e42015-04-30 16:04:50 -07004274 boolean stopped, boolean allowedByPermission, int uid, int userId) {
Dianne Hackbornf02b60a2012-08-16 10:48:27 -07004275 int appId = UserHandle.getAppId(uid);
Kenny Root447106f2011-03-23 11:00:15 -07004276 final PackageSetting pkgSetting = mPackages.get(packageName);
4277 if (pkgSetting == null) {
4278 throw new IllegalArgumentException("Unknown package: " + packageName);
4279 }
Amith Yamasani13593602012-03-22 16:16:17 -07004280 if (!allowedByPermission && (appId != pkgSetting.appId)) {
Kenny Root447106f2011-03-23 11:00:15 -07004281 throw new SecurityException(
4282 "Permission Denial: attempt to change stopped state from pid="
4283 + Binder.getCallingPid()
Amith Yamasani13593602012-03-22 16:16:17 -07004284 + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
Kenny Root447106f2011-03-23 11:00:15 -07004285 }
4286 if (DEBUG_STOPPED) {
4287 if (stopped) {
4288 RuntimeException e = new RuntimeException("here");
4289 e.fillInStackTrace();
4290 Slog.i(TAG, "Stopping package " + packageName, e);
4291 }
4292 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004293 if (pkgSetting.getStopped(userId) != stopped) {
4294 pkgSetting.setStopped(stopped, userId);
4295 // pkgSetting.pkg.mSetStopped = stopped;
4296 if (pkgSetting.getNotLaunched(userId)) {
Kenny Root447106f2011-03-23 11:00:15 -07004297 if (pkgSetting.installerPackageName != null) {
Christopher Tate5cf55782016-04-25 17:08:56 -07004298 pm.notifyFirstLaunch(pkgSetting.name, pkgSetting.installerPackageName, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004299 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004300 pkgSetting.setNotLaunched(false, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004301 }
4302 return true;
4303 }
4304 return false;
4305 }
4306
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004307 void setHarmfulAppWarningLPw(String packageName, CharSequence warning, int userId) {
4308 final PackageSetting pkgSetting = mPackages.get(packageName);
4309 if (pkgSetting == null) {
4310 throw new IllegalArgumentException("Unknown package: " + packageName);
4311 }
4312 pkgSetting.setHarmfulAppWarning(userId, warning == null ? null : warning.toString());
4313 }
4314
4315 String getHarmfulAppWarningLPr(String packageName, int userId) {
4316 final PackageSetting pkgSetting = mPackages.get(packageName);
4317 if (pkgSetting == null) {
4318 throw new IllegalArgumentException("Unknown package: " + packageName);
4319 }
4320 return pkgSetting.getHarmfulAppWarning(userId);
4321 }
4322
Amith Yamasanie7446692019-04-19 13:39:51 -07004323 /**
4324 * Return all users on the device, including partial or dying users.
4325 * @param userManager UserManagerService instance
4326 * @return the list of users
4327 */
Todd Kennedy13715d52016-08-01 13:38:57 -07004328 private static List<UserInfo> getAllUsers(UserManagerService userManager) {
Amith Yamasanie7446692019-04-19 13:39:51 -07004329 return getUsers(userManager, false);
4330 }
4331
4332 /**
4333 * Return the list of users on the device. Clear the calling identity before calling into
4334 * UserManagerService.
4335 * @param userManager UserManagerService instance
4336 * @param excludeDying Indicates whether to exclude any users marked for deletion.
4337 * @return the list of users
4338 */
4339 private static List<UserInfo> getUsers(UserManagerService userManager, boolean excludeDying) {
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07004340 long id = Binder.clearCallingIdentity();
Amith Yamasani483f3b02012-03-13 16:08:00 -07004341 try {
Amith Yamasanie7446692019-04-19 13:39:51 -07004342 return userManager.getUsers(excludeDying);
Amith Yamasani483f3b02012-03-13 16:08:00 -07004343 } catch (NullPointerException npe) {
4344 // packagemanager not yet initialized
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07004345 } finally {
4346 Binder.restoreCallingIdentity(id);
Amith Yamasani483f3b02012-03-13 16:08:00 -07004347 }
4348 return null;
4349 }
4350
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004351 /**
4352 * Return all {@link PackageSetting} that are actively installed on the
4353 * given {@link VolumeInfo#fsUuid}.
4354 */
4355 List<PackageSetting> getVolumePackagesLPr(String volumeUuid) {
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004356 ArrayList<PackageSetting> res = new ArrayList<>();
4357 for (int i = 0; i < mPackages.size(); i++) {
4358 final PackageSetting setting = mPackages.valueAt(i);
4359 if (Objects.equals(volumeUuid, setting.volumeUuid)) {
4360 res.add(setting);
4361 }
4362 }
4363 return res;
4364 }
4365
Svetoslavc6d1c342015-02-26 14:44:43 -08004366 static void printFlags(PrintWriter pw, int val, Object[] spec) {
Joe Onorato20963df2012-01-04 18:13:24 -08004367 pw.print("[ ");
4368 for (int i=0; i<spec.length; i+=2) {
4369 int mask = (Integer)spec[i];
4370 if ((val & mask) != 0) {
4371 pw.print(spec[i+1]);
4372 pw.print(" ");
4373 }
4374 }
4375 pw.print("]");
4376 }
4377
4378 static final Object[] FLAG_DUMP_SPEC = new Object[] {
4379 ApplicationInfo.FLAG_SYSTEM, "SYSTEM",
4380 ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE",
4381 ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE",
4382 ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT",
4383 ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST",
4384 ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING",
4385 ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA",
4386 ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP",
4387 ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY",
4388 ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE",
4389 ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP",
4390 ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE",
4391 ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION",
4392 ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE",
4393 ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP",
Alex Klyubinb9f8a522015-02-03 11:12:59 -08004394 };
4395
Wale Ogunwale72a73e32016-10-13 12:16:39 -07004396 private static final Object[] PRIVATE_FLAG_DUMP_SPEC = new Object[] {
Svet Ganov087dce22017-09-07 15:42:16 -07004397 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE",
4398 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION",
4399 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE",
Kevin Rocardf91d50b2019-02-21 14:32:46 -08004400 ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE, "ALLOW_AUDIO_PLAYBACK_CAPTURE",
Svet Ganovd563e932019-04-14 13:07:41 -07004401 ApplicationInfo.PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE, "PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE",
Svet Ganov087dce22017-09-07 15:42:16 -07004402 ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND, "BACKUP_IN_FOREGROUND",
4403 ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
4404 ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE, "DEFAULT_TO_DEVICE_PROTECTED_STORAGE",
4405 ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE, "DIRECT_BOOT_AWARE",
Svet Ganov087dce22017-09-07 15:42:16 -07004406 ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS, "HAS_DOMAIN_URLS",
4407 ApplicationInfo.PRIVATE_FLAG_HIDDEN, "HIDDEN",
4408 ApplicationInfo.PRIVATE_FLAG_INSTANT, "EPHEMERAL",
4409 ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING, "ISOLATED_SPLIT_LOADING",
4410 ApplicationInfo.PRIVATE_FLAG_OEM, "OEM",
4411 ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE, "PARTIALLY_DIRECT_BOOT_AWARE",
4412 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED, "PRIVILEGED",
4413 ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER, "REQUIRED_FOR_SYSTEM_USER",
4414 ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY, "STATIC_SHARED_LIBRARY",
Jiyong Park002fdbd2017-02-13 20:50:31 +09004415 ApplicationInfo.PRIVATE_FLAG_VENDOR, "VENDOR",
Jaekyun Seok1713d9e2018-01-12 21:47:26 +09004416 ApplicationInfo.PRIVATE_FLAG_PRODUCT, "PRODUCT",
Jeongik Chaf6629832019-07-04 21:12:06 +09004417 ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT, "SYSTEM_EXT",
Svet Ganov087dce22017-09-07 15:42:16 -07004418 ApplicationInfo.PRIVATE_FLAG_VIRTUAL_PRELOAD, "VIRTUAL_PRELOAD",
MÃ¥rten Kongstad48c24cf2019-02-25 10:54:09 +01004419 ApplicationInfo.PRIVATE_FLAG_ODM, "ODM",
Joe Onorato20963df2012-01-04 18:13:24 -08004420 };
4421
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07004422 void dumpVersionLPr(IndentingPrintWriter pw) {
4423 pw.increaseIndent();
4424 for (int i= 0; i < mVersion.size(); i++) {
4425 final String volumeUuid = mVersion.keyAt(i);
4426 final VersionInfo ver = mVersion.valueAt(i);
4427 if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, volumeUuid)) {
4428 pw.println("Internal:");
4429 } else if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, volumeUuid)) {
4430 pw.println("External:");
4431 } else {
4432 pw.println("UUID " + volumeUuid + ":");
4433 }
4434 pw.increaseIndent();
4435 pw.printPair("sdkVersion", ver.sdkVersion);
4436 pw.printPair("databaseVersion", ver.databaseVersion);
4437 pw.println();
4438 pw.printPair("fingerprint", ver.fingerprint);
4439 pw.println();
4440 pw.decreaseIndent();
4441 }
4442 pw.decreaseIndent();
4443 }
4444
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004445 void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
4446 ArraySet<String> permissionNames, PackageSetting ps, SimpleDateFormat sdf,
Makoto Onuki0a068582018-06-13 10:57:34 -07004447 Date date, List<UserInfo> users, boolean dumpAll, boolean dumpAllComponents) {
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004448 if (checkinTag != null) {
4449 pw.print(checkinTag);
4450 pw.print(",");
4451 pw.print(ps.realName != null ? ps.realName : ps.name);
4452 pw.print(",");
4453 pw.print(ps.appId);
4454 pw.print(",");
4455 pw.print(ps.versionCode);
4456 pw.print(",");
4457 pw.print(ps.firstInstallTime);
4458 pw.print(",");
4459 pw.print(ps.lastUpdateTime);
4460 pw.print(",");
4461 pw.print(ps.installerPackageName != null ? ps.installerPackageName : "?");
4462 pw.println();
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004463 if (ps.pkg != null) {
4464 pw.print(checkinTag); pw.print("-"); pw.print("splt,");
4465 pw.print("base,");
4466 pw.println(ps.pkg.baseRevisionCode);
4467 if (ps.pkg.splitNames != null) {
4468 for (int i = 0; i < ps.pkg.splitNames.length; i++) {
4469 pw.print(checkinTag); pw.print("-"); pw.print("splt,");
4470 pw.print(ps.pkg.splitNames[i]); pw.print(",");
4471 pw.println(ps.pkg.splitRevisionCodes[i]);
4472 }
4473 }
4474 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004475 for (UserInfo user : users) {
4476 pw.print(checkinTag);
4477 pw.print("-");
4478 pw.print("usr");
4479 pw.print(",");
4480 pw.print(user.id);
4481 pw.print(",");
4482 pw.print(ps.getInstalled(user.id) ? "I" : "i");
Amith Yamasanie5bcff62014-07-19 15:44:09 -07004483 pw.print(ps.getHidden(user.id) ? "B" : "b");
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00004484 pw.print(ps.getSuspended(user.id) ? "SU" : "su");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004485 pw.print(ps.getStopped(user.id) ? "S" : "s");
4486 pw.print(ps.getNotLaunched(user.id) ? "l" : "L");
Todd Kennedybe0b8892017-02-15 14:13:52 -08004487 pw.print(ps.getInstantApp(user.id) ? "IA" : "ia");
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07004488 pw.print(ps.getVirtulalPreload(user.id) ? "VPI" : "vpi");
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004489 String harmfulAppWarning = ps.getHarmfulAppWarning(user.id);
4490 pw.print(harmfulAppWarning != null ? "HA" : "ha");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004491 pw.print(",");
4492 pw.print(ps.getEnabled(user.id));
4493 String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
4494 pw.print(",");
4495 pw.print(lastDisabledAppCaller != null ? lastDisabledAppCaller : "?");
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004496 pw.print(",");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004497 pw.println();
4498 }
4499 return;
4500 }
4501
Dianne Hackbornc895be72013-03-11 17:48:43 -07004502 pw.print(prefix); pw.print("Package [");
4503 pw.print(ps.realName != null ? ps.realName : ps.name);
4504 pw.print("] (");
4505 pw.print(Integer.toHexString(System.identityHashCode(ps)));
4506 pw.println("):");
4507
4508 if (ps.realName != null) {
4509 pw.print(prefix); pw.print(" compat name=");
4510 pw.println(ps.name);
4511 }
4512
Svetoslavc6d1c342015-02-26 14:44:43 -08004513 pw.print(prefix); pw.print(" userId="); pw.println(ps.appId);
4514
Dianne Hackbornc895be72013-03-11 17:48:43 -07004515 if (ps.sharedUser != null) {
4516 pw.print(prefix); pw.print(" sharedUser="); pw.println(ps.sharedUser);
4517 }
4518 pw.print(prefix); pw.print(" pkg="); pw.println(ps.pkg);
4519 pw.print(prefix); pw.print(" codePath="); pw.println(ps.codePathString);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004520 if (permissionNames == null) {
4521 pw.print(prefix); pw.print(" resourcePath="); pw.println(ps.resourcePathString);
4522 pw.print(prefix); pw.print(" legacyNativeLibraryDir=");
4523 pw.println(ps.legacyNativeLibraryPathString);
4524 pw.print(prefix); pw.print(" primaryCpuAbi="); pw.println(ps.primaryCpuAbiString);
4525 pw.print(prefix); pw.print(" secondaryCpuAbi="); pw.println(ps.secondaryCpuAbiString);
4526 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004527 pw.print(prefix); pw.print(" versionCode="); pw.print(ps.versionCode);
4528 if (ps.pkg != null) {
Todd Kennedy89d60182016-03-11 11:18:32 -08004529 pw.print(" minSdk="); pw.print(ps.pkg.applicationInfo.minSdkVersion);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004530 pw.print(" targetSdk="); pw.print(ps.pkg.applicationInfo.targetSdkVersion);
4531 }
4532 pw.println();
4533 if (ps.pkg != null) {
Svet Ganov354cd3c2015-12-17 11:35:04 -08004534 if (ps.pkg.parentPackage != null) {
4535 PackageParser.Package parentPkg = ps.pkg.parentPackage;
4536 PackageSetting pps = mPackages.get(parentPkg.packageName);
4537 if (pps == null || !pps.codePathString.equals(parentPkg.codePath)) {
4538 pps = mDisabledSysPackages.get(parentPkg.packageName);
4539 }
4540 if (pps != null) {
4541 pw.print(prefix); pw.print(" parentPackage=");
4542 pw.println(pps.realName != null ? pps.realName : pps.name);
4543 }
4544 } else if (ps.pkg.childPackages != null) {
4545 pw.print(prefix); pw.print(" childPackages=[");
4546 final int childCount = ps.pkg.childPackages.size();
4547 for (int i = 0; i < childCount; i++) {
4548 PackageParser.Package childPkg = ps.pkg.childPackages.get(i);
4549 PackageSetting cps = mPackages.get(childPkg.packageName);
4550 if (cps == null || !cps.codePathString.equals(childPkg.codePath)) {
4551 cps = mDisabledSysPackages.get(childPkg.packageName);
4552 }
4553 if (cps != null) {
4554 if (i > 0) {
4555 pw.print(", ");
4556 }
4557 pw.print(cps.realName != null ? cps.realName : cps.name);
4558 }
4559 }
4560 pw.println("]");
4561 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004562 pw.print(prefix); pw.print(" versionName="); pw.println(ps.pkg.mVersionName);
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004563 pw.print(prefix); pw.print(" splits="); dumpSplitNames(pw, ps.pkg); pw.println();
Patrick Baumann420d58a2017-12-19 10:17:21 -08004564 final int apkSigningVersion = ps.pkg.mSigningDetails.signatureSchemeVersion;
4565 pw.print(prefix); pw.print(" apkSigningVersion="); pw.println(apkSigningVersion);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004566 pw.print(prefix); pw.print(" applicationInfo=");
4567 pw.println(ps.pkg.applicationInfo.toString());
4568 pw.print(prefix); pw.print(" flags="); printFlags(pw, ps.pkg.applicationInfo.flags,
4569 FLAG_DUMP_SPEC); pw.println();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004570 if (ps.pkg.applicationInfo.privateFlags != 0) {
4571 pw.print(prefix); pw.print(" privateFlags="); printFlags(pw,
4572 ps.pkg.applicationInfo.privateFlags, PRIVATE_FLAG_DUMP_SPEC); pw.println();
4573 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004574 pw.print(prefix); pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004575 pw.print(prefix); pw.print(" supportsScreens=[");
4576 boolean first = true;
4577 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
4578 if (!first)
4579 pw.print(", ");
4580 first = false;
4581 pw.print("small");
4582 }
4583 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
4584 if (!first)
4585 pw.print(", ");
4586 first = false;
4587 pw.print("medium");
4588 }
4589 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
4590 if (!first)
4591 pw.print(", ");
4592 first = false;
4593 pw.print("large");
4594 }
4595 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
4596 if (!first)
4597 pw.print(", ");
4598 first = false;
4599 pw.print("xlarge");
4600 }
4601 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
4602 if (!first)
4603 pw.print(", ");
4604 first = false;
4605 pw.print("resizeable");
4606 }
4607 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
4608 if (!first)
4609 pw.print(", ");
4610 first = false;
4611 pw.print("anyDensity");
4612 }
4613 pw.println("]");
4614 if (ps.pkg.libraryNames != null && ps.pkg.libraryNames.size() > 0) {
Svet Ganov67882122016-12-11 16:36:34 -08004615 pw.print(prefix); pw.println(" dynamic libraries:");
4616 for (int i = 0; i<ps.pkg.libraryNames.size(); i++) {
4617 pw.print(prefix); pw.print(" ");
4618 pw.println(ps.pkg.libraryNames.get(i));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004619 }
4620 }
Svet Ganov67882122016-12-11 16:36:34 -08004621 if (ps.pkg.staticSharedLibName != null) {
4622 pw.print(prefix); pw.println(" static library:");
4623 pw.print(prefix); pw.print(" ");
4624 pw.print("name:"); pw.print(ps.pkg.staticSharedLibName);
4625 pw.print(" version:"); pw.println(ps.pkg.staticSharedLibVersion);
4626 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004627 if (ps.pkg.usesLibraries != null && ps.pkg.usesLibraries.size() > 0) {
4628 pw.print(prefix); pw.println(" usesLibraries:");
4629 for (int i=0; i<ps.pkg.usesLibraries.size(); i++) {
4630 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.usesLibraries.get(i));
4631 }
4632 }
Svet Ganov67882122016-12-11 16:36:34 -08004633 if (ps.pkg.usesStaticLibraries != null
4634 && ps.pkg.usesStaticLibraries.size() > 0) {
4635 pw.print(prefix); pw.println(" usesStaticLibraries:");
4636 for (int i=0; i<ps.pkg.usesStaticLibraries.size(); i++) {
4637 pw.print(prefix); pw.print(" ");
4638 pw.print(ps.pkg.usesStaticLibraries.get(i)); pw.print(" version:");
4639 pw.println(ps.pkg.usesStaticLibrariesVersions[i]);
4640 }
4641 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004642 if (ps.pkg.usesOptionalLibraries != null
4643 && ps.pkg.usesOptionalLibraries.size() > 0) {
4644 pw.print(prefix); pw.println(" usesOptionalLibraries:");
4645 for (int i=0; i<ps.pkg.usesOptionalLibraries.size(); i++) {
4646 pw.print(prefix); pw.print(" ");
Svet Ganov67882122016-12-11 16:36:34 -08004647 pw.println(ps.pkg.usesOptionalLibraries.get(i));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004648 }
4649 }
4650 if (ps.pkg.usesLibraryFiles != null
4651 && ps.pkg.usesLibraryFiles.length > 0) {
4652 pw.print(prefix); pw.println(" usesLibraryFiles:");
4653 for (int i=0; i<ps.pkg.usesLibraryFiles.length; i++) {
4654 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.usesLibraryFiles[i]);
4655 }
4656 }
4657 }
4658 pw.print(prefix); pw.print(" timeStamp=");
4659 date.setTime(ps.timeStamp);
4660 pw.println(sdf.format(date));
4661 pw.print(prefix); pw.print(" firstInstallTime=");
4662 date.setTime(ps.firstInstallTime);
4663 pw.println(sdf.format(date));
4664 pw.print(prefix); pw.print(" lastUpdateTime=");
4665 date.setTime(ps.lastUpdateTime);
4666 pw.println(sdf.format(date));
4667 if (ps.installerPackageName != null) {
4668 pw.print(prefix); pw.print(" installerPackageName=");
4669 pw.println(ps.installerPackageName);
4670 }
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004671 if (ps.volumeUuid != null) {
4672 pw.print(prefix); pw.print(" volumeUuid=");
4673 pw.println(ps.volumeUuid);
4674 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004675 pw.print(prefix); pw.print(" signatures="); pw.println(ps.signatures);
Svetoslavcf959f62015-03-26 20:53:34 -07004676 pw.print(prefix); pw.print(" installPermissionsFixed=");
4677 pw.print(ps.installPermissionsFixed);
Todd Kennedyaf6f1952018-02-13 11:09:50 -08004678 pw.println();
Dianne Hackbornc895be72013-03-11 17:48:43 -07004679 pw.print(prefix); pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
4680 pw.println();
Svetoslavc6d1c342015-02-26 14:44:43 -08004681
Patrick Baumann7438dcb2018-05-08 14:31:45 -07004682 if (ps.pkg != null && ps.pkg.mOverlayTarget != null) {
Adrian Roosc84df772018-01-19 21:20:22 +01004683 pw.print(prefix); pw.print(" overlayTarget="); pw.println(ps.pkg.mOverlayTarget);
4684 pw.print(prefix); pw.print(" overlayCategory="); pw.println(ps.pkg.mOverlayCategory);
4685 }
4686
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004687 if (ps.pkg != null && ps.pkg.permissions != null && ps.pkg.permissions.size() > 0) {
4688 final ArrayList<PackageParser.Permission> perms = ps.pkg.permissions;
4689 pw.print(prefix); pw.println(" declared permissions:");
4690 for (int i=0; i<perms.size(); i++) {
4691 PackageParser.Permission perm = perms.get(i);
4692 if (permissionNames != null
4693 && !permissionNames.contains(perm.info.name)) {
4694 continue;
4695 }
4696 pw.print(prefix); pw.print(" "); pw.print(perm.info.name);
4697 pw.print(": prot=");
4698 pw.print(PermissionInfo.protectionToString(perm.info.protectionLevel));
4699 if ((perm.info.flags&PermissionInfo.FLAG_COSTS_MONEY) != 0) {
4700 pw.print(", COSTS_MONEY");
4701 }
Svet Ganov2a1376d2016-02-22 17:20:35 -08004702 if ((perm.info.flags&PermissionInfo.FLAG_REMOVED) != 0) {
Svet Ganov52153f42015-08-11 08:59:12 -07004703 pw.print(", HIDDEN");
Svet Ganov3e0be742015-08-07 23:06:00 -07004704 }
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004705 if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
4706 pw.print(", INSTALLED");
4707 }
4708 pw.println();
4709 }
4710 }
4711
Dianne Hackborn9cfba352016-03-24 17:31:28 -07004712 if ((permissionNames != null || dumpAll) && ps.pkg != null
4713 && ps.pkg.requestedPermissions != null
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004714 && ps.pkg.requestedPermissions.size() > 0) {
4715 final ArrayList<String> perms = ps.pkg.requestedPermissions;
4716 pw.print(prefix); pw.println(" requested permissions:");
4717 for (int i=0; i<perms.size(); i++) {
4718 String perm = perms.get(i);
4719 if (permissionNames != null
4720 && !permissionNames.contains(perm)) {
4721 continue;
4722 }
Svet Ganovd8eb8b22019-04-05 18:52:08 -07004723 pw.print(prefix); pw.print(" "); pw.print(perm);
4724 final BasePermission bp = mPermissions.getPermission(perm);
Svet Ganovd563e932019-04-14 13:07:41 -07004725 if (bp != null && bp.isHardOrSoftRestricted()) {
Svet Ganovd8eb8b22019-04-05 18:52:08 -07004726 pw.println(": restricted=true");
4727 } else {
4728 pw.println();
4729 }
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004730 }
4731 }
4732
4733 if (ps.sharedUser == null || permissionNames != null || dumpAll) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004734 PermissionsState permissionsState = ps.getPermissionsState();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004735 dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState);
Svetoslavc6d1c342015-02-26 14:44:43 -08004736 }
4737
Makoto Onuki0a068582018-06-13 10:57:34 -07004738 if (dumpAllComponents) {
4739 dumpComponents(pw, prefix + " ", ps);
4740 }
4741
Dianne Hackbornc895be72013-03-11 17:48:43 -07004742 for (UserInfo user : users) {
4743 pw.print(prefix); pw.print(" User "); pw.print(user.id); pw.print(": ");
Jeff Sharkey42884192016-04-09 16:12:01 -06004744 pw.print("ceDataInode=");
4745 pw.print(ps.getCeDataInode(user.id));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004746 pw.print(" installed=");
4747 pw.print(ps.getInstalled(user.id));
Amith Yamasanie5bcff62014-07-19 15:44:09 -07004748 pw.print(" hidden=");
4749 pw.print(ps.getHidden(user.id));
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00004750 pw.print(" suspended=");
4751 pw.print(ps.getSuspended(user.id));
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004752 if (ps.getSuspended(user.id)) {
Suprabh Shukla3c3af142018-03-30 00:28:37 -07004753 final PackageUserState pus = ps.readUserState(user.id);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004754 pw.print(" suspendingPackage=");
Suprabh Shukla3c3af142018-03-30 00:28:37 -07004755 pw.print(pus.suspendingPackage);
Suprabh Shukla389cb6f2018-10-01 18:20:39 -07004756 pw.print(" dialogInfo=");
4757 pw.print(pus.dialogInfo);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004758 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004759 pw.print(" stopped=");
4760 pw.print(ps.getStopped(user.id));
4761 pw.print(" notLaunched=");
4762 pw.print(ps.getNotLaunched(user.id));
4763 pw.print(" enabled=");
Fyodor Kupolov09546ff2017-04-03 17:45:50 -07004764 pw.print(ps.getEnabled(user.id));
Todd Kennedybe0b8892017-02-15 14:13:52 -08004765 pw.print(" instant=");
Dianne Hackbornc50a1082017-08-15 14:10:39 -07004766 pw.print(ps.getInstantApp(user.id));
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07004767 pw.print(" virtual=");
4768 pw.println(ps.getVirtulalPreload(user.id));
Todd Kennedyb2749472017-06-13 08:24:32 -07004769
4770 String[] overlayPaths = ps.getOverlayPaths(user.id);
4771 if (overlayPaths != null && overlayPaths.length > 0) {
Todd Kennedy560830c2017-06-16 13:55:13 -07004772 pw.print(prefix); pw.println(" overlay paths:");
Todd Kennedyb2749472017-06-13 08:24:32 -07004773 for (String path : overlayPaths) {
Todd Kennedy560830c2017-06-16 13:55:13 -07004774 pw.print(prefix); pw.print(" "); pw.println(path);
Todd Kennedyb2749472017-06-13 08:24:32 -07004775 }
4776 }
4777
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07004778 String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
4779 if (lastDisabledAppCaller != null) {
4780 pw.print(prefix); pw.print(" lastDisabledCaller: ");
4781 pw.println(lastDisabledAppCaller);
4782 }
Svetoslavc6d1c342015-02-26 14:44:43 -08004783
4784 if (ps.sharedUser == null) {
4785 PermissionsState permissionsState = ps.getPermissionsState();
4786 dumpGidsLPr(pw, prefix + " ", permissionsState.computeGids(user.id));
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004787 dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames, permissionsState
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004788 .getRuntimePermissionStates(user.id), dumpAll);
Svetoslavc6d1c342015-02-26 14:44:43 -08004789 }
4790
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004791 String harmfulAppWarning = ps.getHarmfulAppWarning(user.id);
4792 if (harmfulAppWarning != null) {
4793 pw.print(prefix); pw.print(" harmfulAppWarning: ");
4794 pw.println(harmfulAppWarning);
4795 }
4796
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004797 if (permissionNames == null) {
4798 ArraySet<String> cmp = ps.getDisabledComponents(user.id);
4799 if (cmp != null && cmp.size() > 0) {
4800 pw.print(prefix); pw.println(" disabledComponents:");
4801 for (String s : cmp) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004802 pw.print(prefix); pw.print(" "); pw.println(s);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004803 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004804 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004805 cmp = ps.getEnabledComponents(user.id);
4806 if (cmp != null && cmp.size() > 0) {
4807 pw.print(prefix); pw.println(" enabledComponents:");
4808 for (String s : cmp) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004809 pw.print(prefix); pw.print(" "); pw.println(s);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004810 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004811 }
4812 }
4813 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004814 }
4815
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004816 void dumpPackagesLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4817 DumpState dumpState, boolean checkin) {
Kenny Root447106f2011-03-23 11:00:15 -07004818 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
4819 final Date date = new Date();
4820 boolean printedSomething = false;
Makoto Onuki0a068582018-06-13 10:57:34 -07004821 final boolean dumpAllComponents =
4822 dumpState.isOptionEnabled(DumpState.OPTION_DUMP_ALL_COMPONENTS);
Todd Kennedy13715d52016-08-01 13:38:57 -07004823 List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
Kenny Root447106f2011-03-23 11:00:15 -07004824 for (final PackageSetting ps : mPackages.values()) {
4825 if (packageName != null && !packageName.equals(ps.realName)
4826 && !packageName.equals(ps.name)) {
4827 continue;
4828 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004829 if (permissionNames != null
4830 && !ps.getPermissionsState().hasRequestedPermission(permissionNames)) {
4831 continue;
4832 }
Kenny Root447106f2011-03-23 11:00:15 -07004833
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004834 if (!checkin && packageName != null) {
Kenny Root447106f2011-03-23 11:00:15 -07004835 dumpState.setSharedUser(ps.sharedUser);
4836 }
4837
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004838 if (!checkin && !printedSomething) {
Kenny Root447106f2011-03-23 11:00:15 -07004839 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004840 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004841 pw.println("Packages:");
4842 printedSomething = true;
4843 }
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004844 dumpPackageLPr(pw, " ", checkin ? "pkg" : null, permissionNames, ps, sdf, date, users,
Makoto Onuki0a068582018-06-13 10:57:34 -07004845 packageName != null, dumpAllComponents);
Kenny Root447106f2011-03-23 11:00:15 -07004846 }
4847
4848 printedSomething = false;
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004849 if (mRenamedPackages.size() > 0 && permissionNames == null) {
Andy McFadden2f362292012-01-20 14:43:38 -08004850 for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Root447106f2011-03-23 11:00:15 -07004851 if (packageName != null && !packageName.equals(e.getKey())
4852 && !packageName.equals(e.getValue())) {
4853 continue;
4854 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004855 if (!checkin) {
4856 if (!printedSomething) {
4857 if (dumpState.onTitlePrinted())
4858 pw.println();
4859 pw.println("Renamed packages:");
4860 printedSomething = true;
4861 }
4862 pw.print(" ");
4863 } else {
4864 pw.print("ren,");
Kenny Root447106f2011-03-23 11:00:15 -07004865 }
Kenny Root447106f2011-03-23 11:00:15 -07004866 pw.print(e.getKey());
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004867 pw.print(checkin ? " -> " : ",");
Kenny Root447106f2011-03-23 11:00:15 -07004868 pw.println(e.getValue());
4869 }
4870 }
4871
4872 printedSomething = false;
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004873 if (mDisabledSysPackages.size() > 0 && permissionNames == null) {
Kenny Root447106f2011-03-23 11:00:15 -07004874 for (final PackageSetting ps : mDisabledSysPackages.values()) {
4875 if (packageName != null && !packageName.equals(ps.realName)
4876 && !packageName.equals(ps.name)) {
4877 continue;
4878 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004879 if (!checkin && !printedSomething) {
Kenny Root447106f2011-03-23 11:00:15 -07004880 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004881 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004882 pw.println("Hidden system packages:");
4883 printedSomething = true;
4884 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004885 dumpPackageLPr(pw, " ", checkin ? "dis" : null, permissionNames, ps, sdf, date,
Makoto Onuki0a068582018-06-13 10:57:34 -07004886 users, packageName != null, dumpAllComponents);
Kenny Root447106f2011-03-23 11:00:15 -07004887 }
4888 }
4889 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004890
Netta P426cbef2017-02-10 14:38:39 -08004891 void dumpPackagesProto(ProtoOutputStream proto) {
4892 List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
4893
4894 final int count = mPackages.size();
4895 for (int i = 0; i < count; i++) {
4896 final PackageSetting ps = mPackages.valueAt(i);
4897 ps.writeToProto(proto, PackageServiceDumpProto.PACKAGES, users);
4898 }
4899 }
4900
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004901 void dumpPermissionsLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4902 DumpState dumpState) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07004903 mPermissions.dumpPermissions(pw, packageName, permissionNames,
4904 (mReadExternalStorageEnforced == Boolean.TRUE), dumpState);
Kenny Root447106f2011-03-23 11:00:15 -07004905 }
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07004906
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004907 void dumpSharedUsersLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4908 DumpState dumpState, boolean checkin) {
Kenny Root447106f2011-03-23 11:00:15 -07004909 boolean printedSomething = false;
4910 for (SharedUserSetting su : mSharedUsers.values()) {
4911 if (packageName != null && su != dumpState.getSharedUser()) {
4912 continue;
4913 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004914 if (permissionNames != null
4915 && !su.getPermissionsState().hasRequestedPermission(permissionNames)) {
4916 continue;
4917 }
Dianne Hackbornd052a942014-11-21 15:23:13 -08004918 if (!checkin) {
4919 if (!printedSomething) {
4920 if (dumpState.onTitlePrinted())
4921 pw.println();
4922 pw.println("Shared users:");
4923 printedSomething = true;
4924 }
Todd Kennedy0d80c412019-05-10 08:23:06 -07004925
Dianne Hackbornd052a942014-11-21 15:23:13 -08004926 pw.print(" SharedUser [");
4927 pw.print(su.name);
4928 pw.print("] (");
4929 pw.print(Integer.toHexString(System.identityHashCode(su)));
Todd Kennedy0d80c412019-05-10 08:23:06 -07004930 pw.println("):");
Svetoslavc6d1c342015-02-26 14:44:43 -08004931
4932 String prefix = " ";
4933 pw.print(prefix); pw.print("userId="); pw.println(su.userId);
4934
Todd Kennedy0d80c412019-05-10 08:23:06 -07004935 pw.print(prefix); pw.println("Packages");
4936 final int numPackages = su.packages.size();
4937 for (int i = 0; i < numPackages; i++) {
4938 final PackageSetting ps = su.packages.valueAt(i);
4939 if (ps != null) {
4940 pw.print(prefix + " "); pw.println(ps.toString());
4941 } else {
4942 pw.print(prefix + " "); pw.println("NULL?!");
4943 }
4944 }
4945
4946 if (dumpState.isOptionEnabled(DumpState.OPTION_SKIP_PERMISSIONS)) {
4947 continue;
4948 }
4949
4950 final PermissionsState permissionsState = su.getPermissionsState();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004951 dumpInstallPermissionsLPr(pw, prefix, permissionNames, permissionsState);
Svetoslavc6d1c342015-02-26 14:44:43 -08004952
4953 for (int userId : UserManagerService.getInstance().getUserIds()) {
4954 final int[] gids = permissionsState.computeGids(userId);
Todd Kennedy0d80c412019-05-10 08:23:06 -07004955 final List<PermissionState> permissions =
4956 permissionsState.getRuntimePermissionStates(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08004957 if (!ArrayUtils.isEmpty(gids) || !permissions.isEmpty()) {
4958 pw.print(prefix); pw.print("User "); pw.print(userId); pw.println(": ");
4959 dumpGidsLPr(pw, prefix + " ", gids);
Todd Kennedy0d80c412019-05-10 08:23:06 -07004960 dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames,
4961 permissions, packageName != null);
Svetoslavc6d1c342015-02-26 14:44:43 -08004962 }
Dianne Hackbornd052a942014-11-21 15:23:13 -08004963 }
4964 } else {
4965 pw.print("suid,"); pw.print(su.userId); pw.print(","); pw.println(su.name);
Kenny Root447106f2011-03-23 11:00:15 -07004966 }
4967 }
4968 }
4969
Netta P426cbef2017-02-10 14:38:39 -08004970 void dumpSharedUsersProto(ProtoOutputStream proto) {
4971 final int count = mSharedUsers.size();
4972 for (int i = 0; i < count; i++) {
Yi Jind6759d42017-10-12 15:08:49 -07004973 mSharedUsers.valueAt(i).writeToProto(proto, PackageServiceDumpProto.SHARED_USERS);
Netta P426cbef2017-02-10 14:38:39 -08004974 }
4975 }
4976
Kenny Root447106f2011-03-23 11:00:15 -07004977 void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
4978 pw.println("Settings parse messages:");
4979 pw.print(mReadMessages.toString());
4980 }
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004981
4982 private static void dumpSplitNames(PrintWriter pw, PackageParser.Package pkg) {
4983 if (pkg == null) {
4984 pw.print("unknown");
4985 } else {
4986 // [base:10, config.mdpi, config.xhdpi:12]
4987 pw.print("[");
4988 pw.print("base");
4989 if (pkg.baseRevisionCode != 0) {
4990 pw.print(":"); pw.print(pkg.baseRevisionCode);
4991 }
4992 if (pkg.splitNames != null) {
4993 for (int i = 0; i < pkg.splitNames.length; i++) {
4994 pw.print(", ");
4995 pw.print(pkg.splitNames[i]);
4996 if (pkg.splitRevisionCodes[i] != 0) {
4997 pw.print(":"); pw.print(pkg.splitRevisionCodes[i]);
4998 }
4999 }
5000 }
5001 pw.print("]");
5002 }
5003 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005004
5005 void dumpGidsLPr(PrintWriter pw, String prefix, int[] gids) {
5006 if (!ArrayUtils.isEmpty(gids)) {
Fabrice Di Meglio62271722015-04-10 17:24:02 -07005007 pw.print(prefix);
5008 pw.print("gids="); pw.println(
Svetoslavc6d1c342015-02-26 14:44:43 -08005009 PackageManagerService.arrayToString(gids));
5010 }
5011 }
5012
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005013 void dumpRuntimePermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07005014 List<PermissionState> permissionStates, boolean dumpAll) {
5015 if (!permissionStates.isEmpty() || dumpAll) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005016 pw.print(prefix); pw.println("runtime permissions:");
Svet Ganov8c7f7002015-05-07 10:48:44 -07005017 for (PermissionState permissionState : permissionStates) {
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005018 if (permissionNames != null
5019 && !permissionNames.contains(permissionState.getName())) {
5020 continue;
5021 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005022 pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005023 pw.print(": granted="); pw.print(permissionState.isGranted());
5024 pw.println(permissionFlagsToString(", flags=",
5025 permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005026 }
5027 }
5028 }
5029
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005030 private static String permissionFlagsToString(String prefix, int flags) {
5031 StringBuilder flagsString = null;
Svet Ganov77ab6a82015-07-03 12:03:02 -07005032 while (flags != 0) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005033 if (flagsString == null) {
5034 flagsString = new StringBuilder();
5035 flagsString.append(prefix);
5036 flagsString.append("[ ");
5037 }
Svet Ganov77ab6a82015-07-03 12:03:02 -07005038 final int flag = 1 << Integer.numberOfTrailingZeros(flags);
5039 flags &= ~flag;
5040 flagsString.append(PackageManager.permissionFlagToString(flag));
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005041 if (flags != 0) {
5042 flagsString.append('|');
5043 }
5044
Svet Ganov77ab6a82015-07-03 12:03:02 -07005045 }
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005046 if (flagsString != null) {
5047 flagsString.append(']');
5048 return flagsString.toString();
5049 } else {
5050 return "";
5051 }
Svet Ganov77ab6a82015-07-03 12:03:02 -07005052 }
5053
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005054 void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Svetoslavc6d1c342015-02-26 14:44:43 -08005055 PermissionsState permissionsState) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005056 List<PermissionState> permissionStates = permissionsState.getInstallPermissionStates();
5057 if (!permissionStates.isEmpty()) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005058 pw.print(prefix); pw.println("install permissions:");
Svet Ganov8c7f7002015-05-07 10:48:44 -07005059 for (PermissionState permissionState : permissionStates) {
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005060 if (permissionNames != null
5061 && !permissionNames.contains(permissionState.getName())) {
5062 continue;
5063 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005064 pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005065 pw.print(": granted="); pw.print(permissionState.isGranted());
5066 pw.println(permissionFlagsToString(", flags=",
Svet Ganov8c7f7002015-05-07 10:48:44 -07005067 permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005068 }
5069 }
5070 }
5071
Makoto Onuki0a068582018-06-13 10:57:34 -07005072 void dumpComponents(PrintWriter pw, String prefix, PackageSetting ps) {
5073 dumpComponents(pw, prefix, ps, "activities:", ps.pkg.activities);
5074 dumpComponents(pw, prefix, ps, "services:", ps.pkg.services);
5075 dumpComponents(pw, prefix, ps, "receivers:", ps.pkg.receivers);
5076 dumpComponents(pw, prefix, ps, "providers:", ps.pkg.providers);
5077 dumpComponents(pw, prefix, ps, "instrumentations:", ps.pkg.instrumentation);
5078 }
5079
5080 void dumpComponents(PrintWriter pw, String prefix, PackageSetting ps,
5081 String label, List<? extends PackageParser.Component<?>> list) {
5082 final int size = CollectionUtils.size(list);
5083 if (size == 0) {
5084 return;
5085 }
5086 pw.print(prefix);pw.println(label);
5087 for (int i = 0; i < size; i++) {
5088 final PackageParser.Component<?> component = list.get(i);
5089 pw.print(prefix);pw.print(" ");
5090 pw.println(component.getComponentName().flattenToShortString());
5091 }
5092 }
5093
Svetoslavc6d1c342015-02-26 14:44:43 -08005094 public void writeRuntimePermissionsForUserLPr(int userId, boolean sync) {
5095 if (sync) {
5096 mRuntimePermissionsPersistence.writePermissionsForUserSyncLPr(userId);
5097 } else {
5098 mRuntimePermissionsPersistence.writePermissionsForUserAsyncLPr(userId);
5099 }
5100 }
5101
5102 private final class RuntimePermissionPersistence {
5103 private static final long WRITE_PERMISSIONS_DELAY_MILLIS = 200;
Svetoslavc6d1c342015-02-26 14:44:43 -08005104 private static final long MAX_WRITE_PERMISSIONS_DELAY_MILLIS = 2000;
5105
Philip P. Moltmann1ae81a52019-05-21 15:31:36 -07005106 private static final int UPGRADE_VERSION = -1;
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005107 private static final int INITIAL_VERSION = 0;
5108
Svetoslavc6d1c342015-02-26 14:44:43 -08005109 private final Handler mHandler = new MyHandler();
5110
Todd Kennedy91a39d12017-09-27 12:37:04 -07005111 private final Object mPersistenceLock;
Svetoslavc6d1c342015-02-26 14:44:43 -08005112
5113 @GuardedBy("mLock")
Svet Ganovba3ba812015-06-26 10:54:06 -07005114 private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray();
Svetoslavc6d1c342015-02-26 14:44:43 -08005115
5116 @GuardedBy("mLock")
Svet Ganovba3ba812015-06-26 10:54:06 -07005117 // The mapping keys are user ids.
5118 private final SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray();
5119
5120 @GuardedBy("mLock")
5121 // The mapping keys are user ids.
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005122 private final SparseIntArray mVersions = new SparseIntArray();
5123
5124 @GuardedBy("mLock")
5125 // The mapping keys are user ids.
Svet Ganovba3ba812015-06-26 10:54:06 -07005126 private final SparseArray<String> mFingerprints = new SparseArray<>();
5127
5128 @GuardedBy("mLock")
5129 // The mapping keys are user ids.
5130 private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray();
Svetoslavc6d1c342015-02-26 14:44:43 -08005131
Todd Kennedy91a39d12017-09-27 12:37:04 -07005132 public RuntimePermissionPersistence(Object persistenceLock) {
5133 mPersistenceLock = persistenceLock;
Svetoslavc6d1c342015-02-26 14:44:43 -08005134 }
5135
Andreas Gampe2e8c7672018-07-20 13:01:08 -07005136 @GuardedBy("Settings.this.mLock")
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005137 int getVersionLPr(int userId) {
Philip P. Moltmann1ae81a52019-05-21 15:31:36 -07005138 return mVersions.get(userId, INITIAL_VERSION);
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005139 }
5140
5141 @GuardedBy("Settings.this.mLock")
5142 void setVersionLPr(int version, int userId) {
5143 mVersions.put(userId, version);
5144 writePermissionsForUserAsyncLPr(userId);
5145 }
5146
5147 @GuardedBy("Settings.this.mLock")
5148 public boolean areDefaultRuntimePermissionsGrantedLPr(int userId) {
Svet Ganovba3ba812015-06-26 10:54:06 -07005149 return mDefaultPermissionsGranted.get(userId);
5150 }
5151
Andreas Gampe2e8c7672018-07-20 13:01:08 -07005152 @GuardedBy("Settings.this.mLock")
Philip P. Moltmann5f5783e2019-05-22 14:57:18 -07005153 public void setRuntimePermissionsFingerPrintLPr(@NonNull String fingerPrint,
5154 @UserIdInt int userId) {
5155 mFingerprints.put(userId, fingerPrint);
Svet Ganovba3ba812015-06-26 10:54:06 -07005156 writePermissionsForUserAsyncLPr(userId);
5157 }
5158
Svetoslavc6d1c342015-02-26 14:44:43 -08005159 public void writePermissionsForUserSyncLPr(int userId) {
5160 mHandler.removeMessages(userId);
5161 writePermissionsSync(userId);
5162 }
5163
Andreas Gampe2e8c7672018-07-20 13:01:08 -07005164 @GuardedBy("Settings.this.mLock")
Svetoslavc6d1c342015-02-26 14:44:43 -08005165 public void writePermissionsForUserAsyncLPr(int userId) {
5166 final long currentTimeMillis = SystemClock.uptimeMillis();
5167
5168 if (mWriteScheduled.get(userId)) {
5169 mHandler.removeMessages(userId);
5170
5171 // If enough time passed, write without holding off anymore.
5172 final long lastNotWrittenMutationTimeMillis = mLastNotWrittenMutationTimesMillis
5173 .get(userId);
5174 final long timeSinceLastNotWrittenMutationMillis = currentTimeMillis
5175 - lastNotWrittenMutationTimeMillis;
5176 if (timeSinceLastNotWrittenMutationMillis >= MAX_WRITE_PERMISSIONS_DELAY_MILLIS) {
5177 mHandler.obtainMessage(userId).sendToTarget();
5178 return;
5179 }
5180
5181 // Hold off a bit more as settings are frequently changing.
5182 final long maxDelayMillis = Math.max(lastNotWrittenMutationTimeMillis
5183 + MAX_WRITE_PERMISSIONS_DELAY_MILLIS - currentTimeMillis, 0);
5184 final long writeDelayMillis = Math.min(WRITE_PERMISSIONS_DELAY_MILLIS,
5185 maxDelayMillis);
5186
5187 Message message = mHandler.obtainMessage(userId);
5188 mHandler.sendMessageDelayed(message, writeDelayMillis);
5189 } else {
5190 mLastNotWrittenMutationTimesMillis.put(userId, currentTimeMillis);
5191 Message message = mHandler.obtainMessage(userId);
5192 mHandler.sendMessageDelayed(message, WRITE_PERMISSIONS_DELAY_MILLIS);
5193 mWriteScheduled.put(userId, true);
5194 }
5195 }
5196
5197 private void writePermissionsSync(int userId) {
Dianne Hackborne17b4452018-01-10 13:15:40 -08005198 AtomicFile destination = new AtomicFile(getUserRuntimePermissionsFile(userId),
5199 "package-perms-" + userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005200
Svet Ganov8c7f7002015-05-07 10:48:44 -07005201 ArrayMap<String, List<PermissionState>> permissionsForPackage = new ArrayMap<>();
5202 ArrayMap<String, List<PermissionState>> permissionsForSharedUser = new ArrayMap<>();
Svetoslavc6d1c342015-02-26 14:44:43 -08005203
Todd Kennedy91a39d12017-09-27 12:37:04 -07005204 synchronized (mPersistenceLock) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005205 mWriteScheduled.delete(userId);
5206
5207 final int packageCount = mPackages.size();
5208 for (int i = 0; i < packageCount; i++) {
5209 String packageName = mPackages.keyAt(i);
5210 PackageSetting packageSetting = mPackages.valueAt(i);
5211 if (packageSetting.sharedUser == null) {
5212 PermissionsState permissionsState = packageSetting.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005213 List<PermissionState> permissionsStates = permissionsState
5214 .getRuntimePermissionStates(userId);
5215 if (!permissionsStates.isEmpty()) {
5216 permissionsForPackage.put(packageName, permissionsStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005217 }
5218 }
5219 }
5220
5221 final int sharedUserCount = mSharedUsers.size();
5222 for (int i = 0; i < sharedUserCount; i++) {
5223 String sharedUserName = mSharedUsers.keyAt(i);
5224 SharedUserSetting sharedUser = mSharedUsers.valueAt(i);
5225 PermissionsState permissionsState = sharedUser.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005226 List<PermissionState> permissionsStates = permissionsState
5227 .getRuntimePermissionStates(userId);
5228 if (!permissionsStates.isEmpty()) {
5229 permissionsForSharedUser.put(sharedUserName, permissionsStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005230 }
5231 }
5232 }
5233
5234 FileOutputStream out = null;
5235 try {
5236 out = destination.startWrite();
5237
5238 XmlSerializer serializer = Xml.newSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01005239 serializer.setOutput(out, StandardCharsets.UTF_8.name());
Svetoslavc6d1c342015-02-26 14:44:43 -08005240 serializer.setFeature(
5241 "http://xmlpull.org/v1/doc/features.html#indent-output", true);
5242 serializer.startDocument(null, true);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005243
Svetoslavc6d1c342015-02-26 14:44:43 -08005244 serializer.startTag(null, TAG_RUNTIME_PERMISSIONS);
5245
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005246 final int version = mVersions.get(userId, INITIAL_VERSION);
5247 serializer.attribute(null, ATTR_VERSION, Integer.toString(version));
5248
Svet Ganovba3ba812015-06-26 10:54:06 -07005249 String fingerprint = mFingerprints.get(userId);
Svetoslavcdfd2302015-06-25 19:07:31 -07005250 if (fingerprint != null) {
5251 serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);
5252 }
Svet Ganovba3ba812015-06-26 10:54:06 -07005253
Svetoslavc6d1c342015-02-26 14:44:43 -08005254 final int packageCount = permissionsForPackage.size();
5255 for (int i = 0; i < packageCount; i++) {
5256 String packageName = permissionsForPackage.keyAt(i);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005257 List<PermissionState> permissionStates = permissionsForPackage.valueAt(i);
Svetoslavc6d1c342015-02-26 14:44:43 -08005258 serializer.startTag(null, TAG_PACKAGE);
5259 serializer.attribute(null, ATTR_NAME, packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005260 writePermissions(serializer, permissionStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005261 serializer.endTag(null, TAG_PACKAGE);
5262 }
5263
5264 final int sharedUserCount = permissionsForSharedUser.size();
5265 for (int i = 0; i < sharedUserCount; i++) {
5266 String packageName = permissionsForSharedUser.keyAt(i);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005267 List<PermissionState> permissionStates = permissionsForSharedUser.valueAt(i);
Svetoslavc6d1c342015-02-26 14:44:43 -08005268 serializer.startTag(null, TAG_SHARED_USER);
5269 serializer.attribute(null, ATTR_NAME, packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005270 writePermissions(serializer, permissionStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005271 serializer.endTag(null, TAG_SHARED_USER);
5272 }
5273
5274 serializer.endTag(null, TAG_RUNTIME_PERMISSIONS);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005275
Svetoslavc6d1c342015-02-26 14:44:43 -08005276 serializer.endDocument();
5277 destination.finishWrite(out);
Svet Ganovba0821e2015-04-22 13:34:31 -07005278
Svet Ganovba3ba812015-06-26 10:54:06 -07005279 if (Build.FINGERPRINT.equals(fingerprint)) {
5280 mDefaultPermissionsGranted.put(userId, true);
5281 }
5282 // Any error while writing is fatal.
Svet Ganovba0821e2015-04-22 13:34:31 -07005283 } catch (Throwable t) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005284 Slog.wtf(PackageManagerService.TAG,
Svet Ganovba0821e2015-04-22 13:34:31 -07005285 "Failed to write settings, restoring backup", t);
Svetoslavc6d1c342015-02-26 14:44:43 -08005286 destination.failWrite(out);
5287 } finally {
5288 IoUtils.closeQuietly(out);
5289 }
5290 }
5291
Andreas Gampe2e8c7672018-07-20 13:01:08 -07005292 @GuardedBy("Settings.this.mLock")
Fyodor Kupolov69542592016-05-23 14:22:38 -07005293 private void onUserRemovedLPw(int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005294 // Make sure we do not
5295 mHandler.removeMessages(userId);
5296
5297 for (SettingBase sb : mPackages.values()) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005298 revokeRuntimePermissionsAndClearFlags(sb, userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005299 }
5300
5301 for (SettingBase sb : mSharedUsers.values()) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005302 revokeRuntimePermissionsAndClearFlags(sb, userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005303 }
Fyodor Kupolov69542592016-05-23 14:22:38 -07005304
5305 mDefaultPermissionsGranted.delete(userId);
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005306 mVersions.delete(userId);
Fyodor Kupolov69542592016-05-23 14:22:38 -07005307 mFingerprints.remove(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005308 }
5309
Svet Ganov8c7f7002015-05-07 10:48:44 -07005310 private void revokeRuntimePermissionsAndClearFlags(SettingBase sb, int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005311 PermissionsState permissionsState = sb.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005312 for (PermissionState permissionState
5313 : permissionsState.getRuntimePermissionStates(userId)) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07005314 BasePermission bp = mPermissions.getPermission(permissionState.getName());
Svetoslavc6d1c342015-02-26 14:44:43 -08005315 if (bp != null) {
5316 permissionsState.revokeRuntimePermission(bp, userId);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005317 permissionsState.updatePermissionFlags(bp, userId,
Philip P. Moltmann76597692019-03-02 13:18:41 -08005318 PackageManager.MASK_PERMISSION_FLAGS_ALL, 0);
Svetoslavc6d1c342015-02-26 14:44:43 -08005319 }
5320 }
5321 }
5322
Svet Ganovadc1cf42015-06-15 16:36:24 -07005323 public void deleteUserRuntimePermissionsFile(int userId) {
5324 getUserRuntimePermissionsFile(userId).delete();
5325 }
5326
Andreas Gampe2e8c7672018-07-20 13:01:08 -07005327 @GuardedBy("Settings.this.mLock")
Svetoslavc6d1c342015-02-26 14:44:43 -08005328 public void readStateForUserSyncLPr(int userId) {
5329 File permissionsFile = getUserRuntimePermissionsFile(userId);
5330 if (!permissionsFile.exists()) {
5331 return;
5332 }
5333
5334 FileInputStream in;
5335 try {
Svetoslav3dcdd372015-05-29 13:00:32 -07005336 in = new AtomicFile(permissionsFile).openRead();
Svetoslavc6d1c342015-02-26 14:44:43 -08005337 } catch (FileNotFoundException fnfe) {
5338 Slog.i(PackageManagerService.TAG, "No permissions state");
5339 return;
5340 }
5341
5342 try {
5343 XmlPullParser parser = Xml.newPullParser();
5344 parser.setInput(in, null);
5345 parseRuntimePermissionsLPr(parser, userId);
Svet Ganovba0821e2015-04-22 13:34:31 -07005346
Svet Ganove723e542015-04-23 11:58:26 -07005347 } catch (XmlPullParserException | IOException e) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005348 throw new IllegalStateException("Failed parsing permissions file: "
Svet Ganove723e542015-04-23 11:58:26 -07005349 + permissionsFile , e);
Svetoslavc6d1c342015-02-26 14:44:43 -08005350 } finally {
5351 IoUtils.closeQuietly(in);
5352 }
5353 }
5354
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005355 // Private internals
5356
Andreas Gampe2e8c7672018-07-20 13:01:08 -07005357 @GuardedBy("Settings.this.mLock")
Svetoslavc6d1c342015-02-26 14:44:43 -08005358 private void parseRuntimePermissionsLPr(XmlPullParser parser, int userId)
5359 throws IOException, XmlPullParserException {
Svet Ganov12a692a2015-03-28 19:34:15 -07005360 final int outerDepth = parser.getDepth();
5361 int type;
5362 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5363 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5364 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5365 continue;
5366 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005367
Svet Ganov12a692a2015-03-28 19:34:15 -07005368 switch (parser.getName()) {
Svet Ganovba3ba812015-06-26 10:54:06 -07005369 case TAG_RUNTIME_PERMISSIONS: {
Philip P. Moltmann1ae81a52019-05-21 15:31:36 -07005370 // If the permisions settings file exists but the version is not set this is
5371 // an upgrade from P->Q. Hence mark it with the special UPGRADE_VERSION
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005372 int version = XmlUtils.readIntAttribute(parser, ATTR_VERSION,
Philip P. Moltmann1ae81a52019-05-21 15:31:36 -07005373 UPGRADE_VERSION);
Svet Ganovd8eb8b22019-04-05 18:52:08 -07005374 mVersions.put(userId, version);
Svet Ganovba3ba812015-06-26 10:54:06 -07005375 String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT);
5376 mFingerprints.put(userId, fingerprint);
5377 final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint);
5378 mDefaultPermissionsGranted.put(userId, defaultsGranted);
5379 } break;
5380
Svet Ganov12a692a2015-03-28 19:34:15 -07005381 case TAG_PACKAGE: {
5382 String name = parser.getAttributeValue(null, ATTR_NAME);
5383 PackageSetting ps = mPackages.get(name);
5384 if (ps == null) {
5385 Slog.w(PackageManagerService.TAG, "Unknown package:" + name);
5386 XmlUtils.skipCurrentTag(parser);
5387 continue;
5388 }
5389 parsePermissionsLPr(parser, ps.getPermissionsState(), userId);
5390 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005391
Svet Ganov12a692a2015-03-28 19:34:15 -07005392 case TAG_SHARED_USER: {
5393 String name = parser.getAttributeValue(null, ATTR_NAME);
5394 SharedUserSetting sus = mSharedUsers.get(name);
5395 if (sus == null) {
5396 Slog.w(PackageManagerService.TAG, "Unknown shared user:" + name);
5397 XmlUtils.skipCurrentTag(parser);
5398 continue;
5399 }
5400 parsePermissionsLPr(parser, sus.getPermissionsState(), userId);
5401 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005402 }
5403 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005404 }
5405
Svet Ganov12a692a2015-03-28 19:34:15 -07005406 private void parsePermissionsLPr(XmlPullParser parser, PermissionsState permissionsState,
Svetoslavc6d1c342015-02-26 14:44:43 -08005407 int userId) throws IOException, XmlPullParserException {
Svet Ganov12a692a2015-03-28 19:34:15 -07005408 final int outerDepth = parser.getDepth();
5409 int type;
5410 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5411 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5412 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5413 continue;
Svetoslavc6d1c342015-02-26 14:44:43 -08005414 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005415
Svet Ganov12a692a2015-03-28 19:34:15 -07005416 switch (parser.getName()) {
5417 case TAG_ITEM: {
5418 String name = parser.getAttributeValue(null, ATTR_NAME);
Todd Kennedy0eb97382017-10-03 16:57:22 -07005419 BasePermission bp = mPermissions.getPermission(name);
Svet Ganov12a692a2015-03-28 19:34:15 -07005420 if (bp == null) {
5421 Slog.w(PackageManagerService.TAG, "Unknown permission:" + name);
5422 XmlUtils.skipCurrentTag(parser);
5423 continue;
5424 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005425
Svet Ganov8c7f7002015-05-07 10:48:44 -07005426 String grantedStr = parser.getAttributeValue(null, ATTR_GRANTED);
5427 final boolean granted = grantedStr == null
5428 || Boolean.parseBoolean(grantedStr);
5429
5430 String flagsStr = parser.getAttributeValue(null, ATTR_FLAGS);
5431 final int flags = (flagsStr != null)
5432 ? Integer.parseInt(flagsStr, 16) : 0;
5433
5434 if (granted) {
Svet Ganovadc1cf42015-06-15 16:36:24 -07005435 permissionsState.grantRuntimePermission(bp, userId);
5436 permissionsState.updatePermissionFlags(bp, userId,
Philip P. Moltmann76597692019-03-02 13:18:41 -08005437 PackageManager.MASK_PERMISSION_FLAGS_ALL, flags);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005438 } else {
Svet Ganovadc1cf42015-06-15 16:36:24 -07005439 permissionsState.updatePermissionFlags(bp, userId,
Philip P. Moltmann76597692019-03-02 13:18:41 -08005440 PackageManager.MASK_PERMISSION_FLAGS_ALL, flags);
Svet Ganov12a692a2015-03-28 19:34:15 -07005441 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005442
Svet Ganov12a692a2015-03-28 19:34:15 -07005443 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005444 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005445 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005446 }
5447
Svet Ganov8c7f7002015-05-07 10:48:44 -07005448 private void writePermissions(XmlSerializer serializer,
5449 List<PermissionState> permissionStates) throws IOException {
5450 for (PermissionState permissionState : permissionStates) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005451 serializer.startTag(null, TAG_ITEM);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005452 serializer.attribute(null, ATTR_NAME,permissionState.getName());
5453 serializer.attribute(null, ATTR_GRANTED,
5454 String.valueOf(permissionState.isGranted()));
5455 serializer.attribute(null, ATTR_FLAGS,
5456 Integer.toHexString(permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005457 serializer.endTag(null, TAG_ITEM);
5458 }
5459 }
5460
5461 private final class MyHandler extends Handler {
5462 public MyHandler() {
5463 super(BackgroundThread.getHandler().getLooper());
5464 }
5465
5466 @Override
5467 public void handleMessage(Message message) {
5468 final int userId = message.what;
5469 Runnable callback = (Runnable) message.obj;
5470 writePermissionsSync(userId);
5471 if (callback != null) {
5472 callback.run();
5473 }
5474 }
5475 }
5476 }
Andy McFadden2f362292012-01-20 14:43:38 -08005477}