blob: a7e38301bb4023eabcfeaaacd771cceab812d2ae [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;
Christopher Tatee9fd1fa2015-09-15 16:43:07 -070022import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE;
Jeff Sharkey2271ba32016-02-01 17:57:08 -070023import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED;
24import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
Todd Kennedy13715d52016-08-01 13:38:57 -070025import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
Todd Kennedy3cd658e2016-08-16 15:00:31 -070026import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
Fabrice Di Meglio07885952015-04-06 19:41:28 -070027import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080028import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070029import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
Jeff Sharkey184a0102013-07-10 16:19:52 -070030import static android.os.Process.PACKAGE_INFO_GID;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070031import static android.os.Process.SYSTEM_UID;
Jeff Sharkey2271ba32016-02-01 17:57:08 -070032
Christopher Tate72c10a22015-06-12 18:31:24 -070033import static com.android.server.pm.PackageManagerService.DEBUG_DOMAIN_VERIFICATION;
Suprabh Shukla021b57a2018-03-08 18:21:50 -080034import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070035
Xiaohui Chen594f2082015-08-18 11:04:20 -070036import android.annotation.NonNull;
Todd Kennedy13715d52016-08-01 13:38:57 -070037import android.annotation.Nullable;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070038import android.content.ComponentName;
39import android.content.Intent;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080040import android.content.IntentFilter;
41import android.content.pm.ActivityInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070042import android.content.pm.ApplicationInfo;
43import android.content.pm.ComponentInfo;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080044import android.content.pm.IntentFilterVerificationInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070045import android.content.pm.PackageCleanItem;
46import android.content.pm.PackageManager;
47import android.content.pm.PackageParser;
48import android.content.pm.PackageUserState;
49import android.content.pm.PermissionInfo;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080050import android.content.pm.ResolveInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070051import android.content.pm.Signature;
52import android.content.pm.UserInfo;
53import android.content.pm.VerifierDeviceIdentity;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080054import android.net.Uri;
Narayan Kamathff110bd2014-07-04 18:30:45 +010055import android.os.Binder;
Jeff Sharkey4ed745d2014-07-15 20:39:15 -070056import android.os.Build;
Narayan Kamathff110bd2014-07-04 18:30:45 +010057import android.os.Environment;
58import android.os.FileUtils;
Svetoslavc6d1c342015-02-26 14:44:43 -080059import android.os.Handler;
60import android.os.Message;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080061import android.os.PatternMatcher;
Suprabh Shukla021b57a2018-03-08 18:21:50 -080062import android.os.PersistableBundle;
Narayan Kamathff110bd2014-07-04 18:30:45 +010063import android.os.Process;
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;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070086import com.android.internal.util.FastXmlSerializer;
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -070087import com.android.internal.util.IndentingPrintWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070088import com.android.internal.util.JournaledFile;
89import com.android.internal.util.XmlUtils;
Jeff Sharkey740f5232016-12-09 14:31:26 -070090import com.android.server.pm.Installer.InstallerException;
Todd Kennedy91a39d12017-09-27 12:37:04 -070091import com.android.server.pm.permission.BasePermission;
Todd Kennedy0eb97382017-10-03 16:57:22 -070092import com.android.server.pm.permission.PermissionSettings;
Todd Kennedy82b08422017-09-28 13:32:05 -070093import com.android.server.pm.permission.PermissionsState;
94import com.android.server.pm.permission.PermissionsState.PermissionState;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070095
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070096import libcore.io.IoUtils;
Alexandra Gherghina6e2ae252014-06-12 16:03:58 +010097
Kenny Rootcf0b38c2011-03-22 14:17:59 -070098import org.xmlpull.v1.XmlPullParser;
99import org.xmlpull.v1.XmlPullParserException;
100import org.xmlpull.v1.XmlSerializer;
101
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700102import java.io.BufferedInputStream;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700103import java.io.BufferedOutputStream;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700104import java.io.BufferedWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700105import java.io.File;
106import java.io.FileInputStream;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700107import java.io.FileNotFoundException;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700108import java.io.FileOutputStream;
109import java.io.IOException;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700110import java.io.InputStream;
111import java.io.OutputStreamWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700112import java.io.PrintWriter;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700113import java.nio.charset.Charset;
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +0100114import java.nio.charset.StandardCharsets;
Kenny Root447106f2011-03-23 11:00:15 -0700115import java.text.SimpleDateFormat;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700116import java.util.ArrayList;
117import java.util.Arrays;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700118import java.util.Collection;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800119import java.util.Collections;
Kenny Root447106f2011-03-23 11:00:15 -0700120import java.util.Date;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700121import java.util.Iterator;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700122import java.util.List;
Andy McFadden2f362292012-01-20 14:43:38 -0800123import java.util.Map;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700124import java.util.Map.Entry;
Jeff Sharkey84f12942014-07-10 17:48:11 -0700125import java.util.Objects;
Dianne Hackborn63092712012-10-07 14:45:35 -0700126import java.util.Set;
Kenny Root62539e92011-11-10 09:35:38 -0800127
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700128/**
129 * Holds information about dynamic settings.
130 */
Todd Kennedy91a39d12017-09-27 12:37:04 -0700131public final class Settings {
Kenny Root447106f2011-03-23 11:00:15 -0700132 private static final String TAG = "PackageSettings";
133
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700134 /**
135 * Current version of the package database. Set it to the latest version in
136 * the {@link DatabaseVersion} class below to ensure the database upgrade
137 * doesn't happen repeatedly.
138 * <p>
139 * Note that care should be taken to make sure all database upgrades are
140 * idempotent.
141 */
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700142 public static final int CURRENT_DATABASE_VERSION = DatabaseVersion.SIGNATURE_MALFORMED_RECOVER;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700143
144 /**
145 * This class contains constants that can be referred to from upgrade code.
146 * Insert constant values here that describe the upgrade reason. The version
147 * code must be monotonically increasing.
148 */
149 public static class DatabaseVersion {
150 /**
151 * The initial version of the database.
152 */
153 public static final int FIRST_VERSION = 1;
Kenny Roota8e65fd2014-04-24 11:44:47 -0700154
155 /**
156 * Migrating the Signature array from the entire certificate chain to
157 * just the signing certificate.
158 */
159 public static final int SIGNATURE_END_ENTITY = 2;
Jeff Sharkeyd68b87c2014-11-12 12:18:11 -0800160
161 /**
162 * There was a window of time in
163 * {@link android.os.Build.VERSION_CODES#LOLLIPOP} where we persisted
164 * certificates after potentially mutating them. To switch back to the
165 * original untouched certificates, we need to force a collection pass.
166 */
167 public static final int SIGNATURE_MALFORMED_RECOVER = 3;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700168 }
169
Kenny Root447106f2011-03-23 11:00:15 -0700170 private static final boolean DEBUG_STOPPED = false;
Amith Yamasani258848d2012-08-10 17:06:33 -0700171 private static final boolean DEBUG_MU = false;
Jeff Sharkey2271ba32016-02-01 17:57:08 -0700172 private static final boolean DEBUG_KERNEL = false;
Todd Kennedy788c8422016-08-10 10:52:34 -0700173 private static final boolean DEBUG_PARSER = false;
Kenny Root447106f2011-03-23 11:00:15 -0700174
Svetoslavc6d1c342015-02-26 14:44:43 -0800175 private static final String RUNTIME_PERMISSIONS_FILE_NAME = "runtime-permissions.xml";
176
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -0700177 private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage";
178 private static final String ATTR_ENFORCEMENT = "enforcement";
179
Todd Kennedy91a39d12017-09-27 12:37:04 -0700180 public static final String TAG_ITEM = "item";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700181 private static final String TAG_DISABLED_COMPONENTS = "disabled-components";
182 private static final String TAG_ENABLED_COMPONENTS = "enabled-components";
183 private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions";
184 private static final String TAG_PACKAGE = "pkg";
Svetoslavc6d1c342015-02-26 14:44:43 -0800185 private static final String TAG_SHARED_USER = "shared-user";
186 private static final String TAG_RUNTIME_PERMISSIONS = "runtime-permissions";
187 private static final String TAG_PERMISSIONS = "perms";
Svet Ganov354cd3c2015-12-17 11:35:04 -0800188 private static final String TAG_CHILD_PACKAGE = "child-package";
Svet Ganov67882122016-12-11 16:36:34 -0800189 private static final String TAG_USES_STATIC_LIB = "uses-static-lib";
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +0200190 private static final String TAG_BLOCK_UNINSTALL_PACKAGES = "block-uninstall-packages";
191 private static final String TAG_BLOCK_UNINSTALL = "block-uninstall";
Svet Ganov354cd3c2015-12-17 11:35:04 -0800192
Sander Alewijnseaf597622014-03-20 18:44:57 +0000193 private static final String TAG_PERSISTENT_PREFERRED_ACTIVITIES =
194 "persistent-preferred-activities";
Nicolas Prevot81948992014-05-16 18:25:26 +0100195 static final String TAG_CROSS_PROFILE_INTENT_FILTERS =
196 "crossProfile-intent-filters";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700197 private static final String TAG_DOMAIN_VERIFICATION = "domain-verification";
198 private static final String TAG_DEFAULT_APPS = "default-apps";
199 private static final String TAG_ALL_INTENT_FILTER_VERIFICATION =
Christopher Tate6038d152015-06-17 13:07:46 -0700200 "all-intent-filter-verifications";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700201 private static final String TAG_DEFAULT_BROWSER = "default-browser";
Robin Lee0dc591b2016-05-04 13:01:46 +0100202 private static final String TAG_DEFAULT_DIALER = "default-dialer";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700203 private static final String TAG_VERSION = "version";
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800204 private static final String TAG_SUSPENDED_APP_EXTRAS = "suspended-app-extras";
205 private static final String TAG_SUSPENDED_LAUNCHER_EXTRAS = "suspended-launcher-extras";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700206
Todd Kennedy91a39d12017-09-27 12:37:04 -0700207 public static final String ATTR_NAME = "name";
208 public static final String ATTR_PACKAGE = "package";
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700209 private static final String ATTR_USER = "user";
210 private static final String ATTR_CODE = "code";
Svet Ganov8c7f7002015-05-07 10:48:44 -0700211 private static final String ATTR_GRANTED = "granted";
212 private static final String ATTR_FLAGS = "flags";
Svet Ganov67882122016-12-11 16:36:34 -0800213 private static final String ATTR_VERSION = "version";
Jeff Sharkey42884192016-04-09 16:12:01 -0600214
215 private static final String ATTR_CE_DATA_INODE = "ceDataInode";
216 private static final String ATTR_INSTALLED = "inst";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700217 private static final String ATTR_STOPPED = "stopped";
Jeff Sharkey42884192016-04-09 16:12:01 -0600218 private static final String ATTR_NOT_LAUNCHED = "nl";
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700219 // Legacy, here for reading older versions of the package-restrictions.
Amith Yamasani655d0e22013-06-12 14:19:10 -0700220 private static final String ATTR_BLOCKED = "blocked";
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700221 // New name for the above attribute.
222 private static final String ATTR_HIDDEN = "hidden";
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000223 private static final String ATTR_SUSPENDED = "suspended";
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800224 private static final String ATTR_SUSPENDING_PACKAGE = "suspending-package";
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700225 private static final String ATTR_SUSPEND_DIALOG_MESSAGE = "suspend_dialog_message";
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +0200226 // Legacy, uninstall blocks are stored separately.
227 @Deprecated
Kenny Guyc13053b2014-05-29 14:17:17 +0100228 private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall";
Jeff Sharkey42884192016-04-09 16:12:01 -0600229 private static final String ATTR_ENABLED = "enabled";
230 private static final String ATTR_ENABLED_CALLER = "enabledCaller";
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800231 private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus";
Jeff Sharkey42884192016-04-09 16:12:01 -0600232 private static final String ATTR_APP_LINK_GENERATION = "app-link-generation";
Bartosz Fabianowskia34f53f2017-01-11 18:08:47 +0100233 private static final String ATTR_INSTALL_REASON = "install-reason";
Todd Kennedybe0b8892017-02-15 14:13:52 -0800234 private static final String ATTR_INSTANT_APP = "instant-app";
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700235 private static final String ATTR_VIRTUAL_PRELOAD = "virtual-preload";
Ben Gruver1ab3d6e2017-12-07 13:45:08 -0800236 private static final String ATTR_HARMFUL_APP_WARNING = "harmful-app-warning";
Jeff Sharkey42884192016-04-09 16:12:01 -0600237
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700238 private static final String ATTR_PACKAGE_NAME = "packageName";
Svet Ganovba3ba812015-06-26 10:54:06 -0700239 private static final String ATTR_FINGERPRINT = "fingerprint";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700240 private static final String ATTR_VOLUME_UUID = "volumeUuid";
241 private static final String ATTR_SDK_VERSION = "sdkVersion";
242 private static final String ATTR_DATABASE_VERSION = "databaseVersion";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700243
Christopher Tatee9fd1fa2015-09-15 16:43:07 -0700244 // Bookkeeping for restored permission grants
245 private static final String TAG_RESTORED_RUNTIME_PERMISSIONS = "restored-perms";
246 // package name: ATTR_PACKAGE_NAME
247 private static final String TAG_PERMISSION_ENTRY = "perm";
248 // permission name: ATTR_NAME
249 // permission granted (boolean): ATTR_GRANTED
250 private static final String ATTR_USER_SET = "set";
251 private static final String ATTR_USER_FIXED = "fixed";
252 private static final String ATTR_REVOKE_ON_UPGRADE = "rou";
253
254 // Flag mask of restored permission grants that are applied at install time
255 private static final int USER_RUNTIME_GRANT_MASK =
256 FLAG_PERMISSION_USER_SET
257 | FLAG_PERMISSION_USER_FIXED
258 | FLAG_PERMISSION_REVOKE_ON_UPGRADE;
259
Svetoslavc6d1c342015-02-26 14:44:43 -0800260 private final Object mLock;
Svetoslavc6d1c342015-02-26 14:44:43 -0800261
262 private final RuntimePermissionPersistence mRuntimePermissionsPersistence;
263
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700264 private final File mSettingsFilename;
265 private final File mBackupSettingsFilename;
266 private final File mPackageListFilename;
267 private final File mStoppedPackagesFilename;
268 private final File mBackupStoppedPackagesFilename;
Amith Yamasani23ab7f52017-01-22 17:43:24 -0800269 /** The top level directory in configfs for sdcardfs to push the package->uid,userId mappings */
Jeff Sharkey2271ba32016-02-01 17:57:08 -0700270 private final File mKernelMappingFilename;
Jeff Sharkey184a0102013-07-10 16:19:52 -0700271
Jeff Sharkey2271ba32016-02-01 17:57:08 -0700272 /** Map from package name to settings */
273 final ArrayMap<String, PackageSetting> mPackages = new ArrayMap<>();
274
Sudheer Shanka29283372016-04-04 20:56:27 -0700275 /** List of packages that installed other packages */
276 final ArraySet<String> mInstallerPackages = new ArraySet<>();
277
Amith Yamasani23ab7f52017-01-22 17:43:24 -0800278 /** Map from package name to appId and excluded userids */
279 private final ArrayMap<String, KernelPackageState> mKernelMapping = new ArrayMap<>();
Christopher Tate6038d152015-06-17 13:07:46 -0700280
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700281 // List of replaced system applications
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700282 private final ArrayMap<String, PackageSetting> mDisabledSysPackages =
283 new ArrayMap<String, PackageSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700284
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +0200285 /** List of packages that are blocked for uninstall for specific users */
286 private final SparseArray<ArraySet<String>> mBlockUninstallPackages = new SparseArray<>();
287
Christopher Tate6038d152015-06-17 13:07:46 -0700288 // Set of restored intent-filter verification states
289 private final ArrayMap<String, IntentFilterVerificationInfo> mRestoredIntentFilterVerifications =
290 new ArrayMap<String, IntentFilterVerificationInfo>();
291
Amith Yamasani23ab7f52017-01-22 17:43:24 -0800292 private static final class KernelPackageState {
293 int appId;
294 int[] excludedUserIds;
295 }
296
Christopher Tatee9fd1fa2015-09-15 16:43:07 -0700297 // Bookkeeping for restored user permission grants
298 final class RestoredPermissionGrant {
299 String permissionName;
300 boolean granted;
301 int grantBits;
302
303 RestoredPermissionGrant(String name, boolean isGranted, int theGrantBits) {
304 permissionName = name;
305 granted = isGranted;
306 grantBits = theGrantBits;
307 }
308 }
309
310 // This would be more compact as a flat array of restored grants or something, but we
311 // may have quite a few, especially during early device lifetime, and avoiding all those
312 // linear lookups will be important.
313 private final SparseArray<ArrayMap<String, ArraySet<RestoredPermissionGrant>>>
314 mRestoredUserGrants =
315 new SparseArray<ArrayMap<String, ArraySet<RestoredPermissionGrant>>>();
316
Geremy Condra12c18382013-03-06 16:49:06 -0800317 private static int mFirstAvailableUid = 0;
318
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700319 /** Map from volume UUID to {@link VersionInfo} */
320 private ArrayMap<String, VersionInfo> mVersion = new ArrayMap<>();
Kenny Root0aaa0d92011-09-12 16:42:55 -0700321
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700322 /**
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700323 * Version details for a storage volume that may hold apps.
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700324 */
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700325 public static class VersionInfo {
326 /**
327 * These are the last platform API version we were using for the apps
328 * installed on internal and external storage. It is used to grant newer
329 * permissions one time during a system upgrade.
330 */
331 int sdkVersion;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700332
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700333 /**
334 * The current database version for apps on internal storage. This is
335 * used to upgrade the format of the packages.xml database not
336 * necessarily tied to an SDK version.
337 */
338 int databaseVersion;
339
340 /**
341 * Last known value of {@link Build#FINGERPRINT}. Used to determine when
342 * an system update has occurred, meaning we need to clear code caches.
343 */
344 String fingerprint;
345
346 /**
347 * Force all version information to match current system values,
348 * typically after resolving any required upgrade steps.
349 */
350 public void forceCurrent() {
351 sdkVersion = Build.VERSION.SDK_INT;
352 databaseVersion = CURRENT_DATABASE_VERSION;
353 fingerprint = Build.FINGERPRINT;
354 }
355 }
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700356
Jeff Sharkeyf5385772012-05-11 14:04:41 -0700357 Boolean mReadExternalStorageEnforced;
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -0700358
Kenny Root0aaa0d92011-09-12 16:42:55 -0700359 /** Device identity for the purpose of package verification. */
360 private VerifierDeviceIdentity mVerifierDeviceIdentity;
361
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700362 // The user's preferred activities associated with particular intent
363 // filters.
Dianne Hackborn63092712012-10-07 14:45:35 -0700364 final SparseArray<PreferredIntentResolver> mPreferredActivities =
365 new SparseArray<PreferredIntentResolver>();
366
Sander Alewijnsef475ca32014-02-17 15:13:58 +0000367 // The persistent preferred activities of the user's profile/device owner
368 // associated with particular intent filters.
369 final SparseArray<PersistentPreferredIntentResolver> mPersistentPreferredActivities =
370 new SparseArray<PersistentPreferredIntentResolver>();
371
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000372 // For every user, it is used to find to which other users the intent can be forwarded.
Nicolas Prevot81948992014-05-16 18:25:26 +0100373 final SparseArray<CrossProfileIntentResolver> mCrossProfileIntentResolvers =
374 new SparseArray<CrossProfileIntentResolver>();
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000375
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700376 final ArrayMap<String, SharedUserSetting> mSharedUsers =
377 new ArrayMap<String, SharedUserSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700378 private final ArrayList<Object> mUserIds = new ArrayList<Object>();
379 private final SparseArray<Object> mOtherUserIds =
380 new SparseArray<Object>();
381
382 // For reading/writing settings file.
383 private final ArrayList<Signature> mPastSignatures =
384 new ArrayList<Signature>();
dcashman8c04fac2015-03-23 11:39:42 -0700385 private final ArrayMap<Long, Integer> mKeySetRefs =
386 new ArrayMap<Long, Integer>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700387
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700388 // Packages that have been uninstalled and still need their external
389 // storage data deleted.
Jeff Sharkey752cd922012-09-23 16:25:12 -0700390 final ArrayList<PackageCleanItem> mPackagesToBeCleaned = new ArrayList<PackageCleanItem>();
Selim Gurun5c8acb42016-04-07 16:34:02 -0700391
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700392 // Packages that have been renamed since they were first installed.
393 // Keys are the new names of the packages, values are the original
Todd Kennedy13715d52016-08-01 13:38:57 -0700394 // names. The packages appear everywhere else under their original
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700395 // names.
Todd Kennedy13715d52016-08-01 13:38:57 -0700396 private final ArrayMap<String, String> mRenamedPackages = new ArrayMap<String, String>();
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700397
398 // For every user, it is used to find the package name of the default Browser App.
399 final SparseArray<String> mDefaultBrowserApp = new SparseArray<String>();
400
Robin Lee0dc591b2016-05-04 13:01:46 +0100401 // For every user, a record of the package name of the default Dialer App.
402 final SparseArray<String> mDefaultDialerApp = new SparseArray<String>();
403
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700404 // App-link priority tracking, per-user
405 final SparseIntArray mNextAppLinkGeneration = new SparseIntArray();
406
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700407 final StringBuilder mReadMessages = new StringBuilder();
408
Kenny Root447106f2011-03-23 11:00:15 -0700409 /**
410 * Used to track packages that have a shared user ID that hasn't been read
411 * in yet.
412 * <p>
413 * TODO: make this just a local variable that is passed in during package
414 * scanning to make it less confusing.
415 */
Todd Kennedy788c8422016-08-10 10:52:34 -0700416 private final ArrayList<PackageSetting> mPendingPackages = new ArrayList<>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700417
Amith Yamasani483f3b02012-03-13 16:08:00 -0700418 private final File mSystemDir;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800419
dcashman55b10782014-04-09 14:20:38 -0700420 public final KeySetManagerService mKeySetManagerService = new KeySetManagerService(mPackages);
Todd Kennedy0eb97382017-10-03 16:57:22 -0700421 /** Settings and other information about permissions */
Todd Kennedyc8423932017-10-05 08:58:36 -0700422 final PermissionSettings mPermissions;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800423
Todd Kennedy0eb97382017-10-03 16:57:22 -0700424 Settings(PermissionSettings permissions, Object lock) {
425 this(Environment.getDataDirectory(), permissions, lock);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700426 }
427
Todd Kennedy0eb97382017-10-03 16:57:22 -0700428 Settings(File dataDir, PermissionSettings permission, Object lock) {
Svetoslavc6d1c342015-02-26 14:44:43 -0800429 mLock = lock;
Todd Kennedy0eb97382017-10-03 16:57:22 -0700430 mPermissions = permission;
Svetoslavc6d1c342015-02-26 14:44:43 -0800431 mRuntimePermissionsPersistence = new RuntimePermissionPersistence(mLock);
432
Amith Yamasani483f3b02012-03-13 16:08:00 -0700433 mSystemDir = new File(dataDir, "system");
434 mSystemDir.mkdirs();
435 FileUtils.setPermissions(mSystemDir.toString(),
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700436 FileUtils.S_IRWXU|FileUtils.S_IRWXG
437 |FileUtils.S_IROTH|FileUtils.S_IXOTH,
438 -1, -1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700439 mSettingsFilename = new File(mSystemDir, "packages.xml");
440 mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
441 mPackageListFilename = new File(mSystemDir, "packages.list");
Jeff Sharkeyaebb65c2014-11-24 15:00:13 -0800442 FileUtils.setPermissions(mPackageListFilename, 0640, SYSTEM_UID, PACKAGE_INFO_GID);
Jeff Sharkey184a0102013-07-10 16:19:52 -0700443
Jeff Sharkey2271ba32016-02-01 17:57:08 -0700444 final File kernelDir = new File("/config/sdcardfs");
445 mKernelMappingFilename = kernelDir.exists() ? kernelDir : null;
446
Amith Yamasani483f3b02012-03-13 16:08:00 -0700447 // Deprecated: Needed for migration
448 mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
449 mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700450 }
451
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700452 PackageSetting getPackageLPr(String pkgName) {
Todd Kennedy13715d52016-08-01 13:38:57 -0700453 return mPackages.get(pkgName);
454 }
455
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700456 String getRenamedPackageLPr(String pkgName) {
Todd Kennedy13715d52016-08-01 13:38:57 -0700457 return mRenamedPackages.get(pkgName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700458 }
459
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700460 String addRenamedPackageLPw(String pkgName, String origPkgName) {
461 return mRenamedPackages.put(pkgName, origPkgName);
462 }
463
Christopher Tatee9fd1fa2015-09-15 16:43:07 -0700464 void applyPendingPermissionGrantsLPw(String packageName, int userId) {
465 ArrayMap<String, ArraySet<RestoredPermissionGrant>> grantsByPackage =
466 mRestoredUserGrants.get(userId);
467 if (grantsByPackage == null || grantsByPackage.size() == 0) {
468 return;
469 }
470
471 ArraySet<RestoredPermissionGrant> grants = grantsByPackage.get(packageName);
472 if (grants == null || grants.size() == 0) {
473 return;
474 }
475
476 final PackageSetting ps = mPackages.get(packageName);
477 if (ps == null) {
478 Slog.e(TAG, "Can't find supposedly installed package " + packageName);
479 return;
480 }
481 final PermissionsState perms = ps.getPermissionsState();
482
483 for (RestoredPermissionGrant grant : grants) {
Todd Kennedy0eb97382017-10-03 16:57:22 -0700484 BasePermission bp = mPermissions.getPermission(grant.permissionName);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -0700485 if (bp != null) {
486 if (grant.granted) {
487 perms.grantRuntimePermission(bp, userId);
488 }
489 perms.updatePermissionFlags(bp, userId, USER_RUNTIME_GRANT_MASK, grant.grantBits);
490 }
491 }
492
493 // And remove it from the pending-grant bookkeeping
494 grantsByPackage.remove(packageName);
495 if (grantsByPackage.size() < 1) {
496 mRestoredUserGrants.remove(userId);
497 }
498 writeRuntimePermissionsForUserLPr(userId, false);
499 }
500
Todd Kennedy0eb97382017-10-03 16:57:22 -0700501 public boolean canPropagatePermissionToInstantApp(String permName) {
502 return mPermissions.canPropagatePermissionToInstantApp(permName);
503 }
504
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700505 void setInstallerPackageName(String pkgName, String installerPkgName) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700506 PackageSetting p = mPackages.get(pkgName);
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700507 if (p != null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700508 p.setInstallerPackageName(installerPkgName);
Sudheer Shanka29283372016-04-04 20:56:27 -0700509 if (installerPkgName != null) {
510 mInstallerPackages.add(installerPkgName);
511 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700512 }
513 }
514
Todd Kennedy13715d52016-08-01 13:38:57 -0700515 /** Gets and optionally creates a new shared user id. */
Todd Kennedyff35e662016-09-20 12:53:52 -0700516 SharedUserSetting getSharedUserLPw(String name, int pkgFlags, int pkgPrivateFlags,
517 boolean create) throws PackageManagerException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700518 SharedUserSetting s = mSharedUsers.get(name);
Todd Kennedyff35e662016-09-20 12:53:52 -0700519 if (s == null && create) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800520 s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800521 s.userId = newUserIdLPw(s);
Todd Kennedyff35e662016-09-20 12:53:52 -0700522 if (s.userId < 0) {
523 // < 0 means we couldn't assign a userid; throw exception
524 throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE,
525 "Creating shared user " + name + " failed");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700526 }
Todd Kennedyff35e662016-09-20 12:53:52 -0700527 Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
528 mSharedUsers.put(name, s);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700529 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700530 return s;
531 }
532
Narayan Kamathdf6d6dc2014-04-28 14:18:34 +0100533 Collection<SharedUserSetting> getAllSharedUsersLPw() {
534 return mSharedUsers.values();
535 }
536
Svet Ganov354cd3c2015-12-17 11:35:04 -0800537 boolean disableSystemPackageLPw(String name, boolean replaced) {
Kenny Root447106f2011-03-23 11:00:15 -0700538 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700539 if(p == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -0700540 Log.w(PackageManagerService.TAG, "Package " + name + " is not an installed package");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700541 return false;
542 }
Kenny Root447106f2011-03-23 11:00:15 -0700543 final PackageSetting dp = mDisabledSysPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700544 // always make sure the system package code and resource paths dont change
Todd Kennedyc29b11a2017-10-23 15:55:59 -0700545 if (dp == null && p.pkg != null && p.pkg.isSystem() && !p.pkg.isUpdatedSystemApp()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700546 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
547 p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
548 }
549 mDisabledSysPackages.put(name, p);
550
Svet Ganov354cd3c2015-12-17 11:35:04 -0800551 if (replaced) {
552 // a little trick... when we install the new package, we don't
553 // want to modify the existing PackageSetting for the built-in
554 // version. so at this point we need a new PackageSetting that
555 // is okay to muck with.
556 PackageSetting newp = new PackageSetting(p);
557 replacePackageLPw(name, newp);
Svet Ganov354cd3c2015-12-17 11:35:04 -0800558 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700559 return true;
560 }
561 return false;
562 }
563
Kenny Root447106f2011-03-23 11:00:15 -0700564 PackageSetting enableSystemPackageLPw(String name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700565 PackageSetting p = mDisabledSysPackages.get(name);
566 if(p == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -0700567 Log.w(PackageManagerService.TAG, "Package " + name + " is not disabled");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700568 return null;
569 }
570 // Reset flag in ApplicationInfo object
571 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
572 p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
573 }
Kenny Root447106f2011-03-23 11:00:15 -0700574 PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100575 p.legacyNativeLibraryPathString, p.primaryCpuAbiString,
Selim Gurun5c8acb42016-04-07 16:34:02 -0700576 p.secondaryCpuAbiString, p.cpuAbiOverrideString,
Svet Ganov354cd3c2015-12-17 11:35:04 -0800577 p.appId, p.versionCode, p.pkgFlags, p.pkgPrivateFlags,
Svet Ganov67882122016-12-11 16:36:34 -0800578 p.parentPackageName, p.childPackageNames, p.usesStaticLibraries,
579 p.usesStaticLibrariesVersions);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700580 mDisabledSysPackages.remove(name);
581 return ret;
582 }
583
Kenny Rootc52d6fd2012-05-07 23:04:52 -0700584 boolean isDisabledSystemPackageLPr(String name) {
585 return mDisabledSysPackages.containsKey(name);
586 }
587
588 void removeDisabledSystemPackageLPw(String name) {
589 mDisabledSysPackages.remove(name);
590 }
591
Kenny Root447106f2011-03-23 11:00:15 -0700592 PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
Svet Ganovf4ff39c2016-02-04 14:27:05 -0800593 String legacyNativeLibraryPathString, String primaryCpuAbiString,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700594 String secondaryCpuAbiString, String cpuAbiOverrideString, int uid, long vc, int
Svet Ganovf4ff39c2016-02-04 14:27:05 -0800595 pkgFlags, int pkgPrivateFlags, String parentPackageName,
Svet Ganov67882122016-12-11 16:36:34 -0800596 List<String> childPackageNames, String[] usesStaticLibraries,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700597 long[] usesStaticLibraryNames) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700598 PackageSetting p = mPackages.get(name);
599 if (p != null) {
Amith Yamasani13593602012-03-22 16:16:17 -0700600 if (p.appId == uid) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700601 return p;
602 }
603 PackageManagerService.reportSettingsProblem(Log.ERROR,
604 "Adding duplicate package, keeping first: " + name);
605 return null;
606 }
Narayan Kamathff110bd2014-07-04 18:30:45 +0100607 p = new PackageSetting(name, realName, codePath, resourcePath,
Narayan Kamath4903f642014-08-11 13:33:45 +0100608 legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString,
Svet Ganov354cd3c2015-12-17 11:35:04 -0800609 cpuAbiOverrideString, vc, pkgFlags, pkgPrivateFlags, parentPackageName,
Svet Ganov67882122016-12-11 16:36:34 -0800610 childPackageNames, 0 /*userId*/, usesStaticLibraries, usesStaticLibraryNames);
Amith Yamasani13593602012-03-22 16:16:17 -0700611 p.appId = uid;
Kenny Root447106f2011-03-23 11:00:15 -0700612 if (addUserIdLPw(uid, p, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700613 mPackages.put(name, p);
614 return p;
615 }
616 return null;
617 }
618
Todd Kennedyc8423932017-10-05 08:58:36 -0700619 void addAppOpPackage(String permName, String packageName) {
620 mPermissions.addAppOpPackage(permName, packageName);
621 }
622
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800623 SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags, int pkgPrivateFlags) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700624 SharedUserSetting s = mSharedUsers.get(name);
625 if (s != null) {
626 if (s.userId == uid) {
627 return s;
628 }
629 PackageManagerService.reportSettingsProblem(Log.ERROR,
630 "Adding duplicate shared user, keeping first: " + name);
631 return null;
632 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800633 s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700634 s.userId = uid;
Kenny Root447106f2011-03-23 11:00:15 -0700635 if (addUserIdLPw(uid, s, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700636 mSharedUsers.put(name, s);
637 return s;
638 }
639 return null;
640 }
641
Christopher Tate86b391c2013-09-13 16:58:36 -0700642 void pruneSharedUsersLPw() {
643 ArrayList<String> removeStage = new ArrayList<String>();
644 for (Map.Entry<String,SharedUserSetting> entry : mSharedUsers.entrySet()) {
645 final SharedUserSetting sus = entry.getValue();
Todd Kennedy68f67152015-10-21 13:09:10 -0700646 if (sus == null) {
647 removeStage.add(entry.getKey());
648 continue;
649 }
650 // remove packages that are no longer installed
651 for (Iterator<PackageSetting> iter = sus.packages.iterator(); iter.hasNext();) {
652 PackageSetting ps = iter.next();
653 if (mPackages.get(ps.name) == null) {
654 iter.remove();
655 }
656 }
657 if (sus.packages.size() == 0) {
Christopher Tate86b391c2013-09-13 16:58:36 -0700658 removeStage.add(entry.getKey());
659 }
660 }
661 for (int i = 0; i < removeStage.size(); i++) {
662 mSharedUsers.remove(removeStage.get(i));
663 }
664 }
665
Todd Kennedy0eb97382017-10-03 16:57:22 -0700666 /**
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700667 * Creates a new {@code PackageSetting} object.
668 * Use this method instead of the constructor to ensure a settings object is created
669 * with the correct base.
Todd Kennedy13715d52016-08-01 13:38:57 -0700670 */
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700671 static @NonNull PackageSetting createNewSetting(String pkgName, PackageSetting originalPkg,
672 PackageSetting disabledPkg, String realPkgName, SharedUserSetting sharedUser,
673 File codePath, File resourcePath, String legacyNativeLibraryPath, String primaryCpuAbi,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700674 String secondaryCpuAbi, long versionCode, int pkgFlags, int pkgPrivateFlags,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700675 UserHandle installUser, boolean allowInstall, boolean instantApp,
676 boolean virtualPreload, String parentPkgName, List<String> childPkgNames,
677 UserManagerService userManager,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700678 String[] usesStaticLibraries, long[] usesStaticLibrariesVersions) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700679 final PackageSetting pkgSetting;
680 if (originalPkg != null) {
681 if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package "
682 + pkgName + " is adopting original package " + originalPkg.name);
683 pkgSetting = new PackageSetting(originalPkg, pkgName /*realPkgName*/);
684 pkgSetting.childPackageNames =
685 (childPkgNames != null) ? new ArrayList<>(childPkgNames) : null;
686 pkgSetting.codePath = codePath;
687 pkgSetting.legacyNativeLibraryPathString = legacyNativeLibraryPath;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700688 pkgSetting.parentPackageName = parentPkgName;
689 pkgSetting.pkgFlags = pkgFlags;
690 pkgSetting.pkgPrivateFlags = pkgPrivateFlags;
Todd Kennedy13715d52016-08-01 13:38:57 -0700691 pkgSetting.primaryCpuAbiString = primaryCpuAbi;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700692 pkgSetting.resourcePath = resourcePath;
Todd Kennedy13715d52016-08-01 13:38:57 -0700693 pkgSetting.secondaryCpuAbiString = secondaryCpuAbi;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700694 // NOTE: Create a deeper copy of the package signatures so we don't
695 // overwrite the signatures in the original package setting.
696 pkgSetting.signatures = new PackageSignatures();
697 pkgSetting.versionCode = versionCode;
Svet Ganov67882122016-12-11 16:36:34 -0800698 pkgSetting.usesStaticLibraries = usesStaticLibraries;
699 pkgSetting.usesStaticLibrariesVersions = usesStaticLibrariesVersions;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700700 // Update new package state.
701 pkgSetting.setTimeStamp(codePath.lastModified());
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700702 } else {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700703 pkgSetting = new PackageSetting(pkgName, realPkgName, codePath, resourcePath,
704 legacyNativeLibraryPath, primaryCpuAbi, secondaryCpuAbi,
705 null /*cpuAbiOverrideString*/, versionCode, pkgFlags, pkgPrivateFlags,
Svet Ganov67882122016-12-11 16:36:34 -0800706 parentPkgName, childPkgNames, 0 /*sharedUserId*/, usesStaticLibraries,
707 usesStaticLibrariesVersions);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700708 pkgSetting.setTimeStamp(codePath.lastModified());
709 pkgSetting.sharedUser = sharedUser;
710 // If this is not a system app, it starts out stopped.
711 if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
712 if (DEBUG_STOPPED) {
713 RuntimeException e = new RuntimeException("here");
714 e.fillInStackTrace();
715 Slog.i(PackageManagerService.TAG, "Stopping package " + pkgName, e);
716 }
Todd Kennedy13715d52016-08-01 13:38:57 -0700717 List<UserInfo> users = getAllUsers(userManager);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700718 final int installUserId = installUser != null ? installUser.getIdentifier() : 0;
719 if (users != null && allowInstall) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700720 for (UserInfo user : users) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700721 // By default we consider this app to be installed
722 // for the user if no user has been specified (which
723 // means to leave it at its original value, and the
724 // original default value is true), or we are being
725 // asked to install for all users, or this is the
726 // user we are installing for.
727 final boolean installed = installUser == null
728 || (installUserId == UserHandle.USER_ALL
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700729 && !isAdbInstallDisallowed(userManager, user.id))
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700730 || installUserId == user.id;
731 pkgSetting.setUserState(user.id, 0, COMPONENT_ENABLED_STATE_DEFAULT,
732 installed,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800733 true /*stopped*/,
734 true /*notLaunched*/,
735 false /*hidden*/,
736 false /*suspended*/,
Suprabh Shukla151b21b2018-04-27 19:30:30 -0700737 null /*suspendingPackage*/,
738 null /*dialogMessage*/,
739 null /*suspendedAppExtras*/,
740 null /*suspendedLauncherExtras*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800741 instantApp,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700742 virtualPreload,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800743 null /*lastDisableAppCaller*/,
744 null /*enabledComponents*/,
745 null /*disabledComponents*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -0800746 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED,
Ben Gruver1ab3d6e2017-12-07 13:45:08 -0800747 0, PackageManager.INSTALL_REASON_UNKNOWN,
748 null /*harmfulAppWarning*/);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700749 }
750 }
751 }
752 if (sharedUser != null) {
753 pkgSetting.appId = sharedUser.userId;
754 } else {
755 // Clone the setting here for disabled system packages
756 if (disabledPkg != null) {
757 // For disabled packages a new setting is created
758 // from the existing user id. This still has to be
759 // added to list of user id's
760 // Copy signatures from previous setting
761 pkgSetting.signatures = new PackageSignatures(disabledPkg.signatures);
762 pkgSetting.appId = disabledPkg.appId;
763 // Clone permissions
764 pkgSetting.getPermissionsState().copyFrom(disabledPkg.getPermissionsState());
765 // Clone component info
766 List<UserInfo> users = getAllUsers(userManager);
767 if (users != null) {
768 for (UserInfo user : users) {
769 final int userId = user.id;
770 pkgSetting.setDisabledComponentsCopy(
771 disabledPkg.getDisabledComponents(userId), userId);
772 pkgSetting.setEnabledComponentsCopy(
773 disabledPkg.getEnabledComponents(userId), userId);
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700774 }
775 }
776 }
777 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700778 }
Todd Kennedy13715d52016-08-01 13:38:57 -0700779 return pkgSetting;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700780 }
781
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700782 /**
783 * Updates the given package setting using the provided information.
784 * <p>
785 * WARNING: The provided PackageSetting object may be mutated.
786 */
787 static void updatePackageSetting(@NonNull PackageSetting pkgSetting,
788 @Nullable PackageSetting disabledPkg, @Nullable SharedUserSetting sharedUser,
Todd Kennedy30a23a52018-01-04 13:27:49 -0800789 @NonNull File codePath, File resourcePath,
790 @Nullable String legacyNativeLibraryPath, @Nullable String primaryCpuAbi,
791 @Nullable String secondaryCpuAbi, int pkgFlags, int pkgPrivateFlags,
792 @Nullable List<String> childPkgNames, @NonNull UserManagerService userManager,
793 @Nullable String[] usesStaticLibraries, @Nullable long[] usesStaticLibrariesVersions)
794 throws PackageManagerException {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700795 final String pkgName = pkgSetting.name;
796 if (pkgSetting.sharedUser != sharedUser) {
797 PackageManagerService.reportSettingsProblem(Log.WARN,
798 "Package " + pkgName + " shared user changed from "
799 + (pkgSetting.sharedUser != null ? pkgSetting.sharedUser.name : "<nothing>")
800 + " to " + (sharedUser != null ? sharedUser.name : "<nothing>"));
801 throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
802 "Updating application package " + pkgName + " failed");
803 }
804
805 if (!pkgSetting.codePath.equals(codePath)) {
Todd Kennedy30a23a52018-01-04 13:27:49 -0800806 final boolean isSystem = pkgSetting.isSystem();
807 Slog.i(PackageManagerService.TAG,
808 "Update" + (isSystem ? " system" : "")
809 + " package " + pkgName
810 + " code path from " + pkgSetting.codePathString
811 + " to " + codePath.toString()
812 + "; Retain data and using new");
813 if (!isSystem) {
814 // The package isn't considered as installed if the application was
815 // first installed by another user. Update the installed flag when the
816 // application ever becomes part of the system.
817 if ((pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0 && disabledPkg == null) {
818 final List<UserInfo> allUserInfos = getAllUsers(userManager);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700819 if (allUserInfos != null) {
820 for (UserInfo userInfo : allUserInfos) {
821 pkgSetting.setInstalled(true, userInfo.id);
822 }
823 }
824 }
825
Todd Kennedy30a23a52018-01-04 13:27:49 -0800826 // Since we've changed paths, prefer the new native library path over
827 // the one stored in the package settings since we might have moved from
828 // internal to external storage or vice versa.
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700829 pkgSetting.legacyNativeLibraryPathString = legacyNativeLibraryPath;
830 }
Todd Kennedy30a23a52018-01-04 13:27:49 -0800831 pkgSetting.codePath = codePath;
832 pkgSetting.codePathString = codePath.toString();
833 }
834 if (!pkgSetting.resourcePath.equals(resourcePath)) {
835 final boolean isSystem = pkgSetting.isSystem();
836 Slog.i(PackageManagerService.TAG,
837 "Update" + (isSystem ? " system" : "")
838 + " package " + pkgName
839 + " resource path from " + pkgSetting.resourcePathString
840 + " to " + resourcePath.toString()
841 + "; Retain data and using new");
842 pkgSetting.resourcePath = resourcePath;
843 pkgSetting.resourcePathString = resourcePath.toString();
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700844 }
845 // If what we are scanning is a system (and possibly privileged) package,
846 // then make it so, regardless of whether it was previously installed only
Patrick Baumanna639d142018-05-02 15:00:59 -0700847 // in the data partition. Reset first.
848 pkgSetting.pkgFlags &= ~ApplicationInfo.FLAG_SYSTEM;
849 pkgSetting.pkgPrivateFlags &= ~(ApplicationInfo.PRIVATE_FLAG_PRIVILEGED
850 | ApplicationInfo.PRIVATE_FLAG_OEM
851 | ApplicationInfo.PRIVATE_FLAG_VENDOR
852 | ApplicationInfo.PRIVATE_FLAG_PRODUCT);
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700853 pkgSetting.pkgFlags |= pkgFlags & ApplicationInfo.FLAG_SYSTEM;
854 pkgSetting.pkgPrivateFlags |=
855 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
Svet Ganov087dce22017-09-07 15:42:16 -0700856 pkgSetting.pkgPrivateFlags |=
857 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_OEM;
Jiyong Park002fdbd2017-02-13 20:50:31 +0900858 pkgSetting.pkgPrivateFlags |=
859 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR;
Jaekyun Seok1713d9e2018-01-12 21:47:26 +0900860 pkgSetting.pkgPrivateFlags |=
861 pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700862 pkgSetting.primaryCpuAbiString = primaryCpuAbi;
863 pkgSetting.secondaryCpuAbiString = secondaryCpuAbi;
864 if (childPkgNames != null) {
865 pkgSetting.childPackageNames = new ArrayList<>(childPkgNames);
866 }
Todd Kennedy30a23a52018-01-04 13:27:49 -0800867 // Update static shared library dependencies if needed
868 if (usesStaticLibraries != null && usesStaticLibrariesVersions != null
869 && usesStaticLibraries.length == usesStaticLibrariesVersions.length) {
870 pkgSetting.usesStaticLibraries = usesStaticLibraries;
871 pkgSetting.usesStaticLibrariesVersions = usesStaticLibrariesVersions;
872 } else {
873 pkgSetting.usesStaticLibraries = null;
874 pkgSetting.usesStaticLibrariesVersions = null;
Svet Ganov67882122016-12-11 16:36:34 -0800875 }
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700876 }
877
878 /**
879 * Registers a user ID with the system. Potentially allocates a new user ID.
880 * @throws PackageManagerException If a user ID could not be allocated.
881 */
882 void addUserToSettingLPw(PackageSetting p) throws PackageManagerException {
883 if (p.appId == 0) {
884 // Assign new user ID
885 p.appId = newUserIdLPw(p);
886 } else {
887 // Add new setting to list of user IDs
888 addUserIdLPw(p.appId, p, p.name);
889 }
890 if (p.appId < 0) {
891 PackageManagerService.reportSettingsProblem(Log.WARN,
Jeff Sharkeyf60d8ab2017-02-24 11:06:49 -0700892 "Package " + p.name + " could not be assigned a valid UID");
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700893 throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE,
Jeff Sharkeyf60d8ab2017-02-24 11:06:49 -0700894 "Package " + p.name + " could not be assigned a valid UID");
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700895 }
896 }
897
898 /**
899 * Writes per-user package restrictions if the user state has changed. If the user
900 * state has not changed, this does nothing.
901 */
Todd Kennedyff35e662016-09-20 12:53:52 -0700902 void writeUserRestrictionsLPw(PackageSetting newPackage, PackageSetting oldPackage) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700903 // package doesn't exist; do nothing
Todd Kennedy8cad6232016-10-06 11:27:07 -0700904 if (getPackageLPr(newPackage.name) == null) {
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700905 return;
906 }
907 // no users defined; do nothing
908 final List<UserInfo> allUsers = getAllUsers(UserManagerService.getInstance());
909 if (allUsers == null) {
910 return;
911 }
912 for (UserInfo user : allUsers) {
913 final PackageUserState oldUserState = oldPackage == null
914 ? PackageSettingBase.DEFAULT_USER_STATE
915 : oldPackage.readUserState(user.id);
916 if (!oldUserState.equals(newPackage.readUserState(user.id))) {
917 writePackageRestrictionsLPr(user.id);
918 }
919 }
920 }
921
Todd Kennedy13715d52016-08-01 13:38:57 -0700922 static boolean isAdbInstallDisallowed(UserManagerService userManager, int userId) {
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700923 return userManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES,
924 userId);
925 }
926
Todd Kennedy30a23a52018-01-04 13:27:49 -0800927 // TODO: Move to scanPackageOnlyLI() after verifying signatures are setup correctly
928 // by that time.
Kenny Root447106f2011-03-23 11:00:15 -0700929 void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
Amith Yamasani483f3b02012-03-13 16:08:00 -0700930 // Update signatures if needed.
Daniel Cashman77029c52018-01-18 16:19:29 -0800931 if (p.signatures.mSigningDetails.signatures == null) {
932 p.signatures.mSigningDetails = pkg.mSigningDetails;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700933 }
934 // If this app defines a shared user id initialize
935 // the shared user signatures as well.
Daniel Cashman77029c52018-01-18 16:19:29 -0800936 if (p.sharedUser != null && p.sharedUser.signatures.mSigningDetails.signatures == null) {
937 p.sharedUser.signatures.mSigningDetails = pkg.mSigningDetails;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700938 }
Todd Kennedy788c8422016-08-10 10:52:34 -0700939 addPackageSettingLPw(p, p.sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700940 }
941
942 // Utility method that adds a PackageSetting to mPackages and
Christopher Tate6038d152015-06-17 13:07:46 -0700943 // completes updating the shared user attributes and any restored
944 // app link verification state
Todd Kennedy788c8422016-08-10 10:52:34 -0700945 private void addPackageSettingLPw(PackageSetting p, SharedUserSetting sharedUser) {
946 mPackages.put(p.name, p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700947 if (sharedUser != null) {
948 if (p.sharedUser != null && p.sharedUser != sharedUser) {
949 PackageManagerService.reportSettingsProblem(Log.ERROR,
950 "Package " + p.name + " was user "
951 + p.sharedUser + " but is now " + sharedUser
952 + "; I am not changing its files so it will probably fail!");
Ben Gruverdd72c9e2013-08-06 12:34:17 -0700953 p.sharedUser.removePackage(p);
Amith Yamasani13593602012-03-22 16:16:17 -0700954 } else if (p.appId != sharedUser.userId) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700955 PackageManagerService.reportSettingsProblem(Log.ERROR,
Amith Yamasani13593602012-03-22 16:16:17 -0700956 "Package " + p.name + " was user id " + p.appId
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700957 + " but is now user " + sharedUser
958 + " with id " + sharedUser.userId
959 + "; I am not changing its files so it will probably fail!");
960 }
961
Ben Gruverdd72c9e2013-08-06 12:34:17 -0700962 sharedUser.addPackage(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700963 p.sharedUser = sharedUser;
Amith Yamasani13593602012-03-22 16:16:17 -0700964 p.appId = sharedUser.userId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700965 }
Svet Ganove7af1942015-08-04 11:13:44 -0700966
967 // If the we know about this user id, we have to update it as it
968 // has to point to the same PackageSetting instance as the package.
969 Object userIdPs = getUserIdLPr(p.appId);
970 if (sharedUser == null) {
971 if (userIdPs != null && userIdPs != p) {
972 replaceUserIdLPw(p.appId, p);
973 }
974 } else {
975 if (userIdPs != null && userIdPs != sharedUser) {
976 replaceUserIdLPw(p.appId, sharedUser);
977 }
978 }
979
Todd Kennedy788c8422016-08-10 10:52:34 -0700980 IntentFilterVerificationInfo ivi = mRestoredIntentFilterVerifications.get(p.name);
Christopher Tate6038d152015-06-17 13:07:46 -0700981 if (ivi != null) {
982 if (DEBUG_DOMAIN_VERIFICATION) {
Todd Kennedy788c8422016-08-10 10:52:34 -0700983 Slog.i(TAG, "Applying restored IVI for " + p.name + " : " + ivi.getStatusString());
Christopher Tate6038d152015-06-17 13:07:46 -0700984 }
Todd Kennedy788c8422016-08-10 10:52:34 -0700985 mRestoredIntentFilterVerifications.remove(p.name);
Christopher Tate6038d152015-06-17 13:07:46 -0700986 p.setIntentFilterVerificationInfo(ivi);
987 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700988 }
989
990 /*
991 * Update the shared user setting when a package using
992 * specifying the shared user id is removed. The gids
993 * associated with each permission of the deleted package
994 * are removed from the shared user's gid list only if its
995 * not in use by other permissions of packages in the
996 * shared user setting.
997 */
Svetoslavc6d1c342015-02-26 14:44:43 -0800998 int updateSharedUserPermsLPw(PackageSetting deletedPs, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -0700999 if ((deletedPs == null) || (deletedPs.pkg == null)) {
1000 Slog.i(PackageManagerService.TAG,
1001 "Trying to update info for null package. Just ignoring");
Svetoslavc6d1c342015-02-26 14:44:43 -08001002 return UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001003 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001004
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001005 // No sharedUserId
1006 if (deletedPs.sharedUser == null) {
Svetoslavc6d1c342015-02-26 14:44:43 -08001007 return UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001008 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001009
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001010 SharedUserSetting sus = deletedPs.sharedUser;
Svetoslavc6d1c342015-02-26 14:44:43 -08001011
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001012 // Update permissions
Kenny Root447106f2011-03-23 11:00:15 -07001013 for (String eachPerm : deletedPs.pkg.requestedPermissions) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07001014 BasePermission bp = mPermissions.getPermission(eachPerm);
Svetoslavc6d1c342015-02-26 14:44:43 -08001015 if (bp == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001016 continue;
1017 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001018
Svetoslavc6d1c342015-02-26 14:44:43 -08001019 // Check if another package in the shared user needs the permission.
Svetoslav4a5f4a22015-07-07 18:18:15 -07001020 boolean used = false;
Svetoslavc6d1c342015-02-26 14:44:43 -08001021 for (PackageSetting pkg : sus.packages) {
1022 if (pkg.pkg != null
1023 && !pkg.pkg.packageName.equals(deletedPs.pkg.packageName)
1024 && pkg.pkg.requestedPermissions.contains(eachPerm)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001025 used = true;
1026 break;
1027 }
1028 }
Svetoslav4a5f4a22015-07-07 18:18:15 -07001029 if (used) {
1030 continue;
1031 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001032
Svetoslav4a5f4a22015-07-07 18:18:15 -07001033 PermissionsState permissionsState = sus.getPermissionsState();
1034 PackageSetting disabledPs = getDisabledSystemPkgLPr(deletedPs.pkg.packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07001035
Svetoslav4a5f4a22015-07-07 18:18:15 -07001036 // If the package is shadowing is a disabled system package,
1037 // do not drop permissions that the shadowed package requests.
1038 if (disabledPs != null) {
1039 boolean reqByDisabledSysPkg = false;
1040 for (String permission : disabledPs.pkg.requestedPermissions) {
1041 if (permission.equals(eachPerm)) {
1042 reqByDisabledSysPkg = true;
1043 break;
1044 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001045 }
Svetoslav4a5f4a22015-07-07 18:18:15 -07001046 if (reqByDisabledSysPkg) {
1047 continue;
Svetoslavc6d1c342015-02-26 14:44:43 -08001048 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001049 }
Svetoslav4a5f4a22015-07-07 18:18:15 -07001050
1051 // Try to revoke as an install permission which is for all users.
1052 // The package is gone - no need to keep flags for applying policy.
1053 permissionsState.updatePermissionFlags(bp, userId,
1054 PackageManager.MASK_PERMISSION_FLAGS, 0);
1055
1056 if (permissionsState.revokeInstallPermission(bp) ==
1057 PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
1058 return UserHandle.USER_ALL;
1059 }
1060
1061 // Try to revoke as an install permission which is per user.
1062 if (permissionsState.revokeRuntimePermission(bp, userId) ==
1063 PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
1064 return userId;
1065 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001066 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001067
1068 return UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001069 }
1070
Kenny Root447106f2011-03-23 11:00:15 -07001071 int removePackageLPw(String name) {
1072 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001073 if (p != null) {
1074 mPackages.remove(name);
Sudheer Shanka29283372016-04-04 20:56:27 -07001075 removeInstallerPackageStatus(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001076 if (p.sharedUser != null) {
Ben Gruverdd72c9e2013-08-06 12:34:17 -07001077 p.sharedUser.removePackage(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001078 if (p.sharedUser.packages.size() == 0) {
1079 mSharedUsers.remove(p.sharedUser.name);
Kenny Root447106f2011-03-23 11:00:15 -07001080 removeUserIdLPw(p.sharedUser.userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001081 return p.sharedUser.userId;
1082 }
1083 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07001084 removeUserIdLPw(p.appId);
1085 return p.appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001086 }
1087 }
1088 return -1;
1089 }
1090
Sudheer Shanka29283372016-04-04 20:56:27 -07001091 /**
1092 * Checks if {@param packageName} is an installer package and if so, clear the installer
1093 * package name of the packages that are installed by this.
1094 */
1095 private void removeInstallerPackageStatus(String packageName) {
1096 // Check if the package to be removed is an installer package.
1097 if (!mInstallerPackages.contains(packageName)) {
1098 return;
1099 }
1100 for (int i = 0; i < mPackages.size(); i++) {
1101 final PackageSetting ps = mPackages.valueAt(i);
1102 final String installerPackageName = ps.getInstallerPackageName();
1103 if (installerPackageName != null
1104 && installerPackageName.equals(packageName)) {
1105 ps.setInstallerPackageName(null);
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07001106 ps.isOrphaned = true;
Sudheer Shanka29283372016-04-04 20:56:27 -07001107 }
1108 }
1109 mInstallerPackages.remove(packageName);
1110 }
1111
Kenny Root447106f2011-03-23 11:00:15 -07001112 private void replacePackageLPw(String name, PackageSetting newp) {
1113 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001114 if (p != null) {
1115 if (p.sharedUser != null) {
Ben Gruverdd72c9e2013-08-06 12:34:17 -07001116 p.sharedUser.removePackage(p);
1117 p.sharedUser.addPackage(newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001118 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07001119 replaceUserIdLPw(p.appId, newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001120 }
1121 }
1122 mPackages.put(name, newp);
1123 }
1124
Kenny Root447106f2011-03-23 11:00:15 -07001125 private boolean addUserIdLPw(int uid, Object obj, Object name) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001126 if (uid > Process.LAST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001127 return false;
1128 }
1129
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001130 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001131 int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001132 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001133 while (index >= N) {
1134 mUserIds.add(null);
1135 N++;
1136 }
1137 if (mUserIds.get(index) != null) {
1138 PackageManagerService.reportSettingsProblem(Log.ERROR,
1139 "Adding duplicate user id: " + uid
1140 + " name=" + name);
1141 return false;
1142 }
1143 mUserIds.set(index, obj);
1144 } else {
1145 if (mOtherUserIds.get(uid) != null) {
1146 PackageManagerService.reportSettingsProblem(Log.ERROR,
1147 "Adding duplicate shared id: " + uid
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001148 + " name=" + name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001149 return false;
1150 }
1151 mOtherUserIds.put(uid, obj);
1152 }
1153 return true;
1154 }
1155
Kenny Root447106f2011-03-23 11:00:15 -07001156 public Object getUserIdLPr(int uid) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001157 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001158 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001159 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001160 return index < N ? mUserIds.get(index) : null;
1161 } else {
1162 return mOtherUserIds.get(uid);
1163 }
1164 }
1165
Kenny Root447106f2011-03-23 11:00:15 -07001166 private void removeUserIdLPw(int uid) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001167 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001168 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001169 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001170 if (index < N) mUserIds.set(index, null);
1171 } else {
1172 mOtherUserIds.remove(uid);
1173 }
Geremy Condra12c18382013-03-06 16:49:06 -08001174 setFirstAvailableUid(uid+1);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001175 }
1176
Kenny Root447106f2011-03-23 11:00:15 -07001177 private void replaceUserIdLPw(int uid, Object obj) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001178 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001179 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001180 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001181 if (index < N) mUserIds.set(index, obj);
1182 } else {
1183 mOtherUserIds.put(uid, obj);
1184 }
1185 }
1186
Dianne Hackborn63092712012-10-07 14:45:35 -07001187 PreferredIntentResolver editPreferredActivitiesLPw(int userId) {
1188 PreferredIntentResolver pir = mPreferredActivities.get(userId);
1189 if (pir == null) {
1190 pir = new PreferredIntentResolver();
1191 mPreferredActivities.put(userId, pir);
1192 }
1193 return pir;
1194 }
1195
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001196 PersistentPreferredIntentResolver editPersistentPreferredActivitiesLPw(int userId) {
1197 PersistentPreferredIntentResolver ppir = mPersistentPreferredActivities.get(userId);
1198 if (ppir == null) {
1199 ppir = new PersistentPreferredIntentResolver();
1200 mPersistentPreferredActivities.put(userId, ppir);
1201 }
1202 return ppir;
1203 }
1204
Nicolas Prevot81948992014-05-16 18:25:26 +01001205 CrossProfileIntentResolver editCrossProfileIntentResolverLPw(int userId) {
1206 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(userId);
1207 if (cpir == null) {
1208 cpir = new CrossProfileIntentResolver();
1209 mCrossProfileIntentResolvers.put(userId, cpir);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001210 }
Nicolas Prevot81948992014-05-16 18:25:26 +01001211 return cpir;
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001212 }
1213
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001214 /**
1215 * The following functions suppose that you have a lock for managing access to the
1216 * mIntentFiltersVerifications map.
1217 */
1218
1219 /* package protected */
1220 IntentFilterVerificationInfo getIntentFilterVerificationLPr(String packageName) {
1221 PackageSetting ps = mPackages.get(packageName);
1222 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001223 if (DEBUG_DOMAIN_VERIFICATION) {
1224 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1225 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001226 return null;
1227 }
1228 return ps.getIntentFilterVerificationInfo();
1229 }
1230
1231 /* package protected */
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001232 IntentFilterVerificationInfo createIntentFilterVerificationIfNeededLPw(String packageName,
Todd Kennedy788c8422016-08-10 10:52:34 -07001233 ArraySet<String> domains) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001234 PackageSetting ps = mPackages.get(packageName);
1235 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001236 if (DEBUG_DOMAIN_VERIFICATION) {
1237 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1238 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001239 return null;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001240 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001241 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1242 if (ivi == null) {
1243 ivi = new IntentFilterVerificationInfo(packageName, domains);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001244 ps.setIntentFilterVerificationInfo(ivi);
Christopher Tate72c10a22015-06-12 18:31:24 -07001245 if (DEBUG_DOMAIN_VERIFICATION) {
1246 Slog.d(PackageManagerService.TAG,
1247 "Creating new IntentFilterVerificationInfo for pkg: " + packageName);
1248 }
Fabrice Di Meglio1de3f0d2015-04-29 19:42:41 -07001249 } else {
1250 ivi.setDomains(domains);
Christopher Tate72c10a22015-06-12 18:31:24 -07001251 if (DEBUG_DOMAIN_VERIFICATION) {
1252 Slog.d(PackageManagerService.TAG,
1253 "Setting domains to existing IntentFilterVerificationInfo for pkg: " +
1254 packageName + " and with domains: " + ivi.getDomainsString());
1255 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001256 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001257 return ivi;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001258 }
1259
1260 int getIntentFilterVerificationStatusLPr(String packageName, int userId) {
1261 PackageSetting ps = mPackages.get(packageName);
1262 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001263 if (DEBUG_DOMAIN_VERIFICATION) {
1264 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1265 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001266 return INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
1267 }
Christopher Tated85a6642015-07-17 15:39:08 -07001268 return (int)(ps.getDomainVerificationStatusForUser(userId) >> 32);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001269 }
1270
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001271 boolean updateIntentFilterVerificationStatusLPw(String packageName, final int status, int userId) {
Fabrice Di Meglio07885952015-04-06 19:41:28 -07001272 // Update the status for the current package
1273 PackageSetting current = mPackages.get(packageName);
1274 if (current == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001275 if (DEBUG_DOMAIN_VERIFICATION) {
1276 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1277 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001278 return false;
1279 }
Christopher Tate050aee22015-07-01 16:50:43 -07001280
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001281 final int alwaysGeneration;
1282 if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
1283 alwaysGeneration = mNextAppLinkGeneration.get(userId) + 1;
1284 mNextAppLinkGeneration.put(userId, alwaysGeneration);
1285 } else {
1286 alwaysGeneration = 0;
1287 }
1288
1289 current.setDomainVerificationStatusForUser(status, alwaysGeneration, userId);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001290 return true;
1291 }
1292
1293 /**
Fabrice Di Meglio07885952015-04-06 19:41:28 -07001294 * Used for Settings App and PackageManagerService dump. Should be read only.
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001295 */
1296 List<IntentFilterVerificationInfo> getIntentFilterVerificationsLPr(
1297 String packageName) {
1298 if (packageName == null) {
1299 return Collections.<IntentFilterVerificationInfo>emptyList();
1300 }
1301 ArrayList<IntentFilterVerificationInfo> result = new ArrayList<>();
1302 for (PackageSetting ps : mPackages.values()) {
1303 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1304 if (ivi == null || TextUtils.isEmpty(ivi.getPackageName()) ||
1305 !ivi.getPackageName().equalsIgnoreCase(packageName)) {
1306 continue;
1307 }
1308 result.add(ivi);
1309 }
1310 return result;
1311 }
1312
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001313 boolean removeIntentFilterVerificationLPw(String packageName, int userId) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001314 PackageSetting ps = mPackages.get(packageName);
1315 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001316 if (DEBUG_DOMAIN_VERIFICATION) {
1317 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1318 }
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001319 return false;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001320 }
1321 ps.clearDomainVerificationStatusForUser(userId);
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001322 return true;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001323 }
1324
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001325 boolean removeIntentFilterVerificationLPw(String packageName, int[] userIds) {
1326 boolean result = false;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001327 for (int userId : userIds) {
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001328 result |= removeIntentFilterVerificationLPw(packageName, userId);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001329 }
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001330 return result;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001331 }
1332
Christopher Tatedb3fe812015-06-24 16:15:48 -07001333 boolean setDefaultBrowserPackageNameLPw(String packageName, int userId) {
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001334 if (userId == UserHandle.USER_ALL) {
1335 return false;
1336 }
Christopher Tate53d52c82017-04-24 15:55:33 -07001337 if (packageName != null) {
1338 mDefaultBrowserApp.put(userId, packageName);
1339 } else {
1340 mDefaultBrowserApp.remove(userId);
1341 }
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001342 writePackageRestrictionsLPr(userId);
1343 return true;
1344 }
1345
1346 String getDefaultBrowserPackageNameLPw(int userId) {
1347 return (userId == UserHandle.USER_ALL) ? null : mDefaultBrowserApp.get(userId);
1348 }
1349
Robin Lee0dc591b2016-05-04 13:01:46 +01001350 boolean setDefaultDialerPackageNameLPw(String packageName, int userId) {
1351 if (userId == UserHandle.USER_ALL) {
1352 return false;
1353 }
1354 mDefaultDialerApp.put(userId, packageName);
1355 writePackageRestrictionsLPr(userId);
1356 return true;
1357 }
1358
1359 String getDefaultDialerPackageNameLPw(int userId) {
1360 return (userId == UserHandle.USER_ALL) ? null : mDefaultDialerApp.get(userId);
1361 }
1362
Amith Yamasani483f3b02012-03-13 16:08:00 -07001363 private File getUserPackagesStateFile(int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08001364 // TODO: Implement a cleaner solution when adding tests.
1365 // This instead of Environment.getUserSystemDirectory(userId) to support testing.
1366 File userDir = new File(new File(mSystemDir, "users"), Integer.toString(userId));
1367 return new File(userDir, "package-restrictions.xml");
1368 }
1369
1370 private File getUserRuntimePermissionsFile(int userId) {
1371 // TODO: Implement a cleaner solution when adding tests.
1372 // This instead of Environment.getUserSystemDirectory(userId) to support testing.
1373 File userDir = new File(new File(mSystemDir, "users"), Integer.toString(userId));
1374 return new File(userDir, RUNTIME_PERMISSIONS_FILE_NAME);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001375 }
1376
1377 private File getUserPackagesStateBackupFile(int userId) {
Amith Yamasani61f57372012-08-31 12:12:28 -07001378 return new File(Environment.getUserSystemDirectory(userId),
1379 "package-restrictions-backup.xml");
Amith Yamasani483f3b02012-03-13 16:08:00 -07001380 }
1381
1382 void writeAllUsersPackageRestrictionsLPr() {
Todd Kennedy13715d52016-08-01 13:38:57 -07001383 List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
Amith Yamasani483f3b02012-03-13 16:08:00 -07001384 if (users == null) return;
1385
1386 for (UserInfo user : users) {
1387 writePackageRestrictionsLPr(user.id);
1388 }
1389 }
1390
Svetoslavc6d1c342015-02-26 14:44:43 -08001391 void writeAllRuntimePermissionsLPr() {
1392 for (int userId : UserManagerService.getInstance().getUserIds()) {
1393 mRuntimePermissionsPersistence.writePermissionsForUserAsyncLPr(userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001394 }
1395 }
1396
Svet Ganovba3ba812015-06-26 10:54:06 -07001397 boolean areDefaultRuntimePermissionsGrantedLPr(int userId) {
1398 return mRuntimePermissionsPersistence
1399 .areDefaultRuntimPermissionsGrantedLPr(userId);
1400 }
1401
1402 void onDefaultRuntimePermissionsGrantedLPr(int userId) {
1403 mRuntimePermissionsPersistence
1404 .onDefaultRuntimePermissionsGrantedLPr(userId);
1405 }
1406
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001407 public VersionInfo findOrCreateVersion(String volumeUuid) {
1408 VersionInfo ver = mVersion.get(volumeUuid);
1409 if (ver == null) {
1410 ver = new VersionInfo();
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001411 mVersion.put(volumeUuid, ver);
1412 }
1413 return ver;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001414 }
1415
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001416 public VersionInfo getInternalVersion() {
1417 return mVersion.get(StorageManager.UUID_PRIVATE_INTERNAL);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001418 }
1419
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001420 public VersionInfo getExternalVersion() {
1421 return mVersion.get(StorageManager.UUID_PRIMARY_PHYSICAL);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001422 }
1423
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001424 public void onVolumeForgotten(String fsUuid) {
1425 mVersion.remove(fsUuid);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001426 }
1427
Christopher Tatee012a232015-04-01 17:18:50 -07001428 /**
1429 * Applies the preferred activity state described by the given XML. This code
1430 * also supports the restore-from-backup code path.
1431 *
1432 * @see PreferredActivityBackupHelper
1433 */
1434 void readPreferredActivitiesLPw(XmlPullParser parser, int userId)
Dianne Hackborn63092712012-10-07 14:45:35 -07001435 throws XmlPullParserException, IOException {
1436 int outerDepth = parser.getDepth();
1437 int type;
1438 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1439 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1440 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1441 continue;
1442 }
1443
1444 String tagName = parser.getName();
1445 if (tagName.equals(TAG_ITEM)) {
1446 PreferredActivity pa = new PreferredActivity(parser);
1447 if (pa.mPref.getParseError() == null) {
1448 editPreferredActivitiesLPw(userId).addFilter(pa);
1449 } else {
1450 PackageManagerService.reportSettingsProblem(Log.WARN,
1451 "Error in package manager settings: <preferred-activity> "
1452 + pa.mPref.getParseError() + " at "
1453 + parser.getPositionDescription());
1454 }
1455 } else {
1456 PackageManagerService.reportSettingsProblem(Log.WARN,
1457 "Unknown element under <preferred-activities>: " + parser.getName());
1458 XmlUtils.skipCurrentTag(parser);
1459 }
1460 }
1461 }
1462
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001463 private void readPersistentPreferredActivitiesLPw(XmlPullParser parser, int userId)
1464 throws XmlPullParserException, IOException {
1465 int outerDepth = parser.getDepth();
1466 int type;
1467 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1468 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1469 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1470 continue;
1471 }
1472 String tagName = parser.getName();
1473 if (tagName.equals(TAG_ITEM)) {
1474 PersistentPreferredActivity ppa = new PersistentPreferredActivity(parser);
1475 editPersistentPreferredActivitiesLPw(userId).addFilter(ppa);
1476 } else {
1477 PackageManagerService.reportSettingsProblem(Log.WARN,
Sander Alewijnseaf597622014-03-20 18:44:57 +00001478 "Unknown element under <" + TAG_PERSISTENT_PREFERRED_ACTIVITIES + ">: "
1479 + parser.getName());
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001480 XmlUtils.skipCurrentTag(parser);
1481 }
1482 }
1483 }
1484
Nicolas Prevot81948992014-05-16 18:25:26 +01001485 private void readCrossProfileIntentFiltersLPw(XmlPullParser parser, int userId)
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001486 throws XmlPullParserException, IOException {
1487 int outerDepth = parser.getDepth();
1488 int type;
1489 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1490 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1491 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1492 continue;
1493 }
Christopher Tate6038d152015-06-17 13:07:46 -07001494 final String tagName = parser.getName();
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001495 if (tagName.equals(TAG_ITEM)) {
Nicolas Prevot81948992014-05-16 18:25:26 +01001496 CrossProfileIntentFilter cpif = new CrossProfileIntentFilter(parser);
1497 editCrossProfileIntentResolverLPw(userId).addFilter(cpif);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001498 } else {
Nicolas Prevot81948992014-05-16 18:25:26 +01001499 String msg = "Unknown element under " + TAG_CROSS_PROFILE_INTENT_FILTERS + ": " +
Christopher Tate6038d152015-06-17 13:07:46 -07001500 tagName;
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001501 PackageManagerService.reportSettingsProblem(Log.WARN, msg);
1502 XmlUtils.skipCurrentTag(parser);
1503 }
1504 }
1505 }
1506
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001507 private void readDomainVerificationLPw(XmlPullParser parser, PackageSettingBase packageSetting)
1508 throws XmlPullParserException, IOException {
1509 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1510 packageSetting.setIntentFilterVerificationInfo(ivi);
Todd Kennedy788c8422016-08-10 10:52:34 -07001511 if (DEBUG_PARSER) {
1512 Log.d(TAG, "Read domain verification for package: " + ivi.getPackageName());
1513 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001514 }
1515
Christopher Tate6038d152015-06-17 13:07:46 -07001516 private void readRestoredIntentFilterVerifications(XmlPullParser parser)
1517 throws XmlPullParserException, IOException {
1518 int outerDepth = parser.getDepth();
1519 int type;
1520 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1521 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1522 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1523 continue;
1524 }
1525 final String tagName = parser.getName();
1526 if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
1527 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1528 if (DEBUG_DOMAIN_VERIFICATION) {
1529 Slog.i(TAG, "Restored IVI for " + ivi.getPackageName()
1530 + " status=" + ivi.getStatusString());
1531 }
1532 mRestoredIntentFilterVerifications.put(ivi.getPackageName(), ivi);
1533 } else {
1534 Slog.w(TAG, "Unknown element: " + tagName);
1535 XmlUtils.skipCurrentTag(parser);
1536 }
1537 }
1538 }
1539
1540 void readDefaultAppsLPw(XmlPullParser parser, int userId)
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001541 throws XmlPullParserException, IOException {
1542 int outerDepth = parser.getDepth();
1543 int type;
1544 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1545 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1546 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1547 continue;
1548 }
1549 String tagName = parser.getName();
1550 if (tagName.equals(TAG_DEFAULT_BROWSER)) {
1551 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
1552 mDefaultBrowserApp.put(userId, packageName);
Robin Lee0dc591b2016-05-04 13:01:46 +01001553 } else if (tagName.equals(TAG_DEFAULT_DIALER)) {
1554 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
1555 mDefaultDialerApp.put(userId, packageName);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001556 } else {
1557 String msg = "Unknown element under " + TAG_DEFAULT_APPS + ": " +
1558 parser.getName();
1559 PackageManagerService.reportSettingsProblem(Log.WARN, msg);
1560 XmlUtils.skipCurrentTag(parser);
1561 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001562 }
1563 }
1564
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001565 void readBlockUninstallPackagesLPw(XmlPullParser parser, int userId)
1566 throws XmlPullParserException, IOException {
1567 int outerDepth = parser.getDepth();
1568 int type;
1569 ArraySet<String> packages = new ArraySet<>();
1570 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1571 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1572 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1573 continue;
1574 }
1575 String tagName = parser.getName();
1576 if (tagName.equals(TAG_BLOCK_UNINSTALL)) {
1577 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
1578 packages.add(packageName);
1579 } else {
1580 String msg = "Unknown element under " + TAG_BLOCK_UNINSTALL_PACKAGES + ": " +
1581 parser.getName();
1582 PackageManagerService.reportSettingsProblem(Log.WARN, msg);
1583 XmlUtils.skipCurrentTag(parser);
1584 }
1585 }
1586 if (packages.isEmpty()) {
1587 mBlockUninstallPackages.remove(userId);
1588 } else {
1589 mBlockUninstallPackages.put(userId, packages);
1590 }
1591 }
1592
Amith Yamasani483f3b02012-03-13 16:08:00 -07001593 void readPackageRestrictionsLPr(int userId) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001594 if (DEBUG_MU) {
1595 Log.i(TAG, "Reading package restrictions for user=" + userId);
1596 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07001597 FileInputStream str = null;
1598 File userPackagesStateFile = getUserPackagesStateFile(userId);
1599 File backupFile = getUserPackagesStateBackupFile(userId);
1600 if (backupFile.exists()) {
1601 try {
1602 str = new FileInputStream(backupFile);
1603 mReadMessages.append("Reading from backup stopped packages file\n");
1604 PackageManagerService.reportSettingsProblem(Log.INFO,
1605 "Need to read from backup stopped packages file");
1606 if (userPackagesStateFile.exists()) {
1607 // If both the backup and normal file exist, we
1608 // ignore the normal one since it might have been
1609 // corrupted.
1610 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
1611 + userPackagesStateFile);
1612 userPackagesStateFile.delete();
1613 }
1614 } catch (java.io.IOException e) {
1615 // We'll try for the normal settings file.
1616 }
1617 }
1618
1619 try {
1620 if (str == null) {
1621 if (!userPackagesStateFile.exists()) {
1622 mReadMessages.append("No stopped packages file found\n");
1623 PackageManagerService.reportSettingsProblem(Log.INFO,
1624 "No stopped packages file; "
1625 + "assuming all started");
1626 // At first boot, make sure no packages are stopped.
1627 // We usually want to have third party apps initialize
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001628 // in the stopped state, but not at first boot. Also
1629 // consider all applications to be installed.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001630 for (PackageSetting pkg : mPackages.values()) {
Jeff Sharkey42884192016-04-09 16:12:01 -06001631 pkg.setUserState(userId, 0, COMPONENT_ENABLED_STATE_DEFAULT,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001632 true /*installed*/,
1633 false /*stopped*/,
1634 false /*notLaunched*/,
1635 false /*hidden*/,
1636 false /*suspended*/,
Suprabh Shukla151b21b2018-04-27 19:30:30 -07001637 null /*suspendingPackage*/,
1638 null /*dialogMessage*/,
1639 null /*suspendedAppExtras*/,
1640 null /*suspendedLauncherExtras*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001641 false /*instantApp*/,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07001642 false /*virtualPreload*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001643 null /*lastDisableAppCaller*/,
1644 null /*enabledComponents*/,
1645 null /*disabledComponents*/,
Todd Kennedybe0b8892017-02-15 14:13:52 -08001646 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED,
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08001647 0, PackageManager.INSTALL_REASON_UNKNOWN,
1648 null /*harmfulAppWarning*/);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001649 }
1650 return;
1651 }
1652 str = new FileInputStream(userPackagesStateFile);
1653 }
1654 final XmlPullParser parser = Xml.newPullParser();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01001655 parser.setInput(str, StandardCharsets.UTF_8.name());
Amith Yamasani483f3b02012-03-13 16:08:00 -07001656
1657 int type;
1658 while ((type=parser.next()) != XmlPullParser.START_TAG
1659 && type != XmlPullParser.END_DOCUMENT) {
1660 ;
1661 }
1662
1663 if (type != XmlPullParser.START_TAG) {
1664 mReadMessages.append("No start tag found in package restrictions file\n");
1665 PackageManagerService.reportSettingsProblem(Log.WARN,
1666 "No start tag found in package manager stopped packages");
1667 return;
1668 }
1669
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001670 int maxAppLinkGeneration = 0;
1671
Amith Yamasani483f3b02012-03-13 16:08:00 -07001672 int outerDepth = parser.getDepth();
1673 PackageSetting ps = null;
1674 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1675 && (type != XmlPullParser.END_TAG
1676 || parser.getDepth() > outerDepth)) {
1677 if (type == XmlPullParser.END_TAG
1678 || type == XmlPullParser.TEXT) {
1679 continue;
1680 }
1681
1682 String tagName = parser.getName();
1683 if (tagName.equals(TAG_PACKAGE)) {
1684 String name = parser.getAttributeValue(null, ATTR_NAME);
1685 ps = mPackages.get(name);
1686 if (ps == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -07001687 Slog.w(PackageManagerService.TAG, "No package known for stopped package "
Amith Yamasani483f3b02012-03-13 16:08:00 -07001688 + name);
1689 XmlUtils.skipCurrentTag(parser);
1690 continue;
1691 }
Jeff Sharkey42884192016-04-09 16:12:01 -06001692
1693 final long ceDataInode = XmlUtils.readLongAttribute(parser, ATTR_CE_DATA_INODE,
1694 0);
1695 final boolean installed = XmlUtils.readBooleanAttribute(parser, ATTR_INSTALLED,
1696 true);
1697 final boolean stopped = XmlUtils.readBooleanAttribute(parser, ATTR_STOPPED,
1698 false);
1699 final boolean notLaunched = XmlUtils.readBooleanAttribute(parser,
1700 ATTR_NOT_LAUNCHED, false);
1701
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001702 // For backwards compatibility with the previous name of "blocked", which
1703 // now means hidden, read the old attribute as well.
Amith Yamasani655d0e22013-06-12 14:19:10 -07001704 final String blockedStr = parser.getAttributeValue(null, ATTR_BLOCKED);
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001705 boolean hidden = blockedStr == null
Amith Yamasani655d0e22013-06-12 14:19:10 -07001706 ? false : Boolean.parseBoolean(blockedStr);
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001707 final String hiddenStr = parser.getAttributeValue(null, ATTR_HIDDEN);
1708 hidden = hiddenStr == null
1709 ? hidden : Boolean.parseBoolean(hiddenStr);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001710
Jeff Sharkey42884192016-04-09 16:12:01 -06001711 final boolean suspended = XmlUtils.readBooleanAttribute(parser, ATTR_SUSPENDED,
1712 false);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001713 String suspendingPackage = parser.getAttributeValue(null,
1714 ATTR_SUSPENDING_PACKAGE);
Suprabh Shukla3c3af142018-03-30 00:28:37 -07001715 final String dialogMessage = parser.getAttributeValue(null,
1716 ATTR_SUSPEND_DIALOG_MESSAGE);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001717 if (suspended && suspendingPackage == null) {
1718 suspendingPackage = PLATFORM_PACKAGE_NAME;
1719 }
1720
Jeff Sharkey42884192016-04-09 16:12:01 -06001721 final boolean blockUninstall = XmlUtils.readBooleanAttribute(parser,
1722 ATTR_BLOCK_UNINSTALL, false);
Todd Kennedybe0b8892017-02-15 14:13:52 -08001723 final boolean instantApp = XmlUtils.readBooleanAttribute(parser,
1724 ATTR_INSTANT_APP, false);
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07001725 final boolean virtualPreload = XmlUtils.readBooleanAttribute(parser,
1726 ATTR_VIRTUAL_PRELOAD, false);
Jeff Sharkey42884192016-04-09 16:12:01 -06001727 final int enabled = XmlUtils.readIntAttribute(parser, ATTR_ENABLED,
1728 COMPONENT_ENABLED_STATE_DEFAULT);
1729 final String enabledCaller = parser.getAttributeValue(null,
1730 ATTR_ENABLED_CALLER);
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08001731 final String harmfulAppWarning =
1732 parser.getAttributeValue(null, ATTR_HARMFUL_APP_WARNING);
Jeff Sharkey42884192016-04-09 16:12:01 -06001733 final int verifState = XmlUtils.readIntAttribute(parser,
1734 ATTR_DOMAIN_VERIFICATON_STATE,
1735 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED);
1736 final int linkGeneration = XmlUtils.readIntAttribute(parser,
1737 ATTR_APP_LINK_GENERATION, 0);
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001738 if (linkGeneration > maxAppLinkGeneration) {
1739 maxAppLinkGeneration = linkGeneration;
1740 }
Bartosz Fabianowskia34f53f2017-01-11 18:08:47 +01001741 final int installReason = XmlUtils.readIntAttribute(parser,
1742 ATTR_INSTALL_REASON, PackageManager.INSTALL_REASON_UNKNOWN);
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001743
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001744 ArraySet<String> enabledComponents = null;
1745 ArraySet<String> disabledComponents = null;
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001746 PersistableBundle suspendedAppExtras = null;
1747 PersistableBundle suspendedLauncherExtras = null;
Amith Yamasani483f3b02012-03-13 16:08:00 -07001748
1749 int packageDepth = parser.getDepth();
1750 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1751 && (type != XmlPullParser.END_TAG
1752 || parser.getDepth() > packageDepth)) {
1753 if (type == XmlPullParser.END_TAG
1754 || type == XmlPullParser.TEXT) {
1755 continue;
1756 }
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001757 switch (parser.getName()) {
1758 case TAG_ENABLED_COMPONENTS:
1759 enabledComponents = readComponentsLPr(parser);
1760 break;
1761 case TAG_DISABLED_COMPONENTS:
1762 disabledComponents = readComponentsLPr(parser);
1763 break;
1764 case TAG_SUSPENDED_APP_EXTRAS:
1765 suspendedAppExtras = PersistableBundle.restoreFromXml(parser);
1766 break;
1767 case TAG_SUSPENDED_LAUNCHER_EXTRAS:
1768 suspendedLauncherExtras = PersistableBundle.restoreFromXml(parser);
1769 break;
1770 default:
1771 Slog.wtf(TAG, "Unknown tag " + parser.getName() + " under tag "
1772 + TAG_PACKAGE);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001773 }
1774 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001775
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001776 if (blockUninstall) {
1777 setBlockUninstallLPw(userId, name, true);
1778 }
Jeff Sharkey42884192016-04-09 16:12:01 -06001779 ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched,
Suprabh Shukla3c3af142018-03-30 00:28:37 -07001780 hidden, suspended, suspendingPackage, dialogMessage, suspendedAppExtras,
Suprabh Shukla021b57a2018-03-08 18:21:50 -08001781 suspendedLauncherExtras, instantApp, virtualPreload, enabledCaller,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07001782 enabledComponents, disabledComponents, verifState, linkGeneration,
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08001783 installReason, harmfulAppWarning);
Dianne Hackborn63092712012-10-07 14:45:35 -07001784 } else if (tagName.equals("preferred-activities")) {
1785 readPreferredActivitiesLPw(parser, userId);
Sander Alewijnseaf597622014-03-20 18:44:57 +00001786 } else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) {
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001787 readPersistentPreferredActivitiesLPw(parser, userId);
Nicolas Prevot29762c32014-07-29 18:51:32 +01001788 } else if (tagName.equals(TAG_CROSS_PROFILE_INTENT_FILTERS)) {
Nicolas Prevot81948992014-05-16 18:25:26 +01001789 readCrossProfileIntentFiltersLPw(parser, userId);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001790 } else if (tagName.equals(TAG_DEFAULT_APPS)) {
1791 readDefaultAppsLPw(parser, userId);
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001792 } else if (tagName.equals(TAG_BLOCK_UNINSTALL_PACKAGES)) {
1793 readBlockUninstallPackagesLPw(parser, userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001794 } else {
1795 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
1796 + parser.getName());
1797 XmlUtils.skipCurrentTag(parser);
1798 }
1799 }
1800
1801 str.close();
1802
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001803 mNextAppLinkGeneration.put(userId, maxAppLinkGeneration + 1);
1804
Amith Yamasani483f3b02012-03-13 16:08:00 -07001805 } catch (XmlPullParserException e) {
1806 mReadMessages.append("Error reading: " + e.toString());
1807 PackageManagerService.reportSettingsProblem(Log.ERROR,
1808 "Error reading stopped packages: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07001809 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
1810 e);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001811
1812 } catch (java.io.IOException e) {
1813 mReadMessages.append("Error reading: " + e.toString());
1814 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07001815 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
1816 e);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001817 }
1818 }
1819
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02001820 void setBlockUninstallLPw(int userId, String packageName, boolean blockUninstall) {
1821 ArraySet<String> packages = mBlockUninstallPackages.get(userId);
1822 if (blockUninstall) {
1823 if (packages == null) {
1824 packages = new ArraySet<String>();
1825 mBlockUninstallPackages.put(userId, packages);
1826 }
1827 packages.add(packageName);
1828 } else if (packages != null) {
1829 packages.remove(packageName);
1830 if (packages.isEmpty()) {
1831 mBlockUninstallPackages.remove(userId);
1832 }
1833 }
1834 }
1835
1836 boolean getBlockUninstallLPr(int userId, String packageName) {
1837 ArraySet<String> packages = mBlockUninstallPackages.get(userId);
1838 if (packages == null) {
1839 return false;
1840 }
1841 return packages.contains(packageName);
1842 }
1843
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001844 private ArraySet<String> readComponentsLPr(XmlPullParser parser)
Amith Yamasani483f3b02012-03-13 16:08:00 -07001845 throws IOException, XmlPullParserException {
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001846 ArraySet<String> components = null;
Amith Yamasani483f3b02012-03-13 16:08:00 -07001847 int type;
1848 int outerDepth = parser.getDepth();
1849 String tagName;
1850 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1851 && (type != XmlPullParser.END_TAG
1852 || parser.getDepth() > outerDepth)) {
1853 if (type == XmlPullParser.END_TAG
1854 || type == XmlPullParser.TEXT) {
1855 continue;
1856 }
1857 tagName = parser.getName();
1858 if (tagName.equals(TAG_ITEM)) {
1859 String componentName = parser.getAttributeValue(null, ATTR_NAME);
1860 if (componentName != null) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001861 if (components == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001862 components = new ArraySet<String>();
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001863 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07001864 components.add(componentName);
1865 }
1866 }
1867 }
1868 return components;
1869 }
1870
Christopher Tatee012a232015-04-01 17:18:50 -07001871 /**
1872 * Record the state of preferred activity configuration into XML. This is used both
1873 * for recording packages.xml internally and for supporting backup/restore of the
1874 * preferred activity configuration.
1875 */
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08001876 void writePreferredActivitiesLPr(XmlSerializer serializer, int userId, boolean full)
Dianne Hackborn63092712012-10-07 14:45:35 -07001877 throws IllegalArgumentException, IllegalStateException, IOException {
1878 serializer.startTag(null, "preferred-activities");
1879 PreferredIntentResolver pir = mPreferredActivities.get(userId);
1880 if (pir != null) {
1881 for (final PreferredActivity pa : pir.filterSet()) {
1882 serializer.startTag(null, TAG_ITEM);
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08001883 pa.writeToXml(serializer, full);
Dianne Hackborn63092712012-10-07 14:45:35 -07001884 serializer.endTag(null, TAG_ITEM);
1885 }
1886 }
1887 serializer.endTag(null, "preferred-activities");
1888 }
1889
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001890 void writePersistentPreferredActivitiesLPr(XmlSerializer serializer, int userId)
1891 throws IllegalArgumentException, IllegalStateException, IOException {
Sander Alewijnseaf597622014-03-20 18:44:57 +00001892 serializer.startTag(null, TAG_PERSISTENT_PREFERRED_ACTIVITIES);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001893 PersistentPreferredIntentResolver ppir = mPersistentPreferredActivities.get(userId);
1894 if (ppir != null) {
1895 for (final PersistentPreferredActivity ppa : ppir.filterSet()) {
1896 serializer.startTag(null, TAG_ITEM);
1897 ppa.writeToXml(serializer);
1898 serializer.endTag(null, TAG_ITEM);
1899 }
1900 }
Sander Alewijnseaf597622014-03-20 18:44:57 +00001901 serializer.endTag(null, TAG_PERSISTENT_PREFERRED_ACTIVITIES);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001902 }
1903
Nicolas Prevot81948992014-05-16 18:25:26 +01001904 void writeCrossProfileIntentFiltersLPr(XmlSerializer serializer, int userId)
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001905 throws IllegalArgumentException, IllegalStateException, IOException {
Nicolas Prevot81948992014-05-16 18:25:26 +01001906 serializer.startTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
1907 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(userId);
1908 if (cpir != null) {
1909 for (final CrossProfileIntentFilter cpif : cpir.filterSet()) {
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001910 serializer.startTag(null, TAG_ITEM);
Nicolas Prevot81948992014-05-16 18:25:26 +01001911 cpif.writeToXml(serializer);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001912 serializer.endTag(null, TAG_ITEM);
1913 }
1914 }
Nicolas Prevot81948992014-05-16 18:25:26 +01001915 serializer.endTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001916 }
1917
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001918 void writeDomainVerificationsLPr(XmlSerializer serializer,
1919 IntentFilterVerificationInfo verificationInfo)
1920 throws IllegalArgumentException, IllegalStateException, IOException {
1921 if (verificationInfo != null && verificationInfo.getPackageName() != null) {
1922 serializer.startTag(null, TAG_DOMAIN_VERIFICATION);
1923 verificationInfo.writeToXml(serializer);
Christopher Tate72c10a22015-06-12 18:31:24 -07001924 if (DEBUG_DOMAIN_VERIFICATION) {
1925 Slog.d(TAG, "Wrote domain verification for package: "
1926 + verificationInfo.getPackageName());
1927 }
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001928 serializer.endTag(null, TAG_DOMAIN_VERIFICATION);
1929 }
1930 }
1931
Christopher Tate6038d152015-06-17 13:07:46 -07001932 // Specifically for backup/restore
1933 void writeAllDomainVerificationsLPr(XmlSerializer serializer, int userId)
1934 throws IllegalArgumentException, IllegalStateException, IOException {
1935 serializer.startTag(null, TAG_ALL_INTENT_FILTER_VERIFICATION);
1936 final int N = mPackages.size();
1937 for (int i = 0; i < N; i++) {
1938 PackageSetting ps = mPackages.valueAt(i);
1939 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1940 if (ivi != null) {
1941 writeDomainVerificationsLPr(serializer, ivi);
1942 }
1943 }
1944 serializer.endTag(null, TAG_ALL_INTENT_FILTER_VERIFICATION);
1945 }
1946
1947 // Specifically for backup/restore
1948 void readAllDomainVerificationsLPr(XmlPullParser parser, int userId)
1949 throws XmlPullParserException, IOException {
1950 mRestoredIntentFilterVerifications.clear();
1951
1952 int outerDepth = parser.getDepth();
1953 int type;
1954 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1955 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1956 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1957 continue;
1958 }
1959
1960 String tagName = parser.getName();
1961 if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
1962 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1963 final String pkgName = ivi.getPackageName();
1964 final PackageSetting ps = mPackages.get(pkgName);
1965 if (ps != null) {
1966 // known/existing package; update in place
1967 ps.setIntentFilterVerificationInfo(ivi);
1968 if (DEBUG_DOMAIN_VERIFICATION) {
1969 Slog.d(TAG, "Restored IVI for existing app " + pkgName
1970 + " status=" + ivi.getStatusString());
1971 }
1972 } else {
1973 mRestoredIntentFilterVerifications.put(pkgName, ivi);
1974 if (DEBUG_DOMAIN_VERIFICATION) {
1975 Slog.d(TAG, "Restored IVI for pending app " + pkgName
1976 + " status=" + ivi.getStatusString());
1977 }
1978 }
1979 } else {
1980 PackageManagerService.reportSettingsProblem(Log.WARN,
1981 "Unknown element under <all-intent-filter-verification>: "
1982 + parser.getName());
1983 XmlUtils.skipCurrentTag(parser);
1984 }
1985 }
1986 }
1987
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07001988 // Specifically for backup/restore
1989 public void processRestoredPermissionGrantLPr(String pkgName, String permission,
Todd Kennedy91a39d12017-09-27 12:37:04 -07001990 boolean isGranted, int restoredFlagSet, int userId) {
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07001991 mRuntimePermissionsPersistence.rememberRestoredUserGrantLPr(
1992 pkgName, permission, isGranted, restoredFlagSet, userId);
1993 }
1994
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001995 void writeDefaultAppsLPr(XmlSerializer serializer, int userId)
1996 throws IllegalArgumentException, IllegalStateException, IOException {
1997 serializer.startTag(null, TAG_DEFAULT_APPS);
Robin Lee0dc591b2016-05-04 13:01:46 +01001998 String defaultBrowser = mDefaultBrowserApp.get(userId);
1999 if (!TextUtils.isEmpty(defaultBrowser)) {
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002000 serializer.startTag(null, TAG_DEFAULT_BROWSER);
Robin Lee0dc591b2016-05-04 13:01:46 +01002001 serializer.attribute(null, ATTR_PACKAGE_NAME, defaultBrowser);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002002 serializer.endTag(null, TAG_DEFAULT_BROWSER);
2003 }
Robin Lee0dc591b2016-05-04 13:01:46 +01002004 String defaultDialer = mDefaultDialerApp.get(userId);
2005 if (!TextUtils.isEmpty(defaultDialer)) {
2006 serializer.startTag(null, TAG_DEFAULT_DIALER);
2007 serializer.attribute(null, ATTR_PACKAGE_NAME, defaultDialer);
2008 serializer.endTag(null, TAG_DEFAULT_DIALER);
2009 }
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002010 serializer.endTag(null, TAG_DEFAULT_APPS);
2011 }
2012
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02002013 void writeBlockUninstallPackagesLPr(XmlSerializer serializer, int userId)
2014 throws IOException {
2015 ArraySet<String> packages = mBlockUninstallPackages.get(userId);
2016 if (packages != null) {
2017 serializer.startTag(null, TAG_BLOCK_UNINSTALL_PACKAGES);
2018 for (int i = 0; i < packages.size(); i++) {
2019 serializer.startTag(null, TAG_BLOCK_UNINSTALL);
2020 serializer.attribute(null, ATTR_PACKAGE_NAME, packages.valueAt(i));
2021 serializer.endTag(null, TAG_BLOCK_UNINSTALL);
2022 }
2023 serializer.endTag(null, TAG_BLOCK_UNINSTALL_PACKAGES);
2024 }
2025 }
2026
Amith Yamasani483f3b02012-03-13 16:08:00 -07002027 void writePackageRestrictionsLPr(int userId) {
Amith Yamasani258848d2012-08-10 17:06:33 -07002028 if (DEBUG_MU) {
2029 Log.i(TAG, "Writing package restrictions for user=" + userId);
2030 }
Dianne Hackborne17b4452018-01-10 13:15:40 -08002031 final long startTime = SystemClock.uptimeMillis();
2032
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002033 // Keep the old stopped packages around until we know the new ones have
2034 // been successfully written.
Amith Yamasani483f3b02012-03-13 16:08:00 -07002035 File userPackagesStateFile = getUserPackagesStateFile(userId);
2036 File backupFile = getUserPackagesStateBackupFile(userId);
2037 new File(userPackagesStateFile.getParent()).mkdirs();
2038 if (userPackagesStateFile.exists()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002039 // Presence of backup settings file indicates that we failed
2040 // to persist packages earlier. So preserve the older
2041 // backup for future reference since the current packages
2042 // might have been corrupted.
Amith Yamasani483f3b02012-03-13 16:08:00 -07002043 if (!backupFile.exists()) {
2044 if (!userPackagesStateFile.renameTo(backupFile)) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002045 Slog.wtf(PackageManagerService.TAG,
2046 "Unable to backup user packages state file, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002047 + "current changes will be lost at reboot");
2048 return;
2049 }
2050 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002051 userPackagesStateFile.delete();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002052 Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
2053 }
2054 }
2055
2056 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002057 final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile);
Kenny Root447106f2011-03-23 11:00:15 -07002058 final BufferedOutputStream str = new BufferedOutputStream(fstr);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002059
Kenny Root447106f2011-03-23 11:00:15 -07002060 final XmlSerializer serializer = new FastXmlSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01002061 serializer.setOutput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002062 serializer.startDocument(null, true);
2063 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
2064
Amith Yamasani483f3b02012-03-13 16:08:00 -07002065 serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002066
Kenny Root447106f2011-03-23 11:00:15 -07002067 for (final PackageSetting pkg : mPackages.values()) {
Jeff Sharkey42884192016-04-09 16:12:01 -06002068 final PackageUserState ustate = pkg.readUserState(userId);
2069 if (DEBUG_MU) Log.i(TAG, " pkg=" + pkg.name + ", state=" + ustate.enabled);
Amith Yamasani483f3b02012-03-13 16:08:00 -07002070
Jeff Sharkey42884192016-04-09 16:12:01 -06002071 serializer.startTag(null, TAG_PACKAGE);
2072 serializer.attribute(null, ATTR_NAME, pkg.name);
2073 if (ustate.ceDataInode != 0) {
2074 XmlUtils.writeLongAttribute(serializer, ATTR_CE_DATA_INODE, ustate.ceDataInode);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002075 }
Jeff Sharkey42884192016-04-09 16:12:01 -06002076 if (!ustate.installed) {
2077 serializer.attribute(null, ATTR_INSTALLED, "false");
2078 }
2079 if (ustate.stopped) {
2080 serializer.attribute(null, ATTR_STOPPED, "true");
2081 }
2082 if (ustate.notLaunched) {
2083 serializer.attribute(null, ATTR_NOT_LAUNCHED, "true");
2084 }
2085 if (ustate.hidden) {
2086 serializer.attribute(null, ATTR_HIDDEN, "true");
2087 }
2088 if (ustate.suspended) {
2089 serializer.attribute(null, ATTR_SUSPENDED, "true");
Suprabh Shukla3c3af142018-03-30 00:28:37 -07002090 if (ustate.suspendingPackage != null) {
2091 serializer.attribute(null, ATTR_SUSPENDING_PACKAGE,
2092 ustate.suspendingPackage);
2093 }
2094 if (ustate.dialogMessage != null) {
2095 serializer.attribute(null, ATTR_SUSPEND_DIALOG_MESSAGE,
2096 ustate.dialogMessage);
2097 }
Suprabh Shukla021b57a2018-03-08 18:21:50 -08002098 if (ustate.suspendedAppExtras != null) {
2099 serializer.startTag(null, TAG_SUSPENDED_APP_EXTRAS);
2100 try {
2101 ustate.suspendedAppExtras.saveToXml(serializer);
2102 } catch (XmlPullParserException xmle) {
2103 Slog.wtf(TAG, "Exception while trying to write suspendedAppExtras for "
2104 + pkg + ". Will be lost on reboot", xmle);
2105 }
2106 serializer.endTag(null, TAG_SUSPENDED_APP_EXTRAS);
2107 }
2108 if (ustate.suspendedLauncherExtras != null) {
2109 serializer.startTag(null, TAG_SUSPENDED_LAUNCHER_EXTRAS);
2110 try {
2111 ustate.suspendedLauncherExtras.saveToXml(serializer);
2112 } catch (XmlPullParserException xmle) {
2113 Slog.wtf(TAG, "Exception while trying to write suspendedLauncherExtras"
2114 + " for " + pkg + ". Will be lost on reboot", xmle);
2115 }
2116 serializer.endTag(null, TAG_SUSPENDED_LAUNCHER_EXTRAS);
2117 }
Jeff Sharkey42884192016-04-09 16:12:01 -06002118 }
Todd Kennedybe0b8892017-02-15 14:13:52 -08002119 if (ustate.instantApp) {
2120 serializer.attribute(null, ATTR_INSTANT_APP, "true");
2121 }
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07002122 if (ustate.virtualPreload) {
2123 serializer.attribute(null, ATTR_VIRTUAL_PRELOAD, "true");
2124 }
Jeff Sharkey42884192016-04-09 16:12:01 -06002125 if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
2126 serializer.attribute(null, ATTR_ENABLED,
2127 Integer.toString(ustate.enabled));
2128 if (ustate.lastDisableAppCaller != null) {
2129 serializer.attribute(null, ATTR_ENABLED_CALLER,
2130 ustate.lastDisableAppCaller);
2131 }
2132 }
2133 if (ustate.domainVerificationStatus !=
2134 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED) {
2135 XmlUtils.writeIntAttribute(serializer, ATTR_DOMAIN_VERIFICATON_STATE,
2136 ustate.domainVerificationStatus);
2137 }
2138 if (ustate.appLinkGeneration != 0) {
2139 XmlUtils.writeIntAttribute(serializer, ATTR_APP_LINK_GENERATION,
2140 ustate.appLinkGeneration);
2141 }
Bartosz Fabianowskia34f53f2017-01-11 18:08:47 +01002142 if (ustate.installReason != PackageManager.INSTALL_REASON_UNKNOWN) {
2143 serializer.attribute(null, ATTR_INSTALL_REASON,
2144 Integer.toString(ustate.installReason));
2145 }
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08002146 if (ustate.harmfulAppWarning != null) {
2147 serializer.attribute(null, ATTR_HARMFUL_APP_WARNING,
2148 ustate.harmfulAppWarning);
2149 }
Jeff Sharkey42884192016-04-09 16:12:01 -06002150 if (!ArrayUtils.isEmpty(ustate.enabledComponents)) {
2151 serializer.startTag(null, TAG_ENABLED_COMPONENTS);
2152 for (final String name : ustate.enabledComponents) {
2153 serializer.startTag(null, TAG_ITEM);
2154 serializer.attribute(null, ATTR_NAME, name);
2155 serializer.endTag(null, TAG_ITEM);
2156 }
2157 serializer.endTag(null, TAG_ENABLED_COMPONENTS);
2158 }
2159 if (!ArrayUtils.isEmpty(ustate.disabledComponents)) {
2160 serializer.startTag(null, TAG_DISABLED_COMPONENTS);
2161 for (final String name : ustate.disabledComponents) {
2162 serializer.startTag(null, TAG_ITEM);
2163 serializer.attribute(null, ATTR_NAME, name);
2164 serializer.endTag(null, TAG_ITEM);
2165 }
2166 serializer.endTag(null, TAG_DISABLED_COMPONENTS);
2167 }
2168
2169 serializer.endTag(null, TAG_PACKAGE);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002170 }
2171
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08002172 writePreferredActivitiesLPr(serializer, userId, true);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00002173 writePersistentPreferredActivitiesLPr(serializer, userId);
Nicolas Prevot81948992014-05-16 18:25:26 +01002174 writeCrossProfileIntentFiltersLPr(serializer, userId);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002175 writeDefaultAppsLPr(serializer, userId);
Vladislav Kuzkokov253984e2016-10-24 09:27:16 +02002176 writeBlockUninstallPackagesLPr(serializer, userId);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002177
Amith Yamasani483f3b02012-03-13 16:08:00 -07002178 serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002179
2180 serializer.endDocument();
2181
2182 str.flush();
2183 FileUtils.sync(fstr);
2184 str.close();
2185
2186 // New settings successfully written, old ones are no longer
2187 // needed.
Amith Yamasani483f3b02012-03-13 16:08:00 -07002188 backupFile.delete();
2189 FileUtils.setPermissions(userPackagesStateFile.toString(),
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002190 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08002191 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002192 -1, -1);
2193
Dianne Hackborne17b4452018-01-10 13:15:40 -08002194 com.android.internal.logging.EventLogTags.writeCommitSysConfigFile(
2195 "package-user-" + userId, SystemClock.uptimeMillis() - startTime);
2196
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002197 // Done, all is good!
2198 return;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002199 } catch(java.io.IOException e) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002200 Slog.wtf(PackageManagerService.TAG,
Amith Yamasani483f3b02012-03-13 16:08:00 -07002201 "Unable to write package manager user packages state, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002202 + " current changes will be lost at reboot", e);
2203 }
2204
2205 // Clean up partially written files
Amith Yamasani483f3b02012-03-13 16:08:00 -07002206 if (userPackagesStateFile.exists()) {
2207 if (!userPackagesStateFile.delete()) {
2208 Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: "
2209 + mStoppedPackagesFilename);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002210 }
2211 }
2212 }
2213
Svetoslavc6d1c342015-02-26 14:44:43 -08002214 void readInstallPermissionsLPr(XmlPullParser parser,
2215 PermissionsState permissionsState) throws IOException, XmlPullParserException {
2216 int outerDepth = parser.getDepth();
2217 int type;
2218 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
2219 && (type != XmlPullParser.END_TAG
2220 || parser.getDepth() > outerDepth)) {
2221 if (type == XmlPullParser.END_TAG
2222 || type == XmlPullParser.TEXT) {
2223 continue;
2224 }
2225 String tagName = parser.getName();
2226 if (tagName.equals(TAG_ITEM)) {
2227 String name = parser.getAttributeValue(null, ATTR_NAME);
2228
Todd Kennedy0eb97382017-10-03 16:57:22 -07002229 BasePermission bp = mPermissions.getPermission(name);
Svetoslavc6d1c342015-02-26 14:44:43 -08002230 if (bp == null) {
2231 Slog.w(PackageManagerService.TAG, "Unknown permission: " + name);
2232 XmlUtils.skipCurrentTag(parser);
2233 continue;
2234 }
2235
Svet Ganov8c7f7002015-05-07 10:48:44 -07002236 String grantedStr = parser.getAttributeValue(null, ATTR_GRANTED);
2237 final boolean granted = grantedStr == null
2238 || Boolean.parseBoolean(grantedStr);
2239
2240 String flagsStr = parser.getAttributeValue(null, ATTR_FLAGS);
2241 final int flags = (flagsStr != null)
2242 ? Integer.parseInt(flagsStr, 16) : 0;
2243
2244 if (granted) {
2245 if (permissionsState.grantInstallPermission(bp) ==
2246 PermissionsState.PERMISSION_OPERATION_FAILURE) {
2247 Slog.w(PackageManagerService.TAG, "Permission already added: " + name);
2248 XmlUtils.skipCurrentTag(parser);
2249 } else {
2250 permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
2251 PackageManager.MASK_PERMISSION_FLAGS, flags);
2252 }
2253 } else {
2254 if (permissionsState.revokeInstallPermission(bp) ==
2255 PermissionsState.PERMISSION_OPERATION_FAILURE) {
2256 Slog.w(PackageManagerService.TAG, "Permission already added: " + name);
2257 XmlUtils.skipCurrentTag(parser);
2258 } else {
2259 permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
2260 PackageManager.MASK_PERMISSION_FLAGS, flags);
2261 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002262 }
2263 } else {
2264 Slog.w(PackageManagerService.TAG, "Unknown element under <permissions>: "
2265 + parser.getName());
2266 XmlUtils.skipCurrentTag(parser);
2267 }
2268 }
2269 }
2270
Svet Ganov8c7f7002015-05-07 10:48:44 -07002271 void writePermissionsLPr(XmlSerializer serializer, List<PermissionState> permissionStates)
Svetoslavc6d1c342015-02-26 14:44:43 -08002272 throws IOException {
Svet Ganov8c7f7002015-05-07 10:48:44 -07002273 if (permissionStates.isEmpty()) {
Svetoslavc6d1c342015-02-26 14:44:43 -08002274 return;
2275 }
2276
2277 serializer.startTag(null, TAG_PERMISSIONS);
2278
Svet Ganov8c7f7002015-05-07 10:48:44 -07002279 for (PermissionState permissionState : permissionStates) {
Svetoslavc6d1c342015-02-26 14:44:43 -08002280 serializer.startTag(null, TAG_ITEM);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002281 serializer.attribute(null, ATTR_NAME, permissionState.getName());
2282 serializer.attribute(null, ATTR_GRANTED, String.valueOf(permissionState.isGranted()));
2283 serializer.attribute(null, ATTR_FLAGS, Integer.toHexString(permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08002284 serializer.endTag(null, TAG_ITEM);
2285 }
2286
2287 serializer.endTag(null, TAG_PERMISSIONS);
2288 }
2289
Svet Ganov354cd3c2015-12-17 11:35:04 -08002290 void writeChildPackagesLPw(XmlSerializer serializer, List<String> childPackageNames)
2291 throws IOException {
2292 if (childPackageNames == null) {
2293 return;
2294 }
2295 final int childCount = childPackageNames.size();
2296 for (int i = 0; i < childCount; i++) {
2297 String childPackageName = childPackageNames.get(i);
2298 serializer.startTag(null, TAG_CHILD_PACKAGE);
2299 serializer.attribute(null, ATTR_NAME, childPackageName);
2300 serializer.endTag(null, TAG_CHILD_PACKAGE);
2301 }
2302 }
2303
Svet Ganov67882122016-12-11 16:36:34 -08002304 void readUsesStaticLibLPw(XmlPullParser parser, PackageSetting outPs)
2305 throws IOException, XmlPullParserException {
2306 int outerDepth = parser.getDepth();
2307 int type;
2308 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2309 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2310 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2311 continue;
2312 }
2313 String libName = parser.getAttributeValue(null, ATTR_NAME);
2314 String libVersionStr = parser.getAttributeValue(null, ATTR_VERSION);
2315
Dianne Hackborn3accca02013-09-20 09:32:11 -07002316 long libVersion = -1;
Svet Ganov67882122016-12-11 16:36:34 -08002317 try {
Dianne Hackborn3accca02013-09-20 09:32:11 -07002318 libVersion = Long.parseLong(libVersionStr);
Svet Ganov67882122016-12-11 16:36:34 -08002319 } catch (NumberFormatException e) {
2320 // ignore
2321 }
2322
2323 if (libName != null && libVersion >= 0) {
2324 outPs.usesStaticLibraries = ArrayUtils.appendElement(String.class,
2325 outPs.usesStaticLibraries, libName);
Dianne Hackborn3accca02013-09-20 09:32:11 -07002326 outPs.usesStaticLibrariesVersions = ArrayUtils.appendLong(
Svet Ganov67882122016-12-11 16:36:34 -08002327 outPs.usesStaticLibrariesVersions, libVersion);
2328 }
2329
2330 XmlUtils.skipCurrentTag(parser);
2331 }
2332 }
2333
2334 void writeUsesStaticLibLPw(XmlSerializer serializer, String[] usesStaticLibraries,
Dianne Hackborn3accca02013-09-20 09:32:11 -07002335 long[] usesStaticLibraryVersions) throws IOException {
Svet Ganov67882122016-12-11 16:36:34 -08002336 if (ArrayUtils.isEmpty(usesStaticLibraries) || ArrayUtils.isEmpty(usesStaticLibraryVersions)
2337 || usesStaticLibraries.length != usesStaticLibraryVersions.length) {
2338 return;
2339 }
2340 final int libCount = usesStaticLibraries.length;
2341 for (int i = 0; i < libCount; i++) {
2342 final String libName = usesStaticLibraries[i];
Dianne Hackborn3accca02013-09-20 09:32:11 -07002343 final long libVersion = usesStaticLibraryVersions[i];
Svet Ganov67882122016-12-11 16:36:34 -08002344 serializer.startTag(null, TAG_USES_STATIC_LIB);
2345 serializer.attribute(null, ATTR_NAME, libName);
Dianne Hackborn3accca02013-09-20 09:32:11 -07002346 serializer.attribute(null, ATTR_VERSION, Long.toString(libVersion));
Svet Ganov67882122016-12-11 16:36:34 -08002347 serializer.endTag(null, TAG_USES_STATIC_LIB);
2348 }
2349 }
2350
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002351 // Note: assumed "stopped" field is already cleared in all packages.
Amith Yamasani483f3b02012-03-13 16:08:00 -07002352 // Legacy reader, used to read in the old file format after an upgrade. Not used after that.
Kenny Root447106f2011-03-23 11:00:15 -07002353 void readStoppedLPw() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002354 FileInputStream str = null;
2355 if (mBackupStoppedPackagesFilename.exists()) {
2356 try {
2357 str = new FileInputStream(mBackupStoppedPackagesFilename);
2358 mReadMessages.append("Reading from backup stopped packages file\n");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002359 PackageManagerService.reportSettingsProblem(Log.INFO,
2360 "Need to read from backup stopped packages file");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002361 if (mSettingsFilename.exists()) {
2362 // If both the backup and normal file exist, we
2363 // ignore the normal one since it might have been
2364 // corrupted.
2365 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
2366 + mStoppedPackagesFilename);
2367 mStoppedPackagesFilename.delete();
2368 }
2369 } catch (java.io.IOException e) {
2370 // We'll try for the normal settings file.
2371 }
2372 }
2373
2374 try {
2375 if (str == null) {
2376 if (!mStoppedPackagesFilename.exists()) {
2377 mReadMessages.append("No stopped packages file found\n");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002378 PackageManagerService.reportSettingsProblem(Log.INFO,
2379 "No stopped packages file file; assuming all started");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002380 // At first boot, make sure no packages are stopped.
2381 // We usually want to have third party apps initialize
2382 // in the stopped state, but not at first boot.
2383 for (PackageSetting pkg : mPackages.values()) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002384 pkg.setStopped(false, 0);
2385 pkg.setNotLaunched(false, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002386 }
2387 return;
2388 }
2389 str = new FileInputStream(mStoppedPackagesFilename);
2390 }
Kenny Root447106f2011-03-23 11:00:15 -07002391 final XmlPullParser parser = Xml.newPullParser();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002392 parser.setInput(str, null);
2393
2394 int type;
2395 while ((type=parser.next()) != XmlPullParser.START_TAG
2396 && type != XmlPullParser.END_DOCUMENT) {
2397 ;
2398 }
2399
2400 if (type != XmlPullParser.START_TAG) {
2401 mReadMessages.append("No start tag found in stopped packages file\n");
2402 PackageManagerService.reportSettingsProblem(Log.WARN,
2403 "No start tag found in package manager stopped packages");
2404 return;
2405 }
2406
2407 int outerDepth = parser.getDepth();
2408 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
2409 && (type != XmlPullParser.END_TAG
2410 || parser.getDepth() > outerDepth)) {
2411 if (type == XmlPullParser.END_TAG
2412 || type == XmlPullParser.TEXT) {
2413 continue;
2414 }
2415
2416 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002417 if (tagName.equals(TAG_PACKAGE)) {
2418 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002419 PackageSetting ps = mPackages.get(name);
2420 if (ps != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002421 ps.setStopped(true, 0);
2422 if ("1".equals(parser.getAttributeValue(null, ATTR_NOT_LAUNCHED))) {
2423 ps.setNotLaunched(true, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002424 }
2425 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002426 Slog.w(PackageManagerService.TAG,
Jeff Sharkeye06b4d12016-01-06 14:51:50 -07002427 "No package known for stopped package " + name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002428 }
2429 XmlUtils.skipCurrentTag(parser);
2430 } else {
2431 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
2432 + parser.getName());
2433 XmlUtils.skipCurrentTag(parser);
2434 }
2435 }
2436
2437 str.close();
2438
Amith Yamasani483f3b02012-03-13 16:08:00 -07002439 } catch (XmlPullParserException e) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002440 mReadMessages.append("Error reading: " + e.toString());
Amith Yamasani483f3b02012-03-13 16:08:00 -07002441 PackageManagerService.reportSettingsProblem(Log.ERROR,
2442 "Error reading stopped packages: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07002443 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
2444 e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002445
Amith Yamasani483f3b02012-03-13 16:08:00 -07002446 } catch (java.io.IOException e) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002447 mReadMessages.append("Error reading: " + e.toString());
2448 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07002449 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
2450 e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002451
2452 }
2453 }
2454
Kenny Root447106f2011-03-23 11:00:15 -07002455 void writeLPr() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002456 //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
2457
Dianne Hackborne17b4452018-01-10 13:15:40 -08002458 final long startTime = SystemClock.uptimeMillis();
2459
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002460 // Keep the old settings around until we know the new ones have
2461 // been successfully written.
2462 if (mSettingsFilename.exists()) {
2463 // Presence of backup settings file indicates that we failed
2464 // to persist settings earlier. So preserve the older
2465 // backup for future reference since the current settings
2466 // might have been corrupted.
2467 if (!mBackupSettingsFilename.exists()) {
2468 if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002469 Slog.wtf(PackageManagerService.TAG,
2470 "Unable to backup package manager settings, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002471 + " current changes will be lost at reboot");
2472 return;
2473 }
2474 } else {
2475 mSettingsFilename.delete();
2476 Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
2477 }
2478 }
2479
2480 mPastSignatures.clear();
2481
2482 try {
2483 FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
2484 BufferedOutputStream str = new BufferedOutputStream(fstr);
2485
2486 //XmlSerializer serializer = XmlUtils.serializerInstance();
2487 XmlSerializer serializer = new FastXmlSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01002488 serializer.setOutput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002489 serializer.startDocument(null, true);
2490 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
2491
2492 serializer.startTag(null, "packages");
2493
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002494 for (int i = 0; i < mVersion.size(); i++) {
2495 final String volumeUuid = mVersion.keyAt(i);
2496 final VersionInfo ver = mVersion.valueAt(i);
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002497
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002498 serializer.startTag(null, TAG_VERSION);
2499 XmlUtils.writeStringAttribute(serializer, ATTR_VOLUME_UUID, volumeUuid);
2500 XmlUtils.writeIntAttribute(serializer, ATTR_SDK_VERSION, ver.sdkVersion);
2501 XmlUtils.writeIntAttribute(serializer, ATTR_DATABASE_VERSION, ver.databaseVersion);
2502 XmlUtils.writeStringAttribute(serializer, ATTR_FINGERPRINT, ver.fingerprint);
2503 serializer.endTag(null, TAG_VERSION);
2504 }
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07002505
Kenny Root0aaa0d92011-09-12 16:42:55 -07002506 if (mVerifierDeviceIdentity != null) {
2507 serializer.startTag(null, "verifier");
2508 serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
2509 serializer.endTag(null, "verifier");
2510 }
2511
Jeff Sharkeyf5385772012-05-11 14:04:41 -07002512 if (mReadExternalStorageEnforced != null) {
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002513 serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
2514 serializer.attribute(
Jeff Sharkey5d32e772012-04-12 15:59:23 -07002515 null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0");
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002516 serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE);
2517 }
2518
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002519 serializer.startTag(null, "permission-trees");
Todd Kennedyc8423932017-10-05 08:58:36 -07002520 mPermissions.writePermissionTrees(serializer);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002521 serializer.endTag(null, "permission-trees");
2522
2523 serializer.startTag(null, "permissions");
Todd Kennedy0eb97382017-10-03 16:57:22 -07002524 mPermissions.writePermissions(serializer);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002525 serializer.endTag(null, "permissions");
2526
Kenny Root447106f2011-03-23 11:00:15 -07002527 for (final PackageSetting pkg : mPackages.values()) {
2528 writePackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002529 }
2530
Kenny Root447106f2011-03-23 11:00:15 -07002531 for (final PackageSetting pkg : mDisabledSysPackages.values()) {
2532 writeDisabledSysPackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002533 }
2534
Kenny Root447106f2011-03-23 11:00:15 -07002535 for (final SharedUserSetting usr : mSharedUsers.values()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002536 serializer.startTag(null, "shared-user");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002537 serializer.attribute(null, ATTR_NAME, usr.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002538 serializer.attribute(null, "userId",
2539 Integer.toString(usr.userId));
2540 usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002541 writePermissionsLPr(serializer, usr.getPermissionsState()
2542 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002543 serializer.endTag(null, "shared-user");
2544 }
2545
2546 if (mPackagesToBeCleaned.size() > 0) {
Jeff Sharkey752cd922012-09-23 16:25:12 -07002547 for (PackageCleanItem item : mPackagesToBeCleaned) {
2548 final String userStr = Integer.toString(item.userId);
2549 serializer.startTag(null, "cleaning-package");
2550 serializer.attribute(null, ATTR_NAME, item.packageName);
2551 serializer.attribute(null, ATTR_CODE, item.andCode ? "true" : "false");
2552 serializer.attribute(null, ATTR_USER, userStr);
2553 serializer.endTag(null, "cleaning-package");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002554 }
2555 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002556
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002557 if (mRenamedPackages.size() > 0) {
Andy McFadden2f362292012-01-20 14:43:38 -08002558 for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002559 serializer.startTag(null, "renamed-package");
2560 serializer.attribute(null, "new", e.getKey());
2561 serializer.attribute(null, "old", e.getValue());
2562 serializer.endTag(null, "renamed-package");
2563 }
2564 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002565
Christopher Tate6038d152015-06-17 13:07:46 -07002566 final int numIVIs = mRestoredIntentFilterVerifications.size();
2567 if (numIVIs > 0) {
2568 if (DEBUG_DOMAIN_VERIFICATION) {
2569 Slog.i(TAG, "Writing restored-ivi entries to packages.xml");
2570 }
2571 serializer.startTag(null, "restored-ivi");
2572 for (int i = 0; i < numIVIs; i++) {
2573 IntentFilterVerificationInfo ivi = mRestoredIntentFilterVerifications.valueAt(i);
2574 writeDomainVerificationsLPr(serializer, ivi);
2575 }
2576 serializer.endTag(null, "restored-ivi");
2577 } else {
2578 if (DEBUG_DOMAIN_VERIFICATION) {
2579 Slog.i(TAG, " no restored IVI entries to write");
2580 }
2581 }
2582
dcashman55b10782014-04-09 14:20:38 -07002583 mKeySetManagerService.writeKeySetManagerServiceLPr(serializer);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002584
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002585 serializer.endTag(null, "packages");
2586
2587 serializer.endDocument();
2588
2589 str.flush();
2590 FileUtils.sync(fstr);
2591 str.close();
2592
2593 // New settings successfully written, old ones are no longer
2594 // needed.
2595 mBackupSettingsFilename.delete();
2596 FileUtils.setPermissions(mSettingsFilename.toString(),
2597 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08002598 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002599 -1, -1);
2600
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002601 writeKernelMappingLPr();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002602 writePackageListLPr();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002603 writeAllUsersPackageRestrictionsLPr();
Svetoslavc6d1c342015-02-26 14:44:43 -08002604 writeAllRuntimePermissionsLPr();
Dianne Hackborne17b4452018-01-10 13:15:40 -08002605 com.android.internal.logging.EventLogTags.writeCommitSysConfigFile(
2606 "package", SystemClock.uptimeMillis() - startTime);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002607 return;
2608
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002609 } catch(java.io.IOException e) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002610 Slog.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002611 + "current changes will be lost at reboot", e);
2612 }
2613 // Clean up partially written files
2614 if (mSettingsFilename.exists()) {
2615 if (!mSettingsFilename.delete()) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002616 Slog.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
Amith Yamasani483f3b02012-03-13 16:08:00 -07002617 + mSettingsFilename);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002618 }
2619 }
2620 //Debug.stopMethodTracing();
2621 }
2622
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002623 private void writeKernelRemoveUserLPr(int userId) {
2624 if (mKernelMappingFilename == null) return;
2625
2626 File removeUserIdFile = new File(mKernelMappingFilename, "remove_userid");
2627 if (DEBUG_KERNEL) Slog.d(TAG, "Writing " + userId + " to " + removeUserIdFile
2628 .getAbsolutePath());
2629 writeIntToFile(removeUserIdFile, userId);
2630 }
2631
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002632 void writeKernelMappingLPr() {
2633 if (mKernelMappingFilename == null) return;
2634
2635 final String[] known = mKernelMappingFilename.list();
2636 final ArraySet<String> knownSet = new ArraySet<>(known.length);
2637 for (String name : known) {
2638 knownSet.add(name);
2639 }
2640
2641 for (final PackageSetting ps : mPackages.values()) {
2642 // Package is actively claimed
2643 knownSet.remove(ps.name);
2644 writeKernelMappingLPr(ps);
2645 }
2646
2647 // Remove any unclaimed mappings
2648 for (int i = 0; i < knownSet.size(); i++) {
2649 final String name = knownSet.valueAt(i);
2650 if (DEBUG_KERNEL) Slog.d(TAG, "Dropping mapping " + name);
2651
2652 mKernelMapping.remove(name);
Jeff Sharkey800efcc2016-02-25 17:08:11 -07002653 new File(mKernelMappingFilename, name).delete();
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002654 }
2655 }
2656
2657 void writeKernelMappingLPr(PackageSetting ps) {
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002658 if (mKernelMappingFilename == null || ps == null || ps.name == null) return;
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002659
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002660 KernelPackageState cur = mKernelMapping.get(ps.name);
2661 final boolean firstTime = cur == null;
2662 int[] excludedUserIds = ps.getNotInstalledUserIds();
2663 final boolean userIdsChanged = firstTime
2664 || !Arrays.equals(excludedUserIds, cur.excludedUserIds);
2665
2666 // Package directory
2667 final File dir = new File(mKernelMappingFilename, ps.name);
2668
2669 if (firstTime) {
2670 dir.mkdir();
2671 // Create a new mapping state
2672 cur = new KernelPackageState();
2673 mKernelMapping.put(ps.name, cur);
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002674 }
2675
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002676 // If mapping is incorrect or non-existent, write the appid file
2677 if (cur.appId != ps.appId) {
2678 final File appIdFile = new File(dir, "appid");
2679 writeIntToFile(appIdFile, ps.appId);
2680 if (DEBUG_KERNEL) Slog.d(TAG, "Mapping " + ps.name + " to " + ps.appId);
2681 }
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002682
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002683 if (userIdsChanged) {
2684 // Build the exclusion list -- the ids to add to the exclusion list
2685 for (int i = 0; i < excludedUserIds.length; i++) {
2686 if (cur.excludedUserIds == null || !ArrayUtils.contains(cur.excludedUserIds,
2687 excludedUserIds[i])) {
2688 writeIntToFile(new File(dir, "excluded_userids"), excludedUserIds[i]);
2689 if (DEBUG_KERNEL) Slog.d(TAG, "Writing " + excludedUserIds[i] + " to "
2690 + ps.name + "/excluded_userids");
2691 }
2692 }
2693 // Build the inclusion list -- the ids to remove from the exclusion list
2694 if (cur.excludedUserIds != null) {
2695 for (int i = 0; i < cur.excludedUserIds.length; i++) {
2696 if (!ArrayUtils.contains(excludedUserIds, cur.excludedUserIds[i])) {
2697 writeIntToFile(new File(dir, "clear_userid"),
2698 cur.excludedUserIds[i]);
2699 if (DEBUG_KERNEL) Slog.d(TAG, "Writing " + cur.excludedUserIds[i] + " to "
2700 + ps.name + "/clear_userid");
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002701
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002702 }
2703 }
2704 }
2705 cur.excludedUserIds = excludedUserIds;
2706 }
2707 }
2708
2709 private void writeIntToFile(File file, int value) {
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002710 try {
Narayan Kamath6d051fc2016-11-22 20:20:00 +00002711 FileUtils.bytesToFile(file.getAbsolutePath(),
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002712 Integer.toString(value).getBytes(StandardCharsets.US_ASCII));
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002713 } catch (IOException ignored) {
Amith Yamasani23ab7f52017-01-22 17:43:24 -08002714 Slog.w(TAG, "Couldn't write " + value + " to " + file.getAbsolutePath());
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002715 }
2716 }
2717
Jeff Sharkey91edde22015-05-20 12:04:42 -07002718 void writePackageListLPr() {
2719 writePackageListLPr(-1);
2720 }
2721
2722 void writePackageListLPr(int creatingUserId) {
2723 // Only derive GIDs for active users (not dying)
2724 final List<UserInfo> users = UserManagerService.getInstance().getUsers(true);
2725 int[] userIds = new int[users.size()];
2726 for (int i = 0; i < userIds.length; i++) {
2727 userIds[i] = users.get(i).id;
2728 }
2729 if (creatingUserId != -1) {
2730 userIds = ArrayUtils.appendInt(userIds, creatingUserId);
2731 }
2732
2733 // Write package list file now, use a JournaledFile.
2734 File tempFile = new File(mPackageListFilename.getAbsolutePath() + ".tmp");
2735 JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
2736
2737 final File writeTarget = journal.chooseForWrite();
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002738 FileOutputStream fstr;
2739 BufferedWriter writer = null;
Jeff Sharkey91edde22015-05-20 12:04:42 -07002740 try {
2741 fstr = new FileOutputStream(writeTarget);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002742 writer = new BufferedWriter(new OutputStreamWriter(fstr, Charset.defaultCharset()));
Jeff Sharkey91edde22015-05-20 12:04:42 -07002743 FileUtils.setPermissions(fstr.getFD(), 0640, SYSTEM_UID, PACKAGE_INFO_GID);
2744
2745 StringBuilder sb = new StringBuilder();
2746 for (final PackageSetting pkg : mPackages.values()) {
Jeff Sharkeye17ac152015-11-06 22:40:29 -08002747 if (pkg.pkg == null || pkg.pkg.applicationInfo == null
2748 || pkg.pkg.applicationInfo.dataDir == null) {
Jeff Sharkey2271ba32016-02-01 17:57:08 -07002749 if (!"android".equals(pkg.name)) {
2750 Slog.w(TAG, "Skipping " + pkg + " due to missing metadata");
2751 }
Jeff Sharkey91edde22015-05-20 12:04:42 -07002752 continue;
2753 }
2754
2755 final ApplicationInfo ai = pkg.pkg.applicationInfo;
Jeff Sharkeye84bdd32016-02-08 12:16:00 -07002756 final String dataPath = ai.dataDir;
Jeff Sharkey91edde22015-05-20 12:04:42 -07002757 final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
2758 final int[] gids = pkg.getPermissionsState().computeGids(userIds);
2759
2760 // Avoid any application that has a space in its path.
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002761 if (dataPath.indexOf(' ') >= 0)
Jeff Sharkey91edde22015-05-20 12:04:42 -07002762 continue;
2763
2764 // we store on each line the following information for now:
2765 //
2766 // pkgName - package name
2767 // userId - application-specific user id
2768 // debugFlag - 0 or 1 if the package is debuggable.
2769 // dataPath - path to package's data path
2770 // seinfo - seinfo label for the app (assigned at install time)
2771 // gids - supplementary gids this app launches with
2772 //
2773 // NOTE: We prefer not to expose all ApplicationInfo flags for now.
2774 //
2775 // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
2776 // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
William Robertsdc06bb02015-07-24 10:05:06 -07002777 // frameworks/base/libs/packagelistparser
Jeff Sharkey91edde22015-05-20 12:04:42 -07002778 // system/core/run-as/run-as.c
Jeff Sharkey91edde22015-05-20 12:04:42 -07002779 //
2780 sb.setLength(0);
2781 sb.append(ai.packageName);
2782 sb.append(" ");
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002783 sb.append(ai.uid);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002784 sb.append(isDebug ? " 1 " : " 0 ");
2785 sb.append(dataPath);
2786 sb.append(" ");
Todd Kennedybe0b8892017-02-15 14:13:52 -08002787 sb.append(ai.seInfo);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002788 sb.append(" ");
2789 if (gids != null && gids.length > 0) {
2790 sb.append(gids[0]);
2791 for (int i = 1; i < gids.length; i++) {
2792 sb.append(",");
2793 sb.append(gids[i]);
2794 }
2795 } else {
2796 sb.append("none");
2797 }
2798 sb.append("\n");
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002799 writer.append(sb);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002800 }
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002801 writer.flush();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002802 FileUtils.sync(fstr);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002803 writer.close();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002804 journal.commit();
2805 } catch (Exception e) {
2806 Slog.wtf(TAG, "Failed to write packages.list", e);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002807 IoUtils.closeQuietly(writer);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002808 journal.rollback();
2809 }
2810 }
2811
Kenny Root447106f2011-03-23 11:00:15 -07002812 void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002813 throws java.io.IOException {
2814 serializer.startTag(null, "updated-package");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002815 serializer.attribute(null, ATTR_NAME, pkg.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002816 if (pkg.realName != null) {
2817 serializer.attribute(null, "realName", pkg.realName);
2818 }
2819 serializer.attribute(null, "codePath", pkg.codePathString);
2820 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
2821 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
2822 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
2823 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
2824 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
2825 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
2826 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002827 if (pkg.legacyNativeLibraryPathString != null) {
2828 serializer.attribute(null, "nativeLibraryPath", pkg.legacyNativeLibraryPathString);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002829 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002830 if (pkg.primaryCpuAbiString != null) {
2831 serializer.attribute(null, "primaryCpuAbi", pkg.primaryCpuAbiString);
Narayan Kamath9e289d72014-04-10 09:26:59 +00002832 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002833 if (pkg.secondaryCpuAbiString != null) {
2834 serializer.attribute(null, "secondaryCpuAbi", pkg.secondaryCpuAbiString);
2835 }
Narayan Kamath4903f642014-08-11 13:33:45 +01002836 if (pkg.cpuAbiOverrideString != null) {
2837 serializer.attribute(null, "cpuAbiOverride", pkg.cpuAbiOverrideString);
2838 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002839
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002840 if (pkg.sharedUser == null) {
Amith Yamasani13593602012-03-22 16:16:17 -07002841 serializer.attribute(null, "userId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002842 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07002843 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002844 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002845
Svet Ganov354cd3c2015-12-17 11:35:04 -08002846 if (pkg.parentPackageName != null) {
2847 serializer.attribute(null, "parentPackageName", pkg.parentPackageName);
2848 }
2849
2850 writeChildPackagesLPw(serializer, pkg.childPackageNames);
2851
Svet Ganov67882122016-12-11 16:36:34 -08002852 writeUsesStaticLibLPw(serializer, pkg.usesStaticLibraries, pkg.usesStaticLibrariesVersions);
2853
Svetoslavc6d1c342015-02-26 14:44:43 -08002854 // If this is a shared user, the permissions will be written there.
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002855 if (pkg.sharedUser == null) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07002856 writePermissionsLPr(serializer, pkg.getPermissionsState()
2857 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002858 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002859
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002860 serializer.endTag(null, "updated-package");
2861 }
2862
Kenny Root447106f2011-03-23 11:00:15 -07002863 void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002864 throws java.io.IOException {
2865 serializer.startTag(null, "package");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002866 serializer.attribute(null, ATTR_NAME, pkg.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002867 if (pkg.realName != null) {
2868 serializer.attribute(null, "realName", pkg.realName);
2869 }
2870 serializer.attribute(null, "codePath", pkg.codePathString);
2871 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
2872 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
2873 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002874
2875 if (pkg.legacyNativeLibraryPathString != null) {
2876 serializer.attribute(null, "nativeLibraryPath", pkg.legacyNativeLibraryPathString);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002877 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002878 if (pkg.primaryCpuAbiString != null) {
2879 serializer.attribute(null, "primaryCpuAbi", pkg.primaryCpuAbiString);
Narayan Kamath9e289d72014-04-10 09:26:59 +00002880 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002881 if (pkg.secondaryCpuAbiString != null) {
2882 serializer.attribute(null, "secondaryCpuAbi", pkg.secondaryCpuAbiString);
2883 }
Narayan Kamath4903f642014-08-11 13:33:45 +01002884 if (pkg.cpuAbiOverrideString != null) {
2885 serializer.attribute(null, "cpuAbiOverride", pkg.cpuAbiOverrideString);
2886 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002887
Alex Klyubinb9f8a522015-02-03 11:12:59 -08002888 serializer.attribute(null, "publicFlags", Integer.toString(pkg.pkgFlags));
2889 serializer.attribute(null, "privateFlags", Integer.toString(pkg.pkgPrivateFlags));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002890 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
2891 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
2892 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
2893 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
2894 if (pkg.sharedUser == null) {
Amith Yamasani13593602012-03-22 16:16:17 -07002895 serializer.attribute(null, "userId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002896 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07002897 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002898 }
2899 if (pkg.uidError) {
2900 serializer.attribute(null, "uidError", "true");
2901 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002902 if (pkg.installerPackageName != null) {
2903 serializer.attribute(null, "installer", pkg.installerPackageName);
2904 }
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07002905 if (pkg.isOrphaned) {
2906 serializer.attribute(null, "isOrphaned", "true");
2907 }
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07002908 if (pkg.volumeUuid != null) {
2909 serializer.attribute(null, "volumeUuid", pkg.volumeUuid);
2910 }
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07002911 if (pkg.categoryHint != ApplicationInfo.CATEGORY_UNDEFINED) {
2912 serializer.attribute(null, "categoryHint",
2913 Integer.toString(pkg.categoryHint));
2914 }
Svet Ganov354cd3c2015-12-17 11:35:04 -08002915 if (pkg.parentPackageName != null) {
2916 serializer.attribute(null, "parentPackageName", pkg.parentPackageName);
2917 }
Todd Kennedyab532892017-03-08 14:19:49 -08002918 if (pkg.updateAvailable) {
2919 serializer.attribute(null, "updateAvailable", "true");
2920 }
Svet Ganov354cd3c2015-12-17 11:35:04 -08002921
2922 writeChildPackagesLPw(serializer, pkg.childPackageNames);
2923
Svet Ganov67882122016-12-11 16:36:34 -08002924 writeUsesStaticLibLPw(serializer, pkg.usesStaticLibraries, pkg.usesStaticLibrariesVersions);
2925
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002926 pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002927
2928 writePermissionsLPr(serializer, pkg.getPermissionsState()
2929 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002930
dcashman8c04fac2015-03-23 11:39:42 -07002931 writeSigningKeySetLPr(serializer, pkg.keySetData);
dcashman55b10782014-04-09 14:20:38 -07002932 writeUpgradeKeySetsLPr(serializer, pkg.keySetData);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002933 writeKeySetAliasesLPr(serializer, pkg.keySetData);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002934 writeDomainVerificationsLPr(serializer, pkg.verificationInfo);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002935
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002936 serializer.endTag(null, "package");
2937 }
2938
dcashman8c04fac2015-03-23 11:39:42 -07002939 void writeSigningKeySetLPr(XmlSerializer serializer,
Geremy Condraf1bcca82013-01-07 22:35:24 -08002940 PackageKeySetData data) throws IOException {
dcashman8c04fac2015-03-23 11:39:42 -07002941 serializer.startTag(null, "proper-signing-keyset");
2942 serializer.attribute(null, "identifier",
2943 Long.toString(data.getProperSigningKeySet()));
2944 serializer.endTag(null, "proper-signing-keyset");
dcashman55b10782014-04-09 14:20:38 -07002945 }
2946
2947 void writeUpgradeKeySetsLPr(XmlSerializer serializer,
2948 PackageKeySetData data) throws IOException {
2949 if (data.isUsingUpgradeKeySets()) {
2950 for (long id : data.getUpgradeKeySets()) {
2951 serializer.startTag(null, "upgrade-keyset");
2952 serializer.attribute(null, "identifier", Long.toString(id));
2953 serializer.endTag(null, "upgrade-keyset");
2954 }
Geremy Condraf1bcca82013-01-07 22:35:24 -08002955 }
2956 }
2957
2958 void writeKeySetAliasesLPr(XmlSerializer serializer,
2959 PackageKeySetData data) throws IOException {
2960 for (Map.Entry<String, Long> e: data.getAliases().entrySet()) {
2961 serializer.startTag(null, "defined-keyset");
2962 serializer.attribute(null, "alias", e.getKey());
2963 serializer.attribute(null, "identifier", Long.toString(e.getValue()));
2964 serializer.endTag(null, "defined-keyset");
2965 }
2966 }
2967
Todd Kennedy91a39d12017-09-27 12:37:04 -07002968 void writePermissionLPr(XmlSerializer serializer, BasePermission bp) throws IOException {
2969 bp.writeLPr(serializer);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002970 }
2971
Jeff Sharkey752cd922012-09-23 16:25:12 -07002972 void addPackageToCleanLPw(PackageCleanItem pkg) {
2973 if (!mPackagesToBeCleaned.contains(pkg)) {
2974 mPackagesToBeCleaned.add(pkg);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002975 }
2976 }
2977
Xiaohui Chen594f2082015-08-18 11:04:20 -07002978 boolean readLPw(@NonNull List<UserInfo> users) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002979 FileInputStream str = null;
2980 if (mBackupSettingsFilename.exists()) {
2981 try {
2982 str = new FileInputStream(mBackupSettingsFilename);
2983 mReadMessages.append("Reading from backup settings file\n");
2984 PackageManagerService.reportSettingsProblem(Log.INFO,
2985 "Need to read from backup settings file");
2986 if (mSettingsFilename.exists()) {
2987 // If both the backup and settings file exist, we
2988 // ignore the settings since it might have been
2989 // corrupted.
2990 Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
2991 + mSettingsFilename);
2992 mSettingsFilename.delete();
2993 }
2994 } catch (java.io.IOException e) {
2995 // We'll try for the normal settings file.
2996 }
2997 }
2998
Kenny Root447106f2011-03-23 11:00:15 -07002999 mPendingPackages.clear();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003000 mPastSignatures.clear();
dcashman8c04fac2015-03-23 11:39:42 -07003001 mKeySetRefs.clear();
Sudheer Shanka29283372016-04-04 20:56:27 -07003002 mInstallerPackages.clear();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003003
3004 try {
3005 if (str == null) {
3006 if (!mSettingsFilename.exists()) {
3007 mReadMessages.append("No settings file found\n");
3008 PackageManagerService.reportSettingsProblem(Log.INFO,
3009 "No settings file; creating initial state");
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003010 // It's enough to just touch version details to create them
3011 // with default values
longhaibc62b212016-01-29 14:22:22 +08003012 findOrCreateVersion(StorageManager.UUID_PRIVATE_INTERNAL).forceCurrent();
3013 findOrCreateVersion(StorageManager.UUID_PRIMARY_PHYSICAL).forceCurrent();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003014 return false;
3015 }
3016 str = new FileInputStream(mSettingsFilename);
3017 }
3018 XmlPullParser parser = Xml.newPullParser();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01003019 parser.setInput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003020
3021 int type;
3022 while ((type = parser.next()) != XmlPullParser.START_TAG
3023 && type != XmlPullParser.END_DOCUMENT) {
3024 ;
3025 }
3026
3027 if (type != XmlPullParser.START_TAG) {
3028 mReadMessages.append("No start tag found in settings file\n");
3029 PackageManagerService.reportSettingsProblem(Log.WARN,
3030 "No start tag found in package manager settings");
Dianne Hackborn8d051722014-10-01 14:59:58 -07003031 Slog.wtf(PackageManagerService.TAG,
Dianne Hackborn58f42a52011-10-10 13:46:34 -07003032 "No start tag found in package manager settings");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003033 return false;
3034 }
3035
3036 int outerDepth = parser.getDepth();
3037 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3038 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3039 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3040 continue;
3041 }
3042
3043 String tagName = parser.getName();
3044 if (tagName.equals("package")) {
Kenny Root447106f2011-03-23 11:00:15 -07003045 readPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003046 } else if (tagName.equals("permissions")) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07003047 mPermissions.readPermissions(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003048 } else if (tagName.equals("permission-trees")) {
Todd Kennedyc8423932017-10-05 08:58:36 -07003049 mPermissions.readPermissionTrees(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003050 } else if (tagName.equals("shared-user")) {
Kenny Root447106f2011-03-23 11:00:15 -07003051 readSharedUserLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003052 } else if (tagName.equals("preferred-packages")) {
3053 // no longer used.
3054 } else if (tagName.equals("preferred-activities")) {
Dianne Hackborn63092712012-10-07 14:45:35 -07003055 // Upgrading from old single-user implementation;
3056 // these are the preferred activities for user 0.
3057 readPreferredActivitiesLPw(parser, 0);
Sander Alewijnseaf597622014-03-20 18:44:57 +00003058 } else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) {
Sander Alewijnsef475ca32014-02-17 15:13:58 +00003059 // TODO: check whether this is okay! as it is very
3060 // similar to how preferred-activities are treated
3061 readPersistentPreferredActivitiesLPw(parser, 0);
Nicolas Prevot29762c32014-07-29 18:51:32 +01003062 } else if (tagName.equals(TAG_CROSS_PROFILE_INTENT_FILTERS)) {
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00003063 // TODO: check whether this is okay! as it is very
3064 // similar to how preferred-activities are treated
Nicolas Prevot81948992014-05-16 18:25:26 +01003065 readCrossProfileIntentFiltersLPw(parser, 0);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07003066 } else if (tagName.equals(TAG_DEFAULT_BROWSER)) {
3067 readDefaultAppsLPw(parser, 0);
3068 } else if (tagName.equals("updated-package")) {
Kenny Root447106f2011-03-23 11:00:15 -07003069 readDisabledSysPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003070 } else if (tagName.equals("cleaning-package")) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003071 String name = parser.getAttributeValue(null, ATTR_NAME);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07003072 String userStr = parser.getAttributeValue(null, ATTR_USER);
3073 String codeStr = parser.getAttributeValue(null, ATTR_CODE);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003074 if (name != null) {
Xiaohui Chen594f2082015-08-18 11:04:20 -07003075 int userId = UserHandle.USER_SYSTEM;
Dianne Hackborn7767eac2012-08-23 18:25:40 -07003076 boolean andCode = true;
3077 try {
3078 if (userStr != null) {
Jeff Sharkey752cd922012-09-23 16:25:12 -07003079 userId = Integer.parseInt(userStr);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07003080 }
3081 } catch (NumberFormatException e) {
3082 }
3083 if (codeStr != null) {
3084 andCode = Boolean.parseBoolean(codeStr);
3085 }
Jeff Sharkey752cd922012-09-23 16:25:12 -07003086 addPackageToCleanLPw(new PackageCleanItem(userId, name, andCode));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003087 }
3088 } else if (tagName.equals("renamed-package")) {
3089 String nname = parser.getAttributeValue(null, "new");
3090 String oname = parser.getAttributeValue(null, "old");
3091 if (nname != null && oname != null) {
3092 mRenamedPackages.put(nname, oname);
3093 }
Christopher Tate6038d152015-06-17 13:07:46 -07003094 } else if (tagName.equals("restored-ivi")) {
3095 readRestoredIntentFilterVerifications(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003096 } else if (tagName.equals("last-platform-version")) {
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003097 // Upgrade from older XML schema
3098 final VersionInfo internal = findOrCreateVersion(
3099 StorageManager.UUID_PRIVATE_INTERNAL);
3100 final VersionInfo external = findOrCreateVersion(
3101 StorageManager.UUID_PRIMARY_PHYSICAL);
Svet Ganovadc1cf42015-06-15 16:36:24 -07003102
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003103 internal.sdkVersion = XmlUtils.readIntAttribute(parser, "internal", 0);
3104 external.sdkVersion = XmlUtils.readIntAttribute(parser, "external", 0);
3105 internal.fingerprint = external.fingerprint =
3106 XmlUtils.readStringAttribute(parser, "fingerprint");
3107
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07003108 } else if (tagName.equals("database-version")) {
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003109 // Upgrade from older XML schema
3110 final VersionInfo internal = findOrCreateVersion(
3111 StorageManager.UUID_PRIVATE_INTERNAL);
3112 final VersionInfo external = findOrCreateVersion(
3113 StorageManager.UUID_PRIMARY_PHYSICAL);
3114
3115 internal.databaseVersion = XmlUtils.readIntAttribute(parser, "internal", 0);
3116 external.databaseVersion = XmlUtils.readIntAttribute(parser, "external", 0);
3117
Kenny Root0aaa0d92011-09-12 16:42:55 -07003118 } else if (tagName.equals("verifier")) {
3119 final String deviceIdentity = parser.getAttributeValue(null, "device");
3120 try {
3121 mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
3122 } catch (IllegalArgumentException e) {
3123 Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
3124 + e.getMessage());
3125 }
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07003126 } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) {
3127 final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT);
Todd Kennedy91a39d12017-09-27 12:37:04 -07003128 mReadExternalStorageEnforced =
3129 "1".equals(enforcement) ? Boolean.TRUE : Boolean.FALSE;
Geremy Condraf1bcca82013-01-07 22:35:24 -08003130 } else if (tagName.equals("keyset-settings")) {
dcashman8c04fac2015-03-23 11:39:42 -07003131 mKeySetManagerService.readKeySetsLPw(parser, mKeySetRefs);
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003132 } else if (TAG_VERSION.equals(tagName)) {
3133 final String volumeUuid = XmlUtils.readStringAttribute(parser,
3134 ATTR_VOLUME_UUID);
3135 final VersionInfo ver = findOrCreateVersion(volumeUuid);
3136 ver.sdkVersion = XmlUtils.readIntAttribute(parser, ATTR_SDK_VERSION);
khmel80bdce02018-01-02 16:39:05 -08003137 ver.databaseVersion = XmlUtils.readIntAttribute(parser, ATTR_DATABASE_VERSION);
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003138 ver.fingerprint = XmlUtils.readStringAttribute(parser, ATTR_FINGERPRINT);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003139 } else {
3140 Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
3141 + parser.getName());
3142 XmlUtils.skipCurrentTag(parser);
3143 }
3144 }
3145
3146 str.close();
3147
3148 } catch (XmlPullParserException e) {
3149 mReadMessages.append("Error reading: " + e.toString());
3150 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07003151 Slog.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003152
3153 } catch (java.io.IOException e) {
3154 mReadMessages.append("Error reading: " + e.toString());
3155 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07003156 Slog.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
Amith Yamasani258848d2012-08-10 17:06:33 -07003157 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003158
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003159 // If the build is setup to drop runtime permissions
3160 // on update drop the files before loading them.
3161 if (PackageManagerService.CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE) {
3162 final VersionInfo internal = getInternalVersion();
3163 if (!Build.FINGERPRINT.equals(internal.fingerprint)) {
Xiaohui Chen594f2082015-08-18 11:04:20 -07003164 for (UserInfo user : users) {
3165 mRuntimePermissionsPersistence.deleteUserRuntimePermissionsFile(user.id);
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07003166 }
3167 }
3168 }
3169
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003170 final int N = mPendingPackages.size();
dcashman8c04fac2015-03-23 11:39:42 -07003171
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003172 for (int i = 0; i < N; i++) {
Todd Kennedy788c8422016-08-10 10:52:34 -07003173 final PackageSetting p = mPendingPackages.get(i);
3174 final int sharedUserId = p.getSharedUserId();
3175 final Object idObj = getUserIdLPr(sharedUserId);
3176 if (idObj instanceof SharedUserSetting) {
3177 final SharedUserSetting sharedUser = (SharedUserSetting) idObj;
3178 p.sharedUser = sharedUser;
3179 p.appId = sharedUser.userId;
3180 addPackageSettingLPw(p, sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003181 } else if (idObj != null) {
Todd Kennedy788c8422016-08-10 10:52:34 -07003182 String msg = "Bad package setting: package " + p.name + " has shared uid "
3183 + sharedUserId + " that is not a shared uid\n";
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003184 mReadMessages.append(msg);
3185 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
3186 } else {
Todd Kennedy788c8422016-08-10 10:52:34 -07003187 String msg = "Bad package setting: package " + p.name + " has shared uid "
3188 + sharedUserId + " that is not defined\n";
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003189 mReadMessages.append(msg);
3190 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
3191 }
3192 }
3193 mPendingPackages.clear();
3194
Amith Yamasanif031f232012-10-26 15:35:21 -07003195 if (mBackupStoppedPackagesFilename.exists()
3196 || mStoppedPackagesFilename.exists()) {
3197 // Read old file
3198 readStoppedLPw();
3199 mBackupStoppedPackagesFilename.delete();
3200 mStoppedPackagesFilename.delete();
3201 // Migrate to new file format
Xiaohui Chen594f2082015-08-18 11:04:20 -07003202 writePackageRestrictionsLPr(UserHandle.USER_SYSTEM);
Amith Yamasanif031f232012-10-26 15:35:21 -07003203 } else {
Xiaohui Chen594f2082015-08-18 11:04:20 -07003204 for (UserInfo user : users) {
3205 readPackageRestrictionsLPr(user.id);
Amith Yamasanif031f232012-10-26 15:35:21 -07003206 }
3207 }
3208
Xiaohui Chen594f2082015-08-18 11:04:20 -07003209 for (UserInfo user : users) {
3210 mRuntimePermissionsPersistence.readStateForUserSyncLPr(user.id);
Svet Ganovadc1cf42015-06-15 16:36:24 -07003211 }
3212
Kenny Root1d1b4892011-04-08 14:25:24 -07003213 /*
3214 * Make sure all the updated system packages have their shared users
3215 * associated with them.
3216 */
3217 final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
3218 while (disabledIt.hasNext()) {
3219 final PackageSetting disabledPs = disabledIt.next();
Amith Yamasani13593602012-03-22 16:16:17 -07003220 final Object id = getUserIdLPr(disabledPs.appId);
Kenny Root1d1b4892011-04-08 14:25:24 -07003221 if (id != null && id instanceof SharedUserSetting) {
3222 disabledPs.sharedUser = (SharedUserSetting) id;
3223 }
3224 }
3225
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003226 mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
3227 + mSharedUsers.size() + " shared uids\n");
3228
Jeff Sharkey2271ba32016-02-01 17:57:08 -07003229 writeKernelMappingLPr();
3230
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003231 return true;
3232 }
3233
Christopher Tatedb3fe812015-06-24 16:15:48 -07003234 void applyDefaultPreferredAppsLPw(PackageManagerService service, int userId) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003235 // First pull data from any pre-installed apps.
3236 for (PackageSetting ps : mPackages.values()) {
3237 if ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0 && ps.pkg != null
3238 && ps.pkg.preferredActivityFilters != null) {
3239 ArrayList<PackageParser.ActivityIntentInfo> intents
3240 = ps.pkg.preferredActivityFilters;
3241 for (int i=0; i<intents.size(); i++) {
3242 PackageParser.ActivityIntentInfo aii = intents.get(i);
3243 applyDefaultPreferredActivityLPw(service, aii, new ComponentName(
3244 ps.name, aii.activity.className), userId);
3245 }
3246 }
3247 }
3248
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07003249 // Read preferred apps from .../etc/preferred-apps directory.
3250 File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps");
3251 if (!preferredDir.exists() || !preferredDir.isDirectory()) {
3252 return;
3253 }
3254 if (!preferredDir.canRead()) {
3255 Slog.w(TAG, "Directory " + preferredDir + " cannot be read");
3256 return;
3257 }
3258
3259 // Iterate over the files in the directory and scan .xml files
3260 for (File f : preferredDir.listFiles()) {
3261 if (!f.getPath().endsWith(".xml")) {
3262 Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring");
3263 continue;
3264 }
3265 if (!f.canRead()) {
3266 Slog.w(TAG, "Preferred apps file " + f + " cannot be read");
3267 continue;
3268 }
3269
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003270 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Reading default preferred " + f);
Fyodor Kupolovb35b34c2015-12-17 14:16:51 -08003271 InputStream str = null;
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07003272 try {
Fyodor Kupolovb35b34c2015-12-17 14:16:51 -08003273 str = new BufferedInputStream(new FileInputStream(f));
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07003274 XmlPullParser parser = Xml.newPullParser();
3275 parser.setInput(str, null);
3276
3277 int type;
3278 while ((type = parser.next()) != XmlPullParser.START_TAG
3279 && type != XmlPullParser.END_DOCUMENT) {
3280 ;
3281 }
3282
3283 if (type != XmlPullParser.START_TAG) {
3284 Slog.w(TAG, "Preferred apps file " + f + " does not have start tag");
3285 continue;
3286 }
3287 if (!"preferred-activities".equals(parser.getName())) {
3288 Slog.w(TAG, "Preferred apps file " + f
3289 + " does not start with 'preferred-activities'");
3290 continue;
3291 }
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003292 readDefaultPreferredActivitiesLPw(service, parser, userId);
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07003293 } catch (XmlPullParserException e) {
3294 Slog.w(TAG, "Error reading apps file " + f, e);
3295 } catch (IOException e) {
3296 Slog.w(TAG, "Error reading apps file " + f, e);
3297 } finally {
3298 if (str != null) {
3299 try {
3300 str.close();
3301 } catch (IOException e) {
3302 }
3303 }
3304 }
3305 }
3306 }
3307
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003308 private void applyDefaultPreferredActivityLPw(PackageManagerService service,
3309 IntentFilter tmpPa, ComponentName cn, int userId) {
3310 // The initial preferences only specify the target activity
3311 // component and intent-filter, not the set of matches. So we
3312 // now need to query for the matches to build the correct
3313 // preferred activity entry.
3314 if (PackageManagerService.DEBUG_PREFERRED) {
3315 Log.d(TAG, "Processing preferred:");
3316 tmpPa.dump(new LogPrinter(Log.DEBUG, TAG), " ");
3317 }
3318 Intent intent = new Intent();
Jeff Sharkey8a372a02016-03-16 16:25:45 -06003319 int flags = PackageManager.MATCH_DIRECT_BOOT_AWARE
3320 | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003321 intent.setAction(tmpPa.getAction(0));
3322 for (int i=0; i<tmpPa.countCategories(); i++) {
3323 String cat = tmpPa.getCategory(i);
3324 if (cat.equals(Intent.CATEGORY_DEFAULT)) {
Jeff Sharkey2a90f6732016-01-06 12:26:11 -07003325 flags |= MATCH_DEFAULT_ONLY;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003326 } else {
3327 intent.addCategory(cat);
3328 }
3329 }
3330
3331 boolean doNonData = true;
Christopher Tate2298ef22013-11-04 17:02:10 -08003332 boolean hasSchemes = false;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003333
3334 for (int ischeme=0; ischeme<tmpPa.countDataSchemes(); ischeme++) {
3335 boolean doScheme = true;
3336 String scheme = tmpPa.getDataScheme(ischeme);
Christopher Tate2298ef22013-11-04 17:02:10 -08003337 if (scheme != null && !scheme.isEmpty()) {
3338 hasSchemes = true;
3339 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003340 for (int issp=0; issp<tmpPa.countDataSchemeSpecificParts(); issp++) {
3341 Uri.Builder builder = new Uri.Builder();
3342 builder.scheme(scheme);
3343 PatternMatcher ssp = tmpPa.getDataSchemeSpecificPart(issp);
3344 builder.opaquePart(ssp.getPath());
3345 Intent finalIntent = new Intent(intent);
3346 finalIntent.setData(builder.build());
3347 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003348 scheme, ssp, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003349 doScheme = false;
3350 }
3351 for (int iauth=0; iauth<tmpPa.countDataAuthorities(); iauth++) {
3352 boolean doAuth = true;
3353 IntentFilter.AuthorityEntry auth = tmpPa.getDataAuthority(iauth);
3354 for (int ipath=0; ipath<tmpPa.countDataPaths(); ipath++) {
3355 Uri.Builder builder = new Uri.Builder();
3356 builder.scheme(scheme);
3357 if (auth.getHost() != null) {
3358 builder.authority(auth.getHost());
3359 }
3360 PatternMatcher path = tmpPa.getDataPath(ipath);
3361 builder.path(path.getPath());
3362 Intent finalIntent = new Intent(intent);
3363 finalIntent.setData(builder.build());
3364 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003365 scheme, null, auth, path, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003366 doAuth = doScheme = false;
3367 }
3368 if (doAuth) {
3369 Uri.Builder builder = new Uri.Builder();
3370 builder.scheme(scheme);
3371 if (auth.getHost() != null) {
3372 builder.authority(auth.getHost());
3373 }
3374 Intent finalIntent = new Intent(intent);
3375 finalIntent.setData(builder.build());
3376 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003377 scheme, null, auth, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003378 doScheme = false;
3379 }
3380 }
3381 if (doScheme) {
3382 Uri.Builder builder = new Uri.Builder();
3383 builder.scheme(scheme);
3384 Intent finalIntent = new Intent(intent);
3385 finalIntent.setData(builder.build());
3386 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003387 scheme, null, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003388 }
3389 doNonData = false;
3390 }
3391
3392 for (int idata=0; idata<tmpPa.countDataTypes(); idata++) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003393 String mimeType = tmpPa.getDataType(idata);
Christopher Tate2298ef22013-11-04 17:02:10 -08003394 if (hasSchemes) {
3395 Uri.Builder builder = new Uri.Builder();
3396 for (int ischeme=0; ischeme<tmpPa.countDataSchemes(); ischeme++) {
3397 String scheme = tmpPa.getDataScheme(ischeme);
3398 if (scheme != null && !scheme.isEmpty()) {
3399 Intent finalIntent = new Intent(intent);
3400 builder.scheme(scheme);
3401 finalIntent.setDataAndType(builder.build(), mimeType);
3402 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003403 scheme, null, null, null, userId);
Christopher Tate2298ef22013-11-04 17:02:10 -08003404 }
3405 }
3406 } else {
3407 Intent finalIntent = new Intent(intent);
3408 finalIntent.setType(mimeType);
3409 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003410 null, null, null, null, userId);
Christopher Tate2298ef22013-11-04 17:02:10 -08003411 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003412 doNonData = false;
3413 }
3414
3415 if (doNonData) {
3416 applyDefaultPreferredActivityLPw(service, intent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003417 null, null, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003418 }
3419 }
3420
3421 private void applyDefaultPreferredActivityLPw(PackageManagerService service,
3422 Intent intent, int flags, ComponentName cn, String scheme, PatternMatcher ssp,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003423 IntentFilter.AuthorityEntry auth, PatternMatcher path, int userId) {
Todd Kennedy51b3aac2017-03-30 17:50:42 -07003424 flags = service.updateFlagsForResolve(flags, userId, intent, Binder.getCallingUid(), false);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003425 List<ResolveInfo> ri = service.mActivities.queryIntent(intent,
3426 intent.getType(), flags, 0);
3427 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Queried " + intent
3428 + " results: " + ri);
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003429 int systemMatch = 0;
3430 int thirdPartyMatch = 0;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003431 if (ri != null && ri.size() > 1) {
3432 boolean haveAct = false;
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003433 ComponentName haveNonSys = null;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003434 ComponentName[] set = new ComponentName[ri.size()];
3435 for (int i=0; i<ri.size(); i++) {
3436 ActivityInfo ai = ri.get(i).activityInfo;
3437 set[i] = new ComponentName(ai.packageName, ai.name);
3438 if ((ai.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003439 if (ri.get(i).match >= thirdPartyMatch) {
3440 // Keep track of the best match we find of all third
3441 // party apps, for use later to determine if we actually
3442 // want to set a preferred app for this intent.
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003443 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
3444 + ai.packageName + "/" + ai.name + ": non-system!");
3445 haveNonSys = set[i];
3446 break;
3447 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003448 } else if (cn.getPackageName().equals(ai.packageName)
3449 && cn.getClassName().equals(ai.name)) {
3450 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
3451 + ai.packageName + "/" + ai.name + ": default!");
3452 haveAct = true;
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003453 systemMatch = ri.get(i).match;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003454 } else {
3455 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
3456 + ai.packageName + "/" + ai.name + ": skipped");
3457 }
3458 }
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003459 if (haveNonSys != null && thirdPartyMatch < systemMatch) {
3460 // If we have a matching third party app, but its match is not as
3461 // good as the built-in system app, then we don't want to actually
3462 // consider it a match because presumably the built-in app is still
3463 // the thing we want users to see by default.
3464 haveNonSys = null;
3465 }
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003466 if (haveAct && haveNonSys == null) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003467 IntentFilter filter = new IntentFilter();
3468 if (intent.getAction() != null) {
3469 filter.addAction(intent.getAction());
3470 }
Erin Dahlgren707a59d2013-10-24 15:13:39 -07003471 if (intent.getCategories() != null) {
3472 for (String cat : intent.getCategories()) {
3473 filter.addCategory(cat);
3474 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003475 }
Jeff Sharkey2a90f6732016-01-06 12:26:11 -07003476 if ((flags & MATCH_DEFAULT_ONLY) != 0) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003477 filter.addCategory(Intent.CATEGORY_DEFAULT);
3478 }
3479 if (scheme != null) {
3480 filter.addDataScheme(scheme);
3481 }
3482 if (ssp != null) {
3483 filter.addDataSchemeSpecificPart(ssp.getPath(), ssp.getType());
3484 }
3485 if (auth != null) {
3486 filter.addDataAuthority(auth);
3487 }
3488 if (path != null) {
3489 filter.addDataPath(path);
3490 }
Erin Dahlgren707a59d2013-10-24 15:13:39 -07003491 if (intent.getType() != null) {
3492 try {
3493 filter.addDataType(intent.getType());
3494 } catch (IntentFilter.MalformedMimeTypeException ex) {
3495 Slog.w(TAG, "Malformed mimetype " + intent.getType() + " for " + cn);
3496 }
3497 }
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003498 PreferredActivity pa = new PreferredActivity(filter, systemMatch, set, cn, true);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003499 editPreferredActivitiesLPw(userId).addFilter(pa);
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003500 } else if (haveNonSys == null) {
3501 StringBuilder sb = new StringBuilder();
3502 sb.append("No component ");
3503 sb.append(cn.flattenToShortString());
3504 sb.append(" found setting preferred ");
3505 sb.append(intent);
3506 sb.append("; possible matches are ");
3507 for (int i=0; i<set.length; i++) {
3508 if (i > 0) sb.append(", ");
3509 sb.append(set[i].flattenToShortString());
3510 }
3511 Slog.w(TAG, sb.toString());
3512 } else {
3513 Slog.i(TAG, "Not setting preferred " + intent + "; found third party match "
3514 + haveNonSys.flattenToShortString());
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003515 }
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003516 } else {
3517 Slog.w(TAG, "No potential matches found for " + intent + " while setting preferred "
3518 + cn.flattenToShortString());
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003519 }
3520 }
3521
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003522 private void readDefaultPreferredActivitiesLPw(PackageManagerService service,
3523 XmlPullParser parser, int userId)
3524 throws XmlPullParserException, IOException {
3525 int outerDepth = parser.getDepth();
3526 int type;
3527 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3528 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3529 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3530 continue;
3531 }
3532
3533 String tagName = parser.getName();
3534 if (tagName.equals(TAG_ITEM)) {
3535 PreferredActivity tmpPa = new PreferredActivity(parser);
3536 if (tmpPa.mPref.getParseError() == null) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003537 applyDefaultPreferredActivityLPw(service, tmpPa, tmpPa.mPref.mComponent,
3538 userId);
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003539 } else {
3540 PackageManagerService.reportSettingsProblem(Log.WARN,
3541 "Error in package manager settings: <preferred-activity> "
3542 + tmpPa.mPref.getParseError() + " at "
3543 + parser.getPositionDescription());
3544 }
3545 } else {
3546 PackageManagerService.reportSettingsProblem(Log.WARN,
3547 "Unknown element under <preferred-activities>: " + parser.getName());
3548 XmlUtils.skipCurrentTag(parser);
3549 }
3550 }
3551 }
3552
Kenny Root447106f2011-03-23 11:00:15 -07003553 private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003554 IOException {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003555 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003556 String realName = parser.getAttributeValue(null, "realName");
3557 String codePathStr = parser.getAttributeValue(null, "codePath");
3558 String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003559
3560 String legacyCpuAbiStr = parser.getAttributeValue(null, "requiredCpuAbi");
3561 String legacyNativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
3562
Svet Ganov354cd3c2015-12-17 11:35:04 -08003563 String parentPackageName = parser.getAttributeValue(null, "parentPackageName");
3564
Narayan Kamathff110bd2014-07-04 18:30:45 +01003565 String primaryCpuAbiStr = parser.getAttributeValue(null, "primaryCpuAbi");
3566 String secondaryCpuAbiStr = parser.getAttributeValue(null, "secondaryCpuAbi");
Narayan Kamath4903f642014-08-11 13:33:45 +01003567 String cpuAbiOverrideStr = parser.getAttributeValue(null, "cpuAbiOverride");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003568
3569 if (primaryCpuAbiStr == null && legacyCpuAbiStr != null) {
3570 primaryCpuAbiStr = legacyCpuAbiStr;
3571 }
Narayan Kamath9e289d72014-04-10 09:26:59 +00003572
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003573 if (resourcePathStr == null) {
3574 resourcePathStr = codePathStr;
3575 }
3576 String version = parser.getAttributeValue(null, "version");
Dianne Hackborn3accca02013-09-20 09:32:11 -07003577 long versionCode = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003578 if (version != null) {
3579 try {
Dianne Hackborn3accca02013-09-20 09:32:11 -07003580 versionCode = Long.parseLong(version);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003581 } catch (NumberFormatException e) {
3582 }
3583 }
3584
3585 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003586 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003587 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
Todd Kennedyddaaf4c2017-11-07 10:01:25 -08003588 if (PackageManagerService.locationIsPrivileged(codePathStr)) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003589 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
Christopher Tate628946a2013-10-18 18:11:05 -07003590 }
Todd Kennedyddaaf4c2017-11-07 10:01:25 -08003591 PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
Narayan Kamathff110bd2014-07-04 18:30:45 +01003592 new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiStr,
Svet Ganov354cd3c2015-12-17 11:35:04 -08003593 secondaryCpuAbiStr, cpuAbiOverrideStr, versionCode, pkgFlags, pkgPrivateFlags,
Svet Ganov67882122016-12-11 16:36:34 -08003594 parentPackageName, null /*childPackageNames*/, 0 /*sharedUserId*/, null, null);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003595 String timeStampStr = parser.getAttributeValue(null, "ft");
3596 if (timeStampStr != null) {
3597 try {
3598 long timeStamp = Long.parseLong(timeStampStr, 16);
3599 ps.setTimeStamp(timeStamp);
3600 } catch (NumberFormatException e) {
3601 }
3602 } else {
3603 timeStampStr = parser.getAttributeValue(null, "ts");
3604 if (timeStampStr != null) {
3605 try {
3606 long timeStamp = Long.parseLong(timeStampStr);
3607 ps.setTimeStamp(timeStamp);
3608 } catch (NumberFormatException e) {
3609 }
3610 }
3611 }
3612 timeStampStr = parser.getAttributeValue(null, "it");
3613 if (timeStampStr != null) {
3614 try {
3615 ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
3616 } catch (NumberFormatException e) {
3617 }
3618 }
3619 timeStampStr = parser.getAttributeValue(null, "ut");
3620 if (timeStampStr != null) {
3621 try {
3622 ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
3623 } catch (NumberFormatException e) {
3624 }
3625 }
3626 String idStr = parser.getAttributeValue(null, "userId");
Amith Yamasani13593602012-03-22 16:16:17 -07003627 ps.appId = idStr != null ? Integer.parseInt(idStr) : 0;
3628 if (ps.appId <= 0) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003629 String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
Amith Yamasani13593602012-03-22 16:16:17 -07003630 ps.appId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003631 }
Svetoslavc6d1c342015-02-26 14:44:43 -08003632
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003633 int outerDepth = parser.getDepth();
3634 int type;
3635 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3636 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3637 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3638 continue;
3639 }
3640
Svetoslavc6d1c342015-02-26 14:44:43 -08003641 if (parser.getName().equals(TAG_PERMISSIONS)) {
3642 readInstallPermissionsLPr(parser, ps.getPermissionsState());
Svet Ganov354cd3c2015-12-17 11:35:04 -08003643 } else if (parser.getName().equals(TAG_CHILD_PACKAGE)) {
3644 String childPackageName = parser.getAttributeValue(null, ATTR_NAME);
3645 if (ps.childPackageNames == null) {
3646 ps.childPackageNames = new ArrayList<>();
3647 }
3648 ps.childPackageNames.add(childPackageName);
Svet Ganov67882122016-12-11 16:36:34 -08003649 } else if (parser.getName().equals(TAG_USES_STATIC_LIB)) {
3650 readUsesStaticLibLPw(parser, ps);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003651 } else {
3652 PackageManagerService.reportSettingsProblem(Log.WARN,
3653 "Unknown element under <updated-package>: " + parser.getName());
3654 XmlUtils.skipCurrentTag(parser);
3655 }
3656 }
Christopher Tate628946a2013-10-18 18:11:05 -07003657
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003658 mDisabledSysPackages.put(name, ps);
3659 }
3660
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003661 private static int PRE_M_APP_INFO_FLAG_HIDDEN = 1<<27;
3662 private static int PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE = 1<<28;
3663 private static int PRE_M_APP_INFO_FLAG_FORWARD_LOCK = 1<<29;
3664 private static int PRE_M_APP_INFO_FLAG_PRIVILEGED = 1<<30;
3665
Kenny Root447106f2011-03-23 11:00:15 -07003666 private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003667 String name = null;
3668 String realName = null;
3669 String idStr = null;
3670 String sharedIdStr = null;
3671 String codePathStr = null;
3672 String resourcePathStr = null;
Narayan Kamathff110bd2014-07-04 18:30:45 +01003673 String legacyCpuAbiString = null;
3674 String legacyNativeLibraryPathStr = null;
3675 String primaryCpuAbiString = null;
3676 String secondaryCpuAbiString = null;
Narayan Kamath4903f642014-08-11 13:33:45 +01003677 String cpuAbiOverrideString = null;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003678 String systemStr = null;
3679 String installerPackageName = null;
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07003680 String isOrphaned = null;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003681 String volumeUuid = null;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07003682 String categoryHintString = null;
Todd Kennedyab532892017-03-08 14:19:49 -08003683 String updateAvailable = null;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07003684 int categoryHint = ApplicationInfo.CATEGORY_UNDEFINED;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003685 String uidError = null;
3686 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003687 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003688 long timeStamp = 0;
3689 long firstInstallTime = 0;
3690 long lastUpdateTime = 0;
Todd Kennedy788c8422016-08-10 10:52:34 -07003691 PackageSetting packageSetting = null;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003692 String version = null;
Dianne Hackborn3accca02013-09-20 09:32:11 -07003693 long versionCode = 0;
Svet Ganov354cd3c2015-12-17 11:35:04 -08003694 String parentPackageName;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003695 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003696 name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003697 realName = parser.getAttributeValue(null, "realName");
3698 idStr = parser.getAttributeValue(null, "userId");
3699 uidError = parser.getAttributeValue(null, "uidError");
3700 sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
3701 codePathStr = parser.getAttributeValue(null, "codePath");
3702 resourcePathStr = parser.getAttributeValue(null, "resourcePath");
Narayan Kamath9e289d72014-04-10 09:26:59 +00003703
Narayan Kamathff110bd2014-07-04 18:30:45 +01003704 legacyCpuAbiString = parser.getAttributeValue(null, "requiredCpuAbi");
3705
Svet Ganov354cd3c2015-12-17 11:35:04 -08003706 parentPackageName = parser.getAttributeValue(null, "parentPackageName");
3707
Narayan Kamathff110bd2014-07-04 18:30:45 +01003708 legacyNativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
3709 primaryCpuAbiString = parser.getAttributeValue(null, "primaryCpuAbi");
3710 secondaryCpuAbiString = parser.getAttributeValue(null, "secondaryCpuAbi");
Narayan Kamath4903f642014-08-11 13:33:45 +01003711 cpuAbiOverrideString = parser.getAttributeValue(null, "cpuAbiOverride");
Todd Kennedyab532892017-03-08 14:19:49 -08003712 updateAvailable = parser.getAttributeValue(null, "updateAvailable");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003713
3714 if (primaryCpuAbiString == null && legacyCpuAbiString != null) {
3715 primaryCpuAbiString = legacyCpuAbiString;
3716 }
Svetoslavc6d1c342015-02-26 14:44:43 -08003717
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003718 version = parser.getAttributeValue(null, "version");
3719 if (version != null) {
3720 try {
Dianne Hackborn3accca02013-09-20 09:32:11 -07003721 versionCode = Long.parseLong(version);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003722 } catch (NumberFormatException e) {
3723 }
3724 }
3725 installerPackageName = parser.getAttributeValue(null, "installer");
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07003726 isOrphaned = parser.getAttributeValue(null, "isOrphaned");
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003727 volumeUuid = parser.getAttributeValue(null, "volumeUuid");
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07003728 categoryHintString = parser.getAttributeValue(null, "categoryHint");
3729 if (categoryHintString != null) {
3730 try {
3731 categoryHint = Integer.parseInt(categoryHintString);
3732 } catch (NumberFormatException e) {
3733 }
3734 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003735
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003736 systemStr = parser.getAttributeValue(null, "publicFlags");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003737 if (systemStr != null) {
3738 try {
3739 pkgFlags = Integer.parseInt(systemStr);
3740 } catch (NumberFormatException e) {
3741 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003742 systemStr = parser.getAttributeValue(null, "privateFlags");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003743 if (systemStr != null) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003744 try {
3745 pkgPrivateFlags = Integer.parseInt(systemStr);
3746 } catch (NumberFormatException e) {
3747 }
3748 }
3749 } else {
3750 // Pre-M -- both public and private flags were stored in one "flags" field.
3751 systemStr = parser.getAttributeValue(null, "flags");
3752 if (systemStr != null) {
3753 try {
3754 pkgFlags = Integer.parseInt(systemStr);
3755 } catch (NumberFormatException e) {
3756 }
3757 if ((pkgFlags & PRE_M_APP_INFO_FLAG_HIDDEN) != 0) {
3758 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_HIDDEN;
3759 }
3760 if ((pkgFlags & PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE) != 0) {
3761 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE;
3762 }
3763 if ((pkgFlags & PRE_M_APP_INFO_FLAG_FORWARD_LOCK) != 0) {
3764 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK;
3765 }
3766 if ((pkgFlags & PRE_M_APP_INFO_FLAG_PRIVILEGED) != 0) {
3767 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
3768 }
3769 pkgFlags &= ~(PRE_M_APP_INFO_FLAG_HIDDEN
3770 | PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE
3771 | PRE_M_APP_INFO_FLAG_FORWARD_LOCK
3772 | PRE_M_APP_INFO_FLAG_PRIVILEGED);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003773 } else {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003774 // For backward compatibility
3775 systemStr = parser.getAttributeValue(null, "system");
3776 if (systemStr != null) {
3777 pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
3778 : 0;
3779 } else {
3780 // Old settings that don't specify system... just treat
3781 // them as system, good enough.
3782 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
3783 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003784 }
3785 }
3786 String timeStampStr = parser.getAttributeValue(null, "ft");
3787 if (timeStampStr != null) {
3788 try {
3789 timeStamp = Long.parseLong(timeStampStr, 16);
3790 } catch (NumberFormatException e) {
3791 }
3792 } else {
3793 timeStampStr = parser.getAttributeValue(null, "ts");
3794 if (timeStampStr != null) {
3795 try {
3796 timeStamp = Long.parseLong(timeStampStr);
3797 } catch (NumberFormatException e) {
3798 }
3799 }
3800 }
3801 timeStampStr = parser.getAttributeValue(null, "it");
3802 if (timeStampStr != null) {
3803 try {
3804 firstInstallTime = Long.parseLong(timeStampStr, 16);
3805 } catch (NumberFormatException e) {
3806 }
3807 }
3808 timeStampStr = parser.getAttributeValue(null, "ut");
3809 if (timeStampStr != null) {
3810 try {
3811 lastUpdateTime = Long.parseLong(timeStampStr, 16);
3812 } catch (NumberFormatException e) {
3813 }
3814 }
3815 if (PackageManagerService.DEBUG_SETTINGS)
3816 Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
3817 + " sharedUserId=" + sharedIdStr);
Todd Kennedy788c8422016-08-10 10:52:34 -07003818 final int userId = idStr != null ? Integer.parseInt(idStr) : 0;
3819 final int sharedUserId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003820 if (resourcePathStr == null) {
3821 resourcePathStr = codePathStr;
3822 }
3823 if (realName != null) {
3824 realName = realName.intern();
3825 }
3826 if (name == null) {
3827 PackageManagerService.reportSettingsProblem(Log.WARN,
3828 "Error in package manager settings: <package> has no name at "
3829 + parser.getPositionDescription());
3830 } else if (codePathStr == null) {
3831 PackageManagerService.reportSettingsProblem(Log.WARN,
3832 "Error in package manager settings: <package> has no codePath at "
3833 + parser.getPositionDescription());
3834 } else if (userId > 0) {
Kenny Root447106f2011-03-23 11:00:15 -07003835 packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
Narayan Kamathff110bd2014-07-04 18:30:45 +01003836 new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003837 secondaryCpuAbiString, cpuAbiOverrideString, userId, versionCode, pkgFlags,
Svet Ganov67882122016-12-11 16:36:34 -08003838 pkgPrivateFlags, parentPackageName, null /*childPackageNames*/,
3839 null /*usesStaticLibraries*/, null /*usesStaticLibraryVersions*/);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003840 if (PackageManagerService.DEBUG_SETTINGS)
3841 Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
3842 + userId + " pkg=" + packageSetting);
3843 if (packageSetting == null) {
3844 PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
3845 + userId + " while parsing settings at "
3846 + parser.getPositionDescription());
3847 } else {
3848 packageSetting.setTimeStamp(timeStamp);
3849 packageSetting.firstInstallTime = firstInstallTime;
3850 packageSetting.lastUpdateTime = lastUpdateTime;
3851 }
3852 } else if (sharedIdStr != null) {
Todd Kennedy788c8422016-08-10 10:52:34 -07003853 if (sharedUserId > 0) {
3854 packageSetting = new PackageSetting(name.intern(), realName, new File(
Narayan Kamathff110bd2014-07-04 18:30:45 +01003855 codePathStr), new File(resourcePathStr), legacyNativeLibraryPathStr,
Narayan Kamath4903f642014-08-11 13:33:45 +01003856 primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString,
Todd Kennedy788c8422016-08-10 10:52:34 -07003857 versionCode, pkgFlags, pkgPrivateFlags, parentPackageName,
Svet Ganov67882122016-12-11 16:36:34 -08003858 null /*childPackageNames*/, sharedUserId,
3859 null /*usesStaticLibraries*/, null /*usesStaticLibraryVersions*/);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003860 packageSetting.setTimeStamp(timeStamp);
3861 packageSetting.firstInstallTime = firstInstallTime;
3862 packageSetting.lastUpdateTime = lastUpdateTime;
Todd Kennedy788c8422016-08-10 10:52:34 -07003863 mPendingPackages.add(packageSetting);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003864 if (PackageManagerService.DEBUG_SETTINGS)
3865 Log.i(PackageManagerService.TAG, "Reading package " + name
Todd Kennedy788c8422016-08-10 10:52:34 -07003866 + ": sharedUserId=" + sharedUserId + " pkg=" + packageSetting);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003867 } else {
3868 PackageManagerService.reportSettingsProblem(Log.WARN,
3869 "Error in package manager settings: package " + name
3870 + " has bad sharedId " + sharedIdStr + " at "
3871 + parser.getPositionDescription());
3872 }
3873 } else {
3874 PackageManagerService.reportSettingsProblem(Log.WARN,
3875 "Error in package manager settings: package " + name + " has bad userId "
3876 + idStr + " at " + parser.getPositionDescription());
3877 }
3878 } catch (NumberFormatException e) {
3879 PackageManagerService.reportSettingsProblem(Log.WARN,
3880 "Error in package manager settings: package " + name + " has bad userId "
3881 + idStr + " at " + parser.getPositionDescription());
3882 }
3883 if (packageSetting != null) {
3884 packageSetting.uidError = "true".equals(uidError);
3885 packageSetting.installerPackageName = installerPackageName;
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07003886 packageSetting.isOrphaned = "true".equals(isOrphaned);
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003887 packageSetting.volumeUuid = volumeUuid;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -07003888 packageSetting.categoryHint = categoryHint;
Narayan Kamathff110bd2014-07-04 18:30:45 +01003889 packageSetting.legacyNativeLibraryPathString = legacyNativeLibraryPathStr;
3890 packageSetting.primaryCpuAbiString = primaryCpuAbiString;
3891 packageSetting.secondaryCpuAbiString = secondaryCpuAbiString;
Todd Kennedyab532892017-03-08 14:19:49 -08003892 packageSetting.updateAvailable = "true".equals(updateAvailable);
Amith Yamasani483f3b02012-03-13 16:08:00 -07003893 // Handle legacy string here for single-user mode
3894 final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003895 if (enabledStr != null) {
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003896 try {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003897 packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003898 } catch (NumberFormatException e) {
3899 if (enabledStr.equalsIgnoreCase("true")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003900 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003901 } else if (enabledStr.equalsIgnoreCase("false")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003902 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003903 } else if (enabledStr.equalsIgnoreCase("default")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003904 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003905 } else {
3906 PackageManagerService.reportSettingsProblem(Log.WARN,
3907 "Error in package manager settings: package " + name
3908 + " has bad enabled value: " + idStr + " at "
3909 + parser.getPositionDescription());
3910 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003911 }
3912 } else {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003913 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003914 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07003915
Sudheer Shanka29283372016-04-04 20:56:27 -07003916 if (installerPackageName != null) {
3917 mInstallerPackages.add(installerPackageName);
3918 }
3919
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003920 int outerDepth = parser.getDepth();
3921 int type;
3922 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3923 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3924 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3925 continue;
3926 }
3927
3928 String tagName = parser.getName();
Selim Gurun5c8acb42016-04-07 16:34:02 -07003929 // Legacy
Amith Yamasani483f3b02012-03-13 16:08:00 -07003930 if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
3931 readDisabledComponentsLPw(packageSetting, parser, 0);
3932 } else if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
3933 readEnabledComponentsLPw(packageSetting, parser, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003934 } else if (tagName.equals("sigs")) {
3935 packageSetting.signatures.readXml(parser, mPastSignatures);
Svetoslavc6d1c342015-02-26 14:44:43 -08003936 } else if (tagName.equals(TAG_PERMISSIONS)) {
3937 readInstallPermissionsLPr(parser,
3938 packageSetting.getPermissionsState());
Svetoslavcf959f62015-03-26 20:53:34 -07003939 packageSetting.installPermissionsFixed = true;
dcashman3a0dbfb2014-07-07 13:53:36 -07003940 } else if (tagName.equals("proper-signing-keyset")) {
3941 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
dcashman8c04fac2015-03-23 11:39:42 -07003942 Integer refCt = mKeySetRefs.get(id);
3943 if (refCt != null) {
3944 mKeySetRefs.put(id, refCt + 1);
3945 } else {
3946 mKeySetRefs.put(id, 1);
3947 }
dcashman3a0dbfb2014-07-07 13:53:36 -07003948 packageSetting.keySetData.setProperSigningKeySet(id);
Geremy Condraf1bcca82013-01-07 22:35:24 -08003949 } else if (tagName.equals("signing-keyset")) {
dcashman8c04fac2015-03-23 11:39:42 -07003950 // from v1 of keysetmanagerservice - no longer used
dcashman55b10782014-04-09 14:20:38 -07003951 } else if (tagName.equals("upgrade-keyset")) {
3952 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
3953 packageSetting.keySetData.addUpgradeKeySetById(id);
Geremy Condraf1bcca82013-01-07 22:35:24 -08003954 } else if (tagName.equals("defined-keyset")) {
3955 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
3956 String alias = parser.getAttributeValue(null, "alias");
dcashman8c04fac2015-03-23 11:39:42 -07003957 Integer refCt = mKeySetRefs.get(id);
3958 if (refCt != null) {
3959 mKeySetRefs.put(id, refCt + 1);
3960 } else {
3961 mKeySetRefs.put(id, 1);
3962 }
Geremy Condraf1bcca82013-01-07 22:35:24 -08003963 packageSetting.keySetData.addDefinedKeySet(id, alias);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08003964 } else if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
3965 readDomainVerificationLPw(parser, packageSetting);
Svet Ganov354cd3c2015-12-17 11:35:04 -08003966 } else if (tagName.equals(TAG_CHILD_PACKAGE)) {
3967 String childPackageName = parser.getAttributeValue(null, ATTR_NAME);
3968 if (packageSetting.childPackageNames == null) {
3969 packageSetting.childPackageNames = new ArrayList<>();
3970 }
3971 packageSetting.childPackageNames.add(childPackageName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003972 } else {
3973 PackageManagerService.reportSettingsProblem(Log.WARN,
3974 "Unknown element under <package>: " + parser.getName());
3975 XmlUtils.skipCurrentTag(parser);
3976 }
3977 }
3978 } else {
3979 XmlUtils.skipCurrentTag(parser);
3980 }
3981 }
3982
Amith Yamasani483f3b02012-03-13 16:08:00 -07003983 private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
3984 int userId) throws IOException, XmlPullParserException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003985 int outerDepth = parser.getDepth();
3986 int type;
3987 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3988 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3989 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3990 continue;
3991 }
3992
3993 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003994 if (tagName.equals(TAG_ITEM)) {
3995 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003996 if (name != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003997 packageSetting.addDisabledComponent(name.intern(), userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003998 } else {
3999 PackageManagerService.reportSettingsProblem(Log.WARN,
4000 "Error in package manager settings: <disabled-components> has"
4001 + " no name at " + parser.getPositionDescription());
4002 }
4003 } else {
4004 PackageManagerService.reportSettingsProblem(Log.WARN,
4005 "Unknown element under <disabled-components>: " + parser.getName());
4006 }
4007 XmlUtils.skipCurrentTag(parser);
4008 }
4009 }
4010
Amith Yamasani483f3b02012-03-13 16:08:00 -07004011 private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
4012 int userId) throws IOException, XmlPullParserException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004013 int outerDepth = parser.getDepth();
4014 int type;
4015 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
4016 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
4017 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
4018 continue;
4019 }
4020
4021 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07004022 if (tagName.equals(TAG_ITEM)) {
4023 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004024 if (name != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07004025 packageSetting.addEnabledComponent(name.intern(), userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004026 } else {
4027 PackageManagerService.reportSettingsProblem(Log.WARN,
4028 "Error in package manager settings: <enabled-components> has"
4029 + " no name at " + parser.getPositionDescription());
4030 }
4031 } else {
4032 PackageManagerService.reportSettingsProblem(Log.WARN,
4033 "Unknown element under <enabled-components>: " + parser.getName());
4034 }
4035 XmlUtils.skipCurrentTag(parser);
4036 }
4037 }
4038
Amith Yamasani483f3b02012-03-13 16:08:00 -07004039 private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004040 String name = null;
4041 String idStr = null;
4042 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08004043 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004044 SharedUserSetting su = null;
4045 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07004046 name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004047 idStr = parser.getAttributeValue(null, "userId");
4048 int userId = idStr != null ? Integer.parseInt(idStr) : 0;
4049 if ("true".equals(parser.getAttributeValue(null, "system"))) {
4050 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
4051 }
4052 if (name == null) {
4053 PackageManagerService.reportSettingsProblem(Log.WARN,
4054 "Error in package manager settings: <shared-user> has no name at "
4055 + parser.getPositionDescription());
4056 } else if (userId == 0) {
4057 PackageManagerService.reportSettingsProblem(Log.WARN,
4058 "Error in package manager settings: shared-user " + name
4059 + " has bad userId " + idStr + " at "
4060 + parser.getPositionDescription());
4061 } else {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08004062 if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags, pkgPrivateFlags))
4063 == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004064 PackageManagerService
4065 .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
4066 + parser.getPositionDescription());
4067 }
4068 }
4069 } catch (NumberFormatException e) {
4070 PackageManagerService.reportSettingsProblem(Log.WARN,
4071 "Error in package manager settings: package " + name + " has bad userId "
4072 + idStr + " at " + parser.getPositionDescription());
4073 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004074
4075 if (su != null) {
4076 int outerDepth = parser.getDepth();
4077 int type;
4078 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
4079 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
4080 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
4081 continue;
4082 }
4083
4084 String tagName = parser.getName();
4085 if (tagName.equals("sigs")) {
4086 su.signatures.readXml(parser, mPastSignatures);
4087 } else if (tagName.equals("perms")) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004088 readInstallPermissionsLPr(parser, su.getPermissionsState());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004089 } else {
4090 PackageManagerService.reportSettingsProblem(Log.WARN,
4091 "Unknown element under <shared-user>: " + parser.getName());
4092 XmlUtils.skipCurrentTag(parser);
4093 }
4094 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004095 } else {
4096 XmlUtils.skipCurrentTag(parser);
4097 }
4098 }
4099
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004100 void createNewUserLI(@NonNull PackageManagerService service, @NonNull Installer installer,
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07004101 int userHandle, String[] disallowedPackages) {
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004102 String[] volumeUuids;
4103 String[] names;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004104 int[] appIds;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004105 String[] seinfos;
Janis Danisevskisf3409742016-01-12 14:46:33 +00004106 int[] targetSdkVersions;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004107 int packagesCount;
4108 synchronized (mPackages) {
4109 Collection<PackageSetting> packages = mPackages.values();
4110 packagesCount = packages.size();
4111 volumeUuids = new String[packagesCount];
4112 names = new String[packagesCount];
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004113 appIds = new int[packagesCount];
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004114 seinfos = new String[packagesCount];
Janis Danisevskisf3409742016-01-12 14:46:33 +00004115 targetSdkVersions = new int[packagesCount];
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004116 Iterator<PackageSetting> packagesIterator = packages.iterator();
4117 for (int i = 0; i < packagesCount; i++) {
4118 PackageSetting ps = packagesIterator.next();
4119 if (ps.pkg == null || ps.pkg.applicationInfo == null) {
4120 continue;
4121 }
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07004122 final boolean shouldInstall = ps.isSystem() &&
Rhed Jaoc19da782018-06-13 11:16:16 +08004123 !ArrayUtils.contains(disallowedPackages, ps.name) &&
4124 !ps.pkg.applicationInfo.hiddenUntilInstalled;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004125 // Only system apps are initially installed.
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07004126 ps.setInstalled(shouldInstall, userHandle);
Amith Yamasani23ab7f52017-01-22 17:43:24 -08004127 if (!shouldInstall) {
4128 writeKernelMappingLPr(ps);
4129 }
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004130 // Need to create a data directory for all apps under this user. Accumulate all
4131 // required args and call the installer after mPackages lock has been released
4132 volumeUuids[i] = ps.volumeUuid;
4133 names[i] = ps.name;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004134 appIds[i] = ps.appId;
Todd Kennedybe0b8892017-02-15 14:13:52 -08004135 seinfos[i] = ps.pkg.applicationInfo.seInfo;
Janis Danisevskisf3409742016-01-12 14:46:33 +00004136 targetSdkVersions[i] = ps.pkg.applicationInfo.targetSdkVersion;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004137 }
4138 }
4139 for (int i = 0; i < packagesCount; i++) {
4140 if (names[i] == null) {
Amith Yamasani41cd5772014-07-10 15:26:00 -07004141 continue;
4142 }
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004143 // TODO: triage flags!
Jeff Sharkey47f71082016-02-01 17:03:54 -07004144 final int flags = StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004145 try {
4146 installer.createAppData(volumeUuids[i], names[i], userHandle, flags, appIds[i],
Janis Danisevskisf3409742016-01-12 14:46:33 +00004147 seinfos[i], targetSdkVersions[i]);
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004148 } catch (InstallerException e) {
4149 Slog.w(TAG, "Failed to prepare app data", e);
4150 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004151 }
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004152 synchronized (mPackages) {
4153 applyDefaultPreferredAppsLPw(service, userHandle);
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004154 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004155 }
4156
Alexandra Gherghina539a7ef2014-07-07 12:27:54 +01004157 void removeUserLPw(int userId) {
Dianne Hackborn63092712012-10-07 14:45:35 -07004158 Set<Entry<String, PackageSetting>> entries = mPackages.entrySet();
4159 for (Entry<String, PackageSetting> entry : entries) {
4160 entry.getValue().removeUser(userId);
4161 }
4162 mPreferredActivities.remove(userId);
Amith Yamasani13593602012-03-22 16:16:17 -07004163 File file = getUserPackagesStateFile(userId);
4164 file.delete();
4165 file = getUserPackagesStateBackupFile(userId);
4166 file.delete();
Nicolas Prevote7024042014-07-08 15:47:17 +01004167 removeCrossProfileIntentFiltersLPw(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08004168
Fyodor Kupolov69542592016-05-23 14:22:38 -07004169 mRuntimePermissionsPersistence.onUserRemovedLPw(userId);
Jeff Sharkey91edde22015-05-20 12:04:42 -07004170
4171 writePackageListLPr();
Amith Yamasani23ab7f52017-01-22 17:43:24 -08004172
4173 // Inform kernel that the user was removed, so that packages are marked uninstalled
4174 // for sdcardfs
4175 writeKernelRemoveUserLPr(userId);
Nicolas Prevota0f48852014-05-27 11:21:11 +01004176 }
4177
Nicolas Prevote7024042014-07-08 15:47:17 +01004178 void removeCrossProfileIntentFiltersLPw(int userId) {
4179 synchronized (mCrossProfileIntentResolvers) {
4180 // userId is the source user
4181 if (mCrossProfileIntentResolvers.get(userId) != null) {
4182 mCrossProfileIntentResolvers.remove(userId);
4183 writePackageRestrictionsLPr(userId);
Nicolas Prevota0f48852014-05-27 11:21:11 +01004184 }
Nicolas Prevote7024042014-07-08 15:47:17 +01004185 // userId is the target user
4186 int count = mCrossProfileIntentResolvers.size();
4187 for (int i = 0; i < count; i++) {
4188 int sourceUserId = mCrossProfileIntentResolvers.keyAt(i);
4189 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId);
4190 boolean needsWriting = false;
Jeff Sharkey9f837a92014-10-24 12:07:24 -07004191 ArraySet<CrossProfileIntentFilter> cpifs =
4192 new ArraySet<CrossProfileIntentFilter>(cpir.filterSet());
Nicolas Prevote7024042014-07-08 15:47:17 +01004193 for (CrossProfileIntentFilter cpif : cpifs) {
4194 if (cpif.getTargetUserId() == userId) {
4195 needsWriting = true;
4196 cpir.removeFilter(cpif);
4197 }
4198 }
4199 if (needsWriting) {
4200 writePackageRestrictionsLPr(sourceUserId);
4201 }
Nicolas Prevota0f48852014-05-27 11:21:11 +01004202 }
4203 }
Amith Yamasani13593602012-03-22 16:16:17 -07004204 }
4205
Geremy Condra12c18382013-03-06 16:49:06 -08004206 // This should be called (at least) whenever an application is removed
4207 private void setFirstAvailableUid(int uid) {
4208 if (uid > mFirstAvailableUid) {
4209 mFirstAvailableUid = uid;
4210 }
4211 }
4212
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004213 // Returns -1 if we could not find an available UserId to assign
Kenny Root447106f2011-03-23 11:00:15 -07004214 private int newUserIdLPw(Object obj) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004215 // Let's be stupidly inefficient for now...
4216 final int N = mUserIds.size();
Geremy Condra12c18382013-03-06 16:49:06 -08004217 for (int i = mFirstAvailableUid; i < N; i++) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004218 if (mUserIds.get(i) == null) {
4219 mUserIds.set(i, obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08004220 return Process.FIRST_APPLICATION_UID + i;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004221 }
4222 }
4223
4224 // None left?
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08004225 if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004226 return -1;
4227 }
4228
4229 mUserIds.add(obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08004230 return Process.FIRST_APPLICATION_UID + N;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004231 }
4232
Kenny Root0aaa0d92011-09-12 16:42:55 -07004233 public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
4234 if (mVerifierDeviceIdentity == null) {
4235 mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
4236
4237 writeLPr();
4238 }
4239
4240 return mVerifierDeviceIdentity;
4241 }
4242
Todd Kennedyff35e662016-09-20 12:53:52 -07004243 boolean hasOtherDisabledSystemPkgWithChildLPr(String parentPackageName,
Svet Ganov354cd3c2015-12-17 11:35:04 -08004244 String childPackageName) {
4245 final int packageCount = mDisabledSysPackages.size();
4246 for (int i = 0; i < packageCount; i++) {
4247 PackageSetting disabledPs = mDisabledSysPackages.valueAt(i);
4248 if (disabledPs.childPackageNames == null || disabledPs.childPackageNames.isEmpty()) {
4249 continue;
4250 }
4251 if (disabledPs.name.equals(parentPackageName)) {
4252 continue;
4253 }
4254 final int childCount = disabledPs.childPackageNames.size();
4255 for (int j = 0; j < childCount; j++) {
4256 String currChildPackageName = disabledPs.childPackageNames.get(j);
4257 if (currChildPackageName.equals(childPackageName)) {
4258 return true;
4259 }
4260 }
4261 }
4262 return false;
4263 }
4264
Kenny Root447106f2011-03-23 11:00:15 -07004265 public PackageSetting getDisabledSystemPkgLPr(String name) {
4266 PackageSetting ps = mDisabledSysPackages.get(name);
4267 return ps;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004268 }
4269
Jeff Sharkey5217cac2015-12-20 15:34:01 -07004270 boolean isEnabledAndMatchLPr(ComponentInfo componentInfo, int flags, int userId) {
Jeff Sharkey2bd31db2016-01-09 16:58:14 -07004271 final PackageSetting ps = mPackages.get(componentInfo.packageName);
4272 if (ps == null) return false;
Jeff Sharkeye17ac152015-11-06 22:40:29 -08004273
Jeff Sharkey2bd31db2016-01-09 16:58:14 -07004274 final PackageUserState userState = ps.readUserState(userId);
4275 return userState.isMatch(componentInfo, flags);
Jeff Sharkeye17ac152015-11-06 22:40:29 -08004276 }
4277
Kenny Root447106f2011-03-23 11:00:15 -07004278 String getInstallerPackageNameLPr(String packageName) {
4279 final PackageSetting pkg = mPackages.get(packageName);
4280 if (pkg == null) {
4281 throw new IllegalArgumentException("Unknown package: " + packageName);
4282 }
4283 return pkg.installerPackageName;
4284 }
4285
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07004286 boolean isOrphaned(String packageName) {
4287 final PackageSetting pkg = mPackages.get(packageName);
4288 if (pkg == null) {
4289 throw new IllegalArgumentException("Unknown package: " + packageName);
4290 }
4291 return pkg.isOrphaned;
4292 }
4293
Amith Yamasani483f3b02012-03-13 16:08:00 -07004294 int getApplicationEnabledSettingLPr(String packageName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07004295 final PackageSetting pkg = mPackages.get(packageName);
4296 if (pkg == null) {
4297 throw new IllegalArgumentException("Unknown package: " + packageName);
4298 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004299 return pkg.getEnabled(userId);
Kenny Root447106f2011-03-23 11:00:15 -07004300 }
4301
Amith Yamasani483f3b02012-03-13 16:08:00 -07004302 int getComponentEnabledSettingLPr(ComponentName componentName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07004303 final String packageName = componentName.getPackageName();
4304 final PackageSetting pkg = mPackages.get(packageName);
4305 if (pkg == null) {
4306 throw new IllegalArgumentException("Unknown component: " + componentName);
4307 }
4308 final String classNameStr = componentName.getClassName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07004309 return pkg.getCurrentEnabledStateLPr(classNameStr, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004310 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004311
Svet Ganov973edd192016-09-08 20:15:55 -07004312 boolean wasPackageEverLaunchedLPr(String packageName, int userId) {
4313 final PackageSetting pkgSetting = mPackages.get(packageName);
4314 if (pkgSetting == null) {
4315 throw new IllegalArgumentException("Unknown package: " + packageName);
4316 }
4317 return !pkgSetting.getNotLaunched(userId);
4318 }
4319
Christopher Tate5cf55782016-04-25 17:08:56 -07004320 boolean setPackageStoppedStateLPw(PackageManagerService pm, String packageName,
Jeff Sharkeybd0e9e42015-04-30 16:04:50 -07004321 boolean stopped, boolean allowedByPermission, int uid, int userId) {
Dianne Hackbornf02b60a2012-08-16 10:48:27 -07004322 int appId = UserHandle.getAppId(uid);
Kenny Root447106f2011-03-23 11:00:15 -07004323 final PackageSetting pkgSetting = mPackages.get(packageName);
4324 if (pkgSetting == null) {
4325 throw new IllegalArgumentException("Unknown package: " + packageName);
4326 }
Amith Yamasani13593602012-03-22 16:16:17 -07004327 if (!allowedByPermission && (appId != pkgSetting.appId)) {
Kenny Root447106f2011-03-23 11:00:15 -07004328 throw new SecurityException(
4329 "Permission Denial: attempt to change stopped state from pid="
4330 + Binder.getCallingPid()
Amith Yamasani13593602012-03-22 16:16:17 -07004331 + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
Kenny Root447106f2011-03-23 11:00:15 -07004332 }
4333 if (DEBUG_STOPPED) {
4334 if (stopped) {
4335 RuntimeException e = new RuntimeException("here");
4336 e.fillInStackTrace();
4337 Slog.i(TAG, "Stopping package " + packageName, e);
4338 }
4339 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004340 if (pkgSetting.getStopped(userId) != stopped) {
4341 pkgSetting.setStopped(stopped, userId);
4342 // pkgSetting.pkg.mSetStopped = stopped;
4343 if (pkgSetting.getNotLaunched(userId)) {
Kenny Root447106f2011-03-23 11:00:15 -07004344 if (pkgSetting.installerPackageName != null) {
Christopher Tate5cf55782016-04-25 17:08:56 -07004345 pm.notifyFirstLaunch(pkgSetting.name, pkgSetting.installerPackageName, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004346 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004347 pkgSetting.setNotLaunched(false, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004348 }
4349 return true;
4350 }
4351 return false;
4352 }
4353
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004354 void setHarmfulAppWarningLPw(String packageName, CharSequence warning, int userId) {
4355 final PackageSetting pkgSetting = mPackages.get(packageName);
4356 if (pkgSetting == null) {
4357 throw new IllegalArgumentException("Unknown package: " + packageName);
4358 }
4359 pkgSetting.setHarmfulAppWarning(userId, warning == null ? null : warning.toString());
4360 }
4361
4362 String getHarmfulAppWarningLPr(String packageName, int userId) {
4363 final PackageSetting pkgSetting = mPackages.get(packageName);
4364 if (pkgSetting == null) {
4365 throw new IllegalArgumentException("Unknown package: " + packageName);
4366 }
4367 return pkgSetting.getHarmfulAppWarning(userId);
4368 }
4369
Todd Kennedy13715d52016-08-01 13:38:57 -07004370 private static List<UserInfo> getAllUsers(UserManagerService userManager) {
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07004371 long id = Binder.clearCallingIdentity();
Amith Yamasani483f3b02012-03-13 16:08:00 -07004372 try {
Todd Kennedy13715d52016-08-01 13:38:57 -07004373 return userManager.getUsers(false);
Amith Yamasani483f3b02012-03-13 16:08:00 -07004374 } catch (NullPointerException npe) {
4375 // packagemanager not yet initialized
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07004376 } finally {
4377 Binder.restoreCallingIdentity(id);
Amith Yamasani483f3b02012-03-13 16:08:00 -07004378 }
4379 return null;
4380 }
4381
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004382 /**
4383 * Return all {@link PackageSetting} that are actively installed on the
4384 * given {@link VolumeInfo#fsUuid}.
4385 */
4386 List<PackageSetting> getVolumePackagesLPr(String volumeUuid) {
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004387 ArrayList<PackageSetting> res = new ArrayList<>();
4388 for (int i = 0; i < mPackages.size(); i++) {
4389 final PackageSetting setting = mPackages.valueAt(i);
4390 if (Objects.equals(volumeUuid, setting.volumeUuid)) {
4391 res.add(setting);
4392 }
4393 }
4394 return res;
4395 }
4396
Svetoslavc6d1c342015-02-26 14:44:43 -08004397 static void printFlags(PrintWriter pw, int val, Object[] spec) {
Joe Onorato20963df2012-01-04 18:13:24 -08004398 pw.print("[ ");
4399 for (int i=0; i<spec.length; i+=2) {
4400 int mask = (Integer)spec[i];
4401 if ((val & mask) != 0) {
4402 pw.print(spec[i+1]);
4403 pw.print(" ");
4404 }
4405 }
4406 pw.print("]");
4407 }
4408
4409 static final Object[] FLAG_DUMP_SPEC = new Object[] {
4410 ApplicationInfo.FLAG_SYSTEM, "SYSTEM",
4411 ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE",
4412 ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE",
4413 ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT",
4414 ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST",
4415 ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING",
4416 ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA",
4417 ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP",
4418 ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY",
4419 ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE",
4420 ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP",
4421 ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE",
4422 ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION",
4423 ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE",
4424 ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP",
Alex Klyubinb9f8a522015-02-03 11:12:59 -08004425 };
4426
Wale Ogunwale72a73e32016-10-13 12:16:39 -07004427 private static final Object[] PRIVATE_FLAG_DUMP_SPEC = new Object[] {
Svet Ganov087dce22017-09-07 15:42:16 -07004428 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE",
4429 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION",
4430 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE",
4431 ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND, "BACKUP_IN_FOREGROUND",
4432 ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
4433 ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE, "DEFAULT_TO_DEVICE_PROTECTED_STORAGE",
4434 ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE, "DIRECT_BOOT_AWARE",
4435 ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK, "FORWARD_LOCK",
4436 ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS, "HAS_DOMAIN_URLS",
4437 ApplicationInfo.PRIVATE_FLAG_HIDDEN, "HIDDEN",
4438 ApplicationInfo.PRIVATE_FLAG_INSTANT, "EPHEMERAL",
4439 ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING, "ISOLATED_SPLIT_LOADING",
4440 ApplicationInfo.PRIVATE_FLAG_OEM, "OEM",
4441 ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE, "PARTIALLY_DIRECT_BOOT_AWARE",
4442 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED, "PRIVILEGED",
4443 ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER, "REQUIRED_FOR_SYSTEM_USER",
4444 ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY, "STATIC_SHARED_LIBRARY",
Jiyong Park002fdbd2017-02-13 20:50:31 +09004445 ApplicationInfo.PRIVATE_FLAG_VENDOR, "VENDOR",
Jaekyun Seok1713d9e2018-01-12 21:47:26 +09004446 ApplicationInfo.PRIVATE_FLAG_PRODUCT, "PRODUCT",
Svet Ganov087dce22017-09-07 15:42:16 -07004447 ApplicationInfo.PRIVATE_FLAG_VIRTUAL_PRELOAD, "VIRTUAL_PRELOAD",
Joe Onorato20963df2012-01-04 18:13:24 -08004448 };
4449
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07004450 void dumpVersionLPr(IndentingPrintWriter pw) {
4451 pw.increaseIndent();
4452 for (int i= 0; i < mVersion.size(); i++) {
4453 final String volumeUuid = mVersion.keyAt(i);
4454 final VersionInfo ver = mVersion.valueAt(i);
4455 if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, volumeUuid)) {
4456 pw.println("Internal:");
4457 } else if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, volumeUuid)) {
4458 pw.println("External:");
4459 } else {
4460 pw.println("UUID " + volumeUuid + ":");
4461 }
4462 pw.increaseIndent();
4463 pw.printPair("sdkVersion", ver.sdkVersion);
4464 pw.printPair("databaseVersion", ver.databaseVersion);
4465 pw.println();
4466 pw.printPair("fingerprint", ver.fingerprint);
4467 pw.println();
4468 pw.decreaseIndent();
4469 }
4470 pw.decreaseIndent();
4471 }
4472
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004473 void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
4474 ArraySet<String> permissionNames, PackageSetting ps, SimpleDateFormat sdf,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004475 Date date, List<UserInfo> users, boolean dumpAll) {
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004476 if (checkinTag != null) {
4477 pw.print(checkinTag);
4478 pw.print(",");
4479 pw.print(ps.realName != null ? ps.realName : ps.name);
4480 pw.print(",");
4481 pw.print(ps.appId);
4482 pw.print(",");
4483 pw.print(ps.versionCode);
4484 pw.print(",");
4485 pw.print(ps.firstInstallTime);
4486 pw.print(",");
4487 pw.print(ps.lastUpdateTime);
4488 pw.print(",");
4489 pw.print(ps.installerPackageName != null ? ps.installerPackageName : "?");
4490 pw.println();
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004491 if (ps.pkg != null) {
4492 pw.print(checkinTag); pw.print("-"); pw.print("splt,");
4493 pw.print("base,");
4494 pw.println(ps.pkg.baseRevisionCode);
4495 if (ps.pkg.splitNames != null) {
4496 for (int i = 0; i < ps.pkg.splitNames.length; i++) {
4497 pw.print(checkinTag); pw.print("-"); pw.print("splt,");
4498 pw.print(ps.pkg.splitNames[i]); pw.print(",");
4499 pw.println(ps.pkg.splitRevisionCodes[i]);
4500 }
4501 }
4502 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004503 for (UserInfo user : users) {
4504 pw.print(checkinTag);
4505 pw.print("-");
4506 pw.print("usr");
4507 pw.print(",");
4508 pw.print(user.id);
4509 pw.print(",");
4510 pw.print(ps.getInstalled(user.id) ? "I" : "i");
Amith Yamasanie5bcff62014-07-19 15:44:09 -07004511 pw.print(ps.getHidden(user.id) ? "B" : "b");
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00004512 pw.print(ps.getSuspended(user.id) ? "SU" : "su");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004513 pw.print(ps.getStopped(user.id) ? "S" : "s");
4514 pw.print(ps.getNotLaunched(user.id) ? "l" : "L");
Todd Kennedybe0b8892017-02-15 14:13:52 -08004515 pw.print(ps.getInstantApp(user.id) ? "IA" : "ia");
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07004516 pw.print(ps.getVirtulalPreload(user.id) ? "VPI" : "vpi");
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004517 String harmfulAppWarning = ps.getHarmfulAppWarning(user.id);
4518 pw.print(harmfulAppWarning != null ? "HA" : "ha");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004519 pw.print(",");
4520 pw.print(ps.getEnabled(user.id));
4521 String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
4522 pw.print(",");
4523 pw.print(lastDisabledAppCaller != null ? lastDisabledAppCaller : "?");
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004524 pw.print(",");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004525 pw.println();
4526 }
4527 return;
4528 }
4529
Dianne Hackbornc895be72013-03-11 17:48:43 -07004530 pw.print(prefix); pw.print("Package [");
4531 pw.print(ps.realName != null ? ps.realName : ps.name);
4532 pw.print("] (");
4533 pw.print(Integer.toHexString(System.identityHashCode(ps)));
4534 pw.println("):");
4535
4536 if (ps.realName != null) {
4537 pw.print(prefix); pw.print(" compat name=");
4538 pw.println(ps.name);
4539 }
4540
Svetoslavc6d1c342015-02-26 14:44:43 -08004541 pw.print(prefix); pw.print(" userId="); pw.println(ps.appId);
4542
Dianne Hackbornc895be72013-03-11 17:48:43 -07004543 if (ps.sharedUser != null) {
4544 pw.print(prefix); pw.print(" sharedUser="); pw.println(ps.sharedUser);
4545 }
4546 pw.print(prefix); pw.print(" pkg="); pw.println(ps.pkg);
4547 pw.print(prefix); pw.print(" codePath="); pw.println(ps.codePathString);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004548 if (permissionNames == null) {
4549 pw.print(prefix); pw.print(" resourcePath="); pw.println(ps.resourcePathString);
4550 pw.print(prefix); pw.print(" legacyNativeLibraryDir=");
4551 pw.println(ps.legacyNativeLibraryPathString);
4552 pw.print(prefix); pw.print(" primaryCpuAbi="); pw.println(ps.primaryCpuAbiString);
4553 pw.print(prefix); pw.print(" secondaryCpuAbi="); pw.println(ps.secondaryCpuAbiString);
4554 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004555 pw.print(prefix); pw.print(" versionCode="); pw.print(ps.versionCode);
4556 if (ps.pkg != null) {
Todd Kennedy89d60182016-03-11 11:18:32 -08004557 pw.print(" minSdk="); pw.print(ps.pkg.applicationInfo.minSdkVersion);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004558 pw.print(" targetSdk="); pw.print(ps.pkg.applicationInfo.targetSdkVersion);
4559 }
4560 pw.println();
4561 if (ps.pkg != null) {
Svet Ganov354cd3c2015-12-17 11:35:04 -08004562 if (ps.pkg.parentPackage != null) {
4563 PackageParser.Package parentPkg = ps.pkg.parentPackage;
4564 PackageSetting pps = mPackages.get(parentPkg.packageName);
4565 if (pps == null || !pps.codePathString.equals(parentPkg.codePath)) {
4566 pps = mDisabledSysPackages.get(parentPkg.packageName);
4567 }
4568 if (pps != null) {
4569 pw.print(prefix); pw.print(" parentPackage=");
4570 pw.println(pps.realName != null ? pps.realName : pps.name);
4571 }
4572 } else if (ps.pkg.childPackages != null) {
4573 pw.print(prefix); pw.print(" childPackages=[");
4574 final int childCount = ps.pkg.childPackages.size();
4575 for (int i = 0; i < childCount; i++) {
4576 PackageParser.Package childPkg = ps.pkg.childPackages.get(i);
4577 PackageSetting cps = mPackages.get(childPkg.packageName);
4578 if (cps == null || !cps.codePathString.equals(childPkg.codePath)) {
4579 cps = mDisabledSysPackages.get(childPkg.packageName);
4580 }
4581 if (cps != null) {
4582 if (i > 0) {
4583 pw.print(", ");
4584 }
4585 pw.print(cps.realName != null ? cps.realName : cps.name);
4586 }
4587 }
4588 pw.println("]");
4589 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004590 pw.print(prefix); pw.print(" versionName="); pw.println(ps.pkg.mVersionName);
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004591 pw.print(prefix); pw.print(" splits="); dumpSplitNames(pw, ps.pkg); pw.println();
Patrick Baumann420d58a2017-12-19 10:17:21 -08004592 final int apkSigningVersion = ps.pkg.mSigningDetails.signatureSchemeVersion;
4593 pw.print(prefix); pw.print(" apkSigningVersion="); pw.println(apkSigningVersion);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004594 pw.print(prefix); pw.print(" applicationInfo=");
4595 pw.println(ps.pkg.applicationInfo.toString());
4596 pw.print(prefix); pw.print(" flags="); printFlags(pw, ps.pkg.applicationInfo.flags,
4597 FLAG_DUMP_SPEC); pw.println();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004598 if (ps.pkg.applicationInfo.privateFlags != 0) {
4599 pw.print(prefix); pw.print(" privateFlags="); printFlags(pw,
4600 ps.pkg.applicationInfo.privateFlags, PRIVATE_FLAG_DUMP_SPEC); pw.println();
4601 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004602 pw.print(prefix); pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004603 pw.print(prefix); pw.print(" supportsScreens=[");
4604 boolean first = true;
4605 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
4606 if (!first)
4607 pw.print(", ");
4608 first = false;
4609 pw.print("small");
4610 }
4611 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
4612 if (!first)
4613 pw.print(", ");
4614 first = false;
4615 pw.print("medium");
4616 }
4617 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
4618 if (!first)
4619 pw.print(", ");
4620 first = false;
4621 pw.print("large");
4622 }
4623 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
4624 if (!first)
4625 pw.print(", ");
4626 first = false;
4627 pw.print("xlarge");
4628 }
4629 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
4630 if (!first)
4631 pw.print(", ");
4632 first = false;
4633 pw.print("resizeable");
4634 }
4635 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
4636 if (!first)
4637 pw.print(", ");
4638 first = false;
4639 pw.print("anyDensity");
4640 }
4641 pw.println("]");
4642 if (ps.pkg.libraryNames != null && ps.pkg.libraryNames.size() > 0) {
Svet Ganov67882122016-12-11 16:36:34 -08004643 pw.print(prefix); pw.println(" dynamic libraries:");
4644 for (int i = 0; i<ps.pkg.libraryNames.size(); i++) {
4645 pw.print(prefix); pw.print(" ");
4646 pw.println(ps.pkg.libraryNames.get(i));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004647 }
4648 }
Svet Ganov67882122016-12-11 16:36:34 -08004649 if (ps.pkg.staticSharedLibName != null) {
4650 pw.print(prefix); pw.println(" static library:");
4651 pw.print(prefix); pw.print(" ");
4652 pw.print("name:"); pw.print(ps.pkg.staticSharedLibName);
4653 pw.print(" version:"); pw.println(ps.pkg.staticSharedLibVersion);
4654 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004655 if (ps.pkg.usesLibraries != null && ps.pkg.usesLibraries.size() > 0) {
4656 pw.print(prefix); pw.println(" usesLibraries:");
4657 for (int i=0; i<ps.pkg.usesLibraries.size(); i++) {
4658 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.usesLibraries.get(i));
4659 }
4660 }
Svet Ganov67882122016-12-11 16:36:34 -08004661 if (ps.pkg.usesStaticLibraries != null
4662 && ps.pkg.usesStaticLibraries.size() > 0) {
4663 pw.print(prefix); pw.println(" usesStaticLibraries:");
4664 for (int i=0; i<ps.pkg.usesStaticLibraries.size(); i++) {
4665 pw.print(prefix); pw.print(" ");
4666 pw.print(ps.pkg.usesStaticLibraries.get(i)); pw.print(" version:");
4667 pw.println(ps.pkg.usesStaticLibrariesVersions[i]);
4668 }
4669 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004670 if (ps.pkg.usesOptionalLibraries != null
4671 && ps.pkg.usesOptionalLibraries.size() > 0) {
4672 pw.print(prefix); pw.println(" usesOptionalLibraries:");
4673 for (int i=0; i<ps.pkg.usesOptionalLibraries.size(); i++) {
4674 pw.print(prefix); pw.print(" ");
Svet Ganov67882122016-12-11 16:36:34 -08004675 pw.println(ps.pkg.usesOptionalLibraries.get(i));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004676 }
4677 }
4678 if (ps.pkg.usesLibraryFiles != null
4679 && ps.pkg.usesLibraryFiles.length > 0) {
4680 pw.print(prefix); pw.println(" usesLibraryFiles:");
4681 for (int i=0; i<ps.pkg.usesLibraryFiles.length; i++) {
4682 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.usesLibraryFiles[i]);
4683 }
4684 }
4685 }
4686 pw.print(prefix); pw.print(" timeStamp=");
4687 date.setTime(ps.timeStamp);
4688 pw.println(sdf.format(date));
4689 pw.print(prefix); pw.print(" firstInstallTime=");
4690 date.setTime(ps.firstInstallTime);
4691 pw.println(sdf.format(date));
4692 pw.print(prefix); pw.print(" lastUpdateTime=");
4693 date.setTime(ps.lastUpdateTime);
4694 pw.println(sdf.format(date));
4695 if (ps.installerPackageName != null) {
4696 pw.print(prefix); pw.print(" installerPackageName=");
4697 pw.println(ps.installerPackageName);
4698 }
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004699 if (ps.volumeUuid != null) {
4700 pw.print(prefix); pw.print(" volumeUuid=");
4701 pw.println(ps.volumeUuid);
4702 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004703 pw.print(prefix); pw.print(" signatures="); pw.println(ps.signatures);
Svetoslavcf959f62015-03-26 20:53:34 -07004704 pw.print(prefix); pw.print(" installPermissionsFixed=");
4705 pw.print(ps.installPermissionsFixed);
Todd Kennedyaf6f1952018-02-13 11:09:50 -08004706 pw.println();
Dianne Hackbornc895be72013-03-11 17:48:43 -07004707 pw.print(prefix); pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
4708 pw.println();
Svetoslavc6d1c342015-02-26 14:44:43 -08004709
Patrick Baumann7438dcb2018-05-08 14:31:45 -07004710 if (ps.pkg != null && ps.pkg.mOverlayTarget != null) {
Adrian Roosc84df772018-01-19 21:20:22 +01004711 pw.print(prefix); pw.print(" overlayTarget="); pw.println(ps.pkg.mOverlayTarget);
4712 pw.print(prefix); pw.print(" overlayCategory="); pw.println(ps.pkg.mOverlayCategory);
4713 }
4714
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004715 if (ps.pkg != null && ps.pkg.permissions != null && ps.pkg.permissions.size() > 0) {
4716 final ArrayList<PackageParser.Permission> perms = ps.pkg.permissions;
4717 pw.print(prefix); pw.println(" declared permissions:");
4718 for (int i=0; i<perms.size(); i++) {
4719 PackageParser.Permission perm = perms.get(i);
4720 if (permissionNames != null
4721 && !permissionNames.contains(perm.info.name)) {
4722 continue;
4723 }
4724 pw.print(prefix); pw.print(" "); pw.print(perm.info.name);
4725 pw.print(": prot=");
4726 pw.print(PermissionInfo.protectionToString(perm.info.protectionLevel));
4727 if ((perm.info.flags&PermissionInfo.FLAG_COSTS_MONEY) != 0) {
4728 pw.print(", COSTS_MONEY");
4729 }
Svet Ganov2a1376d2016-02-22 17:20:35 -08004730 if ((perm.info.flags&PermissionInfo.FLAG_REMOVED) != 0) {
Svet Ganov52153f42015-08-11 08:59:12 -07004731 pw.print(", HIDDEN");
Svet Ganov3e0be742015-08-07 23:06:00 -07004732 }
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004733 if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
4734 pw.print(", INSTALLED");
4735 }
4736 pw.println();
4737 }
4738 }
4739
Dianne Hackborn9cfba352016-03-24 17:31:28 -07004740 if ((permissionNames != null || dumpAll) && ps.pkg != null
4741 && ps.pkg.requestedPermissions != null
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004742 && ps.pkg.requestedPermissions.size() > 0) {
4743 final ArrayList<String> perms = ps.pkg.requestedPermissions;
4744 pw.print(prefix); pw.println(" requested permissions:");
4745 for (int i=0; i<perms.size(); i++) {
4746 String perm = perms.get(i);
4747 if (permissionNames != null
4748 && !permissionNames.contains(perm)) {
4749 continue;
4750 }
4751 pw.print(prefix); pw.print(" "); pw.println(perm);
4752 }
4753 }
4754
4755 if (ps.sharedUser == null || permissionNames != null || dumpAll) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004756 PermissionsState permissionsState = ps.getPermissionsState();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004757 dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState);
Svetoslavc6d1c342015-02-26 14:44:43 -08004758 }
4759
Dianne Hackbornc895be72013-03-11 17:48:43 -07004760 for (UserInfo user : users) {
4761 pw.print(prefix); pw.print(" User "); pw.print(user.id); pw.print(": ");
Jeff Sharkey42884192016-04-09 16:12:01 -06004762 pw.print("ceDataInode=");
4763 pw.print(ps.getCeDataInode(user.id));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004764 pw.print(" installed=");
4765 pw.print(ps.getInstalled(user.id));
Amith Yamasanie5bcff62014-07-19 15:44:09 -07004766 pw.print(" hidden=");
4767 pw.print(ps.getHidden(user.id));
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00004768 pw.print(" suspended=");
4769 pw.print(ps.getSuspended(user.id));
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004770 if (ps.getSuspended(user.id)) {
Suprabh Shukla3c3af142018-03-30 00:28:37 -07004771 final PackageUserState pus = ps.readUserState(user.id);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004772 pw.print(" suspendingPackage=");
Suprabh Shukla3c3af142018-03-30 00:28:37 -07004773 pw.print(pus.suspendingPackage);
4774 pw.print(" dialogMessage=");
4775 pw.print(pus.dialogMessage);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004776 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004777 pw.print(" stopped=");
4778 pw.print(ps.getStopped(user.id));
4779 pw.print(" notLaunched=");
4780 pw.print(ps.getNotLaunched(user.id));
4781 pw.print(" enabled=");
Fyodor Kupolov09546ff2017-04-03 17:45:50 -07004782 pw.print(ps.getEnabled(user.id));
Todd Kennedybe0b8892017-02-15 14:13:52 -08004783 pw.print(" instant=");
Dianne Hackbornc50a1082017-08-15 14:10:39 -07004784 pw.print(ps.getInstantApp(user.id));
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07004785 pw.print(" virtual=");
4786 pw.println(ps.getVirtulalPreload(user.id));
Todd Kennedyb2749472017-06-13 08:24:32 -07004787
4788 String[] overlayPaths = ps.getOverlayPaths(user.id);
4789 if (overlayPaths != null && overlayPaths.length > 0) {
Todd Kennedy560830c2017-06-16 13:55:13 -07004790 pw.print(prefix); pw.println(" overlay paths:");
Todd Kennedyb2749472017-06-13 08:24:32 -07004791 for (String path : overlayPaths) {
Todd Kennedy560830c2017-06-16 13:55:13 -07004792 pw.print(prefix); pw.print(" "); pw.println(path);
Todd Kennedyb2749472017-06-13 08:24:32 -07004793 }
4794 }
4795
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07004796 String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
4797 if (lastDisabledAppCaller != null) {
4798 pw.print(prefix); pw.print(" lastDisabledCaller: ");
4799 pw.println(lastDisabledAppCaller);
4800 }
Svetoslavc6d1c342015-02-26 14:44:43 -08004801
4802 if (ps.sharedUser == null) {
4803 PermissionsState permissionsState = ps.getPermissionsState();
4804 dumpGidsLPr(pw, prefix + " ", permissionsState.computeGids(user.id));
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004805 dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames, permissionsState
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004806 .getRuntimePermissionStates(user.id), dumpAll);
Svetoslavc6d1c342015-02-26 14:44:43 -08004807 }
4808
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004809 String harmfulAppWarning = ps.getHarmfulAppWarning(user.id);
4810 if (harmfulAppWarning != null) {
4811 pw.print(prefix); pw.print(" harmfulAppWarning: ");
4812 pw.println(harmfulAppWarning);
4813 }
4814
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004815 if (permissionNames == null) {
4816 ArraySet<String> cmp = ps.getDisabledComponents(user.id);
4817 if (cmp != null && cmp.size() > 0) {
4818 pw.print(prefix); pw.println(" disabledComponents:");
4819 for (String s : cmp) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004820 pw.print(prefix); pw.print(" "); pw.println(s);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004821 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004822 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004823 cmp = ps.getEnabledComponents(user.id);
4824 if (cmp != null && cmp.size() > 0) {
4825 pw.print(prefix); pw.println(" enabledComponents:");
4826 for (String s : cmp) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004827 pw.print(prefix); pw.print(" "); pw.println(s);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004828 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004829 }
4830 }
4831 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004832 }
4833
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004834 void dumpPackagesLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4835 DumpState dumpState, boolean checkin) {
Kenny Root447106f2011-03-23 11:00:15 -07004836 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
4837 final Date date = new Date();
4838 boolean printedSomething = false;
Todd Kennedy13715d52016-08-01 13:38:57 -07004839 List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
Kenny Root447106f2011-03-23 11:00:15 -07004840 for (final PackageSetting ps : mPackages.values()) {
4841 if (packageName != null && !packageName.equals(ps.realName)
4842 && !packageName.equals(ps.name)) {
4843 continue;
4844 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004845 if (permissionNames != null
4846 && !ps.getPermissionsState().hasRequestedPermission(permissionNames)) {
4847 continue;
4848 }
Kenny Root447106f2011-03-23 11:00:15 -07004849
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004850 if (!checkin && packageName != null) {
Kenny Root447106f2011-03-23 11:00:15 -07004851 dumpState.setSharedUser(ps.sharedUser);
4852 }
4853
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004854 if (!checkin && !printedSomething) {
Kenny Root447106f2011-03-23 11:00:15 -07004855 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004856 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004857 pw.println("Packages:");
4858 printedSomething = true;
4859 }
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004860 dumpPackageLPr(pw, " ", checkin ? "pkg" : null, permissionNames, ps, sdf, date, users,
4861 packageName != null);
Kenny Root447106f2011-03-23 11:00:15 -07004862 }
4863
4864 printedSomething = false;
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004865 if (mRenamedPackages.size() > 0 && permissionNames == null) {
Andy McFadden2f362292012-01-20 14:43:38 -08004866 for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Root447106f2011-03-23 11:00:15 -07004867 if (packageName != null && !packageName.equals(e.getKey())
4868 && !packageName.equals(e.getValue())) {
4869 continue;
4870 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004871 if (!checkin) {
4872 if (!printedSomething) {
4873 if (dumpState.onTitlePrinted())
4874 pw.println();
4875 pw.println("Renamed packages:");
4876 printedSomething = true;
4877 }
4878 pw.print(" ");
4879 } else {
4880 pw.print("ren,");
Kenny Root447106f2011-03-23 11:00:15 -07004881 }
Kenny Root447106f2011-03-23 11:00:15 -07004882 pw.print(e.getKey());
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004883 pw.print(checkin ? " -> " : ",");
Kenny Root447106f2011-03-23 11:00:15 -07004884 pw.println(e.getValue());
4885 }
4886 }
4887
4888 printedSomething = false;
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004889 if (mDisabledSysPackages.size() > 0 && permissionNames == null) {
Kenny Root447106f2011-03-23 11:00:15 -07004890 for (final PackageSetting ps : mDisabledSysPackages.values()) {
4891 if (packageName != null && !packageName.equals(ps.realName)
4892 && !packageName.equals(ps.name)) {
4893 continue;
4894 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004895 if (!checkin && !printedSomething) {
Kenny Root447106f2011-03-23 11:00:15 -07004896 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004897 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004898 pw.println("Hidden system packages:");
4899 printedSomething = true;
4900 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004901 dumpPackageLPr(pw, " ", checkin ? "dis" : null, permissionNames, ps, sdf, date,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004902 users, packageName != null);
Kenny Root447106f2011-03-23 11:00:15 -07004903 }
4904 }
4905 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004906
Netta P426cbef2017-02-10 14:38:39 -08004907 void dumpPackagesProto(ProtoOutputStream proto) {
4908 List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
4909
4910 final int count = mPackages.size();
4911 for (int i = 0; i < count; i++) {
4912 final PackageSetting ps = mPackages.valueAt(i);
4913 ps.writeToProto(proto, PackageServiceDumpProto.PACKAGES, users);
4914 }
4915 }
4916
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004917 void dumpPermissionsLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4918 DumpState dumpState) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07004919 mPermissions.dumpPermissions(pw, packageName, permissionNames,
4920 (mReadExternalStorageEnforced == Boolean.TRUE), dumpState);
Kenny Root447106f2011-03-23 11:00:15 -07004921 }
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07004922
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004923 void dumpSharedUsersLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4924 DumpState dumpState, boolean checkin) {
Kenny Root447106f2011-03-23 11:00:15 -07004925 boolean printedSomething = false;
4926 for (SharedUserSetting su : mSharedUsers.values()) {
4927 if (packageName != null && su != dumpState.getSharedUser()) {
4928 continue;
4929 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004930 if (permissionNames != null
4931 && !su.getPermissionsState().hasRequestedPermission(permissionNames)) {
4932 continue;
4933 }
Dianne Hackbornd052a942014-11-21 15:23:13 -08004934 if (!checkin) {
4935 if (!printedSomething) {
4936 if (dumpState.onTitlePrinted())
4937 pw.println();
4938 pw.println("Shared users:");
4939 printedSomething = true;
4940 }
4941 pw.print(" SharedUser [");
4942 pw.print(su.name);
4943 pw.print("] (");
4944 pw.print(Integer.toHexString(System.identityHashCode(su)));
4945 pw.println("):");
Svetoslavc6d1c342015-02-26 14:44:43 -08004946
4947 String prefix = " ";
4948 pw.print(prefix); pw.print("userId="); pw.println(su.userId);
4949
4950 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);
Svet Ganov8c7f7002015-05-07 10:48:44 -07004955 List<PermissionState> permissions = permissionsState
4956 .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);
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004960 dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames, permissions,
4961 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
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07004982 void dumpRestoredPermissionGrantsLPr(PrintWriter pw, DumpState dumpState) {
4983 if (mRestoredUserGrants.size() > 0) {
4984 pw.println();
4985 pw.println("Restored (pending) permission grants:");
4986 for (int userIndex = 0; userIndex < mRestoredUserGrants.size(); userIndex++) {
4987 ArrayMap<String, ArraySet<RestoredPermissionGrant>> grantsByPackage =
4988 mRestoredUserGrants.valueAt(userIndex);
4989 if (grantsByPackage != null && grantsByPackage.size() > 0) {
4990 final int userId = mRestoredUserGrants.keyAt(userIndex);
4991 pw.print(" User "); pw.println(userId);
4992
4993 for (int pkgIndex = 0; pkgIndex < grantsByPackage.size(); pkgIndex++) {
4994 ArraySet<RestoredPermissionGrant> grants = grantsByPackage.valueAt(pkgIndex);
4995 if (grants != null && grants.size() > 0) {
4996 final String pkgName = grantsByPackage.keyAt(pkgIndex);
4997 pw.print(" "); pw.print(pkgName); pw.println(" :");
4998
4999 for (RestoredPermissionGrant g : grants) {
5000 pw.print(" ");
5001 pw.print(g.permissionName);
5002 if (g.granted) {
5003 pw.print(" GRANTED");
5004 }
5005 if ((g.grantBits&FLAG_PERMISSION_USER_SET) != 0) {
5006 pw.print(" user_set");
5007 }
5008 if ((g.grantBits&FLAG_PERMISSION_USER_FIXED) != 0) {
5009 pw.print(" user_fixed");
5010 }
5011 if ((g.grantBits&FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0) {
5012 pw.print(" revoke_on_upgrade");
5013 }
5014 pw.println();
5015 }
5016 }
5017 }
5018 }
5019 }
5020 pw.println();
5021 }
5022 }
5023
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08005024 private static void dumpSplitNames(PrintWriter pw, PackageParser.Package pkg) {
5025 if (pkg == null) {
5026 pw.print("unknown");
5027 } else {
5028 // [base:10, config.mdpi, config.xhdpi:12]
5029 pw.print("[");
5030 pw.print("base");
5031 if (pkg.baseRevisionCode != 0) {
5032 pw.print(":"); pw.print(pkg.baseRevisionCode);
5033 }
5034 if (pkg.splitNames != null) {
5035 for (int i = 0; i < pkg.splitNames.length; i++) {
5036 pw.print(", ");
5037 pw.print(pkg.splitNames[i]);
5038 if (pkg.splitRevisionCodes[i] != 0) {
5039 pw.print(":"); pw.print(pkg.splitRevisionCodes[i]);
5040 }
5041 }
5042 }
5043 pw.print("]");
5044 }
5045 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005046
5047 void dumpGidsLPr(PrintWriter pw, String prefix, int[] gids) {
5048 if (!ArrayUtils.isEmpty(gids)) {
Fabrice Di Meglio62271722015-04-10 17:24:02 -07005049 pw.print(prefix);
5050 pw.print("gids="); pw.println(
Svetoslavc6d1c342015-02-26 14:44:43 -08005051 PackageManagerService.arrayToString(gids));
5052 }
5053 }
5054
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005055 void dumpRuntimePermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07005056 List<PermissionState> permissionStates, boolean dumpAll) {
5057 if (!permissionStates.isEmpty() || dumpAll) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005058 pw.print(prefix); pw.println("runtime 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=",
5067 permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005068 }
5069 }
5070 }
5071
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005072 private static String permissionFlagsToString(String prefix, int flags) {
5073 StringBuilder flagsString = null;
Svet Ganov77ab6a82015-07-03 12:03:02 -07005074 while (flags != 0) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005075 if (flagsString == null) {
5076 flagsString = new StringBuilder();
5077 flagsString.append(prefix);
5078 flagsString.append("[ ");
5079 }
Svet Ganov77ab6a82015-07-03 12:03:02 -07005080 final int flag = 1 << Integer.numberOfTrailingZeros(flags);
5081 flags &= ~flag;
5082 flagsString.append(PackageManager.permissionFlagToString(flag));
5083 flagsString.append(' ');
5084 }
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005085 if (flagsString != null) {
5086 flagsString.append(']');
5087 return flagsString.toString();
5088 } else {
5089 return "";
5090 }
Svet Ganov77ab6a82015-07-03 12:03:02 -07005091 }
5092
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005093 void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Svetoslavc6d1c342015-02-26 14:44:43 -08005094 PermissionsState permissionsState) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005095 List<PermissionState> permissionStates = permissionsState.getInstallPermissionStates();
5096 if (!permissionStates.isEmpty()) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005097 pw.print(prefix); pw.println("install permissions:");
Svet Ganov8c7f7002015-05-07 10:48:44 -07005098 for (PermissionState permissionState : permissionStates) {
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005099 if (permissionNames != null
5100 && !permissionNames.contains(permissionState.getName())) {
5101 continue;
5102 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005103 pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005104 pw.print(": granted="); pw.print(permissionState.isGranted());
5105 pw.println(permissionFlagsToString(", flags=",
Svet Ganov8c7f7002015-05-07 10:48:44 -07005106 permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005107 }
5108 }
5109 }
5110
5111 public void writeRuntimePermissionsForUserLPr(int userId, boolean sync) {
5112 if (sync) {
5113 mRuntimePermissionsPersistence.writePermissionsForUserSyncLPr(userId);
5114 } else {
5115 mRuntimePermissionsPersistence.writePermissionsForUserAsyncLPr(userId);
5116 }
5117 }
5118
5119 private final class RuntimePermissionPersistence {
5120 private static final long WRITE_PERMISSIONS_DELAY_MILLIS = 200;
Svetoslavc6d1c342015-02-26 14:44:43 -08005121 private static final long MAX_WRITE_PERMISSIONS_DELAY_MILLIS = 2000;
5122
5123 private final Handler mHandler = new MyHandler();
5124
Todd Kennedy91a39d12017-09-27 12:37:04 -07005125 private final Object mPersistenceLock;
Svetoslavc6d1c342015-02-26 14:44:43 -08005126
5127 @GuardedBy("mLock")
Svet Ganovba3ba812015-06-26 10:54:06 -07005128 private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray();
Svetoslavc6d1c342015-02-26 14:44:43 -08005129
5130 @GuardedBy("mLock")
Svet Ganovba3ba812015-06-26 10:54:06 -07005131 // The mapping keys are user ids.
5132 private final SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray();
5133
5134 @GuardedBy("mLock")
5135 // The mapping keys are user ids.
5136 private final SparseArray<String> mFingerprints = new SparseArray<>();
5137
5138 @GuardedBy("mLock")
5139 // The mapping keys are user ids.
5140 private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray();
Svetoslavc6d1c342015-02-26 14:44:43 -08005141
Todd Kennedy91a39d12017-09-27 12:37:04 -07005142 public RuntimePermissionPersistence(Object persistenceLock) {
5143 mPersistenceLock = persistenceLock;
Svetoslavc6d1c342015-02-26 14:44:43 -08005144 }
5145
Svet Ganovba3ba812015-06-26 10:54:06 -07005146 public boolean areDefaultRuntimPermissionsGrantedLPr(int userId) {
5147 return mDefaultPermissionsGranted.get(userId);
5148 }
5149
5150 public void onDefaultRuntimePermissionsGrantedLPr(int userId) {
5151 mFingerprints.put(userId, Build.FINGERPRINT);
5152 writePermissionsForUserAsyncLPr(userId);
5153 }
5154
Svetoslavc6d1c342015-02-26 14:44:43 -08005155 public void writePermissionsForUserSyncLPr(int userId) {
5156 mHandler.removeMessages(userId);
5157 writePermissionsSync(userId);
5158 }
5159
5160 public void writePermissionsForUserAsyncLPr(int userId) {
5161 final long currentTimeMillis = SystemClock.uptimeMillis();
5162
5163 if (mWriteScheduled.get(userId)) {
5164 mHandler.removeMessages(userId);
5165
5166 // If enough time passed, write without holding off anymore.
5167 final long lastNotWrittenMutationTimeMillis = mLastNotWrittenMutationTimesMillis
5168 .get(userId);
5169 final long timeSinceLastNotWrittenMutationMillis = currentTimeMillis
5170 - lastNotWrittenMutationTimeMillis;
5171 if (timeSinceLastNotWrittenMutationMillis >= MAX_WRITE_PERMISSIONS_DELAY_MILLIS) {
5172 mHandler.obtainMessage(userId).sendToTarget();
5173 return;
5174 }
5175
5176 // Hold off a bit more as settings are frequently changing.
5177 final long maxDelayMillis = Math.max(lastNotWrittenMutationTimeMillis
5178 + MAX_WRITE_PERMISSIONS_DELAY_MILLIS - currentTimeMillis, 0);
5179 final long writeDelayMillis = Math.min(WRITE_PERMISSIONS_DELAY_MILLIS,
5180 maxDelayMillis);
5181
5182 Message message = mHandler.obtainMessage(userId);
5183 mHandler.sendMessageDelayed(message, writeDelayMillis);
5184 } else {
5185 mLastNotWrittenMutationTimesMillis.put(userId, currentTimeMillis);
5186 Message message = mHandler.obtainMessage(userId);
5187 mHandler.sendMessageDelayed(message, WRITE_PERMISSIONS_DELAY_MILLIS);
5188 mWriteScheduled.put(userId, true);
5189 }
5190 }
5191
5192 private void writePermissionsSync(int userId) {
Dianne Hackborne17b4452018-01-10 13:15:40 -08005193 AtomicFile destination = new AtomicFile(getUserRuntimePermissionsFile(userId),
5194 "package-perms-" + userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005195
Svet Ganov8c7f7002015-05-07 10:48:44 -07005196 ArrayMap<String, List<PermissionState>> permissionsForPackage = new ArrayMap<>();
5197 ArrayMap<String, List<PermissionState>> permissionsForSharedUser = new ArrayMap<>();
Svetoslavc6d1c342015-02-26 14:44:43 -08005198
Todd Kennedy91a39d12017-09-27 12:37:04 -07005199 synchronized (mPersistenceLock) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005200 mWriteScheduled.delete(userId);
5201
5202 final int packageCount = mPackages.size();
5203 for (int i = 0; i < packageCount; i++) {
5204 String packageName = mPackages.keyAt(i);
5205 PackageSetting packageSetting = mPackages.valueAt(i);
5206 if (packageSetting.sharedUser == null) {
5207 PermissionsState permissionsState = packageSetting.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005208 List<PermissionState> permissionsStates = permissionsState
5209 .getRuntimePermissionStates(userId);
5210 if (!permissionsStates.isEmpty()) {
5211 permissionsForPackage.put(packageName, permissionsStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005212 }
5213 }
5214 }
5215
5216 final int sharedUserCount = mSharedUsers.size();
5217 for (int i = 0; i < sharedUserCount; i++) {
5218 String sharedUserName = mSharedUsers.keyAt(i);
5219 SharedUserSetting sharedUser = mSharedUsers.valueAt(i);
5220 PermissionsState permissionsState = sharedUser.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005221 List<PermissionState> permissionsStates = permissionsState
5222 .getRuntimePermissionStates(userId);
5223 if (!permissionsStates.isEmpty()) {
5224 permissionsForSharedUser.put(sharedUserName, permissionsStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005225 }
5226 }
5227 }
5228
5229 FileOutputStream out = null;
5230 try {
5231 out = destination.startWrite();
5232
5233 XmlSerializer serializer = Xml.newSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01005234 serializer.setOutput(out, StandardCharsets.UTF_8.name());
Svetoslavc6d1c342015-02-26 14:44:43 -08005235 serializer.setFeature(
5236 "http://xmlpull.org/v1/doc/features.html#indent-output", true);
5237 serializer.startDocument(null, true);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005238
Svetoslavc6d1c342015-02-26 14:44:43 -08005239 serializer.startTag(null, TAG_RUNTIME_PERMISSIONS);
5240
Svet Ganovba3ba812015-06-26 10:54:06 -07005241 String fingerprint = mFingerprints.get(userId);
Svetoslavcdfd2302015-06-25 19:07:31 -07005242 if (fingerprint != null) {
5243 serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);
5244 }
Svet Ganovba3ba812015-06-26 10:54:06 -07005245
Svetoslavc6d1c342015-02-26 14:44:43 -08005246 final int packageCount = permissionsForPackage.size();
5247 for (int i = 0; i < packageCount; i++) {
5248 String packageName = permissionsForPackage.keyAt(i);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005249 List<PermissionState> permissionStates = permissionsForPackage.valueAt(i);
Svetoslavc6d1c342015-02-26 14:44:43 -08005250 serializer.startTag(null, TAG_PACKAGE);
5251 serializer.attribute(null, ATTR_NAME, packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005252 writePermissions(serializer, permissionStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005253 serializer.endTag(null, TAG_PACKAGE);
5254 }
5255
5256 final int sharedUserCount = permissionsForSharedUser.size();
5257 for (int i = 0; i < sharedUserCount; i++) {
5258 String packageName = permissionsForSharedUser.keyAt(i);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005259 List<PermissionState> permissionStates = permissionsForSharedUser.valueAt(i);
Svetoslavc6d1c342015-02-26 14:44:43 -08005260 serializer.startTag(null, TAG_SHARED_USER);
5261 serializer.attribute(null, ATTR_NAME, packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005262 writePermissions(serializer, permissionStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005263 serializer.endTag(null, TAG_SHARED_USER);
5264 }
5265
5266 serializer.endTag(null, TAG_RUNTIME_PERMISSIONS);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005267
5268 // Now any restored permission grants that are waiting for the apps
5269 // in question to be installed. These are stored as per-package
5270 // TAG_RESTORED_RUNTIME_PERMISSIONS blocks, each containing some
5271 // number of individual permission grant entities.
5272 if (mRestoredUserGrants.get(userId) != null) {
5273 ArrayMap<String, ArraySet<RestoredPermissionGrant>> restoredGrants =
5274 mRestoredUserGrants.get(userId);
5275 if (restoredGrants != null) {
5276 final int pkgCount = restoredGrants.size();
5277 for (int i = 0; i < pkgCount; i++) {
5278 final ArraySet<RestoredPermissionGrant> pkgGrants =
5279 restoredGrants.valueAt(i);
5280 if (pkgGrants != null && pkgGrants.size() > 0) {
5281 final String pkgName = restoredGrants.keyAt(i);
5282 serializer.startTag(null, TAG_RESTORED_RUNTIME_PERMISSIONS);
5283 serializer.attribute(null, ATTR_PACKAGE_NAME, pkgName);
5284
5285 final int N = pkgGrants.size();
5286 for (int z = 0; z < N; z++) {
5287 RestoredPermissionGrant g = pkgGrants.valueAt(z);
5288 serializer.startTag(null, TAG_PERMISSION_ENTRY);
5289 serializer.attribute(null, ATTR_NAME, g.permissionName);
5290
5291 if (g.granted) {
5292 serializer.attribute(null, ATTR_GRANTED, "true");
5293 }
5294
5295 if ((g.grantBits&FLAG_PERMISSION_USER_SET) != 0) {
5296 serializer.attribute(null, ATTR_USER_SET, "true");
5297 }
5298 if ((g.grantBits&FLAG_PERMISSION_USER_FIXED) != 0) {
5299 serializer.attribute(null, ATTR_USER_FIXED, "true");
5300 }
5301 if ((g.grantBits&FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0) {
5302 serializer.attribute(null, ATTR_REVOKE_ON_UPGRADE, "true");
5303 }
5304 serializer.endTag(null, TAG_PERMISSION_ENTRY);
5305 }
5306 serializer.endTag(null, TAG_RESTORED_RUNTIME_PERMISSIONS);
5307 }
5308 }
5309 }
5310 }
5311
Svetoslavc6d1c342015-02-26 14:44:43 -08005312 serializer.endDocument();
5313 destination.finishWrite(out);
Svet Ganovba0821e2015-04-22 13:34:31 -07005314
Svet Ganovba3ba812015-06-26 10:54:06 -07005315 if (Build.FINGERPRINT.equals(fingerprint)) {
5316 mDefaultPermissionsGranted.put(userId, true);
5317 }
5318 // Any error while writing is fatal.
Svet Ganovba0821e2015-04-22 13:34:31 -07005319 } catch (Throwable t) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005320 Slog.wtf(PackageManagerService.TAG,
Svet Ganovba0821e2015-04-22 13:34:31 -07005321 "Failed to write settings, restoring backup", t);
Svetoslavc6d1c342015-02-26 14:44:43 -08005322 destination.failWrite(out);
5323 } finally {
5324 IoUtils.closeQuietly(out);
5325 }
5326 }
5327
Fyodor Kupolov69542592016-05-23 14:22:38 -07005328 private void onUserRemovedLPw(int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005329 // Make sure we do not
5330 mHandler.removeMessages(userId);
5331
5332 for (SettingBase sb : mPackages.values()) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005333 revokeRuntimePermissionsAndClearFlags(sb, userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005334 }
5335
5336 for (SettingBase sb : mSharedUsers.values()) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005337 revokeRuntimePermissionsAndClearFlags(sb, userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005338 }
Fyodor Kupolov69542592016-05-23 14:22:38 -07005339
5340 mDefaultPermissionsGranted.delete(userId);
5341 mFingerprints.remove(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005342 }
5343
Svet Ganov8c7f7002015-05-07 10:48:44 -07005344 private void revokeRuntimePermissionsAndClearFlags(SettingBase sb, int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005345 PermissionsState permissionsState = sb.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005346 for (PermissionState permissionState
5347 : permissionsState.getRuntimePermissionStates(userId)) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07005348 BasePermission bp = mPermissions.getPermission(permissionState.getName());
Svetoslavc6d1c342015-02-26 14:44:43 -08005349 if (bp != null) {
5350 permissionsState.revokeRuntimePermission(bp, userId);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005351 permissionsState.updatePermissionFlags(bp, userId,
5352 PackageManager.MASK_PERMISSION_FLAGS, 0);
Svetoslavc6d1c342015-02-26 14:44:43 -08005353 }
5354 }
5355 }
5356
Svet Ganovadc1cf42015-06-15 16:36:24 -07005357 public void deleteUserRuntimePermissionsFile(int userId) {
5358 getUserRuntimePermissionsFile(userId).delete();
5359 }
5360
Svetoslavc6d1c342015-02-26 14:44:43 -08005361 public void readStateForUserSyncLPr(int userId) {
5362 File permissionsFile = getUserRuntimePermissionsFile(userId);
5363 if (!permissionsFile.exists()) {
5364 return;
5365 }
5366
5367 FileInputStream in;
5368 try {
Svetoslav3dcdd372015-05-29 13:00:32 -07005369 in = new AtomicFile(permissionsFile).openRead();
Svetoslavc6d1c342015-02-26 14:44:43 -08005370 } catch (FileNotFoundException fnfe) {
5371 Slog.i(PackageManagerService.TAG, "No permissions state");
5372 return;
5373 }
5374
5375 try {
5376 XmlPullParser parser = Xml.newPullParser();
5377 parser.setInput(in, null);
5378 parseRuntimePermissionsLPr(parser, userId);
Svet Ganovba0821e2015-04-22 13:34:31 -07005379
Svet Ganove723e542015-04-23 11:58:26 -07005380 } catch (XmlPullParserException | IOException e) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005381 throw new IllegalStateException("Failed parsing permissions file: "
Svet Ganove723e542015-04-23 11:58:26 -07005382 + permissionsFile , e);
Svetoslavc6d1c342015-02-26 14:44:43 -08005383 } finally {
5384 IoUtils.closeQuietly(in);
5385 }
5386 }
5387
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005388 // Backup/restore support
5389
5390 public void rememberRestoredUserGrantLPr(String pkgName, String permission,
5391 boolean isGranted, int restoredFlagSet, int userId) {
5392 // This change will be remembered at write-settings time
5393 ArrayMap<String, ArraySet<RestoredPermissionGrant>> grantsByPackage =
5394 mRestoredUserGrants.get(userId);
5395 if (grantsByPackage == null) {
5396 grantsByPackage = new ArrayMap<String, ArraySet<RestoredPermissionGrant>>();
5397 mRestoredUserGrants.put(userId, grantsByPackage);
5398 }
5399
5400 ArraySet<RestoredPermissionGrant> grants = grantsByPackage.get(pkgName);
5401 if (grants == null) {
5402 grants = new ArraySet<RestoredPermissionGrant>();
5403 grantsByPackage.put(pkgName, grants);
5404 }
5405
5406 RestoredPermissionGrant grant = new RestoredPermissionGrant(permission,
5407 isGranted, restoredFlagSet);
5408 grants.add(grant);
5409 }
5410
5411 // Private internals
5412
Svetoslavc6d1c342015-02-26 14:44:43 -08005413 private void parseRuntimePermissionsLPr(XmlPullParser parser, int userId)
5414 throws IOException, XmlPullParserException {
Svet Ganov12a692a2015-03-28 19:34:15 -07005415 final int outerDepth = parser.getDepth();
5416 int type;
5417 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5418 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5419 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5420 continue;
5421 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005422
Svet Ganov12a692a2015-03-28 19:34:15 -07005423 switch (parser.getName()) {
Svet Ganovba3ba812015-06-26 10:54:06 -07005424 case TAG_RUNTIME_PERMISSIONS: {
5425 String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT);
5426 mFingerprints.put(userId, fingerprint);
5427 final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint);
5428 mDefaultPermissionsGranted.put(userId, defaultsGranted);
5429 } break;
5430
Svet Ganov12a692a2015-03-28 19:34:15 -07005431 case TAG_PACKAGE: {
5432 String name = parser.getAttributeValue(null, ATTR_NAME);
5433 PackageSetting ps = mPackages.get(name);
5434 if (ps == null) {
5435 Slog.w(PackageManagerService.TAG, "Unknown package:" + name);
5436 XmlUtils.skipCurrentTag(parser);
5437 continue;
5438 }
5439 parsePermissionsLPr(parser, ps.getPermissionsState(), userId);
5440 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005441
Svet Ganov12a692a2015-03-28 19:34:15 -07005442 case TAG_SHARED_USER: {
5443 String name = parser.getAttributeValue(null, ATTR_NAME);
5444 SharedUserSetting sus = mSharedUsers.get(name);
5445 if (sus == null) {
5446 Slog.w(PackageManagerService.TAG, "Unknown shared user:" + name);
5447 XmlUtils.skipCurrentTag(parser);
5448 continue;
5449 }
5450 parsePermissionsLPr(parser, sus.getPermissionsState(), userId);
5451 } break;
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005452
5453 case TAG_RESTORED_RUNTIME_PERMISSIONS: {
5454 final String pkgName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
5455 parseRestoredRuntimePermissionsLPr(parser, pkgName, userId);
5456 } break;
5457 }
5458 }
5459 }
5460
5461 private void parseRestoredRuntimePermissionsLPr(XmlPullParser parser,
5462 final String pkgName, final int userId) throws IOException, XmlPullParserException {
5463 final int outerDepth = parser.getDepth();
5464 int type;
5465 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5466 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5467 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5468 continue;
5469 }
5470
5471 switch (parser.getName()) {
5472 case TAG_PERMISSION_ENTRY: {
5473 final String permName = parser.getAttributeValue(null, ATTR_NAME);
5474 final boolean isGranted = "true".equals(
5475 parser.getAttributeValue(null, ATTR_GRANTED));
5476
5477 int permBits = 0;
5478 if ("true".equals(parser.getAttributeValue(null, ATTR_USER_SET))) {
5479 permBits |= FLAG_PERMISSION_USER_SET;
5480 }
5481 if ("true".equals(parser.getAttributeValue(null, ATTR_USER_FIXED))) {
5482 permBits |= FLAG_PERMISSION_USER_FIXED;
5483 }
5484 if ("true".equals(parser.getAttributeValue(null, ATTR_REVOKE_ON_UPGRADE))) {
5485 permBits |= FLAG_PERMISSION_REVOKE_ON_UPGRADE;
5486 }
5487
5488 if (isGranted || permBits != 0) {
5489 rememberRestoredUserGrantLPr(pkgName, permName, isGranted, permBits, userId);
5490 }
5491 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005492 }
5493 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005494 }
5495
Svet Ganov12a692a2015-03-28 19:34:15 -07005496 private void parsePermissionsLPr(XmlPullParser parser, PermissionsState permissionsState,
Svetoslavc6d1c342015-02-26 14:44:43 -08005497 int userId) throws IOException, XmlPullParserException {
Svet Ganov12a692a2015-03-28 19:34:15 -07005498 final int outerDepth = parser.getDepth();
5499 int type;
5500 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5501 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5502 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5503 continue;
Svetoslavc6d1c342015-02-26 14:44:43 -08005504 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005505
Svet Ganov12a692a2015-03-28 19:34:15 -07005506 switch (parser.getName()) {
5507 case TAG_ITEM: {
5508 String name = parser.getAttributeValue(null, ATTR_NAME);
Todd Kennedy0eb97382017-10-03 16:57:22 -07005509 BasePermission bp = mPermissions.getPermission(name);
Svet Ganov12a692a2015-03-28 19:34:15 -07005510 if (bp == null) {
5511 Slog.w(PackageManagerService.TAG, "Unknown permission:" + name);
5512 XmlUtils.skipCurrentTag(parser);
5513 continue;
5514 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005515
Svet Ganov8c7f7002015-05-07 10:48:44 -07005516 String grantedStr = parser.getAttributeValue(null, ATTR_GRANTED);
5517 final boolean granted = grantedStr == null
5518 || Boolean.parseBoolean(grantedStr);
5519
5520 String flagsStr = parser.getAttributeValue(null, ATTR_FLAGS);
5521 final int flags = (flagsStr != null)
5522 ? Integer.parseInt(flagsStr, 16) : 0;
5523
5524 if (granted) {
Svet Ganovadc1cf42015-06-15 16:36:24 -07005525 permissionsState.grantRuntimePermission(bp, userId);
5526 permissionsState.updatePermissionFlags(bp, userId,
Svet Ganov8c7f7002015-05-07 10:48:44 -07005527 PackageManager.MASK_PERMISSION_FLAGS, flags);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005528 } else {
Svet Ganovadc1cf42015-06-15 16:36:24 -07005529 permissionsState.updatePermissionFlags(bp, userId,
5530 PackageManager.MASK_PERMISSION_FLAGS, flags);
Svet Ganov12a692a2015-03-28 19:34:15 -07005531 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005532
Svet Ganov12a692a2015-03-28 19:34:15 -07005533 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005534 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005535 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005536 }
5537
Svet Ganov8c7f7002015-05-07 10:48:44 -07005538 private void writePermissions(XmlSerializer serializer,
5539 List<PermissionState> permissionStates) throws IOException {
5540 for (PermissionState permissionState : permissionStates) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005541 serializer.startTag(null, TAG_ITEM);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005542 serializer.attribute(null, ATTR_NAME,permissionState.getName());
5543 serializer.attribute(null, ATTR_GRANTED,
5544 String.valueOf(permissionState.isGranted()));
5545 serializer.attribute(null, ATTR_FLAGS,
5546 Integer.toHexString(permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005547 serializer.endTag(null, TAG_ITEM);
5548 }
5549 }
5550
5551 private final class MyHandler extends Handler {
5552 public MyHandler() {
5553 super(BackgroundThread.getHandler().getLooper());
5554 }
5555
5556 @Override
5557 public void handleMessage(Message message) {
5558 final int userId = message.what;
5559 Runnable callback = (Runnable) message.obj;
5560 writePermissionsSync(userId);
5561 if (callback != null) {
5562 callback.run();
5563 }
5564 }
5565 }
5566 }
Andy McFadden2f362292012-01-20 14:43:38 -08005567}