blob: 5177995a8353c96495f1e0b5557ecb541cd8b648 [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() &&
4123 !ArrayUtils.contains(disallowedPackages, ps.name);
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004124 // Only system apps are initially installed.
Sudheer Shanka7cb54a32016-09-16 12:59:05 -07004125 ps.setInstalled(shouldInstall, userHandle);
Amith Yamasani23ab7f52017-01-22 17:43:24 -08004126 if (!shouldInstall) {
4127 writeKernelMappingLPr(ps);
4128 }
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004129 // Need to create a data directory for all apps under this user. Accumulate all
4130 // required args and call the installer after mPackages lock has been released
4131 volumeUuids[i] = ps.volumeUuid;
4132 names[i] = ps.name;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004133 appIds[i] = ps.appId;
Todd Kennedybe0b8892017-02-15 14:13:52 -08004134 seinfos[i] = ps.pkg.applicationInfo.seInfo;
Janis Danisevskisf3409742016-01-12 14:46:33 +00004135 targetSdkVersions[i] = ps.pkg.applicationInfo.targetSdkVersion;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004136 }
4137 }
4138 for (int i = 0; i < packagesCount; i++) {
4139 if (names[i] == null) {
Amith Yamasani41cd5772014-07-10 15:26:00 -07004140 continue;
4141 }
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004142 // TODO: triage flags!
Jeff Sharkey47f71082016-02-01 17:03:54 -07004143 final int flags = StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004144 try {
4145 installer.createAppData(volumeUuids[i], names[i], userHandle, flags, appIds[i],
Janis Danisevskisf3409742016-01-12 14:46:33 +00004146 seinfos[i], targetSdkVersions[i]);
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07004147 } catch (InstallerException e) {
4148 Slog.w(TAG, "Failed to prepare app data", e);
4149 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004150 }
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004151 synchronized (mPackages) {
4152 applyDefaultPreferredAppsLPw(service, userHandle);
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08004153 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004154 }
4155
Alexandra Gherghina539a7ef2014-07-07 12:27:54 +01004156 void removeUserLPw(int userId) {
Dianne Hackborn63092712012-10-07 14:45:35 -07004157 Set<Entry<String, PackageSetting>> entries = mPackages.entrySet();
4158 for (Entry<String, PackageSetting> entry : entries) {
4159 entry.getValue().removeUser(userId);
4160 }
4161 mPreferredActivities.remove(userId);
Amith Yamasani13593602012-03-22 16:16:17 -07004162 File file = getUserPackagesStateFile(userId);
4163 file.delete();
4164 file = getUserPackagesStateBackupFile(userId);
4165 file.delete();
Nicolas Prevote7024042014-07-08 15:47:17 +01004166 removeCrossProfileIntentFiltersLPw(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08004167
Fyodor Kupolov69542592016-05-23 14:22:38 -07004168 mRuntimePermissionsPersistence.onUserRemovedLPw(userId);
Jeff Sharkey91edde22015-05-20 12:04:42 -07004169
4170 writePackageListLPr();
Amith Yamasani23ab7f52017-01-22 17:43:24 -08004171
4172 // Inform kernel that the user was removed, so that packages are marked uninstalled
4173 // for sdcardfs
4174 writeKernelRemoveUserLPr(userId);
Nicolas Prevota0f48852014-05-27 11:21:11 +01004175 }
4176
Nicolas Prevote7024042014-07-08 15:47:17 +01004177 void removeCrossProfileIntentFiltersLPw(int userId) {
4178 synchronized (mCrossProfileIntentResolvers) {
4179 // userId is the source user
4180 if (mCrossProfileIntentResolvers.get(userId) != null) {
4181 mCrossProfileIntentResolvers.remove(userId);
4182 writePackageRestrictionsLPr(userId);
Nicolas Prevota0f48852014-05-27 11:21:11 +01004183 }
Nicolas Prevote7024042014-07-08 15:47:17 +01004184 // userId is the target user
4185 int count = mCrossProfileIntentResolvers.size();
4186 for (int i = 0; i < count; i++) {
4187 int sourceUserId = mCrossProfileIntentResolvers.keyAt(i);
4188 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId);
4189 boolean needsWriting = false;
Jeff Sharkey9f837a92014-10-24 12:07:24 -07004190 ArraySet<CrossProfileIntentFilter> cpifs =
4191 new ArraySet<CrossProfileIntentFilter>(cpir.filterSet());
Nicolas Prevote7024042014-07-08 15:47:17 +01004192 for (CrossProfileIntentFilter cpif : cpifs) {
4193 if (cpif.getTargetUserId() == userId) {
4194 needsWriting = true;
4195 cpir.removeFilter(cpif);
4196 }
4197 }
4198 if (needsWriting) {
4199 writePackageRestrictionsLPr(sourceUserId);
4200 }
Nicolas Prevota0f48852014-05-27 11:21:11 +01004201 }
4202 }
Amith Yamasani13593602012-03-22 16:16:17 -07004203 }
4204
Geremy Condra12c18382013-03-06 16:49:06 -08004205 // This should be called (at least) whenever an application is removed
4206 private void setFirstAvailableUid(int uid) {
4207 if (uid > mFirstAvailableUid) {
4208 mFirstAvailableUid = uid;
4209 }
4210 }
4211
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004212 // Returns -1 if we could not find an available UserId to assign
Kenny Root447106f2011-03-23 11:00:15 -07004213 private int newUserIdLPw(Object obj) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004214 // Let's be stupidly inefficient for now...
4215 final int N = mUserIds.size();
Geremy Condra12c18382013-03-06 16:49:06 -08004216 for (int i = mFirstAvailableUid; i < N; i++) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004217 if (mUserIds.get(i) == null) {
4218 mUserIds.set(i, obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08004219 return Process.FIRST_APPLICATION_UID + i;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004220 }
4221 }
4222
4223 // None left?
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08004224 if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004225 return -1;
4226 }
4227
4228 mUserIds.add(obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08004229 return Process.FIRST_APPLICATION_UID + N;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004230 }
4231
Kenny Root0aaa0d92011-09-12 16:42:55 -07004232 public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
4233 if (mVerifierDeviceIdentity == null) {
4234 mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
4235
4236 writeLPr();
4237 }
4238
4239 return mVerifierDeviceIdentity;
4240 }
4241
Todd Kennedyff35e662016-09-20 12:53:52 -07004242 boolean hasOtherDisabledSystemPkgWithChildLPr(String parentPackageName,
Svet Ganov354cd3c2015-12-17 11:35:04 -08004243 String childPackageName) {
4244 final int packageCount = mDisabledSysPackages.size();
4245 for (int i = 0; i < packageCount; i++) {
4246 PackageSetting disabledPs = mDisabledSysPackages.valueAt(i);
4247 if (disabledPs.childPackageNames == null || disabledPs.childPackageNames.isEmpty()) {
4248 continue;
4249 }
4250 if (disabledPs.name.equals(parentPackageName)) {
4251 continue;
4252 }
4253 final int childCount = disabledPs.childPackageNames.size();
4254 for (int j = 0; j < childCount; j++) {
4255 String currChildPackageName = disabledPs.childPackageNames.get(j);
4256 if (currChildPackageName.equals(childPackageName)) {
4257 return true;
4258 }
4259 }
4260 }
4261 return false;
4262 }
4263
Kenny Root447106f2011-03-23 11:00:15 -07004264 public PackageSetting getDisabledSystemPkgLPr(String name) {
4265 PackageSetting ps = mDisabledSysPackages.get(name);
4266 return ps;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07004267 }
4268
Jeff Sharkey5217cac2015-12-20 15:34:01 -07004269 boolean isEnabledAndMatchLPr(ComponentInfo componentInfo, int flags, int userId) {
Jeff Sharkey2bd31db2016-01-09 16:58:14 -07004270 final PackageSetting ps = mPackages.get(componentInfo.packageName);
4271 if (ps == null) return false;
Jeff Sharkeye17ac152015-11-06 22:40:29 -08004272
Jeff Sharkey2bd31db2016-01-09 16:58:14 -07004273 final PackageUserState userState = ps.readUserState(userId);
4274 return userState.isMatch(componentInfo, flags);
Jeff Sharkeye17ac152015-11-06 22:40:29 -08004275 }
4276
Kenny Root447106f2011-03-23 11:00:15 -07004277 String getInstallerPackageNameLPr(String packageName) {
4278 final PackageSetting pkg = mPackages.get(packageName);
4279 if (pkg == null) {
4280 throw new IllegalArgumentException("Unknown package: " + packageName);
4281 }
4282 return pkg.installerPackageName;
4283 }
4284
Sudheer Shanka8c57aea2016-04-20 16:47:50 -07004285 boolean isOrphaned(String packageName) {
4286 final PackageSetting pkg = mPackages.get(packageName);
4287 if (pkg == null) {
4288 throw new IllegalArgumentException("Unknown package: " + packageName);
4289 }
4290 return pkg.isOrphaned;
4291 }
4292
Amith Yamasani483f3b02012-03-13 16:08:00 -07004293 int getApplicationEnabledSettingLPr(String packageName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07004294 final PackageSetting pkg = mPackages.get(packageName);
4295 if (pkg == null) {
4296 throw new IllegalArgumentException("Unknown package: " + packageName);
4297 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004298 return pkg.getEnabled(userId);
Kenny Root447106f2011-03-23 11:00:15 -07004299 }
4300
Amith Yamasani483f3b02012-03-13 16:08:00 -07004301 int getComponentEnabledSettingLPr(ComponentName componentName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07004302 final String packageName = componentName.getPackageName();
4303 final PackageSetting pkg = mPackages.get(packageName);
4304 if (pkg == null) {
4305 throw new IllegalArgumentException("Unknown component: " + componentName);
4306 }
4307 final String classNameStr = componentName.getClassName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07004308 return pkg.getCurrentEnabledStateLPr(classNameStr, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004309 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004310
Svet Ganov973edd192016-09-08 20:15:55 -07004311 boolean wasPackageEverLaunchedLPr(String packageName, int userId) {
4312 final PackageSetting pkgSetting = mPackages.get(packageName);
4313 if (pkgSetting == null) {
4314 throw new IllegalArgumentException("Unknown package: " + packageName);
4315 }
4316 return !pkgSetting.getNotLaunched(userId);
4317 }
4318
Christopher Tate5cf55782016-04-25 17:08:56 -07004319 boolean setPackageStoppedStateLPw(PackageManagerService pm, String packageName,
Jeff Sharkeybd0e9e42015-04-30 16:04:50 -07004320 boolean stopped, boolean allowedByPermission, int uid, int userId) {
Dianne Hackbornf02b60a2012-08-16 10:48:27 -07004321 int appId = UserHandle.getAppId(uid);
Kenny Root447106f2011-03-23 11:00:15 -07004322 final PackageSetting pkgSetting = mPackages.get(packageName);
4323 if (pkgSetting == null) {
4324 throw new IllegalArgumentException("Unknown package: " + packageName);
4325 }
Amith Yamasani13593602012-03-22 16:16:17 -07004326 if (!allowedByPermission && (appId != pkgSetting.appId)) {
Kenny Root447106f2011-03-23 11:00:15 -07004327 throw new SecurityException(
4328 "Permission Denial: attempt to change stopped state from pid="
4329 + Binder.getCallingPid()
Amith Yamasani13593602012-03-22 16:16:17 -07004330 + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
Kenny Root447106f2011-03-23 11:00:15 -07004331 }
4332 if (DEBUG_STOPPED) {
4333 if (stopped) {
4334 RuntimeException e = new RuntimeException("here");
4335 e.fillInStackTrace();
4336 Slog.i(TAG, "Stopping package " + packageName, e);
4337 }
4338 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004339 if (pkgSetting.getStopped(userId) != stopped) {
4340 pkgSetting.setStopped(stopped, userId);
4341 // pkgSetting.pkg.mSetStopped = stopped;
4342 if (pkgSetting.getNotLaunched(userId)) {
Kenny Root447106f2011-03-23 11:00:15 -07004343 if (pkgSetting.installerPackageName != null) {
Christopher Tate5cf55782016-04-25 17:08:56 -07004344 pm.notifyFirstLaunch(pkgSetting.name, pkgSetting.installerPackageName, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004345 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004346 pkgSetting.setNotLaunched(false, userId);
Kenny Root447106f2011-03-23 11:00:15 -07004347 }
4348 return true;
4349 }
4350 return false;
4351 }
4352
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004353 void setHarmfulAppWarningLPw(String packageName, CharSequence warning, int userId) {
4354 final PackageSetting pkgSetting = mPackages.get(packageName);
4355 if (pkgSetting == null) {
4356 throw new IllegalArgumentException("Unknown package: " + packageName);
4357 }
4358 pkgSetting.setHarmfulAppWarning(userId, warning == null ? null : warning.toString());
4359 }
4360
4361 String getHarmfulAppWarningLPr(String packageName, int userId) {
4362 final PackageSetting pkgSetting = mPackages.get(packageName);
4363 if (pkgSetting == null) {
4364 throw new IllegalArgumentException("Unknown package: " + packageName);
4365 }
4366 return pkgSetting.getHarmfulAppWarning(userId);
4367 }
4368
Todd Kennedy13715d52016-08-01 13:38:57 -07004369 private static List<UserInfo> getAllUsers(UserManagerService userManager) {
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07004370 long id = Binder.clearCallingIdentity();
Amith Yamasani483f3b02012-03-13 16:08:00 -07004371 try {
Todd Kennedy13715d52016-08-01 13:38:57 -07004372 return userManager.getUsers(false);
Amith Yamasani483f3b02012-03-13 16:08:00 -07004373 } catch (NullPointerException npe) {
4374 // packagemanager not yet initialized
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07004375 } finally {
4376 Binder.restoreCallingIdentity(id);
Amith Yamasani483f3b02012-03-13 16:08:00 -07004377 }
4378 return null;
4379 }
4380
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004381 /**
4382 * Return all {@link PackageSetting} that are actively installed on the
4383 * given {@link VolumeInfo#fsUuid}.
4384 */
4385 List<PackageSetting> getVolumePackagesLPr(String volumeUuid) {
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004386 ArrayList<PackageSetting> res = new ArrayList<>();
4387 for (int i = 0; i < mPackages.size(); i++) {
4388 final PackageSetting setting = mPackages.valueAt(i);
4389 if (Objects.equals(volumeUuid, setting.volumeUuid)) {
4390 res.add(setting);
4391 }
4392 }
4393 return res;
4394 }
4395
Svetoslavc6d1c342015-02-26 14:44:43 -08004396 static void printFlags(PrintWriter pw, int val, Object[] spec) {
Joe Onorato20963df2012-01-04 18:13:24 -08004397 pw.print("[ ");
4398 for (int i=0; i<spec.length; i+=2) {
4399 int mask = (Integer)spec[i];
4400 if ((val & mask) != 0) {
4401 pw.print(spec[i+1]);
4402 pw.print(" ");
4403 }
4404 }
4405 pw.print("]");
4406 }
4407
4408 static final Object[] FLAG_DUMP_SPEC = new Object[] {
4409 ApplicationInfo.FLAG_SYSTEM, "SYSTEM",
4410 ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE",
4411 ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE",
4412 ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT",
4413 ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST",
4414 ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING",
4415 ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA",
4416 ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP",
4417 ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY",
4418 ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE",
4419 ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP",
4420 ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE",
4421 ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION",
4422 ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE",
4423 ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP",
Alex Klyubinb9f8a522015-02-03 11:12:59 -08004424 };
4425
Wale Ogunwale72a73e32016-10-13 12:16:39 -07004426 private static final Object[] PRIVATE_FLAG_DUMP_SPEC = new Object[] {
Svet Ganov087dce22017-09-07 15:42:16 -07004427 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE",
4428 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION",
4429 ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE, "PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE",
4430 ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND, "BACKUP_IN_FOREGROUND",
4431 ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
4432 ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE, "DEFAULT_TO_DEVICE_PROTECTED_STORAGE",
4433 ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE, "DIRECT_BOOT_AWARE",
4434 ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK, "FORWARD_LOCK",
4435 ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS, "HAS_DOMAIN_URLS",
4436 ApplicationInfo.PRIVATE_FLAG_HIDDEN, "HIDDEN",
4437 ApplicationInfo.PRIVATE_FLAG_INSTANT, "EPHEMERAL",
4438 ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING, "ISOLATED_SPLIT_LOADING",
4439 ApplicationInfo.PRIVATE_FLAG_OEM, "OEM",
4440 ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE, "PARTIALLY_DIRECT_BOOT_AWARE",
4441 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED, "PRIVILEGED",
4442 ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER, "REQUIRED_FOR_SYSTEM_USER",
4443 ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY, "STATIC_SHARED_LIBRARY",
Jiyong Park002fdbd2017-02-13 20:50:31 +09004444 ApplicationInfo.PRIVATE_FLAG_VENDOR, "VENDOR",
Jaekyun Seok1713d9e2018-01-12 21:47:26 +09004445 ApplicationInfo.PRIVATE_FLAG_PRODUCT, "PRODUCT",
Svet Ganov087dce22017-09-07 15:42:16 -07004446 ApplicationInfo.PRIVATE_FLAG_VIRTUAL_PRELOAD, "VIRTUAL_PRELOAD",
Joe Onorato20963df2012-01-04 18:13:24 -08004447 };
4448
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07004449 void dumpVersionLPr(IndentingPrintWriter pw) {
4450 pw.increaseIndent();
4451 for (int i= 0; i < mVersion.size(); i++) {
4452 final String volumeUuid = mVersion.keyAt(i);
4453 final VersionInfo ver = mVersion.valueAt(i);
4454 if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, volumeUuid)) {
4455 pw.println("Internal:");
4456 } else if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, volumeUuid)) {
4457 pw.println("External:");
4458 } else {
4459 pw.println("UUID " + volumeUuid + ":");
4460 }
4461 pw.increaseIndent();
4462 pw.printPair("sdkVersion", ver.sdkVersion);
4463 pw.printPair("databaseVersion", ver.databaseVersion);
4464 pw.println();
4465 pw.printPair("fingerprint", ver.fingerprint);
4466 pw.println();
4467 pw.decreaseIndent();
4468 }
4469 pw.decreaseIndent();
4470 }
4471
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004472 void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
4473 ArraySet<String> permissionNames, PackageSetting ps, SimpleDateFormat sdf,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004474 Date date, List<UserInfo> users, boolean dumpAll) {
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004475 if (checkinTag != null) {
4476 pw.print(checkinTag);
4477 pw.print(",");
4478 pw.print(ps.realName != null ? ps.realName : ps.name);
4479 pw.print(",");
4480 pw.print(ps.appId);
4481 pw.print(",");
4482 pw.print(ps.versionCode);
4483 pw.print(",");
4484 pw.print(ps.firstInstallTime);
4485 pw.print(",");
4486 pw.print(ps.lastUpdateTime);
4487 pw.print(",");
4488 pw.print(ps.installerPackageName != null ? ps.installerPackageName : "?");
4489 pw.println();
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004490 if (ps.pkg != null) {
4491 pw.print(checkinTag); pw.print("-"); pw.print("splt,");
4492 pw.print("base,");
4493 pw.println(ps.pkg.baseRevisionCode);
4494 if (ps.pkg.splitNames != null) {
4495 for (int i = 0; i < ps.pkg.splitNames.length; i++) {
4496 pw.print(checkinTag); pw.print("-"); pw.print("splt,");
4497 pw.print(ps.pkg.splitNames[i]); pw.print(",");
4498 pw.println(ps.pkg.splitRevisionCodes[i]);
4499 }
4500 }
4501 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004502 for (UserInfo user : users) {
4503 pw.print(checkinTag);
4504 pw.print("-");
4505 pw.print("usr");
4506 pw.print(",");
4507 pw.print(user.id);
4508 pw.print(",");
4509 pw.print(ps.getInstalled(user.id) ? "I" : "i");
Amith Yamasanie5bcff62014-07-19 15:44:09 -07004510 pw.print(ps.getHidden(user.id) ? "B" : "b");
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00004511 pw.print(ps.getSuspended(user.id) ? "SU" : "su");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004512 pw.print(ps.getStopped(user.id) ? "S" : "s");
4513 pw.print(ps.getNotLaunched(user.id) ? "l" : "L");
Todd Kennedybe0b8892017-02-15 14:13:52 -08004514 pw.print(ps.getInstantApp(user.id) ? "IA" : "ia");
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07004515 pw.print(ps.getVirtulalPreload(user.id) ? "VPI" : "vpi");
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004516 String harmfulAppWarning = ps.getHarmfulAppWarning(user.id);
4517 pw.print(harmfulAppWarning != null ? "HA" : "ha");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004518 pw.print(",");
4519 pw.print(ps.getEnabled(user.id));
4520 String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
4521 pw.print(",");
4522 pw.print(lastDisabledAppCaller != null ? lastDisabledAppCaller : "?");
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004523 pw.print(",");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004524 pw.println();
4525 }
4526 return;
4527 }
4528
Dianne Hackbornc895be72013-03-11 17:48:43 -07004529 pw.print(prefix); pw.print("Package [");
4530 pw.print(ps.realName != null ? ps.realName : ps.name);
4531 pw.print("] (");
4532 pw.print(Integer.toHexString(System.identityHashCode(ps)));
4533 pw.println("):");
4534
4535 if (ps.realName != null) {
4536 pw.print(prefix); pw.print(" compat name=");
4537 pw.println(ps.name);
4538 }
4539
Svetoslavc6d1c342015-02-26 14:44:43 -08004540 pw.print(prefix); pw.print(" userId="); pw.println(ps.appId);
4541
Dianne Hackbornc895be72013-03-11 17:48:43 -07004542 if (ps.sharedUser != null) {
4543 pw.print(prefix); pw.print(" sharedUser="); pw.println(ps.sharedUser);
4544 }
4545 pw.print(prefix); pw.print(" pkg="); pw.println(ps.pkg);
4546 pw.print(prefix); pw.print(" codePath="); pw.println(ps.codePathString);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004547 if (permissionNames == null) {
4548 pw.print(prefix); pw.print(" resourcePath="); pw.println(ps.resourcePathString);
4549 pw.print(prefix); pw.print(" legacyNativeLibraryDir=");
4550 pw.println(ps.legacyNativeLibraryPathString);
4551 pw.print(prefix); pw.print(" primaryCpuAbi="); pw.println(ps.primaryCpuAbiString);
4552 pw.print(prefix); pw.print(" secondaryCpuAbi="); pw.println(ps.secondaryCpuAbiString);
4553 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004554 pw.print(prefix); pw.print(" versionCode="); pw.print(ps.versionCode);
4555 if (ps.pkg != null) {
Todd Kennedy89d60182016-03-11 11:18:32 -08004556 pw.print(" minSdk="); pw.print(ps.pkg.applicationInfo.minSdkVersion);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004557 pw.print(" targetSdk="); pw.print(ps.pkg.applicationInfo.targetSdkVersion);
4558 }
4559 pw.println();
4560 if (ps.pkg != null) {
Svet Ganov354cd3c2015-12-17 11:35:04 -08004561 if (ps.pkg.parentPackage != null) {
4562 PackageParser.Package parentPkg = ps.pkg.parentPackage;
4563 PackageSetting pps = mPackages.get(parentPkg.packageName);
4564 if (pps == null || !pps.codePathString.equals(parentPkg.codePath)) {
4565 pps = mDisabledSysPackages.get(parentPkg.packageName);
4566 }
4567 if (pps != null) {
4568 pw.print(prefix); pw.print(" parentPackage=");
4569 pw.println(pps.realName != null ? pps.realName : pps.name);
4570 }
4571 } else if (ps.pkg.childPackages != null) {
4572 pw.print(prefix); pw.print(" childPackages=[");
4573 final int childCount = ps.pkg.childPackages.size();
4574 for (int i = 0; i < childCount; i++) {
4575 PackageParser.Package childPkg = ps.pkg.childPackages.get(i);
4576 PackageSetting cps = mPackages.get(childPkg.packageName);
4577 if (cps == null || !cps.codePathString.equals(childPkg.codePath)) {
4578 cps = mDisabledSysPackages.get(childPkg.packageName);
4579 }
4580 if (cps != null) {
4581 if (i > 0) {
4582 pw.print(", ");
4583 }
4584 pw.print(cps.realName != null ? cps.realName : cps.name);
4585 }
4586 }
4587 pw.println("]");
4588 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004589 pw.print(prefix); pw.print(" versionName="); pw.println(ps.pkg.mVersionName);
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004590 pw.print(prefix); pw.print(" splits="); dumpSplitNames(pw, ps.pkg); pw.println();
Patrick Baumann420d58a2017-12-19 10:17:21 -08004591 final int apkSigningVersion = ps.pkg.mSigningDetails.signatureSchemeVersion;
4592 pw.print(prefix); pw.print(" apkSigningVersion="); pw.println(apkSigningVersion);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004593 pw.print(prefix); pw.print(" applicationInfo=");
4594 pw.println(ps.pkg.applicationInfo.toString());
4595 pw.print(prefix); pw.print(" flags="); printFlags(pw, ps.pkg.applicationInfo.flags,
4596 FLAG_DUMP_SPEC); pw.println();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004597 if (ps.pkg.applicationInfo.privateFlags != 0) {
4598 pw.print(prefix); pw.print(" privateFlags="); printFlags(pw,
4599 ps.pkg.applicationInfo.privateFlags, PRIVATE_FLAG_DUMP_SPEC); pw.println();
4600 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004601 pw.print(prefix); pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004602 pw.print(prefix); pw.print(" supportsScreens=[");
4603 boolean first = true;
4604 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
4605 if (!first)
4606 pw.print(", ");
4607 first = false;
4608 pw.print("small");
4609 }
4610 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
4611 if (!first)
4612 pw.print(", ");
4613 first = false;
4614 pw.print("medium");
4615 }
4616 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
4617 if (!first)
4618 pw.print(", ");
4619 first = false;
4620 pw.print("large");
4621 }
4622 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
4623 if (!first)
4624 pw.print(", ");
4625 first = false;
4626 pw.print("xlarge");
4627 }
4628 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
4629 if (!first)
4630 pw.print(", ");
4631 first = false;
4632 pw.print("resizeable");
4633 }
4634 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
4635 if (!first)
4636 pw.print(", ");
4637 first = false;
4638 pw.print("anyDensity");
4639 }
4640 pw.println("]");
4641 if (ps.pkg.libraryNames != null && ps.pkg.libraryNames.size() > 0) {
Svet Ganov67882122016-12-11 16:36:34 -08004642 pw.print(prefix); pw.println(" dynamic libraries:");
4643 for (int i = 0; i<ps.pkg.libraryNames.size(); i++) {
4644 pw.print(prefix); pw.print(" ");
4645 pw.println(ps.pkg.libraryNames.get(i));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004646 }
4647 }
Svet Ganov67882122016-12-11 16:36:34 -08004648 if (ps.pkg.staticSharedLibName != null) {
4649 pw.print(prefix); pw.println(" static library:");
4650 pw.print(prefix); pw.print(" ");
4651 pw.print("name:"); pw.print(ps.pkg.staticSharedLibName);
4652 pw.print(" version:"); pw.println(ps.pkg.staticSharedLibVersion);
4653 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004654 if (ps.pkg.usesLibraries != null && ps.pkg.usesLibraries.size() > 0) {
4655 pw.print(prefix); pw.println(" usesLibraries:");
4656 for (int i=0; i<ps.pkg.usesLibraries.size(); i++) {
4657 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.usesLibraries.get(i));
4658 }
4659 }
Svet Ganov67882122016-12-11 16:36:34 -08004660 if (ps.pkg.usesStaticLibraries != null
4661 && ps.pkg.usesStaticLibraries.size() > 0) {
4662 pw.print(prefix); pw.println(" usesStaticLibraries:");
4663 for (int i=0; i<ps.pkg.usesStaticLibraries.size(); i++) {
4664 pw.print(prefix); pw.print(" ");
4665 pw.print(ps.pkg.usesStaticLibraries.get(i)); pw.print(" version:");
4666 pw.println(ps.pkg.usesStaticLibrariesVersions[i]);
4667 }
4668 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004669 if (ps.pkg.usesOptionalLibraries != null
4670 && ps.pkg.usesOptionalLibraries.size() > 0) {
4671 pw.print(prefix); pw.println(" usesOptionalLibraries:");
4672 for (int i=0; i<ps.pkg.usesOptionalLibraries.size(); i++) {
4673 pw.print(prefix); pw.print(" ");
Svet Ganov67882122016-12-11 16:36:34 -08004674 pw.println(ps.pkg.usesOptionalLibraries.get(i));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004675 }
4676 }
4677 if (ps.pkg.usesLibraryFiles != null
4678 && ps.pkg.usesLibraryFiles.length > 0) {
4679 pw.print(prefix); pw.println(" usesLibraryFiles:");
4680 for (int i=0; i<ps.pkg.usesLibraryFiles.length; i++) {
4681 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.usesLibraryFiles[i]);
4682 }
4683 }
4684 }
4685 pw.print(prefix); pw.print(" timeStamp=");
4686 date.setTime(ps.timeStamp);
4687 pw.println(sdf.format(date));
4688 pw.print(prefix); pw.print(" firstInstallTime=");
4689 date.setTime(ps.firstInstallTime);
4690 pw.println(sdf.format(date));
4691 pw.print(prefix); pw.print(" lastUpdateTime=");
4692 date.setTime(ps.lastUpdateTime);
4693 pw.println(sdf.format(date));
4694 if (ps.installerPackageName != null) {
4695 pw.print(prefix); pw.print(" installerPackageName=");
4696 pw.println(ps.installerPackageName);
4697 }
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004698 if (ps.volumeUuid != null) {
4699 pw.print(prefix); pw.print(" volumeUuid=");
4700 pw.println(ps.volumeUuid);
4701 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004702 pw.print(prefix); pw.print(" signatures="); pw.println(ps.signatures);
Svetoslavcf959f62015-03-26 20:53:34 -07004703 pw.print(prefix); pw.print(" installPermissionsFixed=");
4704 pw.print(ps.installPermissionsFixed);
Todd Kennedyaf6f1952018-02-13 11:09:50 -08004705 pw.println();
Dianne Hackbornc895be72013-03-11 17:48:43 -07004706 pw.print(prefix); pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
4707 pw.println();
Svetoslavc6d1c342015-02-26 14:44:43 -08004708
Patrick Baumann7438dcb2018-05-08 14:31:45 -07004709 if (ps.pkg != null && ps.pkg.mOverlayTarget != null) {
Adrian Roosc84df772018-01-19 21:20:22 +01004710 pw.print(prefix); pw.print(" overlayTarget="); pw.println(ps.pkg.mOverlayTarget);
4711 pw.print(prefix); pw.print(" overlayCategory="); pw.println(ps.pkg.mOverlayCategory);
4712 }
4713
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004714 if (ps.pkg != null && ps.pkg.permissions != null && ps.pkg.permissions.size() > 0) {
4715 final ArrayList<PackageParser.Permission> perms = ps.pkg.permissions;
4716 pw.print(prefix); pw.println(" declared permissions:");
4717 for (int i=0; i<perms.size(); i++) {
4718 PackageParser.Permission perm = perms.get(i);
4719 if (permissionNames != null
4720 && !permissionNames.contains(perm.info.name)) {
4721 continue;
4722 }
4723 pw.print(prefix); pw.print(" "); pw.print(perm.info.name);
4724 pw.print(": prot=");
4725 pw.print(PermissionInfo.protectionToString(perm.info.protectionLevel));
4726 if ((perm.info.flags&PermissionInfo.FLAG_COSTS_MONEY) != 0) {
4727 pw.print(", COSTS_MONEY");
4728 }
Svet Ganov2a1376d2016-02-22 17:20:35 -08004729 if ((perm.info.flags&PermissionInfo.FLAG_REMOVED) != 0) {
Svet Ganov52153f42015-08-11 08:59:12 -07004730 pw.print(", HIDDEN");
Svet Ganov3e0be742015-08-07 23:06:00 -07004731 }
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004732 if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
4733 pw.print(", INSTALLED");
4734 }
4735 pw.println();
4736 }
4737 }
4738
Dianne Hackborn9cfba352016-03-24 17:31:28 -07004739 if ((permissionNames != null || dumpAll) && ps.pkg != null
4740 && ps.pkg.requestedPermissions != null
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004741 && ps.pkg.requestedPermissions.size() > 0) {
4742 final ArrayList<String> perms = ps.pkg.requestedPermissions;
4743 pw.print(prefix); pw.println(" requested permissions:");
4744 for (int i=0; i<perms.size(); i++) {
4745 String perm = perms.get(i);
4746 if (permissionNames != null
4747 && !permissionNames.contains(perm)) {
4748 continue;
4749 }
4750 pw.print(prefix); pw.print(" "); pw.println(perm);
4751 }
4752 }
4753
4754 if (ps.sharedUser == null || permissionNames != null || dumpAll) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004755 PermissionsState permissionsState = ps.getPermissionsState();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004756 dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState);
Svetoslavc6d1c342015-02-26 14:44:43 -08004757 }
4758
Dianne Hackbornc895be72013-03-11 17:48:43 -07004759 for (UserInfo user : users) {
4760 pw.print(prefix); pw.print(" User "); pw.print(user.id); pw.print(": ");
Jeff Sharkey42884192016-04-09 16:12:01 -06004761 pw.print("ceDataInode=");
4762 pw.print(ps.getCeDataInode(user.id));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004763 pw.print(" installed=");
4764 pw.print(ps.getInstalled(user.id));
Amith Yamasanie5bcff62014-07-19 15:44:09 -07004765 pw.print(" hidden=");
4766 pw.print(ps.getHidden(user.id));
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00004767 pw.print(" suspended=");
4768 pw.print(ps.getSuspended(user.id));
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004769 if (ps.getSuspended(user.id)) {
Suprabh Shukla3c3af142018-03-30 00:28:37 -07004770 final PackageUserState pus = ps.readUserState(user.id);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004771 pw.print(" suspendingPackage=");
Suprabh Shukla3c3af142018-03-30 00:28:37 -07004772 pw.print(pus.suspendingPackage);
4773 pw.print(" dialogMessage=");
4774 pw.print(pus.dialogMessage);
Suprabh Shukla021b57a2018-03-08 18:21:50 -08004775 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004776 pw.print(" stopped=");
4777 pw.print(ps.getStopped(user.id));
4778 pw.print(" notLaunched=");
4779 pw.print(ps.getNotLaunched(user.id));
4780 pw.print(" enabled=");
Fyodor Kupolov09546ff2017-04-03 17:45:50 -07004781 pw.print(ps.getEnabled(user.id));
Todd Kennedybe0b8892017-02-15 14:13:52 -08004782 pw.print(" instant=");
Dianne Hackbornc50a1082017-08-15 14:10:39 -07004783 pw.print(ps.getInstantApp(user.id));
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -07004784 pw.print(" virtual=");
4785 pw.println(ps.getVirtulalPreload(user.id));
Todd Kennedyb2749472017-06-13 08:24:32 -07004786
4787 String[] overlayPaths = ps.getOverlayPaths(user.id);
4788 if (overlayPaths != null && overlayPaths.length > 0) {
Todd Kennedy560830c2017-06-16 13:55:13 -07004789 pw.print(prefix); pw.println(" overlay paths:");
Todd Kennedyb2749472017-06-13 08:24:32 -07004790 for (String path : overlayPaths) {
Todd Kennedy560830c2017-06-16 13:55:13 -07004791 pw.print(prefix); pw.print(" "); pw.println(path);
Todd Kennedyb2749472017-06-13 08:24:32 -07004792 }
4793 }
4794
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07004795 String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
4796 if (lastDisabledAppCaller != null) {
4797 pw.print(prefix); pw.print(" lastDisabledCaller: ");
4798 pw.println(lastDisabledAppCaller);
4799 }
Svetoslavc6d1c342015-02-26 14:44:43 -08004800
4801 if (ps.sharedUser == null) {
4802 PermissionsState permissionsState = ps.getPermissionsState();
4803 dumpGidsLPr(pw, prefix + " ", permissionsState.computeGids(user.id));
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004804 dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames, permissionsState
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004805 .getRuntimePermissionStates(user.id), dumpAll);
Svetoslavc6d1c342015-02-26 14:44:43 -08004806 }
4807
Ben Gruver1ab3d6e2017-12-07 13:45:08 -08004808 String harmfulAppWarning = ps.getHarmfulAppWarning(user.id);
4809 if (harmfulAppWarning != null) {
4810 pw.print(prefix); pw.print(" harmfulAppWarning: ");
4811 pw.println(harmfulAppWarning);
4812 }
4813
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004814 if (permissionNames == null) {
4815 ArraySet<String> cmp = ps.getDisabledComponents(user.id);
4816 if (cmp != null && cmp.size() > 0) {
4817 pw.print(prefix); pw.println(" disabledComponents:");
4818 for (String s : cmp) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004819 pw.print(prefix); pw.print(" "); pw.println(s);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004820 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004821 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004822 cmp = ps.getEnabledComponents(user.id);
4823 if (cmp != null && cmp.size() > 0) {
4824 pw.print(prefix); pw.println(" enabledComponents:");
4825 for (String s : cmp) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004826 pw.print(prefix); pw.print(" "); pw.println(s);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004827 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004828 }
4829 }
4830 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004831 }
4832
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004833 void dumpPackagesLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4834 DumpState dumpState, boolean checkin) {
Kenny Root447106f2011-03-23 11:00:15 -07004835 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
4836 final Date date = new Date();
4837 boolean printedSomething = false;
Todd Kennedy13715d52016-08-01 13:38:57 -07004838 List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
Kenny Root447106f2011-03-23 11:00:15 -07004839 for (final PackageSetting ps : mPackages.values()) {
4840 if (packageName != null && !packageName.equals(ps.realName)
4841 && !packageName.equals(ps.name)) {
4842 continue;
4843 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004844 if (permissionNames != null
4845 && !ps.getPermissionsState().hasRequestedPermission(permissionNames)) {
4846 continue;
4847 }
Kenny Root447106f2011-03-23 11:00:15 -07004848
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004849 if (!checkin && packageName != null) {
Kenny Root447106f2011-03-23 11:00:15 -07004850 dumpState.setSharedUser(ps.sharedUser);
4851 }
4852
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004853 if (!checkin && !printedSomething) {
Kenny Root447106f2011-03-23 11:00:15 -07004854 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004855 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004856 pw.println("Packages:");
4857 printedSomething = true;
4858 }
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004859 dumpPackageLPr(pw, " ", checkin ? "pkg" : null, permissionNames, ps, sdf, date, users,
4860 packageName != null);
Kenny Root447106f2011-03-23 11:00:15 -07004861 }
4862
4863 printedSomething = false;
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004864 if (mRenamedPackages.size() > 0 && permissionNames == null) {
Andy McFadden2f362292012-01-20 14:43:38 -08004865 for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Root447106f2011-03-23 11:00:15 -07004866 if (packageName != null && !packageName.equals(e.getKey())
4867 && !packageName.equals(e.getValue())) {
4868 continue;
4869 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004870 if (!checkin) {
4871 if (!printedSomething) {
4872 if (dumpState.onTitlePrinted())
4873 pw.println();
4874 pw.println("Renamed packages:");
4875 printedSomething = true;
4876 }
4877 pw.print(" ");
4878 } else {
4879 pw.print("ren,");
Kenny Root447106f2011-03-23 11:00:15 -07004880 }
Kenny Root447106f2011-03-23 11:00:15 -07004881 pw.print(e.getKey());
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004882 pw.print(checkin ? " -> " : ",");
Kenny Root447106f2011-03-23 11:00:15 -07004883 pw.println(e.getValue());
4884 }
4885 }
4886
4887 printedSomething = false;
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004888 if (mDisabledSysPackages.size() > 0 && permissionNames == null) {
Kenny Root447106f2011-03-23 11:00:15 -07004889 for (final PackageSetting ps : mDisabledSysPackages.values()) {
4890 if (packageName != null && !packageName.equals(ps.realName)
4891 && !packageName.equals(ps.name)) {
4892 continue;
4893 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004894 if (!checkin && !printedSomething) {
Kenny Root447106f2011-03-23 11:00:15 -07004895 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004896 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004897 pw.println("Hidden system packages:");
4898 printedSomething = true;
4899 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004900 dumpPackageLPr(pw, " ", checkin ? "dis" : null, permissionNames, ps, sdf, date,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004901 users, packageName != null);
Kenny Root447106f2011-03-23 11:00:15 -07004902 }
4903 }
4904 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004905
Netta P426cbef2017-02-10 14:38:39 -08004906 void dumpPackagesProto(ProtoOutputStream proto) {
4907 List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
4908
4909 final int count = mPackages.size();
4910 for (int i = 0; i < count; i++) {
4911 final PackageSetting ps = mPackages.valueAt(i);
4912 ps.writeToProto(proto, PackageServiceDumpProto.PACKAGES, users);
4913 }
4914 }
4915
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004916 void dumpPermissionsLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4917 DumpState dumpState) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07004918 mPermissions.dumpPermissions(pw, packageName, permissionNames,
4919 (mReadExternalStorageEnforced == Boolean.TRUE), dumpState);
Kenny Root447106f2011-03-23 11:00:15 -07004920 }
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07004921
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004922 void dumpSharedUsersLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4923 DumpState dumpState, boolean checkin) {
Kenny Root447106f2011-03-23 11:00:15 -07004924 boolean printedSomething = false;
4925 for (SharedUserSetting su : mSharedUsers.values()) {
4926 if (packageName != null && su != dumpState.getSharedUser()) {
4927 continue;
4928 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004929 if (permissionNames != null
4930 && !su.getPermissionsState().hasRequestedPermission(permissionNames)) {
4931 continue;
4932 }
Dianne Hackbornd052a942014-11-21 15:23:13 -08004933 if (!checkin) {
4934 if (!printedSomething) {
4935 if (dumpState.onTitlePrinted())
4936 pw.println();
4937 pw.println("Shared users:");
4938 printedSomething = true;
4939 }
4940 pw.print(" SharedUser [");
4941 pw.print(su.name);
4942 pw.print("] (");
4943 pw.print(Integer.toHexString(System.identityHashCode(su)));
4944 pw.println("):");
Svetoslavc6d1c342015-02-26 14:44:43 -08004945
4946 String prefix = " ";
4947 pw.print(prefix); pw.print("userId="); pw.println(su.userId);
4948
4949 PermissionsState permissionsState = su.getPermissionsState();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004950 dumpInstallPermissionsLPr(pw, prefix, permissionNames, permissionsState);
Svetoslavc6d1c342015-02-26 14:44:43 -08004951
4952 for (int userId : UserManagerService.getInstance().getUserIds()) {
4953 final int[] gids = permissionsState.computeGids(userId);
Svet Ganov8c7f7002015-05-07 10:48:44 -07004954 List<PermissionState> permissions = permissionsState
4955 .getRuntimePermissionStates(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08004956 if (!ArrayUtils.isEmpty(gids) || !permissions.isEmpty()) {
4957 pw.print(prefix); pw.print("User "); pw.print(userId); pw.println(": ");
4958 dumpGidsLPr(pw, prefix + " ", gids);
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004959 dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames, permissions,
4960 packageName != null);
Svetoslavc6d1c342015-02-26 14:44:43 -08004961 }
Dianne Hackbornd052a942014-11-21 15:23:13 -08004962 }
4963 } else {
4964 pw.print("suid,"); pw.print(su.userId); pw.print(","); pw.println(su.name);
Kenny Root447106f2011-03-23 11:00:15 -07004965 }
4966 }
4967 }
4968
Netta P426cbef2017-02-10 14:38:39 -08004969 void dumpSharedUsersProto(ProtoOutputStream proto) {
4970 final int count = mSharedUsers.size();
4971 for (int i = 0; i < count; i++) {
Yi Jind6759d42017-10-12 15:08:49 -07004972 mSharedUsers.valueAt(i).writeToProto(proto, PackageServiceDumpProto.SHARED_USERS);
Netta P426cbef2017-02-10 14:38:39 -08004973 }
4974 }
4975
Kenny Root447106f2011-03-23 11:00:15 -07004976 void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
4977 pw.println("Settings parse messages:");
4978 pw.print(mReadMessages.toString());
4979 }
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004980
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07004981 void dumpRestoredPermissionGrantsLPr(PrintWriter pw, DumpState dumpState) {
4982 if (mRestoredUserGrants.size() > 0) {
4983 pw.println();
4984 pw.println("Restored (pending) permission grants:");
4985 for (int userIndex = 0; userIndex < mRestoredUserGrants.size(); userIndex++) {
4986 ArrayMap<String, ArraySet<RestoredPermissionGrant>> grantsByPackage =
4987 mRestoredUserGrants.valueAt(userIndex);
4988 if (grantsByPackage != null && grantsByPackage.size() > 0) {
4989 final int userId = mRestoredUserGrants.keyAt(userIndex);
4990 pw.print(" User "); pw.println(userId);
4991
4992 for (int pkgIndex = 0; pkgIndex < grantsByPackage.size(); pkgIndex++) {
4993 ArraySet<RestoredPermissionGrant> grants = grantsByPackage.valueAt(pkgIndex);
4994 if (grants != null && grants.size() > 0) {
4995 final String pkgName = grantsByPackage.keyAt(pkgIndex);
4996 pw.print(" "); pw.print(pkgName); pw.println(" :");
4997
4998 for (RestoredPermissionGrant g : grants) {
4999 pw.print(" ");
5000 pw.print(g.permissionName);
5001 if (g.granted) {
5002 pw.print(" GRANTED");
5003 }
5004 if ((g.grantBits&FLAG_PERMISSION_USER_SET) != 0) {
5005 pw.print(" user_set");
5006 }
5007 if ((g.grantBits&FLAG_PERMISSION_USER_FIXED) != 0) {
5008 pw.print(" user_fixed");
5009 }
5010 if ((g.grantBits&FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0) {
5011 pw.print(" revoke_on_upgrade");
5012 }
5013 pw.println();
5014 }
5015 }
5016 }
5017 }
5018 }
5019 pw.println();
5020 }
5021 }
5022
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08005023 private static void dumpSplitNames(PrintWriter pw, PackageParser.Package pkg) {
5024 if (pkg == null) {
5025 pw.print("unknown");
5026 } else {
5027 // [base:10, config.mdpi, config.xhdpi:12]
5028 pw.print("[");
5029 pw.print("base");
5030 if (pkg.baseRevisionCode != 0) {
5031 pw.print(":"); pw.print(pkg.baseRevisionCode);
5032 }
5033 if (pkg.splitNames != null) {
5034 for (int i = 0; i < pkg.splitNames.length; i++) {
5035 pw.print(", ");
5036 pw.print(pkg.splitNames[i]);
5037 if (pkg.splitRevisionCodes[i] != 0) {
5038 pw.print(":"); pw.print(pkg.splitRevisionCodes[i]);
5039 }
5040 }
5041 }
5042 pw.print("]");
5043 }
5044 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005045
5046 void dumpGidsLPr(PrintWriter pw, String prefix, int[] gids) {
5047 if (!ArrayUtils.isEmpty(gids)) {
Fabrice Di Meglio62271722015-04-10 17:24:02 -07005048 pw.print(prefix);
5049 pw.print("gids="); pw.println(
Svetoslavc6d1c342015-02-26 14:44:43 -08005050 PackageManagerService.arrayToString(gids));
5051 }
5052 }
5053
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005054 void dumpRuntimePermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07005055 List<PermissionState> permissionStates, boolean dumpAll) {
5056 if (!permissionStates.isEmpty() || dumpAll) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005057 pw.print(prefix); pw.println("runtime permissions:");
Svet Ganov8c7f7002015-05-07 10:48:44 -07005058 for (PermissionState permissionState : permissionStates) {
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005059 if (permissionNames != null
5060 && !permissionNames.contains(permissionState.getName())) {
5061 continue;
5062 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005063 pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005064 pw.print(": granted="); pw.print(permissionState.isGranted());
5065 pw.println(permissionFlagsToString(", flags=",
5066 permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005067 }
5068 }
5069 }
5070
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005071 private static String permissionFlagsToString(String prefix, int flags) {
5072 StringBuilder flagsString = null;
Svet Ganov77ab6a82015-07-03 12:03:02 -07005073 while (flags != 0) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005074 if (flagsString == null) {
5075 flagsString = new StringBuilder();
5076 flagsString.append(prefix);
5077 flagsString.append("[ ");
5078 }
Svet Ganov77ab6a82015-07-03 12:03:02 -07005079 final int flag = 1 << Integer.numberOfTrailingZeros(flags);
5080 flags &= ~flag;
5081 flagsString.append(PackageManager.permissionFlagToString(flag));
5082 flagsString.append(' ');
5083 }
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005084 if (flagsString != null) {
5085 flagsString.append(']');
5086 return flagsString.toString();
5087 } else {
5088 return "";
5089 }
Svet Ganov77ab6a82015-07-03 12:03:02 -07005090 }
5091
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005092 void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Svetoslavc6d1c342015-02-26 14:44:43 -08005093 PermissionsState permissionsState) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005094 List<PermissionState> permissionStates = permissionsState.getInstallPermissionStates();
5095 if (!permissionStates.isEmpty()) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005096 pw.print(prefix); pw.println("install permissions:");
Svet Ganov8c7f7002015-05-07 10:48:44 -07005097 for (PermissionState permissionState : permissionStates) {
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07005098 if (permissionNames != null
5099 && !permissionNames.contains(permissionState.getName())) {
5100 continue;
5101 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005102 pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07005103 pw.print(": granted="); pw.print(permissionState.isGranted());
5104 pw.println(permissionFlagsToString(", flags=",
Svet Ganov8c7f7002015-05-07 10:48:44 -07005105 permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005106 }
5107 }
5108 }
5109
5110 public void writeRuntimePermissionsForUserLPr(int userId, boolean sync) {
5111 if (sync) {
5112 mRuntimePermissionsPersistence.writePermissionsForUserSyncLPr(userId);
5113 } else {
5114 mRuntimePermissionsPersistence.writePermissionsForUserAsyncLPr(userId);
5115 }
5116 }
5117
5118 private final class RuntimePermissionPersistence {
5119 private static final long WRITE_PERMISSIONS_DELAY_MILLIS = 200;
Svetoslavc6d1c342015-02-26 14:44:43 -08005120 private static final long MAX_WRITE_PERMISSIONS_DELAY_MILLIS = 2000;
5121
5122 private final Handler mHandler = new MyHandler();
5123
Todd Kennedy91a39d12017-09-27 12:37:04 -07005124 private final Object mPersistenceLock;
Svetoslavc6d1c342015-02-26 14:44:43 -08005125
5126 @GuardedBy("mLock")
Svet Ganovba3ba812015-06-26 10:54:06 -07005127 private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray();
Svetoslavc6d1c342015-02-26 14:44:43 -08005128
5129 @GuardedBy("mLock")
Svet Ganovba3ba812015-06-26 10:54:06 -07005130 // The mapping keys are user ids.
5131 private final SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray();
5132
5133 @GuardedBy("mLock")
5134 // The mapping keys are user ids.
5135 private final SparseArray<String> mFingerprints = new SparseArray<>();
5136
5137 @GuardedBy("mLock")
5138 // The mapping keys are user ids.
5139 private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray();
Svetoslavc6d1c342015-02-26 14:44:43 -08005140
Todd Kennedy91a39d12017-09-27 12:37:04 -07005141 public RuntimePermissionPersistence(Object persistenceLock) {
5142 mPersistenceLock = persistenceLock;
Svetoslavc6d1c342015-02-26 14:44:43 -08005143 }
5144
Svet Ganovba3ba812015-06-26 10:54:06 -07005145 public boolean areDefaultRuntimPermissionsGrantedLPr(int userId) {
5146 return mDefaultPermissionsGranted.get(userId);
5147 }
5148
5149 public void onDefaultRuntimePermissionsGrantedLPr(int userId) {
5150 mFingerprints.put(userId, Build.FINGERPRINT);
5151 writePermissionsForUserAsyncLPr(userId);
5152 }
5153
Svetoslavc6d1c342015-02-26 14:44:43 -08005154 public void writePermissionsForUserSyncLPr(int userId) {
5155 mHandler.removeMessages(userId);
5156 writePermissionsSync(userId);
5157 }
5158
5159 public void writePermissionsForUserAsyncLPr(int userId) {
5160 final long currentTimeMillis = SystemClock.uptimeMillis();
5161
5162 if (mWriteScheduled.get(userId)) {
5163 mHandler.removeMessages(userId);
5164
5165 // If enough time passed, write without holding off anymore.
5166 final long lastNotWrittenMutationTimeMillis = mLastNotWrittenMutationTimesMillis
5167 .get(userId);
5168 final long timeSinceLastNotWrittenMutationMillis = currentTimeMillis
5169 - lastNotWrittenMutationTimeMillis;
5170 if (timeSinceLastNotWrittenMutationMillis >= MAX_WRITE_PERMISSIONS_DELAY_MILLIS) {
5171 mHandler.obtainMessage(userId).sendToTarget();
5172 return;
5173 }
5174
5175 // Hold off a bit more as settings are frequently changing.
5176 final long maxDelayMillis = Math.max(lastNotWrittenMutationTimeMillis
5177 + MAX_WRITE_PERMISSIONS_DELAY_MILLIS - currentTimeMillis, 0);
5178 final long writeDelayMillis = Math.min(WRITE_PERMISSIONS_DELAY_MILLIS,
5179 maxDelayMillis);
5180
5181 Message message = mHandler.obtainMessage(userId);
5182 mHandler.sendMessageDelayed(message, writeDelayMillis);
5183 } else {
5184 mLastNotWrittenMutationTimesMillis.put(userId, currentTimeMillis);
5185 Message message = mHandler.obtainMessage(userId);
5186 mHandler.sendMessageDelayed(message, WRITE_PERMISSIONS_DELAY_MILLIS);
5187 mWriteScheduled.put(userId, true);
5188 }
5189 }
5190
5191 private void writePermissionsSync(int userId) {
Dianne Hackborne17b4452018-01-10 13:15:40 -08005192 AtomicFile destination = new AtomicFile(getUserRuntimePermissionsFile(userId),
5193 "package-perms-" + userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005194
Svet Ganov8c7f7002015-05-07 10:48:44 -07005195 ArrayMap<String, List<PermissionState>> permissionsForPackage = new ArrayMap<>();
5196 ArrayMap<String, List<PermissionState>> permissionsForSharedUser = new ArrayMap<>();
Svetoslavc6d1c342015-02-26 14:44:43 -08005197
Todd Kennedy91a39d12017-09-27 12:37:04 -07005198 synchronized (mPersistenceLock) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005199 mWriteScheduled.delete(userId);
5200
5201 final int packageCount = mPackages.size();
5202 for (int i = 0; i < packageCount; i++) {
5203 String packageName = mPackages.keyAt(i);
5204 PackageSetting packageSetting = mPackages.valueAt(i);
5205 if (packageSetting.sharedUser == null) {
5206 PermissionsState permissionsState = packageSetting.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005207 List<PermissionState> permissionsStates = permissionsState
5208 .getRuntimePermissionStates(userId);
5209 if (!permissionsStates.isEmpty()) {
5210 permissionsForPackage.put(packageName, permissionsStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005211 }
5212 }
5213 }
5214
5215 final int sharedUserCount = mSharedUsers.size();
5216 for (int i = 0; i < sharedUserCount; i++) {
5217 String sharedUserName = mSharedUsers.keyAt(i);
5218 SharedUserSetting sharedUser = mSharedUsers.valueAt(i);
5219 PermissionsState permissionsState = sharedUser.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005220 List<PermissionState> permissionsStates = permissionsState
5221 .getRuntimePermissionStates(userId);
5222 if (!permissionsStates.isEmpty()) {
5223 permissionsForSharedUser.put(sharedUserName, permissionsStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005224 }
5225 }
5226 }
5227
5228 FileOutputStream out = null;
5229 try {
5230 out = destination.startWrite();
5231
5232 XmlSerializer serializer = Xml.newSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01005233 serializer.setOutput(out, StandardCharsets.UTF_8.name());
Svetoslavc6d1c342015-02-26 14:44:43 -08005234 serializer.setFeature(
5235 "http://xmlpull.org/v1/doc/features.html#indent-output", true);
5236 serializer.startDocument(null, true);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005237
Svetoslavc6d1c342015-02-26 14:44:43 -08005238 serializer.startTag(null, TAG_RUNTIME_PERMISSIONS);
5239
Svet Ganovba3ba812015-06-26 10:54:06 -07005240 String fingerprint = mFingerprints.get(userId);
Svetoslavcdfd2302015-06-25 19:07:31 -07005241 if (fingerprint != null) {
5242 serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);
5243 }
Svet Ganovba3ba812015-06-26 10:54:06 -07005244
Svetoslavc6d1c342015-02-26 14:44:43 -08005245 final int packageCount = permissionsForPackage.size();
5246 for (int i = 0; i < packageCount; i++) {
5247 String packageName = permissionsForPackage.keyAt(i);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005248 List<PermissionState> permissionStates = permissionsForPackage.valueAt(i);
Svetoslavc6d1c342015-02-26 14:44:43 -08005249 serializer.startTag(null, TAG_PACKAGE);
5250 serializer.attribute(null, ATTR_NAME, packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005251 writePermissions(serializer, permissionStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005252 serializer.endTag(null, TAG_PACKAGE);
5253 }
5254
5255 final int sharedUserCount = permissionsForSharedUser.size();
5256 for (int i = 0; i < sharedUserCount; i++) {
5257 String packageName = permissionsForSharedUser.keyAt(i);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005258 List<PermissionState> permissionStates = permissionsForSharedUser.valueAt(i);
Svetoslavc6d1c342015-02-26 14:44:43 -08005259 serializer.startTag(null, TAG_SHARED_USER);
5260 serializer.attribute(null, ATTR_NAME, packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005261 writePermissions(serializer, permissionStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08005262 serializer.endTag(null, TAG_SHARED_USER);
5263 }
5264
5265 serializer.endTag(null, TAG_RUNTIME_PERMISSIONS);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005266
5267 // Now any restored permission grants that are waiting for the apps
5268 // in question to be installed. These are stored as per-package
5269 // TAG_RESTORED_RUNTIME_PERMISSIONS blocks, each containing some
5270 // number of individual permission grant entities.
5271 if (mRestoredUserGrants.get(userId) != null) {
5272 ArrayMap<String, ArraySet<RestoredPermissionGrant>> restoredGrants =
5273 mRestoredUserGrants.get(userId);
5274 if (restoredGrants != null) {
5275 final int pkgCount = restoredGrants.size();
5276 for (int i = 0; i < pkgCount; i++) {
5277 final ArraySet<RestoredPermissionGrant> pkgGrants =
5278 restoredGrants.valueAt(i);
5279 if (pkgGrants != null && pkgGrants.size() > 0) {
5280 final String pkgName = restoredGrants.keyAt(i);
5281 serializer.startTag(null, TAG_RESTORED_RUNTIME_PERMISSIONS);
5282 serializer.attribute(null, ATTR_PACKAGE_NAME, pkgName);
5283
5284 final int N = pkgGrants.size();
5285 for (int z = 0; z < N; z++) {
5286 RestoredPermissionGrant g = pkgGrants.valueAt(z);
5287 serializer.startTag(null, TAG_PERMISSION_ENTRY);
5288 serializer.attribute(null, ATTR_NAME, g.permissionName);
5289
5290 if (g.granted) {
5291 serializer.attribute(null, ATTR_GRANTED, "true");
5292 }
5293
5294 if ((g.grantBits&FLAG_PERMISSION_USER_SET) != 0) {
5295 serializer.attribute(null, ATTR_USER_SET, "true");
5296 }
5297 if ((g.grantBits&FLAG_PERMISSION_USER_FIXED) != 0) {
5298 serializer.attribute(null, ATTR_USER_FIXED, "true");
5299 }
5300 if ((g.grantBits&FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0) {
5301 serializer.attribute(null, ATTR_REVOKE_ON_UPGRADE, "true");
5302 }
5303 serializer.endTag(null, TAG_PERMISSION_ENTRY);
5304 }
5305 serializer.endTag(null, TAG_RESTORED_RUNTIME_PERMISSIONS);
5306 }
5307 }
5308 }
5309 }
5310
Svetoslavc6d1c342015-02-26 14:44:43 -08005311 serializer.endDocument();
5312 destination.finishWrite(out);
Svet Ganovba0821e2015-04-22 13:34:31 -07005313
Svet Ganovba3ba812015-06-26 10:54:06 -07005314 if (Build.FINGERPRINT.equals(fingerprint)) {
5315 mDefaultPermissionsGranted.put(userId, true);
5316 }
5317 // Any error while writing is fatal.
Svet Ganovba0821e2015-04-22 13:34:31 -07005318 } catch (Throwable t) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005319 Slog.wtf(PackageManagerService.TAG,
Svet Ganovba0821e2015-04-22 13:34:31 -07005320 "Failed to write settings, restoring backup", t);
Svetoslavc6d1c342015-02-26 14:44:43 -08005321 destination.failWrite(out);
5322 } finally {
5323 IoUtils.closeQuietly(out);
5324 }
5325 }
5326
Fyodor Kupolov69542592016-05-23 14:22:38 -07005327 private void onUserRemovedLPw(int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005328 // Make sure we do not
5329 mHandler.removeMessages(userId);
5330
5331 for (SettingBase sb : mPackages.values()) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005332 revokeRuntimePermissionsAndClearFlags(sb, userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005333 }
5334
5335 for (SettingBase sb : mSharedUsers.values()) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07005336 revokeRuntimePermissionsAndClearFlags(sb, userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005337 }
Fyodor Kupolov69542592016-05-23 14:22:38 -07005338
5339 mDefaultPermissionsGranted.delete(userId);
5340 mFingerprints.remove(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08005341 }
5342
Svet Ganov8c7f7002015-05-07 10:48:44 -07005343 private void revokeRuntimePermissionsAndClearFlags(SettingBase sb, int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005344 PermissionsState permissionsState = sb.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07005345 for (PermissionState permissionState
5346 : permissionsState.getRuntimePermissionStates(userId)) {
Todd Kennedy0eb97382017-10-03 16:57:22 -07005347 BasePermission bp = mPermissions.getPermission(permissionState.getName());
Svetoslavc6d1c342015-02-26 14:44:43 -08005348 if (bp != null) {
5349 permissionsState.revokeRuntimePermission(bp, userId);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005350 permissionsState.updatePermissionFlags(bp, userId,
5351 PackageManager.MASK_PERMISSION_FLAGS, 0);
Svetoslavc6d1c342015-02-26 14:44:43 -08005352 }
5353 }
5354 }
5355
Svet Ganovadc1cf42015-06-15 16:36:24 -07005356 public void deleteUserRuntimePermissionsFile(int userId) {
5357 getUserRuntimePermissionsFile(userId).delete();
5358 }
5359
Svetoslavc6d1c342015-02-26 14:44:43 -08005360 public void readStateForUserSyncLPr(int userId) {
5361 File permissionsFile = getUserRuntimePermissionsFile(userId);
5362 if (!permissionsFile.exists()) {
5363 return;
5364 }
5365
5366 FileInputStream in;
5367 try {
Svetoslav3dcdd372015-05-29 13:00:32 -07005368 in = new AtomicFile(permissionsFile).openRead();
Svetoslavc6d1c342015-02-26 14:44:43 -08005369 } catch (FileNotFoundException fnfe) {
5370 Slog.i(PackageManagerService.TAG, "No permissions state");
5371 return;
5372 }
5373
5374 try {
5375 XmlPullParser parser = Xml.newPullParser();
5376 parser.setInput(in, null);
5377 parseRuntimePermissionsLPr(parser, userId);
Svet Ganovba0821e2015-04-22 13:34:31 -07005378
Svet Ganove723e542015-04-23 11:58:26 -07005379 } catch (XmlPullParserException | IOException e) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005380 throw new IllegalStateException("Failed parsing permissions file: "
Svet Ganove723e542015-04-23 11:58:26 -07005381 + permissionsFile , e);
Svetoslavc6d1c342015-02-26 14:44:43 -08005382 } finally {
5383 IoUtils.closeQuietly(in);
5384 }
5385 }
5386
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005387 // Backup/restore support
5388
5389 public void rememberRestoredUserGrantLPr(String pkgName, String permission,
5390 boolean isGranted, int restoredFlagSet, int userId) {
5391 // This change will be remembered at write-settings time
5392 ArrayMap<String, ArraySet<RestoredPermissionGrant>> grantsByPackage =
5393 mRestoredUserGrants.get(userId);
5394 if (grantsByPackage == null) {
5395 grantsByPackage = new ArrayMap<String, ArraySet<RestoredPermissionGrant>>();
5396 mRestoredUserGrants.put(userId, grantsByPackage);
5397 }
5398
5399 ArraySet<RestoredPermissionGrant> grants = grantsByPackage.get(pkgName);
5400 if (grants == null) {
5401 grants = new ArraySet<RestoredPermissionGrant>();
5402 grantsByPackage.put(pkgName, grants);
5403 }
5404
5405 RestoredPermissionGrant grant = new RestoredPermissionGrant(permission,
5406 isGranted, restoredFlagSet);
5407 grants.add(grant);
5408 }
5409
5410 // Private internals
5411
Svetoslavc6d1c342015-02-26 14:44:43 -08005412 private void parseRuntimePermissionsLPr(XmlPullParser parser, int userId)
5413 throws IOException, XmlPullParserException {
Svet Ganov12a692a2015-03-28 19:34:15 -07005414 final int outerDepth = parser.getDepth();
5415 int type;
5416 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5417 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5418 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5419 continue;
5420 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005421
Svet Ganov12a692a2015-03-28 19:34:15 -07005422 switch (parser.getName()) {
Svet Ganovba3ba812015-06-26 10:54:06 -07005423 case TAG_RUNTIME_PERMISSIONS: {
5424 String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT);
5425 mFingerprints.put(userId, fingerprint);
5426 final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint);
5427 mDefaultPermissionsGranted.put(userId, defaultsGranted);
5428 } break;
5429
Svet Ganov12a692a2015-03-28 19:34:15 -07005430 case TAG_PACKAGE: {
5431 String name = parser.getAttributeValue(null, ATTR_NAME);
5432 PackageSetting ps = mPackages.get(name);
5433 if (ps == null) {
5434 Slog.w(PackageManagerService.TAG, "Unknown package:" + name);
5435 XmlUtils.skipCurrentTag(parser);
5436 continue;
5437 }
5438 parsePermissionsLPr(parser, ps.getPermissionsState(), userId);
5439 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005440
Svet Ganov12a692a2015-03-28 19:34:15 -07005441 case TAG_SHARED_USER: {
5442 String name = parser.getAttributeValue(null, ATTR_NAME);
5443 SharedUserSetting sus = mSharedUsers.get(name);
5444 if (sus == null) {
5445 Slog.w(PackageManagerService.TAG, "Unknown shared user:" + name);
5446 XmlUtils.skipCurrentTag(parser);
5447 continue;
5448 }
5449 parsePermissionsLPr(parser, sus.getPermissionsState(), userId);
5450 } break;
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07005451
5452 case TAG_RESTORED_RUNTIME_PERMISSIONS: {
5453 final String pkgName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
5454 parseRestoredRuntimePermissionsLPr(parser, pkgName, userId);
5455 } break;
5456 }
5457 }
5458 }
5459
5460 private void parseRestoredRuntimePermissionsLPr(XmlPullParser parser,
5461 final String pkgName, final int userId) throws IOException, XmlPullParserException {
5462 final int outerDepth = parser.getDepth();
5463 int type;
5464 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5465 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5466 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5467 continue;
5468 }
5469
5470 switch (parser.getName()) {
5471 case TAG_PERMISSION_ENTRY: {
5472 final String permName = parser.getAttributeValue(null, ATTR_NAME);
5473 final boolean isGranted = "true".equals(
5474 parser.getAttributeValue(null, ATTR_GRANTED));
5475
5476 int permBits = 0;
5477 if ("true".equals(parser.getAttributeValue(null, ATTR_USER_SET))) {
5478 permBits |= FLAG_PERMISSION_USER_SET;
5479 }
5480 if ("true".equals(parser.getAttributeValue(null, ATTR_USER_FIXED))) {
5481 permBits |= FLAG_PERMISSION_USER_FIXED;
5482 }
5483 if ("true".equals(parser.getAttributeValue(null, ATTR_REVOKE_ON_UPGRADE))) {
5484 permBits |= FLAG_PERMISSION_REVOKE_ON_UPGRADE;
5485 }
5486
5487 if (isGranted || permBits != 0) {
5488 rememberRestoredUserGrantLPr(pkgName, permName, isGranted, permBits, userId);
5489 }
5490 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005491 }
5492 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005493 }
5494
Svet Ganov12a692a2015-03-28 19:34:15 -07005495 private void parsePermissionsLPr(XmlPullParser parser, PermissionsState permissionsState,
Svetoslavc6d1c342015-02-26 14:44:43 -08005496 int userId) throws IOException, XmlPullParserException {
Svet Ganov12a692a2015-03-28 19:34:15 -07005497 final int outerDepth = parser.getDepth();
5498 int type;
5499 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5500 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5501 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5502 continue;
Svetoslavc6d1c342015-02-26 14:44:43 -08005503 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005504
Svet Ganov12a692a2015-03-28 19:34:15 -07005505 switch (parser.getName()) {
5506 case TAG_ITEM: {
5507 String name = parser.getAttributeValue(null, ATTR_NAME);
Todd Kennedy0eb97382017-10-03 16:57:22 -07005508 BasePermission bp = mPermissions.getPermission(name);
Svet Ganov12a692a2015-03-28 19:34:15 -07005509 if (bp == null) {
5510 Slog.w(PackageManagerService.TAG, "Unknown permission:" + name);
5511 XmlUtils.skipCurrentTag(parser);
5512 continue;
5513 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005514
Svet Ganov8c7f7002015-05-07 10:48:44 -07005515 String grantedStr = parser.getAttributeValue(null, ATTR_GRANTED);
5516 final boolean granted = grantedStr == null
5517 || Boolean.parseBoolean(grantedStr);
5518
5519 String flagsStr = parser.getAttributeValue(null, ATTR_FLAGS);
5520 final int flags = (flagsStr != null)
5521 ? Integer.parseInt(flagsStr, 16) : 0;
5522
5523 if (granted) {
Svet Ganovadc1cf42015-06-15 16:36:24 -07005524 permissionsState.grantRuntimePermission(bp, userId);
5525 permissionsState.updatePermissionFlags(bp, userId,
Svet Ganov8c7f7002015-05-07 10:48:44 -07005526 PackageManager.MASK_PERMISSION_FLAGS, flags);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005527 } else {
Svet Ganovadc1cf42015-06-15 16:36:24 -07005528 permissionsState.updatePermissionFlags(bp, userId,
5529 PackageManager.MASK_PERMISSION_FLAGS, flags);
Svet Ganov12a692a2015-03-28 19:34:15 -07005530 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005531
Svet Ganov12a692a2015-03-28 19:34:15 -07005532 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005533 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005534 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005535 }
5536
Svet Ganov8c7f7002015-05-07 10:48:44 -07005537 private void writePermissions(XmlSerializer serializer,
5538 List<PermissionState> permissionStates) throws IOException {
5539 for (PermissionState permissionState : permissionStates) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005540 serializer.startTag(null, TAG_ITEM);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005541 serializer.attribute(null, ATTR_NAME,permissionState.getName());
5542 serializer.attribute(null, ATTR_GRANTED,
5543 String.valueOf(permissionState.isGranted()));
5544 serializer.attribute(null, ATTR_FLAGS,
5545 Integer.toHexString(permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005546 serializer.endTag(null, TAG_ITEM);
5547 }
5548 }
5549
5550 private final class MyHandler extends Handler {
5551 public MyHandler() {
5552 super(BackgroundThread.getHandler().getLooper());
5553 }
5554
5555 @Override
5556 public void handleMessage(Message message) {
5557 final int userId = message.what;
5558 Runnable callback = (Runnable) message.obj;
5559 writePermissionsSync(userId);
5560 if (callback != null) {
5561 callback.run();
5562 }
5563 }
5564 }
5565 }
Andy McFadden2f362292012-01-20 14:43:38 -08005566}