blob: bbbe6936a4e6bf95846fc772aa4479ac91ef9073 [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
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070019import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070020import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
21import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
Dianne Hackbornfd7aded2013-01-22 17:10:23 -080022import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
Dianne Hackborn0ac30312011-06-17 14:49:23 -070023import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070024import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
Christopher Tatee9fd1fa2015-09-15 16:43:07 -070025import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
26import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED;
27import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE;
Fabrice Di Meglio07885952015-04-06 19:41:28 -070028import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080029import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070030import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
31import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
32import static android.content.pm.PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
33import static android.content.pm.PackageManager.MATCH_ENCRYPTION_AWARE;
34import static android.content.pm.PackageManager.MATCH_ENCRYPTION_UNAWARE;
35import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
Jeff Sharkey184a0102013-07-10 16:19:52 -070036import static android.os.Process.PACKAGE_INFO_GID;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070037import static android.os.Process.SYSTEM_UID;
Christopher Tate72c10a22015-06-12 18:31:24 -070038import static com.android.server.pm.PackageManagerService.DEBUG_DOMAIN_VERIFICATION;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070039
Xiaohui Chen594f2082015-08-18 11:04:20 -070040import android.annotation.NonNull;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070041import android.content.ComponentName;
42import android.content.Intent;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080043import android.content.IntentFilter;
44import android.content.pm.ActivityInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070045import android.content.pm.ApplicationInfo;
46import android.content.pm.ComponentInfo;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080047import android.content.pm.IntentFilterVerificationInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070048import android.content.pm.PackageCleanItem;
49import android.content.pm.PackageManager;
50import android.content.pm.PackageParser;
51import android.content.pm.PackageUserState;
52import android.content.pm.PermissionInfo;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080053import android.content.pm.ResolveInfo;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070054import android.content.pm.Signature;
55import android.content.pm.UserInfo;
56import android.content.pm.VerifierDeviceIdentity;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080057import android.net.Uri;
Narayan Kamathff110bd2014-07-04 18:30:45 +010058import android.os.Binder;
Jeff Sharkey4ed745d2014-07-15 20:39:15 -070059import android.os.Build;
Narayan Kamathff110bd2014-07-04 18:30:45 +010060import android.os.Environment;
61import android.os.FileUtils;
Svetoslavc6d1c342015-02-26 14:44:43 -080062import android.os.Handler;
63import android.os.Message;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080064import android.os.PatternMatcher;
Narayan Kamathff110bd2014-07-04 18:30:45 +010065import android.os.Process;
Svetoslavc6d1c342015-02-26 14:44:43 -080066import android.os.SystemClock;
Narayan Kamathff110bd2014-07-04 18:30:45 +010067import android.os.UserHandle;
Amith Yamasani26f9ea32014-09-11 10:56:51 -070068import android.os.UserManager;
Paul Crowleybcf48ed2015-04-22 13:36:59 +010069import android.os.storage.StorageManager;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -070070import android.os.storage.VolumeInfo;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080071import android.text.TextUtils;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070072import android.util.ArrayMap;
73import android.util.ArraySet;
74import android.util.AtomicFile;
75import android.util.Log;
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -080076import android.util.LogPrinter;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070077import android.util.Slog;
78import android.util.SparseArray;
Svetoslavc6d1c342015-02-26 14:44:43 -080079import android.util.SparseBooleanArray;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070080import android.util.SparseIntArray;
Svetoslavc6d1c342015-02-26 14:44:43 -080081import android.util.SparseLongArray;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070082import android.util.Xml;
Christopher Tatee012a232015-04-01 17:18:50 -070083
Svetoslavc6d1c342015-02-26 14:44:43 -080084import com.android.internal.annotations.GuardedBy;
85import com.android.internal.os.BackgroundThread;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -070086import com.android.internal.os.InstallerConnection.InstallerException;
Svetoslavc6d1c342015-02-26 14:44:43 -080087import com.android.internal.util.ArrayUtils;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070088import com.android.internal.util.FastXmlSerializer;
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -070089import com.android.internal.util.IndentingPrintWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070090import com.android.internal.util.JournaledFile;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -070091import com.android.internal.util.Preconditions;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070092import com.android.internal.util.XmlUtils;
Christopher Tatee012a232015-04-01 17:18:50 -070093import com.android.server.backup.PreferredActivityBackupHelper;
Kenny Root447106f2011-03-23 11:00:15 -070094import com.android.server.pm.PackageManagerService.DumpState;
Svet Ganov8c7f7002015-05-07 10:48:44 -070095import com.android.server.pm.PermissionsState.PermissionState;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070096
Jeff Sharkey2a90f6732016-01-06 12:26:11 -070097import libcore.io.IoUtils;
Alexandra Gherghina6e2ae252014-06-12 16:03:58 +010098
Kenny Rootcf0b38c2011-03-22 14:17:59 -070099import org.xmlpull.v1.XmlPullParser;
100import org.xmlpull.v1.XmlPullParserException;
101import org.xmlpull.v1.XmlSerializer;
102
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700103import java.io.BufferedInputStream;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700104import java.io.BufferedOutputStream;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700105import java.io.BufferedWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700106import java.io.File;
107import java.io.FileInputStream;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700108import java.io.FileNotFoundException;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700109import java.io.FileOutputStream;
110import java.io.IOException;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700111import java.io.InputStream;
112import java.io.OutputStreamWriter;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700113import java.io.PrintWriter;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700114import java.nio.charset.Charset;
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +0100115import java.nio.charset.StandardCharsets;
Kenny Root447106f2011-03-23 11:00:15 -0700116import java.text.SimpleDateFormat;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700117import java.util.ArrayList;
118import java.util.Arrays;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700119import java.util.Collection;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800120import java.util.Collections;
Kenny Root447106f2011-03-23 11:00:15 -0700121import java.util.Date;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700122import java.util.Iterator;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700123import java.util.List;
Andy McFadden2f362292012-01-20 14:43:38 -0800124import java.util.Map;
Jeff Sharkey2a90f6732016-01-06 12:26:11 -0700125import java.util.Map.Entry;
Jeff Sharkey84f12942014-07-10 17:48:11 -0700126import java.util.Objects;
Dianne Hackborn63092712012-10-07 14:45:35 -0700127import java.util.Set;
Kenny Root62539e92011-11-10 09:35:38 -0800128
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700129/**
130 * Holds information about dynamic settings.
131 */
132final class Settings {
Kenny Root447106f2011-03-23 11:00:15 -0700133 private static final String TAG = "PackageSettings";
134
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700135 /**
136 * Current version of the package database. Set it to the latest version in
137 * the {@link DatabaseVersion} class below to ensure the database upgrade
138 * doesn't happen repeatedly.
139 * <p>
140 * Note that care should be taken to make sure all database upgrades are
141 * idempotent.
142 */
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700143 public static final int CURRENT_DATABASE_VERSION = DatabaseVersion.SIGNATURE_MALFORMED_RECOVER;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700144
145 /**
146 * This class contains constants that can be referred to from upgrade code.
147 * Insert constant values here that describe the upgrade reason. The version
148 * code must be monotonically increasing.
149 */
150 public static class DatabaseVersion {
151 /**
152 * The initial version of the database.
153 */
154 public static final int FIRST_VERSION = 1;
Kenny Roota8e65fd2014-04-24 11:44:47 -0700155
156 /**
157 * Migrating the Signature array from the entire certificate chain to
158 * just the signing certificate.
159 */
160 public static final int SIGNATURE_END_ENTITY = 2;
Jeff Sharkeyd68b87c2014-11-12 12:18:11 -0800161
162 /**
163 * There was a window of time in
164 * {@link android.os.Build.VERSION_CODES#LOLLIPOP} where we persisted
165 * certificates after potentially mutating them. To switch back to the
166 * original untouched certificates, we need to force a collection pass.
167 */
168 public static final int SIGNATURE_MALFORMED_RECOVER = 3;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700169 }
170
Kenny Root447106f2011-03-23 11:00:15 -0700171 private static final boolean DEBUG_STOPPED = false;
Amith Yamasani258848d2012-08-10 17:06:33 -0700172 private static final boolean DEBUG_MU = false;
Kenny Root447106f2011-03-23 11:00:15 -0700173
Svetoslavc6d1c342015-02-26 14:44:43 -0800174 private static final String RUNTIME_PERMISSIONS_FILE_NAME = "runtime-permissions.xml";
175
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -0700176 private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage";
177 private static final String ATTR_ENFORCEMENT = "enforcement";
178
Amith Yamasani483f3b02012-03-13 16:08:00 -0700179 private static final String TAG_ITEM = "item";
180 private static final String TAG_DISABLED_COMPONENTS = "disabled-components";
181 private static final String TAG_ENABLED_COMPONENTS = "enabled-components";
182 private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions";
183 private static final String TAG_PACKAGE = "pkg";
Svetoslavc6d1c342015-02-26 14:44:43 -0800184 private static final String TAG_SHARED_USER = "shared-user";
185 private static final String TAG_RUNTIME_PERMISSIONS = "runtime-permissions";
186 private static final String TAG_PERMISSIONS = "perms";
Sander Alewijnseaf597622014-03-20 18:44:57 +0000187 private static final String TAG_PERSISTENT_PREFERRED_ACTIVITIES =
188 "persistent-preferred-activities";
Nicolas Prevot81948992014-05-16 18:25:26 +0100189 static final String TAG_CROSS_PROFILE_INTENT_FILTERS =
190 "crossProfile-intent-filters";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700191 private static final String TAG_DOMAIN_VERIFICATION = "domain-verification";
192 private static final String TAG_DEFAULT_APPS = "default-apps";
193 private static final String TAG_ALL_INTENT_FILTER_VERIFICATION =
Christopher Tate6038d152015-06-17 13:07:46 -0700194 "all-intent-filter-verifications";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700195 private static final String TAG_DEFAULT_BROWSER = "default-browser";
196 private static final String TAG_VERSION = "version";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700197
198 private static final String ATTR_NAME = "name";
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700199 private static final String ATTR_USER = "user";
200 private static final String ATTR_CODE = "code";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700201 private static final String ATTR_NOT_LAUNCHED = "nl";
202 private static final String ATTR_ENABLED = "enabled";
Svet Ganov8c7f7002015-05-07 10:48:44 -0700203 private static final String ATTR_GRANTED = "granted";
204 private static final String ATTR_FLAGS = "flags";
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700205 private static final String ATTR_ENABLED_CALLER = "enabledCaller";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700206 private static final String ATTR_STOPPED = "stopped";
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700207 // Legacy, here for reading older versions of the package-restrictions.
Amith Yamasani655d0e22013-06-12 14:19:10 -0700208 private static final String ATTR_BLOCKED = "blocked";
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700209 // New name for the above attribute.
210 private static final String ATTR_HIDDEN = "hidden";
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000211 private static final String ATTR_SUSPENDED = "suspended";
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700212 private static final String ATTR_INSTALLED = "inst";
Kenny Guyc13053b2014-05-29 14:17:17 +0100213 private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall";
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800214 private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700215 private static final String ATTR_PACKAGE_NAME = "packageName";
Svet Ganovba3ba812015-06-26 10:54:06 -0700216 private static final String ATTR_FINGERPRINT = "fingerprint";
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700217 private static final String ATTR_APP_LINK_GENERATION = "app-link-generation";
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700218 private static final String ATTR_VOLUME_UUID = "volumeUuid";
219 private static final String ATTR_SDK_VERSION = "sdkVersion";
220 private static final String ATTR_DATABASE_VERSION = "databaseVersion";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700221
Christopher Tatee9fd1fa2015-09-15 16:43:07 -0700222 // Bookkeeping for restored permission grants
223 private static final String TAG_RESTORED_RUNTIME_PERMISSIONS = "restored-perms";
224 // package name: ATTR_PACKAGE_NAME
225 private static final String TAG_PERMISSION_ENTRY = "perm";
226 // permission name: ATTR_NAME
227 // permission granted (boolean): ATTR_GRANTED
228 private static final String ATTR_USER_SET = "set";
229 private static final String ATTR_USER_FIXED = "fixed";
230 private static final String ATTR_REVOKE_ON_UPGRADE = "rou";
231
232 // Flag mask of restored permission grants that are applied at install time
233 private static final int USER_RUNTIME_GRANT_MASK =
234 FLAG_PERMISSION_USER_SET
235 | FLAG_PERMISSION_USER_FIXED
236 | FLAG_PERMISSION_REVOKE_ON_UPGRADE;
237
Svetoslavc6d1c342015-02-26 14:44:43 -0800238 private final Object mLock;
Svetoslavc6d1c342015-02-26 14:44:43 -0800239
240 private final RuntimePermissionPersistence mRuntimePermissionsPersistence;
241
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700242 private final File mSettingsFilename;
243 private final File mBackupSettingsFilename;
244 private final File mPackageListFilename;
245 private final File mStoppedPackagesFilename;
246 private final File mBackupStoppedPackagesFilename;
Jeff Sharkey184a0102013-07-10 16:19:52 -0700247
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700248 final ArrayMap<String, PackageSetting> mPackages =
249 new ArrayMap<String, PackageSetting>();
Christopher Tate6038d152015-06-17 13:07:46 -0700250
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700251 // List of replaced system applications
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700252 private final ArrayMap<String, PackageSetting> mDisabledSysPackages =
253 new ArrayMap<String, PackageSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700254
Christopher Tate6038d152015-06-17 13:07:46 -0700255 // Set of restored intent-filter verification states
256 private final ArrayMap<String, IntentFilterVerificationInfo> mRestoredIntentFilterVerifications =
257 new ArrayMap<String, IntentFilterVerificationInfo>();
258
Christopher Tatee9fd1fa2015-09-15 16:43:07 -0700259 // Bookkeeping for restored user permission grants
260 final class RestoredPermissionGrant {
261 String permissionName;
262 boolean granted;
263 int grantBits;
264
265 RestoredPermissionGrant(String name, boolean isGranted, int theGrantBits) {
266 permissionName = name;
267 granted = isGranted;
268 grantBits = theGrantBits;
269 }
270 }
271
272 // This would be more compact as a flat array of restored grants or something, but we
273 // may have quite a few, especially during early device lifetime, and avoiding all those
274 // linear lookups will be important.
275 private final SparseArray<ArrayMap<String, ArraySet<RestoredPermissionGrant>>>
276 mRestoredUserGrants =
277 new SparseArray<ArrayMap<String, ArraySet<RestoredPermissionGrant>>>();
278
Geremy Condra12c18382013-03-06 16:49:06 -0800279 private static int mFirstAvailableUid = 0;
280
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700281 /** Map from volume UUID to {@link VersionInfo} */
282 private ArrayMap<String, VersionInfo> mVersion = new ArrayMap<>();
Kenny Root0aaa0d92011-09-12 16:42:55 -0700283
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700284 /**
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700285 * Version details for a storage volume that may hold apps.
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700286 */
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700287 public static class VersionInfo {
288 /**
289 * These are the last platform API version we were using for the apps
290 * installed on internal and external storage. It is used to grant newer
291 * permissions one time during a system upgrade.
292 */
293 int sdkVersion;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -0700294
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -0700295 /**
296 * The current database version for apps on internal storage. This is
297 * used to upgrade the format of the packages.xml database not
298 * necessarily tied to an SDK version.
299 */
300 int databaseVersion;
301
302 /**
303 * Last known value of {@link Build#FINGERPRINT}. Used to determine when
304 * an system update has occurred, meaning we need to clear code caches.
305 */
306 String fingerprint;
307
308 /**
309 * Force all version information to match current system values,
310 * typically after resolving any required upgrade steps.
311 */
312 public void forceCurrent() {
313 sdkVersion = Build.VERSION.SDK_INT;
314 databaseVersion = CURRENT_DATABASE_VERSION;
315 fingerprint = Build.FINGERPRINT;
316 }
317 }
Jeff Sharkey4ed745d2014-07-15 20:39:15 -0700318
Jeff Sharkeyf5385772012-05-11 14:04:41 -0700319 Boolean mReadExternalStorageEnforced;
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -0700320
Kenny Root0aaa0d92011-09-12 16:42:55 -0700321 /** Device identity for the purpose of package verification. */
322 private VerifierDeviceIdentity mVerifierDeviceIdentity;
323
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700324 // The user's preferred activities associated with particular intent
325 // filters.
Dianne Hackborn63092712012-10-07 14:45:35 -0700326 final SparseArray<PreferredIntentResolver> mPreferredActivities =
327 new SparseArray<PreferredIntentResolver>();
328
Sander Alewijnsef475ca32014-02-17 15:13:58 +0000329 // The persistent preferred activities of the user's profile/device owner
330 // associated with particular intent filters.
331 final SparseArray<PersistentPreferredIntentResolver> mPersistentPreferredActivities =
332 new SparseArray<PersistentPreferredIntentResolver>();
333
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000334 // For every user, it is used to find to which other users the intent can be forwarded.
Nicolas Prevot81948992014-05-16 18:25:26 +0100335 final SparseArray<CrossProfileIntentResolver> mCrossProfileIntentResolvers =
336 new SparseArray<CrossProfileIntentResolver>();
Nicolas Prevot10fa67c2014-03-24 13:44:38 +0000337
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700338 final ArrayMap<String, SharedUserSetting> mSharedUsers =
339 new ArrayMap<String, SharedUserSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700340 private final ArrayList<Object> mUserIds = new ArrayList<Object>();
341 private final SparseArray<Object> mOtherUserIds =
342 new SparseArray<Object>();
343
344 // For reading/writing settings file.
345 private final ArrayList<Signature> mPastSignatures =
346 new ArrayList<Signature>();
dcashman8c04fac2015-03-23 11:39:42 -0700347 private final ArrayMap<Long, Integer> mKeySetRefs =
348 new ArrayMap<Long, Integer>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700349
350 // Mapping from permission names to info about them.
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700351 final ArrayMap<String, BasePermission> mPermissions =
352 new ArrayMap<String, BasePermission>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700353
354 // Mapping from permission tree names to info about them.
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700355 final ArrayMap<String, BasePermission> mPermissionTrees =
356 new ArrayMap<String, BasePermission>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700357
358 // Packages that have been uninstalled and still need their external
359 // storage data deleted.
Jeff Sharkey752cd922012-09-23 16:25:12 -0700360 final ArrayList<PackageCleanItem> mPackagesToBeCleaned = new ArrayList<PackageCleanItem>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700361
362 // Packages that have been renamed since they were first installed.
363 // Keys are the new names of the packages, values are the original
364 // names. The packages appear everwhere else under their original
365 // names.
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700366 final ArrayMap<String, String> mRenamedPackages = new ArrayMap<String, String>();
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700367
368 // For every user, it is used to find the package name of the default Browser App.
369 final SparseArray<String> mDefaultBrowserApp = new SparseArray<String>();
370
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700371 // App-link priority tracking, per-user
372 final SparseIntArray mNextAppLinkGeneration = new SparseIntArray();
373
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700374 final StringBuilder mReadMessages = new StringBuilder();
375
Kenny Root447106f2011-03-23 11:00:15 -0700376 /**
377 * Used to track packages that have a shared user ID that hasn't been read
378 * in yet.
379 * <p>
380 * TODO: make this just a local variable that is passed in during package
381 * scanning to make it less confusing.
382 */
383 private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700384
Amith Yamasani483f3b02012-03-13 16:08:00 -0700385 private final File mSystemDir;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800386
dcashman55b10782014-04-09 14:20:38 -0700387 public final KeySetManagerService mKeySetManagerService = new KeySetManagerService(mPackages);
Geremy Condraf1bcca82013-01-07 22:35:24 -0800388
Svet Ganov12a692a2015-03-28 19:34:15 -0700389 Settings(Object lock) {
390 this(Environment.getDataDirectory(), lock);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700391 }
392
Svet Ganov12a692a2015-03-28 19:34:15 -0700393 Settings(File dataDir, Object lock) {
Svetoslavc6d1c342015-02-26 14:44:43 -0800394 mLock = lock;
395
396 mRuntimePermissionsPersistence = new RuntimePermissionPersistence(mLock);
397
Amith Yamasani483f3b02012-03-13 16:08:00 -0700398 mSystemDir = new File(dataDir, "system");
399 mSystemDir.mkdirs();
400 FileUtils.setPermissions(mSystemDir.toString(),
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700401 FileUtils.S_IRWXU|FileUtils.S_IRWXG
402 |FileUtils.S_IROTH|FileUtils.S_IXOTH,
403 -1, -1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700404 mSettingsFilename = new File(mSystemDir, "packages.xml");
405 mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
406 mPackageListFilename = new File(mSystemDir, "packages.list");
Jeff Sharkeyaebb65c2014-11-24 15:00:13 -0800407 FileUtils.setPermissions(mPackageListFilename, 0640, SYSTEM_UID, PACKAGE_INFO_GID);
Jeff Sharkey184a0102013-07-10 16:19:52 -0700408
Amith Yamasani483f3b02012-03-13 16:08:00 -0700409 // Deprecated: Needed for migration
410 mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
411 mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700412 }
413
Kenny Root447106f2011-03-23 11:00:15 -0700414 PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700415 String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
Narayan Kamath4903f642014-08-11 13:33:45 +0100416 String legacyNativeLibraryPathString, String primaryCpuAbi, String secondaryCpuAbi,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800417 int pkgFlags, int pkgPrivateFlags, UserHandle user, boolean add) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700418 final String name = pkg.packageName;
Kenny Root447106f2011-03-23 11:00:15 -0700419 PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath,
Jeff Sharkey84f12942014-07-10 17:48:11 -0700420 resourcePath, legacyNativeLibraryPathString, primaryCpuAbi, secondaryCpuAbi,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800421 pkg.mVersionCode, pkgFlags, pkgPrivateFlags, user, add, true /* allowInstall */);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700422 return p;
423 }
424
Kenny Root447106f2011-03-23 11:00:15 -0700425 PackageSetting peekPackageLPr(String name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700426 return mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700427 }
428
Christopher Tatee9fd1fa2015-09-15 16:43:07 -0700429 void setInstallStatus(String pkgName, final int status) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700430 PackageSetting p = mPackages.get(pkgName);
431 if(p != null) {
432 if(p.getInstallStatus() != status) {
433 p.setInstallStatus(status);
434 }
435 }
436 }
437
Christopher Tatee9fd1fa2015-09-15 16:43:07 -0700438 void applyPendingPermissionGrantsLPw(String packageName, int userId) {
439 ArrayMap<String, ArraySet<RestoredPermissionGrant>> grantsByPackage =
440 mRestoredUserGrants.get(userId);
441 if (grantsByPackage == null || grantsByPackage.size() == 0) {
442 return;
443 }
444
445 ArraySet<RestoredPermissionGrant> grants = grantsByPackage.get(packageName);
446 if (grants == null || grants.size() == 0) {
447 return;
448 }
449
450 final PackageSetting ps = mPackages.get(packageName);
451 if (ps == null) {
452 Slog.e(TAG, "Can't find supposedly installed package " + packageName);
453 return;
454 }
455 final PermissionsState perms = ps.getPermissionsState();
456
457 for (RestoredPermissionGrant grant : grants) {
458 BasePermission bp = mPermissions.get(grant.permissionName);
459 if (bp != null) {
460 if (grant.granted) {
461 perms.grantRuntimePermission(bp, userId);
462 }
463 perms.updatePermissionFlags(bp, userId, USER_RUNTIME_GRANT_MASK, grant.grantBits);
464 }
465 }
466
467 // And remove it from the pending-grant bookkeeping
468 grantsByPackage.remove(packageName);
469 if (grantsByPackage.size() < 1) {
470 mRestoredUserGrants.remove(userId);
471 }
472 writeRuntimePermissionsForUserLPr(userId, false);
473 }
474
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700475 void setInstallerPackageName(String pkgName, String installerPkgName) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700476 PackageSetting p = mPackages.get(pkgName);
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700477 if (p != null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700478 p.setInstallerPackageName(installerPkgName);
479 }
480 }
481
Kenny Root447106f2011-03-23 11:00:15 -0700482 SharedUserSetting getSharedUserLPw(String name,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800483 int pkgFlags, int pkgPrivateFlags, boolean create) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700484 SharedUserSetting s = mSharedUsers.get(name);
485 if (s == null) {
486 if (!create) {
487 return null;
488 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800489 s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800490 s.userId = newUserIdLPw(s);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700491 Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
492 // < 0 means we couldn't assign a userid; fall out and return
493 // s, which is currently null
494 if (s.userId >= 0) {
495 mSharedUsers.put(name, s);
496 }
497 }
498
499 return s;
500 }
501
Narayan Kamathdf6d6dc2014-04-28 14:18:34 +0100502 Collection<SharedUserSetting> getAllSharedUsersLPw() {
503 return mSharedUsers.values();
504 }
505
506
Kenny Root447106f2011-03-23 11:00:15 -0700507 boolean disableSystemPackageLPw(String name) {
508 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700509 if(p == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -0700510 Log.w(PackageManagerService.TAG, "Package " + name + " is not an installed package");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700511 return false;
512 }
Kenny Root447106f2011-03-23 11:00:15 -0700513 final PackageSetting dp = mDisabledSysPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700514 // always make sure the system package code and resource paths dont change
515 if (dp == null) {
516 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
517 p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
518 }
519 mDisabledSysPackages.put(name, p);
520
521 // a little trick... when we install the new package, we don't
522 // want to modify the existing PackageSetting for the built-in
523 // version. so at this point we need a new PackageSetting that
524 // is okay to muck with.
525 PackageSetting newp = new PackageSetting(p);
Kenny Root447106f2011-03-23 11:00:15 -0700526 replacePackageLPw(name, newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700527 return true;
528 }
529 return false;
530 }
531
Kenny Root447106f2011-03-23 11:00:15 -0700532 PackageSetting enableSystemPackageLPw(String name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700533 PackageSetting p = mDisabledSysPackages.get(name);
534 if(p == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -0700535 Log.w(PackageManagerService.TAG, "Package " + name + " is not disabled");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700536 return null;
537 }
538 // Reset flag in ApplicationInfo object
539 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
540 p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
541 }
Kenny Root447106f2011-03-23 11:00:15 -0700542 PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100543 p.legacyNativeLibraryPathString, p.primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100544 p.secondaryCpuAbiString, p.secondaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800545 p.appId, p.versionCode, p.pkgFlags, p.pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700546 mDisabledSysPackages.remove(name);
547 return ret;
548 }
549
Kenny Rootc52d6fd2012-05-07 23:04:52 -0700550 boolean isDisabledSystemPackageLPr(String name) {
551 return mDisabledSysPackages.containsKey(name);
552 }
553
554 void removeDisabledSystemPackageLPw(String name) {
555 mDisabledSysPackages.remove(name);
556 }
557
Kenny Root447106f2011-03-23 11:00:15 -0700558 PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100559 String legacyNativeLibraryPathString, String primaryCpuAbiString, String secondaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800560 String cpuAbiOverrideString, int uid, int vc, int pkgFlags, int pkgPrivateFlags) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700561 PackageSetting p = mPackages.get(name);
562 if (p != null) {
Amith Yamasani13593602012-03-22 16:16:17 -0700563 if (p.appId == uid) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700564 return p;
565 }
566 PackageManagerService.reportSettingsProblem(Log.ERROR,
567 "Adding duplicate package, keeping first: " + name);
568 return null;
569 }
Narayan Kamathff110bd2014-07-04 18:30:45 +0100570 p = new PackageSetting(name, realName, codePath, resourcePath,
Narayan Kamath4903f642014-08-11 13:33:45 +0100571 legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800572 cpuAbiOverrideString, vc, pkgFlags, pkgPrivateFlags);
Amith Yamasani13593602012-03-22 16:16:17 -0700573 p.appId = uid;
Kenny Root447106f2011-03-23 11:00:15 -0700574 if (addUserIdLPw(uid, p, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700575 mPackages.put(name, p);
576 return p;
577 }
578 return null;
579 }
580
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800581 SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags, int pkgPrivateFlags) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700582 SharedUserSetting s = mSharedUsers.get(name);
583 if (s != null) {
584 if (s.userId == uid) {
585 return s;
586 }
587 PackageManagerService.reportSettingsProblem(Log.ERROR,
588 "Adding duplicate shared user, keeping first: " + name);
589 return null;
590 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800591 s = new SharedUserSetting(name, pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700592 s.userId = uid;
Kenny Root447106f2011-03-23 11:00:15 -0700593 if (addUserIdLPw(uid, s, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700594 mSharedUsers.put(name, s);
595 return s;
596 }
597 return null;
598 }
599
Christopher Tate86b391c2013-09-13 16:58:36 -0700600 void pruneSharedUsersLPw() {
601 ArrayList<String> removeStage = new ArrayList<String>();
602 for (Map.Entry<String,SharedUserSetting> entry : mSharedUsers.entrySet()) {
603 final SharedUserSetting sus = entry.getValue();
Todd Kennedy68f67152015-10-21 13:09:10 -0700604 if (sus == null) {
605 removeStage.add(entry.getKey());
606 continue;
607 }
608 // remove packages that are no longer installed
609 for (Iterator<PackageSetting> iter = sus.packages.iterator(); iter.hasNext();) {
610 PackageSetting ps = iter.next();
611 if (mPackages.get(ps.name) == null) {
612 iter.remove();
613 }
614 }
615 if (sus.packages.size() == 0) {
Christopher Tate86b391c2013-09-13 16:58:36 -0700616 removeStage.add(entry.getKey());
617 }
618 }
619 for (int i = 0; i < removeStage.size(); i++) {
620 mSharedUsers.remove(removeStage.get(i));
621 }
622 }
623
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700624 // Transfer ownership of permissions from one package to another.
Kenny Root447106f2011-03-23 11:00:15 -0700625 void transferPermissionsLPw(String origPkg, String newPkg) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700626 // Transfer ownership of permissions to the new package.
627 for (int i=0; i<2; i++) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700628 ArrayMap<String, BasePermission> permissions =
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700629 i == 0 ? mPermissionTrees : mPermissions;
630 for (BasePermission bp : permissions.values()) {
631 if (origPkg.equals(bp.sourcePackage)) {
632 if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG,
633 "Moving permission " + bp.name
634 + " from pkg " + bp.sourcePackage
635 + " to " + newPkg);
636 bp.sourcePackage = newPkg;
637 bp.packageSetting = null;
638 bp.perm = null;
639 if (bp.pendingInfo != null) {
640 bp.pendingInfo.packageName = newPkg;
641 }
642 bp.uid = 0;
Jeff Sharkey00f39042015-03-23 16:51:22 -0700643 bp.setGids(null, false);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700644 }
645 }
646 }
647 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700648
Kenny Root447106f2011-03-23 11:00:15 -0700649 private PackageSetting getPackageLPw(String name, PackageSetting origPackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700650 String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
Svetoslavc6d1c342015-02-26 14:44:43 -0800651 String legacyNativeLibraryPathString, String primaryCpuAbiString,
652 String secondaryCpuAbiString, int vc, int pkgFlags, int pkgPrivateFlags,
653 UserHandle installUser, boolean add, boolean allowInstall) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700654 PackageSetting p = mPackages.get(name);
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700655 UserManagerService userManager = UserManagerService.getInstance();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700656 if (p != null) {
Narayan Kamathff110bd2014-07-04 18:30:45 +0100657 p.primaryCpuAbiString = primaryCpuAbiString;
658 p.secondaryCpuAbiString = secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100659
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700660 if (!p.codePath.equals(codePath)) {
661 // Check to see if its a disabled system app
662 if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
663 // This is an updated system app with versions in both system
664 // and data partition. Just let the most recent version
665 // take precedence.
Amith Yamasani483f3b02012-03-13 16:08:00 -0700666 Slog.w(PackageManagerService.TAG, "Trying to update system app code path from "
667 + p.codePathString + " to " + codePath.toString());
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700668 } else {
669 // Just a change in the code path is not an issue, but
670 // let's log a message about it.
Amith Yamasani483f3b02012-03-13 16:08:00 -0700671 Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from "
672 + p.codePath + " to " + codePath + "; Retaining data and using new");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700673 /*
674 * Since we've changed paths, we need to prefer the new
675 * native library path over the one stored in the
676 * package settings since we might have moved from
677 * internal to external storage or vice versa.
678 */
Narayan Kamathff110bd2014-07-04 18:30:45 +0100679 p.legacyNativeLibraryPathString = legacyNativeLibraryPathString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700680 }
681 }
682 if (p.sharedUser != sharedUser) {
683 PackageManagerService.reportSettingsProblem(Log.WARN,
684 "Package " + name + " shared user changed from "
685 + (p.sharedUser != null ? p.sharedUser.name : "<nothing>")
686 + " to "
687 + (sharedUser != null ? sharedUser.name : "<nothing>")
688 + "; replacing with new");
689 p = null;
690 } else {
Christopher Tate9f088202013-10-22 15:36:01 -0700691 // If what we are scanning is a system (and possibly privileged) package,
692 // then make it so, regardless of whether it was previously installed only
693 // in the data partition.
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800694 p.pkgFlags |= pkgFlags & ApplicationInfo.FLAG_SYSTEM;
695 p.pkgPrivateFlags |= pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700696 }
697 }
698 if (p == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700699 if (origPackage != null) {
700 // We are consuming the data from an existing package.
701 p = new PackageSetting(origPackage.name, name, codePath, resourcePath,
Narayan Kamath4903f642014-08-11 13:33:45 +0100702 legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800703 null /* cpuAbiOverrideString */, vc, pkgFlags, pkgPrivateFlags);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700704 if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package "
705 + name + " is adopting original package " + origPackage.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700706 // Note that we will retain the new package's signature so
707 // that we can keep its data.
708 PackageSignatures s = p.signatures;
709 p.copyFrom(origPackage);
710 p.signatures = s;
711 p.sharedUser = origPackage.sharedUser;
Amith Yamasani13593602012-03-22 16:16:17 -0700712 p.appId = origPackage.appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700713 p.origPackage = origPackage;
Svet Ganove7af1942015-08-04 11:13:44 -0700714 p.getPermissionsState().copyFrom(origPackage.getPermissionsState());
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700715 mRenamedPackages.put(name, origPackage.name);
716 name = origPackage.name;
717 // Update new package state.
718 p.setTimeStamp(codePath.lastModified());
719 } else {
720 p = new PackageSetting(name, realName, codePath, resourcePath,
Narayan Kamath4903f642014-08-11 13:33:45 +0100721 legacyNativeLibraryPathString, primaryCpuAbiString, secondaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800722 null /* cpuAbiOverrideString */, vc, pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700723 p.setTimeStamp(codePath.lastModified());
724 p.sharedUser = sharedUser;
725 // If this is not a system app, it starts out stopped.
726 if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
Kenny Root447106f2011-03-23 11:00:15 -0700727 if (DEBUG_STOPPED) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700728 RuntimeException e = new RuntimeException("here");
729 e.fillInStackTrace();
730 Slog.i(PackageManagerService.TAG, "Stopping package " + name, e);
731 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700732 List<UserInfo> users = getAllUsers();
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700733 final int installUserId = installUser != null ? installUser.getIdentifier() : 0;
Amith Yamasanif031f232012-10-26 15:35:21 -0700734 if (users != null && allowInstall) {
Amith Yamasani483f3b02012-03-13 16:08:00 -0700735 for (UserInfo user : users) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700736 // By default we consider this app to be installed
737 // for the user if no user has been specified (which
738 // means to leave it at its original value, and the
739 // original default value is true), or we are being
740 // asked to install for all users, or this is the
741 // user we are installing for.
742 final boolean installed = installUser == null
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700743 || (installUserId == UserHandle.USER_ALL
744 && !isAdbInstallDisallowed(userManager, user.id))
745 || installUserId == user.id;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700746 p.setUserState(user.id, COMPONENT_ENABLED_STATE_DEFAULT,
747 installed,
748 true, // stopped,
749 true, // notLaunched
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700750 false, // hidden
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000751 false, // suspended
Kenny Guyc13053b2014-05-29 14:17:17 +0100752 null, null, null,
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800753 false, // blockUninstall
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700754 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED, 0);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700755 writePackageRestrictionsLPr(user.id);
756 }
757 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700758 }
759 if (sharedUser != null) {
Amith Yamasani13593602012-03-22 16:16:17 -0700760 p.appId = sharedUser.userId;
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800761 } else {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700762 // Clone the setting here for disabled system packages
763 PackageSetting dis = mDisabledSysPackages.get(name);
764 if (dis != null) {
765 // For disabled packages a new setting is created
766 // from the existing user id. This still has to be
767 // added to list of user id's
768 // Copy signatures from previous setting
769 if (dis.signatures.mSignatures != null) {
770 p.signatures.mSignatures = dis.signatures.mSignatures.clone();
771 }
Amith Yamasani13593602012-03-22 16:16:17 -0700772 p.appId = dis.appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700773 // Clone permissions
Svetoslavc6d1c342015-02-26 14:44:43 -0800774 p.getPermissionsState().copyFrom(dis.getPermissionsState());
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700775 // Clone component info
Amith Yamasani483f3b02012-03-13 16:08:00 -0700776 List<UserInfo> users = getAllUsers();
777 if (users != null) {
778 for (UserInfo user : users) {
779 int userId = user.id;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700780 p.setDisabledComponentsCopy(
781 dis.getDisabledComponents(userId), userId);
782 p.setEnabledComponentsCopy(
783 dis.getEnabledComponents(userId), userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700784 }
785 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700786 // Add new setting to list of user ids
Amith Yamasani13593602012-03-22 16:16:17 -0700787 addUserIdLPw(p.appId, p, name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700788 } else {
789 // Assign new user id
Amith Yamasani13593602012-03-22 16:16:17 -0700790 p.appId = newUserIdLPw(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700791 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700792 }
793 }
Amith Yamasani13593602012-03-22 16:16:17 -0700794 if (p.appId < 0) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700795 PackageManagerService.reportSettingsProblem(Log.WARN,
796 "Package " + name + " could not be assigned a valid uid");
797 return null;
798 }
799 if (add) {
800 // Finish adding new package by adding it and updating shared
801 // user preferences
Kenny Root447106f2011-03-23 11:00:15 -0700802 addPackageSettingLPw(p, name, sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700803 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700804 } else {
Amith Yamasanif031f232012-10-26 15:35:21 -0700805 if (installUser != null && allowInstall) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700806 // The caller has explicitly specified the user they want this
807 // package installed for, and the package already exists.
808 // Make sure it conforms to the new request.
809 List<UserInfo> users = getAllUsers();
810 if (users != null) {
811 for (UserInfo user : users) {
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700812 if ((installUser.getIdentifier() == UserHandle.USER_ALL
813 && !isAdbInstallDisallowed(userManager, user.id))
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700814 || installUser.getIdentifier() == user.id) {
815 boolean installed = p.getInstalled(user.id);
816 if (!installed) {
817 p.setInstalled(true, user.id);
818 writePackageRestrictionsLPr(user.id);
819 }
820 }
821 }
822 }
823 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700824 }
825 return p;
826 }
827
Amith Yamasani8cd28b52014-06-08 17:54:27 -0700828 boolean isAdbInstallDisallowed(UserManagerService userManager, int userId) {
829 return userManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES,
830 userId);
831 }
832
Kenny Root447106f2011-03-23 11:00:15 -0700833 void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700834 p.pkg = pkg;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700835 // pkg.mSetEnabled = p.getEnabled(userId);
836 // pkg.mSetStopped = p.getStopped(userId);
Jeff Sharkeyb9f36742015-04-08 21:02:14 -0700837 final String volumeUuid = pkg.applicationInfo.volumeUuid;
Jeff Sharkeyd7460572014-07-06 20:44:55 -0700838 final String codePath = pkg.applicationInfo.getCodePath();
839 final String resourcePath = pkg.applicationInfo.getResourcePath();
Jeff Sharkey84f12942014-07-10 17:48:11 -0700840 final String legacyNativeLibraryPath = pkg.applicationInfo.nativeLibraryRootDir;
Jeff Sharkeyb9f36742015-04-08 21:02:14 -0700841 // Update volume if needed
842 if (!Objects.equals(volumeUuid, p.volumeUuid)) {
843 Slog.w(PackageManagerService.TAG, "Volume for " + p.pkg.packageName +
844 " changing from " + p.volumeUuid + " to " + volumeUuid);
845 p.volumeUuid = volumeUuid;
846 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700847 // Update code path if needed
Jeff Sharkey84f12942014-07-10 17:48:11 -0700848 if (!Objects.equals(codePath, p.codePathString)) {
Jeff Sharkeyb9f36742015-04-08 21:02:14 -0700849 Slog.w(PackageManagerService.TAG, "Code path for " + p.pkg.packageName +
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700850 " changing from " + p.codePathString + " to " + codePath);
851 p.codePath = new File(codePath);
852 p.codePathString = codePath;
853 }
854 //Update resource path if needed
Jeff Sharkey84f12942014-07-10 17:48:11 -0700855 if (!Objects.equals(resourcePath, p.resourcePathString)) {
Jeff Sharkeyb9f36742015-04-08 21:02:14 -0700856 Slog.w(PackageManagerService.TAG, "Resource path for " + p.pkg.packageName +
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700857 " changing from " + p.resourcePathString + " to " + resourcePath);
858 p.resourcePath = new File(resourcePath);
859 p.resourcePathString = resourcePath;
860 }
Narayan Kamathff110bd2014-07-04 18:30:45 +0100861 // Update the native library paths if needed
Jeff Sharkey84f12942014-07-10 17:48:11 -0700862 if (!Objects.equals(legacyNativeLibraryPath, p.legacyNativeLibraryPathString)) {
863 p.legacyNativeLibraryPathString = legacyNativeLibraryPath;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700864 }
Narayan Kamathff110bd2014-07-04 18:30:45 +0100865
Narayan Kamath9e289d72014-04-10 09:26:59 +0000866 // Update the required Cpu Abi
Narayan Kamathff110bd2014-07-04 18:30:45 +0100867 p.primaryCpuAbiString = pkg.applicationInfo.primaryCpuAbi;
868 p.secondaryCpuAbiString = pkg.applicationInfo.secondaryCpuAbi;
Narayan Kamath4903f642014-08-11 13:33:45 +0100869 p.cpuAbiOverrideString = pkg.cpuAbiOverride;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700870 // Update version code if needed
Amith Yamasani483f3b02012-03-13 16:08:00 -0700871 if (pkg.mVersionCode != p.versionCode) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700872 p.versionCode = pkg.mVersionCode;
873 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700874 // Update signatures if needed.
875 if (p.signatures.mSignatures == null) {
876 p.signatures.assignSignatures(pkg.mSignatures);
877 }
Kenny Root5455f682012-09-09 14:52:10 -0700878 // Update flags if needed.
879 if (pkg.applicationInfo.flags != p.pkgFlags) {
880 p.pkgFlags = pkg.applicationInfo.flags;
881 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700882 // If this app defines a shared user id initialize
883 // the shared user signatures as well.
884 if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) {
885 p.sharedUser.signatures.assignSignatures(pkg.mSignatures);
886 }
Kenny Root447106f2011-03-23 11:00:15 -0700887 addPackageSettingLPw(p, pkg.packageName, p.sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700888 }
889
890 // Utility method that adds a PackageSetting to mPackages and
Christopher Tate6038d152015-06-17 13:07:46 -0700891 // completes updating the shared user attributes and any restored
892 // app link verification state
Kenny Root447106f2011-03-23 11:00:15 -0700893 private void addPackageSettingLPw(PackageSetting p, String name,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700894 SharedUserSetting sharedUser) {
895 mPackages.put(name, p);
896 if (sharedUser != null) {
897 if (p.sharedUser != null && p.sharedUser != sharedUser) {
898 PackageManagerService.reportSettingsProblem(Log.ERROR,
899 "Package " + p.name + " was user "
900 + p.sharedUser + " but is now " + sharedUser
901 + "; I am not changing its files so it will probably fail!");
Ben Gruverdd72c9e2013-08-06 12:34:17 -0700902 p.sharedUser.removePackage(p);
Amith Yamasani13593602012-03-22 16:16:17 -0700903 } else if (p.appId != sharedUser.userId) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700904 PackageManagerService.reportSettingsProblem(Log.ERROR,
Amith Yamasani13593602012-03-22 16:16:17 -0700905 "Package " + p.name + " was user id " + p.appId
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700906 + " but is now user " + sharedUser
907 + " with id " + sharedUser.userId
908 + "; I am not changing its files so it will probably fail!");
909 }
910
Ben Gruverdd72c9e2013-08-06 12:34:17 -0700911 sharedUser.addPackage(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700912 p.sharedUser = sharedUser;
Amith Yamasani13593602012-03-22 16:16:17 -0700913 p.appId = sharedUser.userId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700914 }
Svet Ganove7af1942015-08-04 11:13:44 -0700915
916 // If the we know about this user id, we have to update it as it
917 // has to point to the same PackageSetting instance as the package.
918 Object userIdPs = getUserIdLPr(p.appId);
919 if (sharedUser == null) {
920 if (userIdPs != null && userIdPs != p) {
921 replaceUserIdLPw(p.appId, p);
922 }
923 } else {
924 if (userIdPs != null && userIdPs != sharedUser) {
925 replaceUserIdLPw(p.appId, sharedUser);
926 }
927 }
928
Christopher Tate6038d152015-06-17 13:07:46 -0700929 IntentFilterVerificationInfo ivi = mRestoredIntentFilterVerifications.get(name);
930 if (ivi != null) {
931 if (DEBUG_DOMAIN_VERIFICATION) {
932 Slog.i(TAG, "Applying restored IVI for " + name + " : " + ivi.getStatusString());
933 }
934 mRestoredIntentFilterVerifications.remove(name);
935 p.setIntentFilterVerificationInfo(ivi);
936 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700937 }
938
939 /*
940 * Update the shared user setting when a package using
941 * specifying the shared user id is removed. The gids
942 * associated with each permission of the deleted package
943 * are removed from the shared user's gid list only if its
944 * not in use by other permissions of packages in the
945 * shared user setting.
946 */
Svetoslavc6d1c342015-02-26 14:44:43 -0800947 int updateSharedUserPermsLPw(PackageSetting deletedPs, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -0700948 if ((deletedPs == null) || (deletedPs.pkg == null)) {
949 Slog.i(PackageManagerService.TAG,
950 "Trying to update info for null package. Just ignoring");
Svetoslavc6d1c342015-02-26 14:44:43 -0800951 return UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700952 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800953
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700954 // No sharedUserId
955 if (deletedPs.sharedUser == null) {
Svetoslavc6d1c342015-02-26 14:44:43 -0800956 return UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700957 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800958
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700959 SharedUserSetting sus = deletedPs.sharedUser;
Svetoslavc6d1c342015-02-26 14:44:43 -0800960
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700961 // Update permissions
Kenny Root447106f2011-03-23 11:00:15 -0700962 for (String eachPerm : deletedPs.pkg.requestedPermissions) {
Svetoslavc6d1c342015-02-26 14:44:43 -0800963 BasePermission bp = mPermissions.get(eachPerm);
964 if (bp == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700965 continue;
966 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800967
Svetoslavc6d1c342015-02-26 14:44:43 -0800968 // Check if another package in the shared user needs the permission.
Svetoslav4a5f4a22015-07-07 18:18:15 -0700969 boolean used = false;
Svetoslavc6d1c342015-02-26 14:44:43 -0800970 for (PackageSetting pkg : sus.packages) {
971 if (pkg.pkg != null
972 && !pkg.pkg.packageName.equals(deletedPs.pkg.packageName)
973 && pkg.pkg.requestedPermissions.contains(eachPerm)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700974 used = true;
975 break;
976 }
977 }
Svetoslav4a5f4a22015-07-07 18:18:15 -0700978 if (used) {
979 continue;
980 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800981
Svetoslav4a5f4a22015-07-07 18:18:15 -0700982 PermissionsState permissionsState = sus.getPermissionsState();
983 PackageSetting disabledPs = getDisabledSystemPkgLPr(deletedPs.pkg.packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -0700984
Svetoslav4a5f4a22015-07-07 18:18:15 -0700985 // If the package is shadowing is a disabled system package,
986 // do not drop permissions that the shadowed package requests.
987 if (disabledPs != null) {
988 boolean reqByDisabledSysPkg = false;
989 for (String permission : disabledPs.pkg.requestedPermissions) {
990 if (permission.equals(eachPerm)) {
991 reqByDisabledSysPkg = true;
992 break;
993 }
Svetoslavc6d1c342015-02-26 14:44:43 -0800994 }
Svetoslav4a5f4a22015-07-07 18:18:15 -0700995 if (reqByDisabledSysPkg) {
996 continue;
Svetoslavc6d1c342015-02-26 14:44:43 -0800997 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700998 }
Svetoslav4a5f4a22015-07-07 18:18:15 -0700999
1000 // Try to revoke as an install permission which is for all users.
1001 // The package is gone - no need to keep flags for applying policy.
1002 permissionsState.updatePermissionFlags(bp, userId,
1003 PackageManager.MASK_PERMISSION_FLAGS, 0);
1004
1005 if (permissionsState.revokeInstallPermission(bp) ==
1006 PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
1007 return UserHandle.USER_ALL;
1008 }
1009
1010 // Try to revoke as an install permission which is per user.
1011 if (permissionsState.revokeRuntimePermission(bp, userId) ==
1012 PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED) {
1013 return userId;
1014 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001015 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001016
1017 return UserHandle.USER_NULL;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001018 }
1019
Kenny Root447106f2011-03-23 11:00:15 -07001020 int removePackageLPw(String name) {
1021 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001022 if (p != null) {
1023 mPackages.remove(name);
1024 if (p.sharedUser != null) {
Ben Gruverdd72c9e2013-08-06 12:34:17 -07001025 p.sharedUser.removePackage(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001026 if (p.sharedUser.packages.size() == 0) {
1027 mSharedUsers.remove(p.sharedUser.name);
Kenny Root447106f2011-03-23 11:00:15 -07001028 removeUserIdLPw(p.sharedUser.userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001029 return p.sharedUser.userId;
1030 }
1031 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07001032 removeUserIdLPw(p.appId);
1033 return p.appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001034 }
1035 }
1036 return -1;
1037 }
1038
Kenny Root447106f2011-03-23 11:00:15 -07001039 private void replacePackageLPw(String name, PackageSetting newp) {
1040 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001041 if (p != null) {
1042 if (p.sharedUser != null) {
Ben Gruverdd72c9e2013-08-06 12:34:17 -07001043 p.sharedUser.removePackage(p);
1044 p.sharedUser.addPackage(newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001045 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07001046 replaceUserIdLPw(p.appId, newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001047 }
1048 }
1049 mPackages.put(name, newp);
1050 }
1051
Kenny Root447106f2011-03-23 11:00:15 -07001052 private boolean addUserIdLPw(int uid, Object obj, Object name) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001053 if (uid > Process.LAST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001054 return false;
1055 }
1056
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001057 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001058 int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001059 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001060 while (index >= N) {
1061 mUserIds.add(null);
1062 N++;
1063 }
1064 if (mUserIds.get(index) != null) {
1065 PackageManagerService.reportSettingsProblem(Log.ERROR,
1066 "Adding duplicate user id: " + uid
1067 + " name=" + name);
1068 return false;
1069 }
1070 mUserIds.set(index, obj);
1071 } else {
1072 if (mOtherUserIds.get(uid) != null) {
1073 PackageManagerService.reportSettingsProblem(Log.ERROR,
1074 "Adding duplicate shared id: " + uid
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001075 + " name=" + name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001076 return false;
1077 }
1078 mOtherUserIds.put(uid, obj);
1079 }
1080 return true;
1081 }
1082
Kenny Root447106f2011-03-23 11:00:15 -07001083 public Object getUserIdLPr(int uid) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001084 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001085 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001086 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001087 return index < N ? mUserIds.get(index) : null;
1088 } else {
1089 return mOtherUserIds.get(uid);
1090 }
1091 }
1092
Kenny Root447106f2011-03-23 11:00:15 -07001093 private void removeUserIdLPw(int uid) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001094 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001095 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001096 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001097 if (index < N) mUserIds.set(index, null);
1098 } else {
1099 mOtherUserIds.remove(uid);
1100 }
Geremy Condra12c18382013-03-06 16:49:06 -08001101 setFirstAvailableUid(uid+1);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001102 }
1103
Kenny Root447106f2011-03-23 11:00:15 -07001104 private void replaceUserIdLPw(int uid, Object obj) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001105 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001106 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08001107 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001108 if (index < N) mUserIds.set(index, obj);
1109 } else {
1110 mOtherUserIds.put(uid, obj);
1111 }
1112 }
1113
Dianne Hackborn63092712012-10-07 14:45:35 -07001114 PreferredIntentResolver editPreferredActivitiesLPw(int userId) {
1115 PreferredIntentResolver pir = mPreferredActivities.get(userId);
1116 if (pir == null) {
1117 pir = new PreferredIntentResolver();
1118 mPreferredActivities.put(userId, pir);
1119 }
1120 return pir;
1121 }
1122
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001123 PersistentPreferredIntentResolver editPersistentPreferredActivitiesLPw(int userId) {
1124 PersistentPreferredIntentResolver ppir = mPersistentPreferredActivities.get(userId);
1125 if (ppir == null) {
1126 ppir = new PersistentPreferredIntentResolver();
1127 mPersistentPreferredActivities.put(userId, ppir);
1128 }
1129 return ppir;
1130 }
1131
Nicolas Prevot81948992014-05-16 18:25:26 +01001132 CrossProfileIntentResolver editCrossProfileIntentResolverLPw(int userId) {
1133 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(userId);
1134 if (cpir == null) {
1135 cpir = new CrossProfileIntentResolver();
1136 mCrossProfileIntentResolvers.put(userId, cpir);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001137 }
Nicolas Prevot81948992014-05-16 18:25:26 +01001138 return cpir;
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001139 }
1140
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001141 /**
1142 * The following functions suppose that you have a lock for managing access to the
1143 * mIntentFiltersVerifications map.
1144 */
1145
1146 /* package protected */
1147 IntentFilterVerificationInfo getIntentFilterVerificationLPr(String packageName) {
1148 PackageSetting ps = mPackages.get(packageName);
1149 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001150 if (DEBUG_DOMAIN_VERIFICATION) {
1151 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1152 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001153 return null;
1154 }
1155 return ps.getIntentFilterVerificationInfo();
1156 }
1157
1158 /* package protected */
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001159 IntentFilterVerificationInfo createIntentFilterVerificationIfNeededLPw(String packageName,
Fabrice Di Meglio07885952015-04-06 19:41:28 -07001160 ArrayList<String> domains) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001161 PackageSetting ps = mPackages.get(packageName);
1162 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001163 if (DEBUG_DOMAIN_VERIFICATION) {
1164 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1165 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001166 return null;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001167 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001168 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1169 if (ivi == null) {
1170 ivi = new IntentFilterVerificationInfo(packageName, domains);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001171 ps.setIntentFilterVerificationInfo(ivi);
Christopher Tate72c10a22015-06-12 18:31:24 -07001172 if (DEBUG_DOMAIN_VERIFICATION) {
1173 Slog.d(PackageManagerService.TAG,
1174 "Creating new IntentFilterVerificationInfo for pkg: " + packageName);
1175 }
Fabrice Di Meglio1de3f0d2015-04-29 19:42:41 -07001176 } else {
1177 ivi.setDomains(domains);
Christopher Tate72c10a22015-06-12 18:31:24 -07001178 if (DEBUG_DOMAIN_VERIFICATION) {
1179 Slog.d(PackageManagerService.TAG,
1180 "Setting domains to existing IntentFilterVerificationInfo for pkg: " +
1181 packageName + " and with domains: " + ivi.getDomainsString());
1182 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001183 }
Fabrice Di Meglio7d014ce2015-04-08 16:17:46 -07001184 return ivi;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001185 }
1186
1187 int getIntentFilterVerificationStatusLPr(String packageName, int userId) {
1188 PackageSetting ps = mPackages.get(packageName);
1189 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001190 if (DEBUG_DOMAIN_VERIFICATION) {
1191 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1192 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001193 return INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
1194 }
Christopher Tated85a6642015-07-17 15:39:08 -07001195 return (int)(ps.getDomainVerificationStatusForUser(userId) >> 32);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001196 }
1197
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001198 boolean updateIntentFilterVerificationStatusLPw(String packageName, final int status, int userId) {
Fabrice Di Meglio07885952015-04-06 19:41:28 -07001199 // Update the status for the current package
1200 PackageSetting current = mPackages.get(packageName);
1201 if (current == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001202 if (DEBUG_DOMAIN_VERIFICATION) {
1203 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1204 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001205 return false;
1206 }
Christopher Tate050aee22015-07-01 16:50:43 -07001207
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001208 final int alwaysGeneration;
1209 if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
1210 alwaysGeneration = mNextAppLinkGeneration.get(userId) + 1;
1211 mNextAppLinkGeneration.put(userId, alwaysGeneration);
1212 } else {
1213 alwaysGeneration = 0;
1214 }
1215
1216 current.setDomainVerificationStatusForUser(status, alwaysGeneration, userId);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001217 return true;
1218 }
1219
1220 /**
Fabrice Di Meglio07885952015-04-06 19:41:28 -07001221 * Used for Settings App and PackageManagerService dump. Should be read only.
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001222 */
1223 List<IntentFilterVerificationInfo> getIntentFilterVerificationsLPr(
1224 String packageName) {
1225 if (packageName == null) {
1226 return Collections.<IntentFilterVerificationInfo>emptyList();
1227 }
1228 ArrayList<IntentFilterVerificationInfo> result = new ArrayList<>();
1229 for (PackageSetting ps : mPackages.values()) {
1230 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1231 if (ivi == null || TextUtils.isEmpty(ivi.getPackageName()) ||
1232 !ivi.getPackageName().equalsIgnoreCase(packageName)) {
1233 continue;
1234 }
1235 result.add(ivi);
1236 }
1237 return result;
1238 }
1239
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001240 boolean removeIntentFilterVerificationLPw(String packageName, int userId) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001241 PackageSetting ps = mPackages.get(packageName);
1242 if (ps == null) {
Christopher Tate72c10a22015-06-12 18:31:24 -07001243 if (DEBUG_DOMAIN_VERIFICATION) {
1244 Slog.w(PackageManagerService.TAG, "No package known: " + packageName);
1245 }
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001246 return false;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001247 }
1248 ps.clearDomainVerificationStatusForUser(userId);
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001249 return true;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001250 }
1251
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001252 boolean removeIntentFilterVerificationLPw(String packageName, int[] userIds) {
1253 boolean result = false;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001254 for (int userId : userIds) {
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001255 result |= removeIntentFilterVerificationLPw(packageName, userId);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001256 }
Fabrice Di Meglio1f09b8c2015-05-06 18:51:21 -07001257 return result;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001258 }
1259
Christopher Tatedb3fe812015-06-24 16:15:48 -07001260 boolean setDefaultBrowserPackageNameLPw(String packageName, int userId) {
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001261 if (userId == UserHandle.USER_ALL) {
1262 return false;
1263 }
1264 mDefaultBrowserApp.put(userId, packageName);
1265 writePackageRestrictionsLPr(userId);
1266 return true;
1267 }
1268
1269 String getDefaultBrowserPackageNameLPw(int userId) {
1270 return (userId == UserHandle.USER_ALL) ? null : mDefaultBrowserApp.get(userId);
1271 }
1272
Amith Yamasani483f3b02012-03-13 16:08:00 -07001273 private File getUserPackagesStateFile(int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08001274 // TODO: Implement a cleaner solution when adding tests.
1275 // This instead of Environment.getUserSystemDirectory(userId) to support testing.
1276 File userDir = new File(new File(mSystemDir, "users"), Integer.toString(userId));
1277 return new File(userDir, "package-restrictions.xml");
1278 }
1279
1280 private File getUserRuntimePermissionsFile(int userId) {
1281 // TODO: Implement a cleaner solution when adding tests.
1282 // This instead of Environment.getUserSystemDirectory(userId) to support testing.
1283 File userDir = new File(new File(mSystemDir, "users"), Integer.toString(userId));
1284 return new File(userDir, RUNTIME_PERMISSIONS_FILE_NAME);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001285 }
1286
1287 private File getUserPackagesStateBackupFile(int userId) {
Amith Yamasani61f57372012-08-31 12:12:28 -07001288 return new File(Environment.getUserSystemDirectory(userId),
1289 "package-restrictions-backup.xml");
Amith Yamasani483f3b02012-03-13 16:08:00 -07001290 }
1291
1292 void writeAllUsersPackageRestrictionsLPr() {
1293 List<UserInfo> users = getAllUsers();
1294 if (users == null) return;
1295
1296 for (UserInfo user : users) {
1297 writePackageRestrictionsLPr(user.id);
1298 }
1299 }
1300
Svetoslavc6d1c342015-02-26 14:44:43 -08001301 void writeAllRuntimePermissionsLPr() {
1302 for (int userId : UserManagerService.getInstance().getUserIds()) {
1303 mRuntimePermissionsPersistence.writePermissionsForUserAsyncLPr(userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001304 }
1305 }
1306
Svet Ganovba3ba812015-06-26 10:54:06 -07001307 boolean areDefaultRuntimePermissionsGrantedLPr(int userId) {
1308 return mRuntimePermissionsPersistence
1309 .areDefaultRuntimPermissionsGrantedLPr(userId);
1310 }
1311
1312 void onDefaultRuntimePermissionsGrantedLPr(int userId) {
1313 mRuntimePermissionsPersistence
1314 .onDefaultRuntimePermissionsGrantedLPr(userId);
1315 }
1316
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001317 public VersionInfo findOrCreateVersion(String volumeUuid) {
1318 VersionInfo ver = mVersion.get(volumeUuid);
1319 if (ver == null) {
1320 ver = new VersionInfo();
1321 ver.forceCurrent();
1322 mVersion.put(volumeUuid, ver);
1323 }
1324 return ver;
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001325 }
1326
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001327 public VersionInfo getInternalVersion() {
1328 return mVersion.get(StorageManager.UUID_PRIVATE_INTERNAL);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001329 }
1330
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001331 public VersionInfo getExternalVersion() {
1332 return mVersion.get(StorageManager.UUID_PRIMARY_PHYSICAL);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001333 }
1334
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07001335 public void onVolumeForgotten(String fsUuid) {
1336 mVersion.remove(fsUuid);
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07001337 }
1338
Christopher Tatee012a232015-04-01 17:18:50 -07001339 /**
1340 * Applies the preferred activity state described by the given XML. This code
1341 * also supports the restore-from-backup code path.
1342 *
1343 * @see PreferredActivityBackupHelper
1344 */
1345 void readPreferredActivitiesLPw(XmlPullParser parser, int userId)
Dianne Hackborn63092712012-10-07 14:45:35 -07001346 throws XmlPullParserException, IOException {
1347 int outerDepth = parser.getDepth();
1348 int type;
1349 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1350 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1351 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1352 continue;
1353 }
1354
1355 String tagName = parser.getName();
1356 if (tagName.equals(TAG_ITEM)) {
1357 PreferredActivity pa = new PreferredActivity(parser);
1358 if (pa.mPref.getParseError() == null) {
1359 editPreferredActivitiesLPw(userId).addFilter(pa);
1360 } else {
1361 PackageManagerService.reportSettingsProblem(Log.WARN,
1362 "Error in package manager settings: <preferred-activity> "
1363 + pa.mPref.getParseError() + " at "
1364 + parser.getPositionDescription());
1365 }
1366 } else {
1367 PackageManagerService.reportSettingsProblem(Log.WARN,
1368 "Unknown element under <preferred-activities>: " + parser.getName());
1369 XmlUtils.skipCurrentTag(parser);
1370 }
1371 }
1372 }
1373
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001374 private void readPersistentPreferredActivitiesLPw(XmlPullParser parser, int userId)
1375 throws XmlPullParserException, IOException {
1376 int outerDepth = parser.getDepth();
1377 int type;
1378 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1379 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1380 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1381 continue;
1382 }
1383 String tagName = parser.getName();
1384 if (tagName.equals(TAG_ITEM)) {
1385 PersistentPreferredActivity ppa = new PersistentPreferredActivity(parser);
1386 editPersistentPreferredActivitiesLPw(userId).addFilter(ppa);
1387 } else {
1388 PackageManagerService.reportSettingsProblem(Log.WARN,
Sander Alewijnseaf597622014-03-20 18:44:57 +00001389 "Unknown element under <" + TAG_PERSISTENT_PREFERRED_ACTIVITIES + ">: "
1390 + parser.getName());
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001391 XmlUtils.skipCurrentTag(parser);
1392 }
1393 }
1394 }
1395
Nicolas Prevot81948992014-05-16 18:25:26 +01001396 private void readCrossProfileIntentFiltersLPw(XmlPullParser parser, int userId)
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001397 throws XmlPullParserException, IOException {
1398 int outerDepth = parser.getDepth();
1399 int type;
1400 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1401 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1402 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1403 continue;
1404 }
Christopher Tate6038d152015-06-17 13:07:46 -07001405 final String tagName = parser.getName();
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001406 if (tagName.equals(TAG_ITEM)) {
Nicolas Prevot81948992014-05-16 18:25:26 +01001407 CrossProfileIntentFilter cpif = new CrossProfileIntentFilter(parser);
1408 editCrossProfileIntentResolverLPw(userId).addFilter(cpif);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001409 } else {
Nicolas Prevot81948992014-05-16 18:25:26 +01001410 String msg = "Unknown element under " + TAG_CROSS_PROFILE_INTENT_FILTERS + ": " +
Christopher Tate6038d152015-06-17 13:07:46 -07001411 tagName;
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001412 PackageManagerService.reportSettingsProblem(Log.WARN, msg);
1413 XmlUtils.skipCurrentTag(parser);
1414 }
1415 }
1416 }
1417
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001418 private void readDomainVerificationLPw(XmlPullParser parser, PackageSettingBase packageSetting)
1419 throws XmlPullParserException, IOException {
1420 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1421 packageSetting.setIntentFilterVerificationInfo(ivi);
Jeff Sharkeye06b4d12016-01-06 14:51:50 -07001422 Log.d(TAG, "Read domain verification for package: " + ivi.getPackageName());
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001423 }
1424
Christopher Tate6038d152015-06-17 13:07:46 -07001425 private void readRestoredIntentFilterVerifications(XmlPullParser parser)
1426 throws XmlPullParserException, IOException {
1427 int outerDepth = parser.getDepth();
1428 int type;
1429 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1430 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1431 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1432 continue;
1433 }
1434 final String tagName = parser.getName();
1435 if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
1436 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1437 if (DEBUG_DOMAIN_VERIFICATION) {
1438 Slog.i(TAG, "Restored IVI for " + ivi.getPackageName()
1439 + " status=" + ivi.getStatusString());
1440 }
1441 mRestoredIntentFilterVerifications.put(ivi.getPackageName(), ivi);
1442 } else {
1443 Slog.w(TAG, "Unknown element: " + tagName);
1444 XmlUtils.skipCurrentTag(parser);
1445 }
1446 }
1447 }
1448
1449 void readDefaultAppsLPw(XmlPullParser parser, int userId)
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001450 throws XmlPullParserException, IOException {
1451 int outerDepth = parser.getDepth();
1452 int type;
1453 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1454 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1455 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1456 continue;
1457 }
1458 String tagName = parser.getName();
1459 if (tagName.equals(TAG_DEFAULT_BROWSER)) {
1460 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
1461 mDefaultBrowserApp.put(userId, packageName);
1462 } else {
1463 String msg = "Unknown element under " + TAG_DEFAULT_APPS + ": " +
1464 parser.getName();
1465 PackageManagerService.reportSettingsProblem(Log.WARN, msg);
1466 XmlUtils.skipCurrentTag(parser);
1467 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001468 }
1469 }
1470
Amith Yamasani483f3b02012-03-13 16:08:00 -07001471 void readPackageRestrictionsLPr(int userId) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001472 if (DEBUG_MU) {
1473 Log.i(TAG, "Reading package restrictions for user=" + userId);
1474 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07001475 FileInputStream str = null;
1476 File userPackagesStateFile = getUserPackagesStateFile(userId);
1477 File backupFile = getUserPackagesStateBackupFile(userId);
1478 if (backupFile.exists()) {
1479 try {
1480 str = new FileInputStream(backupFile);
1481 mReadMessages.append("Reading from backup stopped packages file\n");
1482 PackageManagerService.reportSettingsProblem(Log.INFO,
1483 "Need to read from backup stopped packages file");
1484 if (userPackagesStateFile.exists()) {
1485 // If both the backup and normal file exist, we
1486 // ignore the normal one since it might have been
1487 // corrupted.
1488 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
1489 + userPackagesStateFile);
1490 userPackagesStateFile.delete();
1491 }
1492 } catch (java.io.IOException e) {
1493 // We'll try for the normal settings file.
1494 }
1495 }
1496
1497 try {
1498 if (str == null) {
1499 if (!userPackagesStateFile.exists()) {
1500 mReadMessages.append("No stopped packages file found\n");
1501 PackageManagerService.reportSettingsProblem(Log.INFO,
1502 "No stopped packages file; "
1503 + "assuming all started");
1504 // At first boot, make sure no packages are stopped.
1505 // We usually want to have third party apps initialize
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001506 // in the stopped state, but not at first boot. Also
1507 // consider all applications to be installed.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001508 for (PackageSetting pkg : mPackages.values()) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001509 pkg.setUserState(userId, COMPONENT_ENABLED_STATE_DEFAULT,
1510 true, // installed
1511 false, // stopped
1512 false, // notLaunched
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001513 false, // hidden
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00001514 false, // suspended
Kenny Guyc13053b2014-05-29 14:17:17 +01001515 null, null, null,
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001516 false, // blockUninstall
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001517 INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED, 0);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001518 }
1519 return;
1520 }
1521 str = new FileInputStream(userPackagesStateFile);
1522 }
1523 final XmlPullParser parser = Xml.newPullParser();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01001524 parser.setInput(str, StandardCharsets.UTF_8.name());
Amith Yamasani483f3b02012-03-13 16:08:00 -07001525
1526 int type;
1527 while ((type=parser.next()) != XmlPullParser.START_TAG
1528 && type != XmlPullParser.END_DOCUMENT) {
1529 ;
1530 }
1531
1532 if (type != XmlPullParser.START_TAG) {
1533 mReadMessages.append("No start tag found in package restrictions file\n");
1534 PackageManagerService.reportSettingsProblem(Log.WARN,
1535 "No start tag found in package manager stopped packages");
1536 return;
1537 }
1538
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001539 int maxAppLinkGeneration = 0;
1540
Amith Yamasani483f3b02012-03-13 16:08:00 -07001541 int outerDepth = parser.getDepth();
1542 PackageSetting ps = null;
1543 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1544 && (type != XmlPullParser.END_TAG
1545 || parser.getDepth() > outerDepth)) {
1546 if (type == XmlPullParser.END_TAG
1547 || type == XmlPullParser.TEXT) {
1548 continue;
1549 }
1550
1551 String tagName = parser.getName();
1552 if (tagName.equals(TAG_PACKAGE)) {
1553 String name = parser.getAttributeValue(null, ATTR_NAME);
1554 ps = mPackages.get(name);
1555 if (ps == null) {
Jeff Sharkeye06b4d12016-01-06 14:51:50 -07001556 Slog.w(PackageManagerService.TAG, "No package known for stopped package "
Amith Yamasani483f3b02012-03-13 16:08:00 -07001557 + name);
1558 XmlUtils.skipCurrentTag(parser);
1559 continue;
1560 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001561 final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
1562 final int enabled = enabledStr == null
1563 ? COMPONENT_ENABLED_STATE_DEFAULT : Integer.parseInt(enabledStr);
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07001564 final String enabledCaller = parser.getAttributeValue(null,
1565 ATTR_ENABLED_CALLER);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001566 final String installedStr = parser.getAttributeValue(null, ATTR_INSTALLED);
1567 final boolean installed = installedStr == null
1568 ? true : Boolean.parseBoolean(installedStr);
1569 final String stoppedStr = parser.getAttributeValue(null, ATTR_STOPPED);
1570 final boolean stopped = stoppedStr == null
1571 ? false : Boolean.parseBoolean(stoppedStr);
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001572 // For backwards compatibility with the previous name of "blocked", which
1573 // now means hidden, read the old attribute as well.
Amith Yamasani655d0e22013-06-12 14:19:10 -07001574 final String blockedStr = parser.getAttributeValue(null, ATTR_BLOCKED);
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001575 boolean hidden = blockedStr == null
Amith Yamasani655d0e22013-06-12 14:19:10 -07001576 ? false : Boolean.parseBoolean(blockedStr);
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001577 final String hiddenStr = parser.getAttributeValue(null, ATTR_HIDDEN);
1578 hidden = hiddenStr == null
1579 ? hidden : Boolean.parseBoolean(hiddenStr);
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00001580 final String suspendedStr = parser.getAttributeValue(null, ATTR_SUSPENDED);
1581 final boolean suspended = suspendedStr == null
1582 ? false : Boolean.parseBoolean(suspendedStr);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001583 final String notLaunchedStr = parser.getAttributeValue(null, ATTR_NOT_LAUNCHED);
1584 final boolean notLaunched = stoppedStr == null
1585 ? false : Boolean.parseBoolean(notLaunchedStr);
Kenny Guyc13053b2014-05-29 14:17:17 +01001586 final String blockUninstallStr = parser.getAttributeValue(null,
1587 ATTR_BLOCK_UNINSTALL);
1588 final boolean blockUninstall = blockUninstallStr == null
1589 ? false : Boolean.parseBoolean(blockUninstallStr);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001590
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001591 final String verifStateStr =
1592 parser.getAttributeValue(null, ATTR_DOMAIN_VERIFICATON_STATE);
1593 final int verifState = (verifStateStr == null) ?
1594 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED :
1595 Integer.parseInt(verifStateStr);
1596
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001597 final String linkGenStr = parser.getAttributeValue(null, ATTR_APP_LINK_GENERATION);
1598 final int linkGeneration = linkGenStr == null ? 0 : Integer.parseInt(linkGenStr);
1599 if (linkGeneration > maxAppLinkGeneration) {
1600 maxAppLinkGeneration = linkGeneration;
1601 }
1602
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001603 ArraySet<String> enabledComponents = null;
1604 ArraySet<String> disabledComponents = null;
Amith Yamasani483f3b02012-03-13 16:08:00 -07001605
1606 int packageDepth = parser.getDepth();
1607 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1608 && (type != XmlPullParser.END_TAG
1609 || parser.getDepth() > packageDepth)) {
1610 if (type == XmlPullParser.END_TAG
1611 || type == XmlPullParser.TEXT) {
1612 continue;
1613 }
1614 tagName = parser.getName();
1615 if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001616 enabledComponents = readComponentsLPr(parser);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001617 } else if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001618 disabledComponents = readComponentsLPr(parser);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001619 }
1620 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001621
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001622 ps.setUserState(userId, enabled, installed, stopped, notLaunched, hidden,
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00001623 suspended, enabledCaller, enabledComponents, disabledComponents,
1624 blockUninstall, verifState, linkGeneration);
Dianne Hackborn63092712012-10-07 14:45:35 -07001625 } else if (tagName.equals("preferred-activities")) {
1626 readPreferredActivitiesLPw(parser, userId);
Sander Alewijnseaf597622014-03-20 18:44:57 +00001627 } else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) {
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001628 readPersistentPreferredActivitiesLPw(parser, userId);
Nicolas Prevot29762c32014-07-29 18:51:32 +01001629 } else if (tagName.equals(TAG_CROSS_PROFILE_INTENT_FILTERS)) {
Nicolas Prevot81948992014-05-16 18:25:26 +01001630 readCrossProfileIntentFiltersLPw(parser, userId);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001631 } else if (tagName.equals(TAG_DEFAULT_APPS)) {
1632 readDefaultAppsLPw(parser, userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001633 } else {
1634 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
1635 + parser.getName());
1636 XmlUtils.skipCurrentTag(parser);
1637 }
1638 }
1639
1640 str.close();
1641
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001642 mNextAppLinkGeneration.put(userId, maxAppLinkGeneration + 1);
1643
Amith Yamasani483f3b02012-03-13 16:08:00 -07001644 } catch (XmlPullParserException e) {
1645 mReadMessages.append("Error reading: " + e.toString());
1646 PackageManagerService.reportSettingsProblem(Log.ERROR,
1647 "Error reading stopped packages: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07001648 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
1649 e);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001650
1651 } catch (java.io.IOException e) {
1652 mReadMessages.append("Error reading: " + e.toString());
1653 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07001654 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
1655 e);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001656 }
1657 }
1658
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001659 private ArraySet<String> readComponentsLPr(XmlPullParser parser)
Amith Yamasani483f3b02012-03-13 16:08:00 -07001660 throws IOException, XmlPullParserException {
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001661 ArraySet<String> components = null;
Amith Yamasani483f3b02012-03-13 16:08:00 -07001662 int type;
1663 int outerDepth = parser.getDepth();
1664 String tagName;
1665 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1666 && (type != XmlPullParser.END_TAG
1667 || parser.getDepth() > outerDepth)) {
1668 if (type == XmlPullParser.END_TAG
1669 || type == XmlPullParser.TEXT) {
1670 continue;
1671 }
1672 tagName = parser.getName();
1673 if (tagName.equals(TAG_ITEM)) {
1674 String componentName = parser.getAttributeValue(null, ATTR_NAME);
1675 if (componentName != null) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001676 if (components == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -07001677 components = new ArraySet<String>();
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001678 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07001679 components.add(componentName);
1680 }
1681 }
1682 }
1683 return components;
1684 }
1685
Christopher Tatee012a232015-04-01 17:18:50 -07001686 /**
1687 * Record the state of preferred activity configuration into XML. This is used both
1688 * for recording packages.xml internally and for supporting backup/restore of the
1689 * preferred activity configuration.
1690 */
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08001691 void writePreferredActivitiesLPr(XmlSerializer serializer, int userId, boolean full)
Dianne Hackborn63092712012-10-07 14:45:35 -07001692 throws IllegalArgumentException, IllegalStateException, IOException {
1693 serializer.startTag(null, "preferred-activities");
1694 PreferredIntentResolver pir = mPreferredActivities.get(userId);
1695 if (pir != null) {
1696 for (final PreferredActivity pa : pir.filterSet()) {
1697 serializer.startTag(null, TAG_ITEM);
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08001698 pa.writeToXml(serializer, full);
Dianne Hackborn63092712012-10-07 14:45:35 -07001699 serializer.endTag(null, TAG_ITEM);
1700 }
1701 }
1702 serializer.endTag(null, "preferred-activities");
1703 }
1704
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001705 void writePersistentPreferredActivitiesLPr(XmlSerializer serializer, int userId)
1706 throws IllegalArgumentException, IllegalStateException, IOException {
Sander Alewijnseaf597622014-03-20 18:44:57 +00001707 serializer.startTag(null, TAG_PERSISTENT_PREFERRED_ACTIVITIES);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001708 PersistentPreferredIntentResolver ppir = mPersistentPreferredActivities.get(userId);
1709 if (ppir != null) {
1710 for (final PersistentPreferredActivity ppa : ppir.filterSet()) {
1711 serializer.startTag(null, TAG_ITEM);
1712 ppa.writeToXml(serializer);
1713 serializer.endTag(null, TAG_ITEM);
1714 }
1715 }
Sander Alewijnseaf597622014-03-20 18:44:57 +00001716 serializer.endTag(null, TAG_PERSISTENT_PREFERRED_ACTIVITIES);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001717 }
1718
Nicolas Prevot81948992014-05-16 18:25:26 +01001719 void writeCrossProfileIntentFiltersLPr(XmlSerializer serializer, int userId)
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001720 throws IllegalArgumentException, IllegalStateException, IOException {
Nicolas Prevot81948992014-05-16 18:25:26 +01001721 serializer.startTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
1722 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(userId);
1723 if (cpir != null) {
1724 for (final CrossProfileIntentFilter cpif : cpir.filterSet()) {
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001725 serializer.startTag(null, TAG_ITEM);
Nicolas Prevot81948992014-05-16 18:25:26 +01001726 cpif.writeToXml(serializer);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001727 serializer.endTag(null, TAG_ITEM);
1728 }
1729 }
Nicolas Prevot81948992014-05-16 18:25:26 +01001730 serializer.endTag(null, TAG_CROSS_PROFILE_INTENT_FILTERS);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001731 }
1732
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001733 void writeDomainVerificationsLPr(XmlSerializer serializer,
1734 IntentFilterVerificationInfo verificationInfo)
1735 throws IllegalArgumentException, IllegalStateException, IOException {
1736 if (verificationInfo != null && verificationInfo.getPackageName() != null) {
1737 serializer.startTag(null, TAG_DOMAIN_VERIFICATION);
1738 verificationInfo.writeToXml(serializer);
Christopher Tate72c10a22015-06-12 18:31:24 -07001739 if (DEBUG_DOMAIN_VERIFICATION) {
1740 Slog.d(TAG, "Wrote domain verification for package: "
1741 + verificationInfo.getPackageName());
1742 }
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001743 serializer.endTag(null, TAG_DOMAIN_VERIFICATION);
1744 }
1745 }
1746
Christopher Tate6038d152015-06-17 13:07:46 -07001747 // Specifically for backup/restore
1748 void writeAllDomainVerificationsLPr(XmlSerializer serializer, int userId)
1749 throws IllegalArgumentException, IllegalStateException, IOException {
1750 serializer.startTag(null, TAG_ALL_INTENT_FILTER_VERIFICATION);
1751 final int N = mPackages.size();
1752 for (int i = 0; i < N; i++) {
1753 PackageSetting ps = mPackages.valueAt(i);
1754 IntentFilterVerificationInfo ivi = ps.getIntentFilterVerificationInfo();
1755 if (ivi != null) {
1756 writeDomainVerificationsLPr(serializer, ivi);
1757 }
1758 }
1759 serializer.endTag(null, TAG_ALL_INTENT_FILTER_VERIFICATION);
1760 }
1761
1762 // Specifically for backup/restore
1763 void readAllDomainVerificationsLPr(XmlPullParser parser, int userId)
1764 throws XmlPullParserException, IOException {
1765 mRestoredIntentFilterVerifications.clear();
1766
1767 int outerDepth = parser.getDepth();
1768 int type;
1769 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1770 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1771 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1772 continue;
1773 }
1774
1775 String tagName = parser.getName();
1776 if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
1777 IntentFilterVerificationInfo ivi = new IntentFilterVerificationInfo(parser);
1778 final String pkgName = ivi.getPackageName();
1779 final PackageSetting ps = mPackages.get(pkgName);
1780 if (ps != null) {
1781 // known/existing package; update in place
1782 ps.setIntentFilterVerificationInfo(ivi);
1783 if (DEBUG_DOMAIN_VERIFICATION) {
1784 Slog.d(TAG, "Restored IVI for existing app " + pkgName
1785 + " status=" + ivi.getStatusString());
1786 }
1787 } else {
1788 mRestoredIntentFilterVerifications.put(pkgName, ivi);
1789 if (DEBUG_DOMAIN_VERIFICATION) {
1790 Slog.d(TAG, "Restored IVI for pending app " + pkgName
1791 + " status=" + ivi.getStatusString());
1792 }
1793 }
1794 } else {
1795 PackageManagerService.reportSettingsProblem(Log.WARN,
1796 "Unknown element under <all-intent-filter-verification>: "
1797 + parser.getName());
1798 XmlUtils.skipCurrentTag(parser);
1799 }
1800 }
1801 }
1802
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07001803 // Specifically for backup/restore
1804 public void processRestoredPermissionGrantLPr(String pkgName, String permission,
1805 boolean isGranted, int restoredFlagSet, int userId)
1806 throws IOException, XmlPullParserException {
1807 mRuntimePermissionsPersistence.rememberRestoredUserGrantLPr(
1808 pkgName, permission, isGranted, restoredFlagSet, userId);
1809 }
1810
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001811 void writeDefaultAppsLPr(XmlSerializer serializer, int userId)
1812 throws IllegalArgumentException, IllegalStateException, IOException {
1813 serializer.startTag(null, TAG_DEFAULT_APPS);
1814 String packageName = mDefaultBrowserApp.get(userId);
1815 if (!TextUtils.isEmpty(packageName)) {
1816 serializer.startTag(null, TAG_DEFAULT_BROWSER);
1817 serializer.attribute(null, ATTR_PACKAGE_NAME, packageName);
1818 serializer.endTag(null, TAG_DEFAULT_BROWSER);
1819 }
1820 serializer.endTag(null, TAG_DEFAULT_APPS);
1821 }
1822
Amith Yamasani483f3b02012-03-13 16:08:00 -07001823 void writePackageRestrictionsLPr(int userId) {
Amith Yamasani258848d2012-08-10 17:06:33 -07001824 if (DEBUG_MU) {
1825 Log.i(TAG, "Writing package restrictions for user=" + userId);
1826 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001827 // Keep the old stopped packages around until we know the new ones have
1828 // been successfully written.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001829 File userPackagesStateFile = getUserPackagesStateFile(userId);
1830 File backupFile = getUserPackagesStateBackupFile(userId);
1831 new File(userPackagesStateFile.getParent()).mkdirs();
1832 if (userPackagesStateFile.exists()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001833 // Presence of backup settings file indicates that we failed
1834 // to persist packages earlier. So preserve the older
1835 // backup for future reference since the current packages
1836 // might have been corrupted.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001837 if (!backupFile.exists()) {
1838 if (!userPackagesStateFile.renameTo(backupFile)) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07001839 Slog.wtf(PackageManagerService.TAG,
1840 "Unable to backup user packages state file, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001841 + "current changes will be lost at reboot");
1842 return;
1843 }
1844 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001845 userPackagesStateFile.delete();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001846 Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
1847 }
1848 }
1849
1850 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001851 final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile);
Kenny Root447106f2011-03-23 11:00:15 -07001852 final BufferedOutputStream str = new BufferedOutputStream(fstr);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001853
Kenny Root447106f2011-03-23 11:00:15 -07001854 final XmlSerializer serializer = new FastXmlSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01001855 serializer.setOutput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001856 serializer.startDocument(null, true);
1857 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
1858
Amith Yamasani483f3b02012-03-13 16:08:00 -07001859 serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001860
Kenny Root447106f2011-03-23 11:00:15 -07001861 for (final PackageSetting pkg : mPackages.values()) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001862 PackageUserState ustate = pkg.readUserState(userId);
1863 if (ustate.stopped || ustate.notLaunched || !ustate.installed
1864 || ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001865 || ustate.hidden
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00001866 || ustate.suspended
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001867 || (ustate.enabledComponents != null
1868 && ustate.enabledComponents.size() > 0)
1869 || (ustate.disabledComponents != null
Kenny Guyc13053b2014-05-29 14:17:17 +01001870 && ustate.disabledComponents.size() > 0)
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001871 || ustate.blockUninstall
1872 || (ustate.domainVerificationStatus !=
1873 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001874 serializer.startTag(null, TAG_PACKAGE);
1875 serializer.attribute(null, ATTR_NAME, pkg.name);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001876 if (DEBUG_MU) Log.i(TAG, " pkg=" + pkg.name + ", state=" + ustate.enabled);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001877
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001878 if (!ustate.installed) {
1879 serializer.attribute(null, ATTR_INSTALLED, "false");
1880 }
1881 if (ustate.stopped) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001882 serializer.attribute(null, ATTR_STOPPED, "true");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001883 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001884 if (ustate.notLaunched) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001885 serializer.attribute(null, ATTR_NOT_LAUNCHED, "true");
1886 }
Amith Yamasanie5bcff62014-07-19 15:44:09 -07001887 if (ustate.hidden) {
1888 serializer.attribute(null, ATTR_HIDDEN, "true");
Amith Yamasani655d0e22013-06-12 14:19:10 -07001889 }
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00001890 if (ustate.suspended) {
1891 serializer.attribute(null, ATTR_SUSPENDED, "true");
1892 }
Kenny Guyc13053b2014-05-29 14:17:17 +01001893 if (ustate.blockUninstall) {
1894 serializer.attribute(null, ATTR_BLOCK_UNINSTALL, "true");
1895 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001896 if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
1897 serializer.attribute(null, ATTR_ENABLED,
1898 Integer.toString(ustate.enabled));
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07001899 if (ustate.lastDisableAppCaller != null) {
1900 serializer.attribute(null, ATTR_ENABLED_CALLER,
1901 ustate.lastDisableAppCaller);
1902 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07001903 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08001904 if (ustate.domainVerificationStatus !=
1905 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED) {
1906 serializer.attribute(null, ATTR_DOMAIN_VERIFICATON_STATE,
1907 Integer.toString(ustate.domainVerificationStatus));
1908 }
Christopher Tatef0d6cb32015-07-10 17:44:53 -07001909 if (ustate.appLinkGeneration != 0) {
1910 serializer.attribute(null, ATTR_APP_LINK_GENERATION,
1911 Integer.toString(ustate.appLinkGeneration));
1912 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001913 if (ustate.enabledComponents != null
1914 && ustate.enabledComponents.size() > 0) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001915 serializer.startTag(null, TAG_ENABLED_COMPONENTS);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001916 for (final String name : ustate.enabledComponents) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001917 serializer.startTag(null, TAG_ITEM);
1918 serializer.attribute(null, ATTR_NAME, name);
1919 serializer.endTag(null, TAG_ITEM);
1920 }
1921 serializer.endTag(null, TAG_ENABLED_COMPONENTS);
1922 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001923 if (ustate.disabledComponents != null
1924 && ustate.disabledComponents.size() > 0) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001925 serializer.startTag(null, TAG_DISABLED_COMPONENTS);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001926 for (final String name : ustate.disabledComponents) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001927 serializer.startTag(null, TAG_ITEM);
1928 serializer.attribute(null, ATTR_NAME, name);
1929 serializer.endTag(null, TAG_ITEM);
1930 }
1931 serializer.endTag(null, TAG_DISABLED_COMPONENTS);
1932 }
Svetoslavc6d1c342015-02-26 14:44:43 -08001933
Amith Yamasani483f3b02012-03-13 16:08:00 -07001934 serializer.endTag(null, TAG_PACKAGE);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001935 }
1936 }
1937
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08001938 writePreferredActivitiesLPr(serializer, userId, true);
Sander Alewijnsef475ca32014-02-17 15:13:58 +00001939 writePersistentPreferredActivitiesLPr(serializer, userId);
Nicolas Prevot81948992014-05-16 18:25:26 +01001940 writeCrossProfileIntentFiltersLPr(serializer, userId);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07001941 writeDefaultAppsLPr(serializer, userId);
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00001942
Amith Yamasani483f3b02012-03-13 16:08:00 -07001943 serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001944
1945 serializer.endDocument();
1946
1947 str.flush();
1948 FileUtils.sync(fstr);
1949 str.close();
1950
1951 // New settings successfully written, old ones are no longer
1952 // needed.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001953 backupFile.delete();
1954 FileUtils.setPermissions(userPackagesStateFile.toString(),
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001955 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08001956 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001957 -1, -1);
1958
1959 // Done, all is good!
1960 return;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001961 } catch(java.io.IOException e) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07001962 Slog.wtf(PackageManagerService.TAG,
Amith Yamasani483f3b02012-03-13 16:08:00 -07001963 "Unable to write package manager user packages state, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001964 + " current changes will be lost at reboot", e);
1965 }
1966
1967 // Clean up partially written files
Amith Yamasani483f3b02012-03-13 16:08:00 -07001968 if (userPackagesStateFile.exists()) {
1969 if (!userPackagesStateFile.delete()) {
1970 Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: "
1971 + mStoppedPackagesFilename);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001972 }
1973 }
1974 }
1975
Svetoslavc6d1c342015-02-26 14:44:43 -08001976 void readInstallPermissionsLPr(XmlPullParser parser,
1977 PermissionsState permissionsState) throws IOException, XmlPullParserException {
1978 int outerDepth = parser.getDepth();
1979 int type;
1980 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1981 && (type != XmlPullParser.END_TAG
1982 || parser.getDepth() > outerDepth)) {
1983 if (type == XmlPullParser.END_TAG
1984 || type == XmlPullParser.TEXT) {
1985 continue;
1986 }
1987 String tagName = parser.getName();
1988 if (tagName.equals(TAG_ITEM)) {
1989 String name = parser.getAttributeValue(null, ATTR_NAME);
1990
1991 BasePermission bp = mPermissions.get(name);
1992 if (bp == null) {
1993 Slog.w(PackageManagerService.TAG, "Unknown permission: " + name);
1994 XmlUtils.skipCurrentTag(parser);
1995 continue;
1996 }
1997
Svet Ganov8c7f7002015-05-07 10:48:44 -07001998 String grantedStr = parser.getAttributeValue(null, ATTR_GRANTED);
1999 final boolean granted = grantedStr == null
2000 || Boolean.parseBoolean(grantedStr);
2001
2002 String flagsStr = parser.getAttributeValue(null, ATTR_FLAGS);
2003 final int flags = (flagsStr != null)
2004 ? Integer.parseInt(flagsStr, 16) : 0;
2005
2006 if (granted) {
2007 if (permissionsState.grantInstallPermission(bp) ==
2008 PermissionsState.PERMISSION_OPERATION_FAILURE) {
2009 Slog.w(PackageManagerService.TAG, "Permission already added: " + name);
2010 XmlUtils.skipCurrentTag(parser);
2011 } else {
2012 permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
2013 PackageManager.MASK_PERMISSION_FLAGS, flags);
2014 }
2015 } else {
2016 if (permissionsState.revokeInstallPermission(bp) ==
2017 PermissionsState.PERMISSION_OPERATION_FAILURE) {
2018 Slog.w(PackageManagerService.TAG, "Permission already added: " + name);
2019 XmlUtils.skipCurrentTag(parser);
2020 } else {
2021 permissionsState.updatePermissionFlags(bp, UserHandle.USER_ALL,
2022 PackageManager.MASK_PERMISSION_FLAGS, flags);
2023 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002024 }
2025 } else {
2026 Slog.w(PackageManagerService.TAG, "Unknown element under <permissions>: "
2027 + parser.getName());
2028 XmlUtils.skipCurrentTag(parser);
2029 }
2030 }
2031 }
2032
Svet Ganov8c7f7002015-05-07 10:48:44 -07002033 void writePermissionsLPr(XmlSerializer serializer, List<PermissionState> permissionStates)
Svetoslavc6d1c342015-02-26 14:44:43 -08002034 throws IOException {
Svet Ganov8c7f7002015-05-07 10:48:44 -07002035 if (permissionStates.isEmpty()) {
Svetoslavc6d1c342015-02-26 14:44:43 -08002036 return;
2037 }
2038
2039 serializer.startTag(null, TAG_PERMISSIONS);
2040
Svet Ganov8c7f7002015-05-07 10:48:44 -07002041 for (PermissionState permissionState : permissionStates) {
Svetoslavc6d1c342015-02-26 14:44:43 -08002042 serializer.startTag(null, TAG_ITEM);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002043 serializer.attribute(null, ATTR_NAME, permissionState.getName());
2044 serializer.attribute(null, ATTR_GRANTED, String.valueOf(permissionState.isGranted()));
2045 serializer.attribute(null, ATTR_FLAGS, Integer.toHexString(permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08002046 serializer.endTag(null, TAG_ITEM);
2047 }
2048
2049 serializer.endTag(null, TAG_PERMISSIONS);
2050 }
2051
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002052 // Note: assumed "stopped" field is already cleared in all packages.
Amith Yamasani483f3b02012-03-13 16:08:00 -07002053 // Legacy reader, used to read in the old file format after an upgrade. Not used after that.
Kenny Root447106f2011-03-23 11:00:15 -07002054 void readStoppedLPw() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002055 FileInputStream str = null;
2056 if (mBackupStoppedPackagesFilename.exists()) {
2057 try {
2058 str = new FileInputStream(mBackupStoppedPackagesFilename);
2059 mReadMessages.append("Reading from backup stopped packages file\n");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002060 PackageManagerService.reportSettingsProblem(Log.INFO,
2061 "Need to read from backup stopped packages file");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002062 if (mSettingsFilename.exists()) {
2063 // If both the backup and normal file exist, we
2064 // ignore the normal one since it might have been
2065 // corrupted.
2066 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
2067 + mStoppedPackagesFilename);
2068 mStoppedPackagesFilename.delete();
2069 }
2070 } catch (java.io.IOException e) {
2071 // We'll try for the normal settings file.
2072 }
2073 }
2074
2075 try {
2076 if (str == null) {
2077 if (!mStoppedPackagesFilename.exists()) {
2078 mReadMessages.append("No stopped packages file found\n");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002079 PackageManagerService.reportSettingsProblem(Log.INFO,
2080 "No stopped packages file file; assuming all started");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002081 // At first boot, make sure no packages are stopped.
2082 // We usually want to have third party apps initialize
2083 // in the stopped state, but not at first boot.
2084 for (PackageSetting pkg : mPackages.values()) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002085 pkg.setStopped(false, 0);
2086 pkg.setNotLaunched(false, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002087 }
2088 return;
2089 }
2090 str = new FileInputStream(mStoppedPackagesFilename);
2091 }
Kenny Root447106f2011-03-23 11:00:15 -07002092 final XmlPullParser parser = Xml.newPullParser();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002093 parser.setInput(str, null);
2094
2095 int type;
2096 while ((type=parser.next()) != XmlPullParser.START_TAG
2097 && type != XmlPullParser.END_DOCUMENT) {
2098 ;
2099 }
2100
2101 if (type != XmlPullParser.START_TAG) {
2102 mReadMessages.append("No start tag found in stopped packages file\n");
2103 PackageManagerService.reportSettingsProblem(Log.WARN,
2104 "No start tag found in package manager stopped packages");
2105 return;
2106 }
2107
2108 int outerDepth = parser.getDepth();
2109 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
2110 && (type != XmlPullParser.END_TAG
2111 || parser.getDepth() > outerDepth)) {
2112 if (type == XmlPullParser.END_TAG
2113 || type == XmlPullParser.TEXT) {
2114 continue;
2115 }
2116
2117 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002118 if (tagName.equals(TAG_PACKAGE)) {
2119 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002120 PackageSetting ps = mPackages.get(name);
2121 if (ps != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002122 ps.setStopped(true, 0);
2123 if ("1".equals(parser.getAttributeValue(null, ATTR_NOT_LAUNCHED))) {
2124 ps.setNotLaunched(true, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002125 }
2126 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002127 Slog.w(PackageManagerService.TAG,
Jeff Sharkeye06b4d12016-01-06 14:51:50 -07002128 "No package known for stopped package " + name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002129 }
2130 XmlUtils.skipCurrentTag(parser);
2131 } else {
2132 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
2133 + parser.getName());
2134 XmlUtils.skipCurrentTag(parser);
2135 }
2136 }
2137
2138 str.close();
2139
Amith Yamasani483f3b02012-03-13 16:08:00 -07002140 } catch (XmlPullParserException e) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002141 mReadMessages.append("Error reading: " + e.toString());
Amith Yamasani483f3b02012-03-13 16:08:00 -07002142 PackageManagerService.reportSettingsProblem(Log.ERROR,
2143 "Error reading stopped packages: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07002144 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
2145 e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002146
Amith Yamasani483f3b02012-03-13 16:08:00 -07002147 } catch (java.io.IOException e) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002148 mReadMessages.append("Error reading: " + e.toString());
2149 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07002150 Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
2151 e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002152
2153 }
2154 }
2155
Kenny Root447106f2011-03-23 11:00:15 -07002156 void writeLPr() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002157 //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
2158
2159 // Keep the old settings around until we know the new ones have
2160 // been successfully written.
2161 if (mSettingsFilename.exists()) {
2162 // Presence of backup settings file indicates that we failed
2163 // to persist settings earlier. So preserve the older
2164 // backup for future reference since the current settings
2165 // might have been corrupted.
2166 if (!mBackupSettingsFilename.exists()) {
2167 if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002168 Slog.wtf(PackageManagerService.TAG,
2169 "Unable to backup package manager settings, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002170 + " current changes will be lost at reboot");
2171 return;
2172 }
2173 } else {
2174 mSettingsFilename.delete();
2175 Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
2176 }
2177 }
2178
2179 mPastSignatures.clear();
2180
2181 try {
2182 FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
2183 BufferedOutputStream str = new BufferedOutputStream(fstr);
2184
2185 //XmlSerializer serializer = XmlUtils.serializerInstance();
2186 XmlSerializer serializer = new FastXmlSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01002187 serializer.setOutput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002188 serializer.startDocument(null, true);
2189 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
2190
2191 serializer.startTag(null, "packages");
2192
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002193 for (int i = 0; i < mVersion.size(); i++) {
2194 final String volumeUuid = mVersion.keyAt(i);
2195 final VersionInfo ver = mVersion.valueAt(i);
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002196
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002197 serializer.startTag(null, TAG_VERSION);
2198 XmlUtils.writeStringAttribute(serializer, ATTR_VOLUME_UUID, volumeUuid);
2199 XmlUtils.writeIntAttribute(serializer, ATTR_SDK_VERSION, ver.sdkVersion);
2200 XmlUtils.writeIntAttribute(serializer, ATTR_DATABASE_VERSION, ver.databaseVersion);
2201 XmlUtils.writeStringAttribute(serializer, ATTR_FINGERPRINT, ver.fingerprint);
2202 serializer.endTag(null, TAG_VERSION);
2203 }
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07002204
Kenny Root0aaa0d92011-09-12 16:42:55 -07002205 if (mVerifierDeviceIdentity != null) {
2206 serializer.startTag(null, "verifier");
2207 serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
2208 serializer.endTag(null, "verifier");
2209 }
2210
Jeff Sharkeyf5385772012-05-11 14:04:41 -07002211 if (mReadExternalStorageEnforced != null) {
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002212 serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
2213 serializer.attribute(
Jeff Sharkey5d32e772012-04-12 15:59:23 -07002214 null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0");
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002215 serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE);
2216 }
2217
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002218 serializer.startTag(null, "permission-trees");
2219 for (BasePermission bp : mPermissionTrees.values()) {
Kenny Root447106f2011-03-23 11:00:15 -07002220 writePermissionLPr(serializer, bp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002221 }
2222 serializer.endTag(null, "permission-trees");
2223
2224 serializer.startTag(null, "permissions");
2225 for (BasePermission bp : mPermissions.values()) {
Kenny Root447106f2011-03-23 11:00:15 -07002226 writePermissionLPr(serializer, bp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002227 }
2228 serializer.endTag(null, "permissions");
2229
Kenny Root447106f2011-03-23 11:00:15 -07002230 for (final PackageSetting pkg : mPackages.values()) {
2231 writePackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002232 }
2233
Kenny Root447106f2011-03-23 11:00:15 -07002234 for (final PackageSetting pkg : mDisabledSysPackages.values()) {
2235 writeDisabledSysPackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002236 }
2237
Kenny Root447106f2011-03-23 11:00:15 -07002238 for (final SharedUserSetting usr : mSharedUsers.values()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002239 serializer.startTag(null, "shared-user");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002240 serializer.attribute(null, ATTR_NAME, usr.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002241 serializer.attribute(null, "userId",
2242 Integer.toString(usr.userId));
2243 usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002244 writePermissionsLPr(serializer, usr.getPermissionsState()
2245 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002246 serializer.endTag(null, "shared-user");
2247 }
2248
2249 if (mPackagesToBeCleaned.size() > 0) {
Jeff Sharkey752cd922012-09-23 16:25:12 -07002250 for (PackageCleanItem item : mPackagesToBeCleaned) {
2251 final String userStr = Integer.toString(item.userId);
2252 serializer.startTag(null, "cleaning-package");
2253 serializer.attribute(null, ATTR_NAME, item.packageName);
2254 serializer.attribute(null, ATTR_CODE, item.andCode ? "true" : "false");
2255 serializer.attribute(null, ATTR_USER, userStr);
2256 serializer.endTag(null, "cleaning-package");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002257 }
2258 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002259
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002260 if (mRenamedPackages.size() > 0) {
Andy McFadden2f362292012-01-20 14:43:38 -08002261 for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002262 serializer.startTag(null, "renamed-package");
2263 serializer.attribute(null, "new", e.getKey());
2264 serializer.attribute(null, "old", e.getValue());
2265 serializer.endTag(null, "renamed-package");
2266 }
2267 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002268
Christopher Tate6038d152015-06-17 13:07:46 -07002269 final int numIVIs = mRestoredIntentFilterVerifications.size();
2270 if (numIVIs > 0) {
2271 if (DEBUG_DOMAIN_VERIFICATION) {
2272 Slog.i(TAG, "Writing restored-ivi entries to packages.xml");
2273 }
2274 serializer.startTag(null, "restored-ivi");
2275 for (int i = 0; i < numIVIs; i++) {
2276 IntentFilterVerificationInfo ivi = mRestoredIntentFilterVerifications.valueAt(i);
2277 writeDomainVerificationsLPr(serializer, ivi);
2278 }
2279 serializer.endTag(null, "restored-ivi");
2280 } else {
2281 if (DEBUG_DOMAIN_VERIFICATION) {
2282 Slog.i(TAG, " no restored IVI entries to write");
2283 }
2284 }
2285
dcashman55b10782014-04-09 14:20:38 -07002286 mKeySetManagerService.writeKeySetManagerServiceLPr(serializer);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002287
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002288 serializer.endTag(null, "packages");
2289
2290 serializer.endDocument();
2291
2292 str.flush();
2293 FileUtils.sync(fstr);
2294 str.close();
2295
2296 // New settings successfully written, old ones are no longer
2297 // needed.
2298 mBackupSettingsFilename.delete();
2299 FileUtils.setPermissions(mSettingsFilename.toString(),
2300 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08002301 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002302 -1, -1);
2303
Jeff Sharkey91edde22015-05-20 12:04:42 -07002304 writePackageListLPr();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002305 writeAllUsersPackageRestrictionsLPr();
Svetoslavc6d1c342015-02-26 14:44:43 -08002306 writeAllRuntimePermissionsLPr();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002307 return;
2308
2309 } catch(XmlPullParserException e) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002310 Slog.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002311 + "current changes will be lost at reboot", e);
2312 } catch(java.io.IOException e) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002313 Slog.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002314 + "current changes will be lost at reboot", e);
2315 }
2316 // Clean up partially written files
2317 if (mSettingsFilename.exists()) {
2318 if (!mSettingsFilename.delete()) {
Dianne Hackborn8d051722014-10-01 14:59:58 -07002319 Slog.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
Amith Yamasani483f3b02012-03-13 16:08:00 -07002320 + mSettingsFilename);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002321 }
2322 }
2323 //Debug.stopMethodTracing();
2324 }
2325
Jeff Sharkey91edde22015-05-20 12:04:42 -07002326 void writePackageListLPr() {
2327 writePackageListLPr(-1);
2328 }
2329
2330 void writePackageListLPr(int creatingUserId) {
2331 // Only derive GIDs for active users (not dying)
2332 final List<UserInfo> users = UserManagerService.getInstance().getUsers(true);
2333 int[] userIds = new int[users.size()];
2334 for (int i = 0; i < userIds.length; i++) {
2335 userIds[i] = users.get(i).id;
2336 }
2337 if (creatingUserId != -1) {
2338 userIds = ArrayUtils.appendInt(userIds, creatingUserId);
2339 }
2340
2341 // Write package list file now, use a JournaledFile.
2342 File tempFile = new File(mPackageListFilename.getAbsolutePath() + ".tmp");
2343 JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
2344
2345 final File writeTarget = journal.chooseForWrite();
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002346 FileOutputStream fstr;
2347 BufferedWriter writer = null;
Jeff Sharkey91edde22015-05-20 12:04:42 -07002348 try {
2349 fstr = new FileOutputStream(writeTarget);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002350 writer = new BufferedWriter(new OutputStreamWriter(fstr, Charset.defaultCharset()));
Jeff Sharkey91edde22015-05-20 12:04:42 -07002351 FileUtils.setPermissions(fstr.getFD(), 0640, SYSTEM_UID, PACKAGE_INFO_GID);
2352
2353 StringBuilder sb = new StringBuilder();
2354 for (final PackageSetting pkg : mPackages.values()) {
Jeff Sharkeye17ac152015-11-06 22:40:29 -08002355 if (pkg.pkg == null || pkg.pkg.applicationInfo == null
2356 || pkg.pkg.applicationInfo.dataDir == null) {
Jeff Sharkey91edde22015-05-20 12:04:42 -07002357 Slog.w(TAG, "Skipping " + pkg + " due to missing metadata");
2358 continue;
2359 }
2360
2361 final ApplicationInfo ai = pkg.pkg.applicationInfo;
Oleksiy Vyalov466ecdb2015-06-12 13:27:12 -07002362 final String dataPath = new File(ai.dataDir).getCanonicalPath();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002363 final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
2364 final int[] gids = pkg.getPermissionsState().computeGids(userIds);
2365
2366 // Avoid any application that has a space in its path.
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002367 if (dataPath.indexOf(' ') >= 0)
Jeff Sharkey91edde22015-05-20 12:04:42 -07002368 continue;
2369
2370 // we store on each line the following information for now:
2371 //
2372 // pkgName - package name
2373 // userId - application-specific user id
2374 // debugFlag - 0 or 1 if the package is debuggable.
2375 // dataPath - path to package's data path
2376 // seinfo - seinfo label for the app (assigned at install time)
2377 // gids - supplementary gids this app launches with
2378 //
2379 // NOTE: We prefer not to expose all ApplicationInfo flags for now.
2380 //
2381 // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
2382 // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
William Robertsdc06bb02015-07-24 10:05:06 -07002383 // frameworks/base/libs/packagelistparser
Jeff Sharkey91edde22015-05-20 12:04:42 -07002384 // system/core/run-as/run-as.c
Jeff Sharkey91edde22015-05-20 12:04:42 -07002385 //
2386 sb.setLength(0);
2387 sb.append(ai.packageName);
2388 sb.append(" ");
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002389 sb.append(ai.uid);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002390 sb.append(isDebug ? " 1 " : " 0 ");
2391 sb.append(dataPath);
2392 sb.append(" ");
2393 sb.append(ai.seinfo);
2394 sb.append(" ");
2395 if (gids != null && gids.length > 0) {
2396 sb.append(gids[0]);
2397 for (int i = 1; i < gids.length; i++) {
2398 sb.append(",");
2399 sb.append(gids[i]);
2400 }
2401 } else {
2402 sb.append("none");
2403 }
2404 sb.append("\n");
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002405 writer.append(sb);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002406 }
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002407 writer.flush();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002408 FileUtils.sync(fstr);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002409 writer.close();
Jeff Sharkey91edde22015-05-20 12:04:42 -07002410 journal.commit();
2411 } catch (Exception e) {
2412 Slog.wtf(TAG, "Failed to write packages.list", e);
Fyodor Kupolovb69056b2015-12-18 15:20:00 -08002413 IoUtils.closeQuietly(writer);
Jeff Sharkey91edde22015-05-20 12:04:42 -07002414 journal.rollback();
2415 }
2416 }
2417
Kenny Root447106f2011-03-23 11:00:15 -07002418 void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002419 throws java.io.IOException {
2420 serializer.startTag(null, "updated-package");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002421 serializer.attribute(null, ATTR_NAME, pkg.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002422 if (pkg.realName != null) {
2423 serializer.attribute(null, "realName", pkg.realName);
2424 }
2425 serializer.attribute(null, "codePath", pkg.codePathString);
2426 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
2427 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
2428 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
2429 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
2430 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
2431 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
2432 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002433 if (pkg.legacyNativeLibraryPathString != null) {
2434 serializer.attribute(null, "nativeLibraryPath", pkg.legacyNativeLibraryPathString);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002435 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002436 if (pkg.primaryCpuAbiString != null) {
2437 serializer.attribute(null, "primaryCpuAbi", pkg.primaryCpuAbiString);
Narayan Kamath9e289d72014-04-10 09:26:59 +00002438 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002439 if (pkg.secondaryCpuAbiString != null) {
2440 serializer.attribute(null, "secondaryCpuAbi", pkg.secondaryCpuAbiString);
2441 }
Narayan Kamath4903f642014-08-11 13:33:45 +01002442 if (pkg.cpuAbiOverrideString != null) {
2443 serializer.attribute(null, "cpuAbiOverride", pkg.cpuAbiOverrideString);
2444 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002445
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002446 if (pkg.sharedUser == null) {
Amith Yamasani13593602012-03-22 16:16:17 -07002447 serializer.attribute(null, "userId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002448 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07002449 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002450 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002451
2452 // If this is a shared user, the permissions will be written there.
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002453 if (pkg.sharedUser == null) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07002454 writePermissionsLPr(serializer, pkg.getPermissionsState()
2455 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002456 }
Svetoslavc6d1c342015-02-26 14:44:43 -08002457
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002458 serializer.endTag(null, "updated-package");
2459 }
2460
Kenny Root447106f2011-03-23 11:00:15 -07002461 void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002462 throws java.io.IOException {
2463 serializer.startTag(null, "package");
Amith Yamasani483f3b02012-03-13 16:08:00 -07002464 serializer.attribute(null, ATTR_NAME, pkg.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002465 if (pkg.realName != null) {
2466 serializer.attribute(null, "realName", pkg.realName);
2467 }
2468 serializer.attribute(null, "codePath", pkg.codePathString);
2469 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
2470 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
2471 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002472
2473 if (pkg.legacyNativeLibraryPathString != null) {
2474 serializer.attribute(null, "nativeLibraryPath", pkg.legacyNativeLibraryPathString);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002475 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002476 if (pkg.primaryCpuAbiString != null) {
2477 serializer.attribute(null, "primaryCpuAbi", pkg.primaryCpuAbiString);
Narayan Kamath9e289d72014-04-10 09:26:59 +00002478 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002479 if (pkg.secondaryCpuAbiString != null) {
2480 serializer.attribute(null, "secondaryCpuAbi", pkg.secondaryCpuAbiString);
2481 }
Narayan Kamath4903f642014-08-11 13:33:45 +01002482 if (pkg.cpuAbiOverrideString != null) {
2483 serializer.attribute(null, "cpuAbiOverride", pkg.cpuAbiOverrideString);
2484 }
Narayan Kamathff110bd2014-07-04 18:30:45 +01002485
Alex Klyubinb9f8a522015-02-03 11:12:59 -08002486 serializer.attribute(null, "publicFlags", Integer.toString(pkg.pkgFlags));
2487 serializer.attribute(null, "privateFlags", Integer.toString(pkg.pkgPrivateFlags));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002488 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
2489 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
2490 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
2491 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
2492 if (pkg.sharedUser == null) {
Amith Yamasani13593602012-03-22 16:16:17 -07002493 serializer.attribute(null, "userId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002494 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07002495 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002496 }
2497 if (pkg.uidError) {
2498 serializer.attribute(null, "uidError", "true");
2499 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002500 if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
2501 serializer.attribute(null, "installStatus", "false");
2502 }
2503 if (pkg.installerPackageName != null) {
2504 serializer.attribute(null, "installer", pkg.installerPackageName);
2505 }
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07002506 if (pkg.volumeUuid != null) {
2507 serializer.attribute(null, "volumeUuid", pkg.volumeUuid);
2508 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002509 pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
Svet Ganov8c7f7002015-05-07 10:48:44 -07002510
2511 writePermissionsLPr(serializer, pkg.getPermissionsState()
2512 .getInstallPermissionStates());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002513
dcashman8c04fac2015-03-23 11:39:42 -07002514 writeSigningKeySetLPr(serializer, pkg.keySetData);
dcashman55b10782014-04-09 14:20:38 -07002515 writeUpgradeKeySetsLPr(serializer, pkg.keySetData);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002516 writeKeySetAliasesLPr(serializer, pkg.keySetData);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002517 writeDomainVerificationsLPr(serializer, pkg.verificationInfo);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002518
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002519 serializer.endTag(null, "package");
2520 }
2521
dcashman8c04fac2015-03-23 11:39:42 -07002522 void writeSigningKeySetLPr(XmlSerializer serializer,
Geremy Condraf1bcca82013-01-07 22:35:24 -08002523 PackageKeySetData data) throws IOException {
dcashman8c04fac2015-03-23 11:39:42 -07002524 serializer.startTag(null, "proper-signing-keyset");
2525 serializer.attribute(null, "identifier",
2526 Long.toString(data.getProperSigningKeySet()));
2527 serializer.endTag(null, "proper-signing-keyset");
dcashman55b10782014-04-09 14:20:38 -07002528 }
2529
2530 void writeUpgradeKeySetsLPr(XmlSerializer serializer,
2531 PackageKeySetData data) throws IOException {
dcashman8c04fac2015-03-23 11:39:42 -07002532 long properSigning = data.getProperSigningKeySet();
dcashman55b10782014-04-09 14:20:38 -07002533 if (data.isUsingUpgradeKeySets()) {
2534 for (long id : data.getUpgradeKeySets()) {
2535 serializer.startTag(null, "upgrade-keyset");
2536 serializer.attribute(null, "identifier", Long.toString(id));
2537 serializer.endTag(null, "upgrade-keyset");
2538 }
Geremy Condraf1bcca82013-01-07 22:35:24 -08002539 }
2540 }
2541
2542 void writeKeySetAliasesLPr(XmlSerializer serializer,
2543 PackageKeySetData data) throws IOException {
2544 for (Map.Entry<String, Long> e: data.getAliases().entrySet()) {
2545 serializer.startTag(null, "defined-keyset");
2546 serializer.attribute(null, "alias", e.getKey());
2547 serializer.attribute(null, "identifier", Long.toString(e.getValue()));
2548 serializer.endTag(null, "defined-keyset");
2549 }
2550 }
2551
Kenny Root447106f2011-03-23 11:00:15 -07002552 void writePermissionLPr(XmlSerializer serializer, BasePermission bp)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002553 throws XmlPullParserException, java.io.IOException {
2554 if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002555 serializer.startTag(null, TAG_ITEM);
2556 serializer.attribute(null, ATTR_NAME, bp.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002557 serializer.attribute(null, "package", bp.sourcePackage);
2558 if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) {
2559 serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel));
2560 }
2561 if (PackageManagerService.DEBUG_SETTINGS)
2562 Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type="
2563 + bp.type);
2564 if (bp.type == BasePermission.TYPE_DYNAMIC) {
Kenny Root447106f2011-03-23 11:00:15 -07002565 final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002566 if (pi != null) {
2567 serializer.attribute(null, "type", "dynamic");
2568 if (pi.icon != 0) {
2569 serializer.attribute(null, "icon", Integer.toString(pi.icon));
2570 }
2571 if (pi.nonLocalizedLabel != null) {
2572 serializer.attribute(null, "label", pi.nonLocalizedLabel.toString());
2573 }
2574 }
2575 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07002576 serializer.endTag(null, TAG_ITEM);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002577 }
2578 }
2579
Kenny Root447106f2011-03-23 11:00:15 -07002580 ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() {
Jeff Sharkey9f837a92014-10-24 12:07:24 -07002581 final ArraySet<String> kList = new ArraySet<String>(mPackages.keySet());
Kenny Root447106f2011-03-23 11:00:15 -07002582 final Iterator<String> its = kList.iterator();
2583 final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002584 while (its.hasNext()) {
Kenny Root447106f2011-03-23 11:00:15 -07002585 final String key = its.next();
2586 final PackageSetting ps = mPackages.get(key);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002587 if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
2588 ret.add(ps);
2589 }
2590 }
2591 return ret;
2592 }
2593
Jeff Sharkey752cd922012-09-23 16:25:12 -07002594 void addPackageToCleanLPw(PackageCleanItem pkg) {
2595 if (!mPackagesToBeCleaned.contains(pkg)) {
2596 mPackagesToBeCleaned.add(pkg);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002597 }
2598 }
2599
Xiaohui Chen594f2082015-08-18 11:04:20 -07002600 boolean readLPw(@NonNull List<UserInfo> users) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002601 FileInputStream str = null;
2602 if (mBackupSettingsFilename.exists()) {
2603 try {
2604 str = new FileInputStream(mBackupSettingsFilename);
2605 mReadMessages.append("Reading from backup settings file\n");
2606 PackageManagerService.reportSettingsProblem(Log.INFO,
2607 "Need to read from backup settings file");
2608 if (mSettingsFilename.exists()) {
2609 // If both the backup and settings file exist, we
2610 // ignore the settings since it might have been
2611 // corrupted.
2612 Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
2613 + mSettingsFilename);
2614 mSettingsFilename.delete();
2615 }
2616 } catch (java.io.IOException e) {
2617 // We'll try for the normal settings file.
2618 }
2619 }
2620
Kenny Root447106f2011-03-23 11:00:15 -07002621 mPendingPackages.clear();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002622 mPastSignatures.clear();
dcashman8c04fac2015-03-23 11:39:42 -07002623 mKeySetRefs.clear();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002624
2625 try {
2626 if (str == null) {
2627 if (!mSettingsFilename.exists()) {
2628 mReadMessages.append("No settings file found\n");
2629 PackageManagerService.reportSettingsProblem(Log.INFO,
2630 "No settings file; creating initial state");
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002631 // It's enough to just touch version details to create them
2632 // with default values
2633 findOrCreateVersion(StorageManager.UUID_PRIVATE_INTERNAL);
2634 findOrCreateVersion(StorageManager.UUID_PRIMARY_PHYSICAL);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002635 return false;
2636 }
2637 str = new FileInputStream(mSettingsFilename);
2638 }
2639 XmlPullParser parser = Xml.newPullParser();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01002640 parser.setInput(str, StandardCharsets.UTF_8.name());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002641
2642 int type;
2643 while ((type = parser.next()) != XmlPullParser.START_TAG
2644 && type != XmlPullParser.END_DOCUMENT) {
2645 ;
2646 }
2647
2648 if (type != XmlPullParser.START_TAG) {
2649 mReadMessages.append("No start tag found in settings file\n");
2650 PackageManagerService.reportSettingsProblem(Log.WARN,
2651 "No start tag found in package manager settings");
Dianne Hackborn8d051722014-10-01 14:59:58 -07002652 Slog.wtf(PackageManagerService.TAG,
Dianne Hackborn58f42a52011-10-10 13:46:34 -07002653 "No start tag found in package manager settings");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002654 return false;
2655 }
2656
2657 int outerDepth = parser.getDepth();
2658 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2659 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2660 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2661 continue;
2662 }
2663
2664 String tagName = parser.getName();
2665 if (tagName.equals("package")) {
Kenny Root447106f2011-03-23 11:00:15 -07002666 readPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002667 } else if (tagName.equals("permissions")) {
Kenny Root447106f2011-03-23 11:00:15 -07002668 readPermissionsLPw(mPermissions, parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002669 } else if (tagName.equals("permission-trees")) {
Kenny Root447106f2011-03-23 11:00:15 -07002670 readPermissionsLPw(mPermissionTrees, parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002671 } else if (tagName.equals("shared-user")) {
Kenny Root447106f2011-03-23 11:00:15 -07002672 readSharedUserLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002673 } else if (tagName.equals("preferred-packages")) {
2674 // no longer used.
2675 } else if (tagName.equals("preferred-activities")) {
Dianne Hackborn63092712012-10-07 14:45:35 -07002676 // Upgrading from old single-user implementation;
2677 // these are the preferred activities for user 0.
2678 readPreferredActivitiesLPw(parser, 0);
Sander Alewijnseaf597622014-03-20 18:44:57 +00002679 } else if (tagName.equals(TAG_PERSISTENT_PREFERRED_ACTIVITIES)) {
Sander Alewijnsef475ca32014-02-17 15:13:58 +00002680 // TODO: check whether this is okay! as it is very
2681 // similar to how preferred-activities are treated
2682 readPersistentPreferredActivitiesLPw(parser, 0);
Nicolas Prevot29762c32014-07-29 18:51:32 +01002683 } else if (tagName.equals(TAG_CROSS_PROFILE_INTENT_FILTERS)) {
Nicolas Prevot10fa67c2014-03-24 13:44:38 +00002684 // TODO: check whether this is okay! as it is very
2685 // similar to how preferred-activities are treated
Nicolas Prevot81948992014-05-16 18:25:26 +01002686 readCrossProfileIntentFiltersLPw(parser, 0);
Fabrice Di Meglio62271722015-04-10 17:24:02 -07002687 } else if (tagName.equals(TAG_DEFAULT_BROWSER)) {
2688 readDefaultAppsLPw(parser, 0);
2689 } else if (tagName.equals("updated-package")) {
Kenny Root447106f2011-03-23 11:00:15 -07002690 readDisabledSysPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002691 } else if (tagName.equals("cleaning-package")) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002692 String name = parser.getAttributeValue(null, ATTR_NAME);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002693 String userStr = parser.getAttributeValue(null, ATTR_USER);
2694 String codeStr = parser.getAttributeValue(null, ATTR_CODE);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002695 if (name != null) {
Xiaohui Chen594f2082015-08-18 11:04:20 -07002696 int userId = UserHandle.USER_SYSTEM;
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002697 boolean andCode = true;
2698 try {
2699 if (userStr != null) {
Jeff Sharkey752cd922012-09-23 16:25:12 -07002700 userId = Integer.parseInt(userStr);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002701 }
2702 } catch (NumberFormatException e) {
2703 }
2704 if (codeStr != null) {
2705 andCode = Boolean.parseBoolean(codeStr);
2706 }
Jeff Sharkey752cd922012-09-23 16:25:12 -07002707 addPackageToCleanLPw(new PackageCleanItem(userId, name, andCode));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002708 }
2709 } else if (tagName.equals("renamed-package")) {
2710 String nname = parser.getAttributeValue(null, "new");
2711 String oname = parser.getAttributeValue(null, "old");
2712 if (nname != null && oname != null) {
2713 mRenamedPackages.put(nname, oname);
2714 }
Christopher Tate6038d152015-06-17 13:07:46 -07002715 } else if (tagName.equals("restored-ivi")) {
2716 readRestoredIntentFilterVerifications(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002717 } else if (tagName.equals("last-platform-version")) {
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002718 // Upgrade from older XML schema
2719 final VersionInfo internal = findOrCreateVersion(
2720 StorageManager.UUID_PRIVATE_INTERNAL);
2721 final VersionInfo external = findOrCreateVersion(
2722 StorageManager.UUID_PRIMARY_PHYSICAL);
Svet Ganovadc1cf42015-06-15 16:36:24 -07002723
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002724 internal.sdkVersion = XmlUtils.readIntAttribute(parser, "internal", 0);
2725 external.sdkVersion = XmlUtils.readIntAttribute(parser, "external", 0);
2726 internal.fingerprint = external.fingerprint =
2727 XmlUtils.readStringAttribute(parser, "fingerprint");
2728
Kenny Rootc1c0d3c2014-04-24 13:36:40 -07002729 } else if (tagName.equals("database-version")) {
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002730 // Upgrade from older XML schema
2731 final VersionInfo internal = findOrCreateVersion(
2732 StorageManager.UUID_PRIVATE_INTERNAL);
2733 final VersionInfo external = findOrCreateVersion(
2734 StorageManager.UUID_PRIMARY_PHYSICAL);
2735
2736 internal.databaseVersion = XmlUtils.readIntAttribute(parser, "internal", 0);
2737 external.databaseVersion = XmlUtils.readIntAttribute(parser, "external", 0);
2738
Kenny Root0aaa0d92011-09-12 16:42:55 -07002739 } else if (tagName.equals("verifier")) {
2740 final String deviceIdentity = parser.getAttributeValue(null, "device");
2741 try {
2742 mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
2743 } catch (IllegalArgumentException e) {
2744 Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
2745 + e.getMessage());
2746 }
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07002747 } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) {
2748 final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT);
Jeff Sharkey5d32e772012-04-12 15:59:23 -07002749 mReadExternalStorageEnforced = "1".equals(enforcement);
Geremy Condraf1bcca82013-01-07 22:35:24 -08002750 } else if (tagName.equals("keyset-settings")) {
dcashman8c04fac2015-03-23 11:39:42 -07002751 mKeySetManagerService.readKeySetsLPw(parser, mKeySetRefs);
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002752 } else if (TAG_VERSION.equals(tagName)) {
2753 final String volumeUuid = XmlUtils.readStringAttribute(parser,
2754 ATTR_VOLUME_UUID);
2755 final VersionInfo ver = findOrCreateVersion(volumeUuid);
2756 ver.sdkVersion = XmlUtils.readIntAttribute(parser, ATTR_SDK_VERSION);
2757 ver.databaseVersion = XmlUtils.readIntAttribute(parser, ATTR_SDK_VERSION);
2758 ver.fingerprint = XmlUtils.readStringAttribute(parser, ATTR_FINGERPRINT);
2759
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002760 } else {
2761 Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
2762 + parser.getName());
2763 XmlUtils.skipCurrentTag(parser);
2764 }
2765 }
2766
2767 str.close();
2768
2769 } catch (XmlPullParserException e) {
2770 mReadMessages.append("Error reading: " + e.toString());
2771 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07002772 Slog.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002773
2774 } catch (java.io.IOException e) {
2775 mReadMessages.append("Error reading: " + e.toString());
2776 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
Dianne Hackborn8d051722014-10-01 14:59:58 -07002777 Slog.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
Amith Yamasani258848d2012-08-10 17:06:33 -07002778 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002779
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002780 // If the build is setup to drop runtime permissions
2781 // on update drop the files before loading them.
2782 if (PackageManagerService.CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE) {
2783 final VersionInfo internal = getInternalVersion();
2784 if (!Build.FINGERPRINT.equals(internal.fingerprint)) {
Xiaohui Chen594f2082015-08-18 11:04:20 -07002785 for (UserInfo user : users) {
2786 mRuntimePermissionsPersistence.deleteUserRuntimePermissionsFile(user.id);
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07002787 }
2788 }
2789 }
2790
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002791 final int N = mPendingPackages.size();
dcashman8c04fac2015-03-23 11:39:42 -07002792
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002793 for (int i = 0; i < N; i++) {
2794 final PendingPackage pp = mPendingPackages.get(i);
Kenny Root447106f2011-03-23 11:00:15 -07002795 Object idObj = getUserIdLPr(pp.sharedId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002796 if (idObj != null && idObj instanceof SharedUserSetting) {
Kenny Root447106f2011-03-23 11:00:15 -07002797 PackageSetting p = getPackageLPw(pp.name, null, pp.realName,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002798 (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +01002799 pp.legacyNativeLibraryPathString, pp.primaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -08002800 pp.secondaryCpuAbiString, pp.versionCode, pp.pkgFlags, pp.pkgPrivateFlags,
2801 null, true /* add */, false /* allowInstall */);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002802 if (p == null) {
2803 PackageManagerService.reportSettingsProblem(Log.WARN,
2804 "Unable to create application package for " + pp.name);
2805 continue;
2806 }
2807 p.copyFrom(pp);
2808 } else if (idObj != null) {
2809 String msg = "Bad package setting: package " + pp.name + " has shared uid "
2810 + pp.sharedId + " that is not a shared uid\n";
2811 mReadMessages.append(msg);
2812 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
2813 } else {
2814 String msg = "Bad package setting: package " + pp.name + " has shared uid "
2815 + pp.sharedId + " that is not defined\n";
2816 mReadMessages.append(msg);
2817 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
2818 }
2819 }
2820 mPendingPackages.clear();
2821
Amith Yamasanif031f232012-10-26 15:35:21 -07002822 if (mBackupStoppedPackagesFilename.exists()
2823 || mStoppedPackagesFilename.exists()) {
2824 // Read old file
2825 readStoppedLPw();
2826 mBackupStoppedPackagesFilename.delete();
2827 mStoppedPackagesFilename.delete();
2828 // Migrate to new file format
Xiaohui Chen594f2082015-08-18 11:04:20 -07002829 writePackageRestrictionsLPr(UserHandle.USER_SYSTEM);
Amith Yamasanif031f232012-10-26 15:35:21 -07002830 } else {
Xiaohui Chen594f2082015-08-18 11:04:20 -07002831 for (UserInfo user : users) {
2832 readPackageRestrictionsLPr(user.id);
Amith Yamasanif031f232012-10-26 15:35:21 -07002833 }
2834 }
2835
Xiaohui Chen594f2082015-08-18 11:04:20 -07002836 for (UserInfo user : users) {
2837 mRuntimePermissionsPersistence.readStateForUserSyncLPr(user.id);
Svet Ganovadc1cf42015-06-15 16:36:24 -07002838 }
2839
Kenny Root1d1b4892011-04-08 14:25:24 -07002840 /*
2841 * Make sure all the updated system packages have their shared users
2842 * associated with them.
2843 */
2844 final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
2845 while (disabledIt.hasNext()) {
2846 final PackageSetting disabledPs = disabledIt.next();
Amith Yamasani13593602012-03-22 16:16:17 -07002847 final Object id = getUserIdLPr(disabledPs.appId);
Kenny Root1d1b4892011-04-08 14:25:24 -07002848 if (id != null && id instanceof SharedUserSetting) {
2849 disabledPs.sharedUser = (SharedUserSetting) id;
2850 }
2851 }
2852
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002853 mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
2854 + mSharedUsers.size() + " shared uids\n");
2855
2856 return true;
2857 }
2858
Christopher Tatedb3fe812015-06-24 16:15:48 -07002859 void applyDefaultPreferredAppsLPw(PackageManagerService service, int userId) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07002860 // First pull data from any pre-installed apps.
2861 for (PackageSetting ps : mPackages.values()) {
2862 if ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0 && ps.pkg != null
2863 && ps.pkg.preferredActivityFilters != null) {
2864 ArrayList<PackageParser.ActivityIntentInfo> intents
2865 = ps.pkg.preferredActivityFilters;
2866 for (int i=0; i<intents.size(); i++) {
2867 PackageParser.ActivityIntentInfo aii = intents.get(i);
2868 applyDefaultPreferredActivityLPw(service, aii, new ComponentName(
2869 ps.name, aii.activity.className), userId);
2870 }
2871 }
2872 }
2873
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07002874 // Read preferred apps from .../etc/preferred-apps directory.
2875 File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps");
2876 if (!preferredDir.exists() || !preferredDir.isDirectory()) {
2877 return;
2878 }
2879 if (!preferredDir.canRead()) {
2880 Slog.w(TAG, "Directory " + preferredDir + " cannot be read");
2881 return;
2882 }
2883
2884 // Iterate over the files in the directory and scan .xml files
2885 for (File f : preferredDir.listFiles()) {
2886 if (!f.getPath().endsWith(".xml")) {
2887 Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring");
2888 continue;
2889 }
2890 if (!f.canRead()) {
2891 Slog.w(TAG, "Preferred apps file " + f + " cannot be read");
2892 continue;
2893 }
2894
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08002895 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Reading default preferred " + f);
Fyodor Kupolovb35b34c2015-12-17 14:16:51 -08002896 InputStream str = null;
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07002897 try {
Fyodor Kupolovb35b34c2015-12-17 14:16:51 -08002898 str = new BufferedInputStream(new FileInputStream(f));
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07002899 XmlPullParser parser = Xml.newPullParser();
2900 parser.setInput(str, null);
2901
2902 int type;
2903 while ((type = parser.next()) != XmlPullParser.START_TAG
2904 && type != XmlPullParser.END_DOCUMENT) {
2905 ;
2906 }
2907
2908 if (type != XmlPullParser.START_TAG) {
2909 Slog.w(TAG, "Preferred apps file " + f + " does not have start tag");
2910 continue;
2911 }
2912 if (!"preferred-activities".equals(parser.getName())) {
2913 Slog.w(TAG, "Preferred apps file " + f
2914 + " does not start with 'preferred-activities'");
2915 continue;
2916 }
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08002917 readDefaultPreferredActivitiesLPw(service, parser, userId);
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07002918 } catch (XmlPullParserException e) {
2919 Slog.w(TAG, "Error reading apps file " + f, e);
2920 } catch (IOException e) {
2921 Slog.w(TAG, "Error reading apps file " + f, e);
2922 } finally {
2923 if (str != null) {
2924 try {
2925 str.close();
2926 } catch (IOException e) {
2927 }
2928 }
2929 }
2930 }
2931 }
2932
Dianne Hackbornb09491f2013-07-22 15:30:11 -07002933 private void applyDefaultPreferredActivityLPw(PackageManagerService service,
2934 IntentFilter tmpPa, ComponentName cn, int userId) {
2935 // The initial preferences only specify the target activity
2936 // component and intent-filter, not the set of matches. So we
2937 // now need to query for the matches to build the correct
2938 // preferred activity entry.
2939 if (PackageManagerService.DEBUG_PREFERRED) {
2940 Log.d(TAG, "Processing preferred:");
2941 tmpPa.dump(new LogPrinter(Log.DEBUG, TAG), " ");
2942 }
2943 Intent intent = new Intent();
2944 int flags = 0;
2945 intent.setAction(tmpPa.getAction(0));
2946 for (int i=0; i<tmpPa.countCategories(); i++) {
2947 String cat = tmpPa.getCategory(i);
2948 if (cat.equals(Intent.CATEGORY_DEFAULT)) {
Jeff Sharkey2a90f6732016-01-06 12:26:11 -07002949 flags |= MATCH_DEFAULT_ONLY;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07002950 } else {
2951 intent.addCategory(cat);
2952 }
2953 }
2954
2955 boolean doNonData = true;
Christopher Tate2298ef22013-11-04 17:02:10 -08002956 boolean hasSchemes = false;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07002957
2958 for (int ischeme=0; ischeme<tmpPa.countDataSchemes(); ischeme++) {
2959 boolean doScheme = true;
2960 String scheme = tmpPa.getDataScheme(ischeme);
Christopher Tate2298ef22013-11-04 17:02:10 -08002961 if (scheme != null && !scheme.isEmpty()) {
2962 hasSchemes = true;
2963 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07002964 for (int issp=0; issp<tmpPa.countDataSchemeSpecificParts(); issp++) {
2965 Uri.Builder builder = new Uri.Builder();
2966 builder.scheme(scheme);
2967 PatternMatcher ssp = tmpPa.getDataSchemeSpecificPart(issp);
2968 builder.opaquePart(ssp.getPath());
2969 Intent finalIntent = new Intent(intent);
2970 finalIntent.setData(builder.build());
2971 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07002972 scheme, ssp, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07002973 doScheme = false;
2974 }
2975 for (int iauth=0; iauth<tmpPa.countDataAuthorities(); iauth++) {
2976 boolean doAuth = true;
2977 IntentFilter.AuthorityEntry auth = tmpPa.getDataAuthority(iauth);
2978 for (int ipath=0; ipath<tmpPa.countDataPaths(); ipath++) {
2979 Uri.Builder builder = new Uri.Builder();
2980 builder.scheme(scheme);
2981 if (auth.getHost() != null) {
2982 builder.authority(auth.getHost());
2983 }
2984 PatternMatcher path = tmpPa.getDataPath(ipath);
2985 builder.path(path.getPath());
2986 Intent finalIntent = new Intent(intent);
2987 finalIntent.setData(builder.build());
2988 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07002989 scheme, null, auth, path, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07002990 doAuth = doScheme = false;
2991 }
2992 if (doAuth) {
2993 Uri.Builder builder = new Uri.Builder();
2994 builder.scheme(scheme);
2995 if (auth.getHost() != null) {
2996 builder.authority(auth.getHost());
2997 }
2998 Intent finalIntent = new Intent(intent);
2999 finalIntent.setData(builder.build());
3000 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003001 scheme, null, auth, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003002 doScheme = false;
3003 }
3004 }
3005 if (doScheme) {
3006 Uri.Builder builder = new Uri.Builder();
3007 builder.scheme(scheme);
3008 Intent finalIntent = new Intent(intent);
3009 finalIntent.setData(builder.build());
3010 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003011 scheme, null, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003012 }
3013 doNonData = false;
3014 }
3015
3016 for (int idata=0; idata<tmpPa.countDataTypes(); idata++) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003017 String mimeType = tmpPa.getDataType(idata);
Christopher Tate2298ef22013-11-04 17:02:10 -08003018 if (hasSchemes) {
3019 Uri.Builder builder = new Uri.Builder();
3020 for (int ischeme=0; ischeme<tmpPa.countDataSchemes(); ischeme++) {
3021 String scheme = tmpPa.getDataScheme(ischeme);
3022 if (scheme != null && !scheme.isEmpty()) {
3023 Intent finalIntent = new Intent(intent);
3024 builder.scheme(scheme);
3025 finalIntent.setDataAndType(builder.build(), mimeType);
3026 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003027 scheme, null, null, null, userId);
Christopher Tate2298ef22013-11-04 17:02:10 -08003028 }
3029 }
3030 } else {
3031 Intent finalIntent = new Intent(intent);
3032 finalIntent.setType(mimeType);
3033 applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003034 null, null, null, null, userId);
Christopher Tate2298ef22013-11-04 17:02:10 -08003035 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003036 doNonData = false;
3037 }
3038
3039 if (doNonData) {
3040 applyDefaultPreferredActivityLPw(service, intent, flags, cn,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003041 null, null, null, null, userId);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003042 }
3043 }
3044
3045 private void applyDefaultPreferredActivityLPw(PackageManagerService service,
3046 Intent intent, int flags, ComponentName cn, String scheme, PatternMatcher ssp,
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003047 IntentFilter.AuthorityEntry auth, PatternMatcher path, int userId) {
Svetoslav Ganov5fd83dc2016-01-20 17:27:48 -08003048 flags = service.updateFlagsForResolve(flags, userId, intent);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003049 List<ResolveInfo> ri = service.mActivities.queryIntent(intent,
3050 intent.getType(), flags, 0);
3051 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Queried " + intent
3052 + " results: " + ri);
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003053 int systemMatch = 0;
3054 int thirdPartyMatch = 0;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003055 if (ri != null && ri.size() > 1) {
3056 boolean haveAct = false;
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003057 ComponentName haveNonSys = null;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003058 ComponentName[] set = new ComponentName[ri.size()];
3059 for (int i=0; i<ri.size(); i++) {
3060 ActivityInfo ai = ri.get(i).activityInfo;
3061 set[i] = new ComponentName(ai.packageName, ai.name);
3062 if ((ai.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003063 if (ri.get(i).match >= thirdPartyMatch) {
3064 // Keep track of the best match we find of all third
3065 // party apps, for use later to determine if we actually
3066 // want to set a preferred app for this intent.
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003067 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
3068 + ai.packageName + "/" + ai.name + ": non-system!");
3069 haveNonSys = set[i];
3070 break;
3071 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003072 } else if (cn.getPackageName().equals(ai.packageName)
3073 && cn.getClassName().equals(ai.name)) {
3074 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
3075 + ai.packageName + "/" + ai.name + ": default!");
3076 haveAct = true;
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003077 systemMatch = ri.get(i).match;
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003078 } else {
3079 if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
3080 + ai.packageName + "/" + ai.name + ": skipped");
3081 }
3082 }
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003083 if (haveNonSys != null && thirdPartyMatch < systemMatch) {
3084 // If we have a matching third party app, but its match is not as
3085 // good as the built-in system app, then we don't want to actually
3086 // consider it a match because presumably the built-in app is still
3087 // the thing we want users to see by default.
3088 haveNonSys = null;
3089 }
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003090 if (haveAct && haveNonSys == null) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003091 IntentFilter filter = new IntentFilter();
3092 if (intent.getAction() != null) {
3093 filter.addAction(intent.getAction());
3094 }
Erin Dahlgren707a59d2013-10-24 15:13:39 -07003095 if (intent.getCategories() != null) {
3096 for (String cat : intent.getCategories()) {
3097 filter.addCategory(cat);
3098 }
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003099 }
Jeff Sharkey2a90f6732016-01-06 12:26:11 -07003100 if ((flags & MATCH_DEFAULT_ONLY) != 0) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003101 filter.addCategory(Intent.CATEGORY_DEFAULT);
3102 }
3103 if (scheme != null) {
3104 filter.addDataScheme(scheme);
3105 }
3106 if (ssp != null) {
3107 filter.addDataSchemeSpecificPart(ssp.getPath(), ssp.getType());
3108 }
3109 if (auth != null) {
3110 filter.addDataAuthority(auth);
3111 }
3112 if (path != null) {
3113 filter.addDataPath(path);
3114 }
Erin Dahlgren707a59d2013-10-24 15:13:39 -07003115 if (intent.getType() != null) {
3116 try {
3117 filter.addDataType(intent.getType());
3118 } catch (IntentFilter.MalformedMimeTypeException ex) {
3119 Slog.w(TAG, "Malformed mimetype " + intent.getType() + " for " + cn);
3120 }
3121 }
Dianne Hackbornf85e7af2014-10-14 10:43:43 -07003122 PreferredActivity pa = new PreferredActivity(filter, systemMatch, set, cn, true);
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003123 editPreferredActivitiesLPw(userId).addFilter(pa);
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003124 } else if (haveNonSys == null) {
3125 StringBuilder sb = new StringBuilder();
3126 sb.append("No component ");
3127 sb.append(cn.flattenToShortString());
3128 sb.append(" found setting preferred ");
3129 sb.append(intent);
3130 sb.append("; possible matches are ");
3131 for (int i=0; i<set.length; i++) {
3132 if (i > 0) sb.append(", ");
3133 sb.append(set[i].flattenToShortString());
3134 }
3135 Slog.w(TAG, sb.toString());
3136 } else {
3137 Slog.i(TAG, "Not setting preferred " + intent + "; found third party match "
3138 + haveNonSys.flattenToShortString());
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003139 }
Dianne Hackborneeb2c7e2014-09-23 16:45:39 -07003140 } else {
3141 Slog.w(TAG, "No potential matches found for " + intent + " while setting preferred "
3142 + cn.flattenToShortString());
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003143 }
3144 }
3145
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003146 private void readDefaultPreferredActivitiesLPw(PackageManagerService service,
3147 XmlPullParser parser, int userId)
3148 throws XmlPullParserException, IOException {
3149 int outerDepth = parser.getDepth();
3150 int type;
3151 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3152 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3153 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3154 continue;
3155 }
3156
3157 String tagName = parser.getName();
3158 if (tagName.equals(TAG_ITEM)) {
3159 PreferredActivity tmpPa = new PreferredActivity(parser);
3160 if (tmpPa.mPref.getParseError() == null) {
Dianne Hackbornb09491f2013-07-22 15:30:11 -07003161 applyDefaultPreferredActivityLPw(service, tmpPa, tmpPa.mPref.mComponent,
3162 userId);
Dianne Hackborn8a2ed1d2013-01-29 15:18:29 -08003163 } else {
3164 PackageManagerService.reportSettingsProblem(Log.WARN,
3165 "Error in package manager settings: <preferred-activity> "
3166 + tmpPa.mPref.getParseError() + " at "
3167 + parser.getPositionDescription());
3168 }
3169 } else {
3170 PackageManagerService.reportSettingsProblem(Log.WARN,
3171 "Unknown element under <preferred-activities>: " + parser.getName());
3172 XmlUtils.skipCurrentTag(parser);
3173 }
3174 }
3175 }
3176
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003177 private int readInt(XmlPullParser parser, String ns, String name, int defValue) {
3178 String v = parser.getAttributeValue(ns, name);
3179 try {
3180 if (v == null) {
3181 return defValue;
3182 }
3183 return Integer.parseInt(v);
3184 } catch (NumberFormatException e) {
3185 PackageManagerService.reportSettingsProblem(Log.WARN,
3186 "Error in package manager settings: attribute " + name
3187 + " has bad integer value " + v + " at "
3188 + parser.getPositionDescription());
3189 }
3190 return defValue;
3191 }
3192
Jeff Sharkey9f837a92014-10-24 12:07:24 -07003193 private void readPermissionsLPw(ArrayMap<String, BasePermission> out, XmlPullParser parser)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003194 throws IOException, XmlPullParserException {
3195 int outerDepth = parser.getDepth();
3196 int type;
3197 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3198 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3199 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3200 continue;
3201 }
3202
Kenny Root447106f2011-03-23 11:00:15 -07003203 final String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003204 if (tagName.equals(TAG_ITEM)) {
3205 final String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Root447106f2011-03-23 11:00:15 -07003206 final String sourcePackage = parser.getAttributeValue(null, "package");
3207 final String ptype = parser.getAttributeValue(null, "type");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003208 if (name != null && sourcePackage != null) {
Kenny Root447106f2011-03-23 11:00:15 -07003209 final boolean dynamic = "dynamic".equals(ptype);
Svetoslavc6d1c342015-02-26 14:44:43 -08003210 final BasePermission bp = new BasePermission(name.intern(), sourcePackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003211 dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL);
3212 bp.protectionLevel = readInt(parser, null, "protection",
3213 PermissionInfo.PROTECTION_NORMAL);
Dianne Hackborne639da72012-02-21 15:11:13 -08003214 bp.protectionLevel = PermissionInfo.fixProtectionLevel(bp.protectionLevel);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003215 if (dynamic) {
3216 PermissionInfo pi = new PermissionInfo();
3217 pi.packageName = sourcePackage.intern();
3218 pi.name = name.intern();
3219 pi.icon = readInt(parser, null, "icon", 0);
3220 pi.nonLocalizedLabel = parser.getAttributeValue(null, "label");
3221 pi.protectionLevel = bp.protectionLevel;
3222 bp.pendingInfo = pi;
3223 }
3224 out.put(bp.name, bp);
3225 } else {
3226 PackageManagerService.reportSettingsProblem(Log.WARN,
3227 "Error in package manager settings: permissions has" + " no name at "
3228 + parser.getPositionDescription());
3229 }
3230 } else {
3231 PackageManagerService.reportSettingsProblem(Log.WARN,
3232 "Unknown element reading permissions: " + parser.getName() + " at "
3233 + parser.getPositionDescription());
3234 }
3235 XmlUtils.skipCurrentTag(parser);
3236 }
3237 }
3238
Kenny Root447106f2011-03-23 11:00:15 -07003239 private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003240 IOException {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003241 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003242 String realName = parser.getAttributeValue(null, "realName");
3243 String codePathStr = parser.getAttributeValue(null, "codePath");
3244 String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003245
3246 String legacyCpuAbiStr = parser.getAttributeValue(null, "requiredCpuAbi");
3247 String legacyNativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
3248
3249 String primaryCpuAbiStr = parser.getAttributeValue(null, "primaryCpuAbi");
3250 String secondaryCpuAbiStr = parser.getAttributeValue(null, "secondaryCpuAbi");
Narayan Kamath4903f642014-08-11 13:33:45 +01003251 String cpuAbiOverrideStr = parser.getAttributeValue(null, "cpuAbiOverride");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003252
3253 if (primaryCpuAbiStr == null && legacyCpuAbiStr != null) {
3254 primaryCpuAbiStr = legacyCpuAbiStr;
3255 }
Narayan Kamath9e289d72014-04-10 09:26:59 +00003256
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003257 if (resourcePathStr == null) {
3258 resourcePathStr = codePathStr;
3259 }
3260 String version = parser.getAttributeValue(null, "version");
3261 int versionCode = 0;
3262 if (version != null) {
3263 try {
3264 versionCode = Integer.parseInt(version);
3265 } catch (NumberFormatException e) {
3266 }
3267 }
3268
3269 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003270 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003271 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
Christopher Tate628946a2013-10-18 18:11:05 -07003272 final File codePathFile = new File(codePathStr);
3273 if (PackageManagerService.locationIsPrivileged(codePathFile)) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003274 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
Christopher Tate628946a2013-10-18 18:11:05 -07003275 }
3276 PackageSetting ps = new PackageSetting(name, realName, codePathFile,
Narayan Kamathff110bd2014-07-04 18:30:45 +01003277 new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiStr,
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003278 secondaryCpuAbiStr, cpuAbiOverrideStr, versionCode, pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003279 String timeStampStr = parser.getAttributeValue(null, "ft");
3280 if (timeStampStr != null) {
3281 try {
3282 long timeStamp = Long.parseLong(timeStampStr, 16);
3283 ps.setTimeStamp(timeStamp);
3284 } catch (NumberFormatException e) {
3285 }
3286 } else {
3287 timeStampStr = parser.getAttributeValue(null, "ts");
3288 if (timeStampStr != null) {
3289 try {
3290 long timeStamp = Long.parseLong(timeStampStr);
3291 ps.setTimeStamp(timeStamp);
3292 } catch (NumberFormatException e) {
3293 }
3294 }
3295 }
3296 timeStampStr = parser.getAttributeValue(null, "it");
3297 if (timeStampStr != null) {
3298 try {
3299 ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
3300 } catch (NumberFormatException e) {
3301 }
3302 }
3303 timeStampStr = parser.getAttributeValue(null, "ut");
3304 if (timeStampStr != null) {
3305 try {
3306 ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
3307 } catch (NumberFormatException e) {
3308 }
3309 }
3310 String idStr = parser.getAttributeValue(null, "userId");
Amith Yamasani13593602012-03-22 16:16:17 -07003311 ps.appId = idStr != null ? Integer.parseInt(idStr) : 0;
3312 if (ps.appId <= 0) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003313 String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
Amith Yamasani13593602012-03-22 16:16:17 -07003314 ps.appId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003315 }
Svetoslavc6d1c342015-02-26 14:44:43 -08003316
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003317 int outerDepth = parser.getDepth();
3318 int type;
3319 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3320 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3321 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3322 continue;
3323 }
3324
Svetoslavc6d1c342015-02-26 14:44:43 -08003325 if (parser.getName().equals(TAG_PERMISSIONS)) {
3326 readInstallPermissionsLPr(parser, ps.getPermissionsState());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003327 } else {
3328 PackageManagerService.reportSettingsProblem(Log.WARN,
3329 "Unknown element under <updated-package>: " + parser.getName());
3330 XmlUtils.skipCurrentTag(parser);
3331 }
3332 }
Christopher Tate628946a2013-10-18 18:11:05 -07003333
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003334 mDisabledSysPackages.put(name, ps);
3335 }
3336
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003337 private static int PRE_M_APP_INFO_FLAG_HIDDEN = 1<<27;
3338 private static int PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE = 1<<28;
3339 private static int PRE_M_APP_INFO_FLAG_FORWARD_LOCK = 1<<29;
3340 private static int PRE_M_APP_INFO_FLAG_PRIVILEGED = 1<<30;
3341
Kenny Root447106f2011-03-23 11:00:15 -07003342 private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003343 String name = null;
3344 String realName = null;
3345 String idStr = null;
3346 String sharedIdStr = null;
3347 String codePathStr = null;
3348 String resourcePathStr = null;
Narayan Kamathff110bd2014-07-04 18:30:45 +01003349 String legacyCpuAbiString = null;
3350 String legacyNativeLibraryPathStr = null;
3351 String primaryCpuAbiString = null;
3352 String secondaryCpuAbiString = null;
Narayan Kamath4903f642014-08-11 13:33:45 +01003353 String cpuAbiOverrideString = null;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003354 String systemStr = null;
3355 String installerPackageName = null;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003356 String volumeUuid = null;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003357 String uidError = null;
3358 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003359 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003360 long timeStamp = 0;
3361 long firstInstallTime = 0;
3362 long lastUpdateTime = 0;
3363 PackageSettingBase packageSetting = null;
3364 String version = null;
3365 int versionCode = 0;
3366 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003367 name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003368 realName = parser.getAttributeValue(null, "realName");
3369 idStr = parser.getAttributeValue(null, "userId");
3370 uidError = parser.getAttributeValue(null, "uidError");
3371 sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
3372 codePathStr = parser.getAttributeValue(null, "codePath");
3373 resourcePathStr = parser.getAttributeValue(null, "resourcePath");
Narayan Kamath9e289d72014-04-10 09:26:59 +00003374
Narayan Kamathff110bd2014-07-04 18:30:45 +01003375 legacyCpuAbiString = parser.getAttributeValue(null, "requiredCpuAbi");
3376
3377 legacyNativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
3378 primaryCpuAbiString = parser.getAttributeValue(null, "primaryCpuAbi");
3379 secondaryCpuAbiString = parser.getAttributeValue(null, "secondaryCpuAbi");
Narayan Kamath4903f642014-08-11 13:33:45 +01003380 cpuAbiOverrideString = parser.getAttributeValue(null, "cpuAbiOverride");
Narayan Kamathff110bd2014-07-04 18:30:45 +01003381
3382 if (primaryCpuAbiString == null && legacyCpuAbiString != null) {
3383 primaryCpuAbiString = legacyCpuAbiString;
3384 }
Svetoslavc6d1c342015-02-26 14:44:43 -08003385
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003386 version = parser.getAttributeValue(null, "version");
3387 if (version != null) {
3388 try {
3389 versionCode = Integer.parseInt(version);
3390 } catch (NumberFormatException e) {
3391 }
3392 }
3393 installerPackageName = parser.getAttributeValue(null, "installer");
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003394 volumeUuid = parser.getAttributeValue(null, "volumeUuid");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003395
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003396 systemStr = parser.getAttributeValue(null, "publicFlags");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003397 if (systemStr != null) {
3398 try {
3399 pkgFlags = Integer.parseInt(systemStr);
3400 } catch (NumberFormatException e) {
3401 }
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003402 systemStr = parser.getAttributeValue(null, "privateFlags");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003403 if (systemStr != null) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003404 try {
3405 pkgPrivateFlags = Integer.parseInt(systemStr);
3406 } catch (NumberFormatException e) {
3407 }
3408 }
3409 } else {
3410 // Pre-M -- both public and private flags were stored in one "flags" field.
3411 systemStr = parser.getAttributeValue(null, "flags");
3412 if (systemStr != null) {
3413 try {
3414 pkgFlags = Integer.parseInt(systemStr);
3415 } catch (NumberFormatException e) {
3416 }
3417 if ((pkgFlags & PRE_M_APP_INFO_FLAG_HIDDEN) != 0) {
3418 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_HIDDEN;
3419 }
3420 if ((pkgFlags & PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE) != 0) {
3421 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE;
3422 }
3423 if ((pkgFlags & PRE_M_APP_INFO_FLAG_FORWARD_LOCK) != 0) {
3424 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK;
3425 }
3426 if ((pkgFlags & PRE_M_APP_INFO_FLAG_PRIVILEGED) != 0) {
3427 pkgPrivateFlags |= ApplicationInfo.PRIVATE_FLAG_PRIVILEGED;
3428 }
3429 pkgFlags &= ~(PRE_M_APP_INFO_FLAG_HIDDEN
3430 | PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE
3431 | PRE_M_APP_INFO_FLAG_FORWARD_LOCK
3432 | PRE_M_APP_INFO_FLAG_PRIVILEGED);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003433 } else {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003434 // For backward compatibility
3435 systemStr = parser.getAttributeValue(null, "system");
3436 if (systemStr != null) {
3437 pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
3438 : 0;
3439 } else {
3440 // Old settings that don't specify system... just treat
3441 // them as system, good enough.
3442 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
3443 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003444 }
3445 }
3446 String timeStampStr = parser.getAttributeValue(null, "ft");
3447 if (timeStampStr != null) {
3448 try {
3449 timeStamp = Long.parseLong(timeStampStr, 16);
3450 } catch (NumberFormatException e) {
3451 }
3452 } else {
3453 timeStampStr = parser.getAttributeValue(null, "ts");
3454 if (timeStampStr != null) {
3455 try {
3456 timeStamp = Long.parseLong(timeStampStr);
3457 } catch (NumberFormatException e) {
3458 }
3459 }
3460 }
3461 timeStampStr = parser.getAttributeValue(null, "it");
3462 if (timeStampStr != null) {
3463 try {
3464 firstInstallTime = Long.parseLong(timeStampStr, 16);
3465 } catch (NumberFormatException e) {
3466 }
3467 }
3468 timeStampStr = parser.getAttributeValue(null, "ut");
3469 if (timeStampStr != null) {
3470 try {
3471 lastUpdateTime = Long.parseLong(timeStampStr, 16);
3472 } catch (NumberFormatException e) {
3473 }
3474 }
3475 if (PackageManagerService.DEBUG_SETTINGS)
3476 Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
3477 + " sharedUserId=" + sharedIdStr);
3478 int userId = idStr != null ? Integer.parseInt(idStr) : 0;
3479 if (resourcePathStr == null) {
3480 resourcePathStr = codePathStr;
3481 }
3482 if (realName != null) {
3483 realName = realName.intern();
3484 }
3485 if (name == null) {
3486 PackageManagerService.reportSettingsProblem(Log.WARN,
3487 "Error in package manager settings: <package> has no name at "
3488 + parser.getPositionDescription());
3489 } else if (codePathStr == null) {
3490 PackageManagerService.reportSettingsProblem(Log.WARN,
3491 "Error in package manager settings: <package> has no codePath at "
3492 + parser.getPositionDescription());
3493 } else if (userId > 0) {
Kenny Root447106f2011-03-23 11:00:15 -07003494 packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
Narayan Kamathff110bd2014-07-04 18:30:45 +01003495 new File(resourcePathStr), legacyNativeLibraryPathStr, primaryCpuAbiString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003496 secondaryCpuAbiString, cpuAbiOverrideString, userId, versionCode, pkgFlags,
3497 pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003498 if (PackageManagerService.DEBUG_SETTINGS)
3499 Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
3500 + userId + " pkg=" + packageSetting);
3501 if (packageSetting == null) {
3502 PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
3503 + userId + " while parsing settings at "
3504 + parser.getPositionDescription());
3505 } else {
3506 packageSetting.setTimeStamp(timeStamp);
3507 packageSetting.firstInstallTime = firstInstallTime;
3508 packageSetting.lastUpdateTime = lastUpdateTime;
3509 }
3510 } else if (sharedIdStr != null) {
3511 userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
3512 if (userId > 0) {
3513 packageSetting = new PendingPackage(name.intern(), realName, new File(
Narayan Kamathff110bd2014-07-04 18:30:45 +01003514 codePathStr), new File(resourcePathStr), legacyNativeLibraryPathStr,
Narayan Kamath4903f642014-08-11 13:33:45 +01003515 primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003516 userId, versionCode, pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003517 packageSetting.setTimeStamp(timeStamp);
3518 packageSetting.firstInstallTime = firstInstallTime;
3519 packageSetting.lastUpdateTime = lastUpdateTime;
3520 mPendingPackages.add((PendingPackage) packageSetting);
3521 if (PackageManagerService.DEBUG_SETTINGS)
3522 Log.i(PackageManagerService.TAG, "Reading package " + name
3523 + ": sharedUserId=" + userId + " pkg=" + packageSetting);
3524 } else {
3525 PackageManagerService.reportSettingsProblem(Log.WARN,
3526 "Error in package manager settings: package " + name
3527 + " has bad sharedId " + sharedIdStr + " at "
3528 + parser.getPositionDescription());
3529 }
3530 } else {
3531 PackageManagerService.reportSettingsProblem(Log.WARN,
3532 "Error in package manager settings: package " + name + " has bad userId "
3533 + idStr + " at " + parser.getPositionDescription());
3534 }
3535 } catch (NumberFormatException e) {
3536 PackageManagerService.reportSettingsProblem(Log.WARN,
3537 "Error in package manager settings: package " + name + " has bad userId "
3538 + idStr + " at " + parser.getPositionDescription());
3539 }
3540 if (packageSetting != null) {
3541 packageSetting.uidError = "true".equals(uidError);
3542 packageSetting.installerPackageName = installerPackageName;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003543 packageSetting.volumeUuid = volumeUuid;
Narayan Kamathff110bd2014-07-04 18:30:45 +01003544 packageSetting.legacyNativeLibraryPathString = legacyNativeLibraryPathStr;
3545 packageSetting.primaryCpuAbiString = primaryCpuAbiString;
3546 packageSetting.secondaryCpuAbiString = secondaryCpuAbiString;
Amith Yamasani483f3b02012-03-13 16:08:00 -07003547 // Handle legacy string here for single-user mode
3548 final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003549 if (enabledStr != null) {
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003550 try {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003551 packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003552 } catch (NumberFormatException e) {
3553 if (enabledStr.equalsIgnoreCase("true")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003554 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003555 } else if (enabledStr.equalsIgnoreCase("false")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003556 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003557 } else if (enabledStr.equalsIgnoreCase("default")) {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003558 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07003559 } else {
3560 PackageManagerService.reportSettingsProblem(Log.WARN,
3561 "Error in package manager settings: package " + name
3562 + " has bad enabled value: " + idStr + " at "
3563 + parser.getPositionDescription());
3564 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003565 }
3566 } else {
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07003567 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0, null);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003568 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07003569
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003570 final String installStatusStr = parser.getAttributeValue(null, "installStatus");
3571 if (installStatusStr != null) {
3572 if (installStatusStr.equalsIgnoreCase("false")) {
3573 packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE;
3574 } else {
3575 packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE;
3576 }
3577 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003578 int outerDepth = parser.getDepth();
3579 int type;
3580 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3581 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3582 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3583 continue;
3584 }
3585
3586 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003587 // Legacy
3588 if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
3589 readDisabledComponentsLPw(packageSetting, parser, 0);
3590 } else if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
3591 readEnabledComponentsLPw(packageSetting, parser, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003592 } else if (tagName.equals("sigs")) {
3593 packageSetting.signatures.readXml(parser, mPastSignatures);
Svetoslavc6d1c342015-02-26 14:44:43 -08003594 } else if (tagName.equals(TAG_PERMISSIONS)) {
3595 readInstallPermissionsLPr(parser,
3596 packageSetting.getPermissionsState());
Svetoslavcf959f62015-03-26 20:53:34 -07003597 packageSetting.installPermissionsFixed = true;
dcashman3a0dbfb2014-07-07 13:53:36 -07003598 } else if (tagName.equals("proper-signing-keyset")) {
3599 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
dcashman8c04fac2015-03-23 11:39:42 -07003600 Integer refCt = mKeySetRefs.get(id);
3601 if (refCt != null) {
3602 mKeySetRefs.put(id, refCt + 1);
3603 } else {
3604 mKeySetRefs.put(id, 1);
3605 }
dcashman3a0dbfb2014-07-07 13:53:36 -07003606 packageSetting.keySetData.setProperSigningKeySet(id);
Geremy Condraf1bcca82013-01-07 22:35:24 -08003607 } else if (tagName.equals("signing-keyset")) {
dcashman8c04fac2015-03-23 11:39:42 -07003608 // from v1 of keysetmanagerservice - no longer used
dcashman55b10782014-04-09 14:20:38 -07003609 } else if (tagName.equals("upgrade-keyset")) {
3610 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
3611 packageSetting.keySetData.addUpgradeKeySetById(id);
Geremy Condraf1bcca82013-01-07 22:35:24 -08003612 } else if (tagName.equals("defined-keyset")) {
3613 long id = Long.parseLong(parser.getAttributeValue(null, "identifier"));
3614 String alias = parser.getAttributeValue(null, "alias");
dcashman8c04fac2015-03-23 11:39:42 -07003615 Integer refCt = mKeySetRefs.get(id);
3616 if (refCt != null) {
3617 mKeySetRefs.put(id, refCt + 1);
3618 } else {
3619 mKeySetRefs.put(id, 1);
3620 }
Geremy Condraf1bcca82013-01-07 22:35:24 -08003621 packageSetting.keySetData.addDefinedKeySet(id, alias);
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08003622 } else if (tagName.equals(TAG_DOMAIN_VERIFICATION)) {
3623 readDomainVerificationLPw(parser, packageSetting);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003624 } else {
3625 PackageManagerService.reportSettingsProblem(Log.WARN,
3626 "Unknown element under <package>: " + parser.getName());
3627 XmlUtils.skipCurrentTag(parser);
3628 }
3629 }
3630 } else {
3631 XmlUtils.skipCurrentTag(parser);
3632 }
3633 }
3634
Amith Yamasani483f3b02012-03-13 16:08:00 -07003635 private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
3636 int userId) throws IOException, XmlPullParserException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003637 int outerDepth = parser.getDepth();
3638 int type;
3639 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3640 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3641 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3642 continue;
3643 }
3644
3645 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003646 if (tagName.equals(TAG_ITEM)) {
3647 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003648 if (name != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003649 packageSetting.addDisabledComponent(name.intern(), userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003650 } else {
3651 PackageManagerService.reportSettingsProblem(Log.WARN,
3652 "Error in package manager settings: <disabled-components> has"
3653 + " no name at " + parser.getPositionDescription());
3654 }
3655 } else {
3656 PackageManagerService.reportSettingsProblem(Log.WARN,
3657 "Unknown element under <disabled-components>: " + parser.getName());
3658 }
3659 XmlUtils.skipCurrentTag(parser);
3660 }
3661 }
3662
Amith Yamasani483f3b02012-03-13 16:08:00 -07003663 private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
3664 int userId) throws IOException, XmlPullParserException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003665 int outerDepth = parser.getDepth();
3666 int type;
3667 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3668 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3669 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3670 continue;
3671 }
3672
3673 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003674 if (tagName.equals(TAG_ITEM)) {
3675 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003676 if (name != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003677 packageSetting.addEnabledComponent(name.intern(), userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003678 } else {
3679 PackageManagerService.reportSettingsProblem(Log.WARN,
3680 "Error in package manager settings: <enabled-components> has"
3681 + " no name at " + parser.getPositionDescription());
3682 }
3683 } else {
3684 PackageManagerService.reportSettingsProblem(Log.WARN,
3685 "Unknown element under <enabled-components>: " + parser.getName());
3686 }
3687 XmlUtils.skipCurrentTag(parser);
3688 }
3689 }
3690
Amith Yamasani483f3b02012-03-13 16:08:00 -07003691 private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003692 String name = null;
3693 String idStr = null;
3694 int pkgFlags = 0;
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003695 int pkgPrivateFlags = 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003696 SharedUserSetting su = null;
3697 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07003698 name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003699 idStr = parser.getAttributeValue(null, "userId");
3700 int userId = idStr != null ? Integer.parseInt(idStr) : 0;
3701 if ("true".equals(parser.getAttributeValue(null, "system"))) {
3702 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
3703 }
3704 if (name == null) {
3705 PackageManagerService.reportSettingsProblem(Log.WARN,
3706 "Error in package manager settings: <shared-user> has no name at "
3707 + parser.getPositionDescription());
3708 } else if (userId == 0) {
3709 PackageManagerService.reportSettingsProblem(Log.WARN,
3710 "Error in package manager settings: shared-user " + name
3711 + " has bad userId " + idStr + " at "
3712 + parser.getPositionDescription());
3713 } else {
Alex Klyubinb9f8a522015-02-03 11:12:59 -08003714 if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags, pkgPrivateFlags))
3715 == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003716 PackageManagerService
3717 .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
3718 + parser.getPositionDescription());
3719 }
3720 }
3721 } catch (NumberFormatException e) {
3722 PackageManagerService.reportSettingsProblem(Log.WARN,
3723 "Error in package manager settings: package " + name + " has bad userId "
3724 + idStr + " at " + parser.getPositionDescription());
3725 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003726
3727 if (su != null) {
3728 int outerDepth = parser.getDepth();
3729 int type;
3730 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
3731 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
3732 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
3733 continue;
3734 }
3735
3736 String tagName = parser.getName();
3737 if (tagName.equals("sigs")) {
3738 su.signatures.readXml(parser, mPastSignatures);
3739 } else if (tagName.equals("perms")) {
Svetoslavc6d1c342015-02-26 14:44:43 -08003740 readInstallPermissionsLPr(parser, su.getPermissionsState());
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003741 } else {
3742 PackageManagerService.reportSettingsProblem(Log.WARN,
3743 "Unknown element under <shared-user>: " + parser.getName());
3744 XmlUtils.skipCurrentTag(parser);
3745 }
3746 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003747 } else {
3748 XmlUtils.skipCurrentTag(parser);
3749 }
3750 }
3751
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08003752 void createNewUserLI(@NonNull PackageManagerService service, @NonNull Installer installer,
3753 int userHandle) {
3754 String[] volumeUuids;
3755 String[] names;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07003756 int[] appIds;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08003757 String[] seinfos;
Janis Danisevskisf3409742016-01-12 14:46:33 +00003758 int[] targetSdkVersions;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08003759 int packagesCount;
3760 synchronized (mPackages) {
3761 Collection<PackageSetting> packages = mPackages.values();
3762 packagesCount = packages.size();
3763 volumeUuids = new String[packagesCount];
3764 names = new String[packagesCount];
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07003765 appIds = new int[packagesCount];
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08003766 seinfos = new String[packagesCount];
Janis Danisevskisf3409742016-01-12 14:46:33 +00003767 targetSdkVersions = new int[packagesCount];
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08003768 Iterator<PackageSetting> packagesIterator = packages.iterator();
3769 for (int i = 0; i < packagesCount; i++) {
3770 PackageSetting ps = packagesIterator.next();
3771 if (ps.pkg == null || ps.pkg.applicationInfo == null) {
3772 continue;
3773 }
3774 // Only system apps are initially installed.
3775 ps.setInstalled(ps.isSystem(), userHandle);
3776 // Need to create a data directory for all apps under this user. Accumulate all
3777 // required args and call the installer after mPackages lock has been released
3778 volumeUuids[i] = ps.volumeUuid;
3779 names[i] = ps.name;
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07003780 appIds[i] = ps.appId;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08003781 seinfos[i] = ps.pkg.applicationInfo.seinfo;
Janis Danisevskisf3409742016-01-12 14:46:33 +00003782 targetSdkVersions[i] = ps.pkg.applicationInfo.targetSdkVersion;
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08003783 }
3784 }
3785 for (int i = 0; i < packagesCount; i++) {
3786 if (names[i] == null) {
Amith Yamasani41cd5772014-07-10 15:26:00 -07003787 continue;
3788 }
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07003789 // TODO: triage flags!
3790 final int flags = Installer.FLAG_CE_STORAGE | Installer.FLAG_DE_STORAGE;
3791 try {
3792 installer.createAppData(volumeUuids[i], names[i], userHandle, flags, appIds[i],
Janis Danisevskisf3409742016-01-12 14:46:33 +00003793 seinfos[i], targetSdkVersions[i]);
Jeff Sharkeyfdeeeea2016-01-11 17:34:24 -07003794 } catch (InstallerException e) {
3795 Slog.w(TAG, "Failed to prepare app data", e);
3796 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003797 }
Fyodor Kupolovd8327bd2015-11-30 17:42:43 -08003798 synchronized (mPackages) {
3799 applyDefaultPreferredAppsLPw(service, userHandle);
3800 writePackageRestrictionsLPr(userHandle);
3801 writePackageListLPr(userHandle);
3802 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003803 }
3804
Alexandra Gherghina539a7ef2014-07-07 12:27:54 +01003805 void removeUserLPw(int userId) {
Dianne Hackborn63092712012-10-07 14:45:35 -07003806 Set<Entry<String, PackageSetting>> entries = mPackages.entrySet();
3807 for (Entry<String, PackageSetting> entry : entries) {
3808 entry.getValue().removeUser(userId);
3809 }
3810 mPreferredActivities.remove(userId);
Amith Yamasani13593602012-03-22 16:16:17 -07003811 File file = getUserPackagesStateFile(userId);
3812 file.delete();
3813 file = getUserPackagesStateBackupFile(userId);
3814 file.delete();
Nicolas Prevote7024042014-07-08 15:47:17 +01003815 removeCrossProfileIntentFiltersLPw(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08003816
3817 mRuntimePermissionsPersistence.onUserRemoved(userId);
Jeff Sharkey91edde22015-05-20 12:04:42 -07003818
3819 writePackageListLPr();
Nicolas Prevota0f48852014-05-27 11:21:11 +01003820 }
3821
Nicolas Prevote7024042014-07-08 15:47:17 +01003822 void removeCrossProfileIntentFiltersLPw(int userId) {
3823 synchronized (mCrossProfileIntentResolvers) {
3824 // userId is the source user
3825 if (mCrossProfileIntentResolvers.get(userId) != null) {
3826 mCrossProfileIntentResolvers.remove(userId);
3827 writePackageRestrictionsLPr(userId);
Nicolas Prevota0f48852014-05-27 11:21:11 +01003828 }
Nicolas Prevote7024042014-07-08 15:47:17 +01003829 // userId is the target user
3830 int count = mCrossProfileIntentResolvers.size();
3831 for (int i = 0; i < count; i++) {
3832 int sourceUserId = mCrossProfileIntentResolvers.keyAt(i);
3833 CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId);
3834 boolean needsWriting = false;
Jeff Sharkey9f837a92014-10-24 12:07:24 -07003835 ArraySet<CrossProfileIntentFilter> cpifs =
3836 new ArraySet<CrossProfileIntentFilter>(cpir.filterSet());
Nicolas Prevote7024042014-07-08 15:47:17 +01003837 for (CrossProfileIntentFilter cpif : cpifs) {
3838 if (cpif.getTargetUserId() == userId) {
3839 needsWriting = true;
3840 cpir.removeFilter(cpif);
3841 }
3842 }
3843 if (needsWriting) {
3844 writePackageRestrictionsLPr(sourceUserId);
3845 }
Nicolas Prevota0f48852014-05-27 11:21:11 +01003846 }
3847 }
Amith Yamasani13593602012-03-22 16:16:17 -07003848 }
3849
Geremy Condra12c18382013-03-06 16:49:06 -08003850 // This should be called (at least) whenever an application is removed
3851 private void setFirstAvailableUid(int uid) {
3852 if (uid > mFirstAvailableUid) {
3853 mFirstAvailableUid = uid;
3854 }
3855 }
3856
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003857 // Returns -1 if we could not find an available UserId to assign
Kenny Root447106f2011-03-23 11:00:15 -07003858 private int newUserIdLPw(Object obj) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003859 // Let's be stupidly inefficient for now...
3860 final int N = mUserIds.size();
Geremy Condra12c18382013-03-06 16:49:06 -08003861 for (int i = mFirstAvailableUid; i < N; i++) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003862 if (mUserIds.get(i) == null) {
3863 mUserIds.set(i, obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08003864 return Process.FIRST_APPLICATION_UID + i;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003865 }
3866 }
3867
3868 // None left?
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08003869 if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003870 return -1;
3871 }
3872
3873 mUserIds.add(obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08003874 return Process.FIRST_APPLICATION_UID + N;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003875 }
3876
Kenny Root0aaa0d92011-09-12 16:42:55 -07003877 public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
3878 if (mVerifierDeviceIdentity == null) {
3879 mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
3880
3881 writeLPr();
3882 }
3883
3884 return mVerifierDeviceIdentity;
3885 }
3886
Kenny Root447106f2011-03-23 11:00:15 -07003887 public PackageSetting getDisabledSystemPkgLPr(String name) {
3888 PackageSetting ps = mDisabledSysPackages.get(name);
3889 return ps;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07003890 }
3891
Jeff Sharkey9f837a92014-10-24 12:07:24 -07003892 private String compToString(ArraySet<String> cmp) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07003893 return cmp != null ? Arrays.toString(cmp.toArray()) : "[]";
3894 }
Jeff Sharkeye17ac152015-11-06 22:40:29 -08003895
Jeff Sharkey5217cac2015-12-20 15:34:01 -07003896 boolean isEnabledAndMatchLPr(ComponentInfo componentInfo, int flags, int userId) {
Jeff Sharkey2bd31db2016-01-09 16:58:14 -07003897 final PackageSetting ps = mPackages.get(componentInfo.packageName);
3898 if (ps == null) return false;
Jeff Sharkeye17ac152015-11-06 22:40:29 -08003899
Jeff Sharkey2bd31db2016-01-09 16:58:14 -07003900 final PackageUserState userState = ps.readUserState(userId);
3901 return userState.isMatch(componentInfo, flags);
Jeff Sharkeye17ac152015-11-06 22:40:29 -08003902 }
3903
Kenny Root447106f2011-03-23 11:00:15 -07003904 String getInstallerPackageNameLPr(String packageName) {
3905 final PackageSetting pkg = mPackages.get(packageName);
3906 if (pkg == null) {
3907 throw new IllegalArgumentException("Unknown package: " + packageName);
3908 }
3909 return pkg.installerPackageName;
3910 }
3911
Amith Yamasani483f3b02012-03-13 16:08:00 -07003912 int getApplicationEnabledSettingLPr(String packageName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07003913 final PackageSetting pkg = mPackages.get(packageName);
3914 if (pkg == null) {
3915 throw new IllegalArgumentException("Unknown package: " + packageName);
3916 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07003917 return pkg.getEnabled(userId);
Kenny Root447106f2011-03-23 11:00:15 -07003918 }
3919
Amith Yamasani483f3b02012-03-13 16:08:00 -07003920 int getComponentEnabledSettingLPr(ComponentName componentName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07003921 final String packageName = componentName.getPackageName();
3922 final PackageSetting pkg = mPackages.get(packageName);
3923 if (pkg == null) {
3924 throw new IllegalArgumentException("Unknown component: " + componentName);
3925 }
3926 final String classNameStr = componentName.getClassName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003927 return pkg.getCurrentEnabledStateLPr(classNameStr, userId);
Kenny Root447106f2011-03-23 11:00:15 -07003928 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07003929
Jeff Sharkeybd0e9e42015-04-30 16:04:50 -07003930 boolean setPackageStoppedStateLPw(PackageManagerService yucky, String packageName,
3931 boolean stopped, boolean allowedByPermission, int uid, int userId) {
Dianne Hackbornf02b60a2012-08-16 10:48:27 -07003932 int appId = UserHandle.getAppId(uid);
Kenny Root447106f2011-03-23 11:00:15 -07003933 final PackageSetting pkgSetting = mPackages.get(packageName);
3934 if (pkgSetting == null) {
3935 throw new IllegalArgumentException("Unknown package: " + packageName);
3936 }
Amith Yamasani13593602012-03-22 16:16:17 -07003937 if (!allowedByPermission && (appId != pkgSetting.appId)) {
Kenny Root447106f2011-03-23 11:00:15 -07003938 throw new SecurityException(
3939 "Permission Denial: attempt to change stopped state from pid="
3940 + Binder.getCallingPid()
Amith Yamasani13593602012-03-22 16:16:17 -07003941 + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
Kenny Root447106f2011-03-23 11:00:15 -07003942 }
3943 if (DEBUG_STOPPED) {
3944 if (stopped) {
3945 RuntimeException e = new RuntimeException("here");
3946 e.fillInStackTrace();
3947 Slog.i(TAG, "Stopping package " + packageName, e);
3948 }
3949 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07003950 if (pkgSetting.getStopped(userId) != stopped) {
3951 pkgSetting.setStopped(stopped, userId);
3952 // pkgSetting.pkg.mSetStopped = stopped;
3953 if (pkgSetting.getNotLaunched(userId)) {
Kenny Root447106f2011-03-23 11:00:15 -07003954 if (pkgSetting.installerPackageName != null) {
Jeff Sharkeybd0e9e42015-04-30 16:04:50 -07003955 yucky.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH,
Dianne Hackbornf36003f2015-11-11 13:24:11 -08003956 pkgSetting.name, null, 0,
Dianne Hackborn7767eac2012-08-23 18:25:40 -07003957 pkgSetting.installerPackageName, null, new int[] {userId});
Kenny Root447106f2011-03-23 11:00:15 -07003958 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07003959 pkgSetting.setNotLaunched(false, userId);
Kenny Root447106f2011-03-23 11:00:15 -07003960 }
3961 return true;
3962 }
3963 return false;
3964 }
3965
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -08003966 List<UserInfo> getAllUsers() {
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07003967 long id = Binder.clearCallingIdentity();
Amith Yamasani483f3b02012-03-13 16:08:00 -07003968 try {
Amith Yamasani920ace02012-09-20 22:15:37 -07003969 return UserManagerService.getInstance().getUsers(false);
Amith Yamasani483f3b02012-03-13 16:08:00 -07003970 } catch (NullPointerException npe) {
3971 // packagemanager not yet initialized
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07003972 } finally {
3973 Binder.restoreCallingIdentity(id);
Amith Yamasani483f3b02012-03-13 16:08:00 -07003974 }
3975 return null;
3976 }
3977
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003978 /**
3979 * Return all {@link PackageSetting} that are actively installed on the
3980 * given {@link VolumeInfo#fsUuid}.
3981 */
3982 List<PackageSetting> getVolumePackagesLPr(String volumeUuid) {
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07003983 ArrayList<PackageSetting> res = new ArrayList<>();
3984 for (int i = 0; i < mPackages.size(); i++) {
3985 final PackageSetting setting = mPackages.valueAt(i);
3986 if (Objects.equals(volumeUuid, setting.volumeUuid)) {
3987 res.add(setting);
3988 }
3989 }
3990 return res;
3991 }
3992
Svetoslavc6d1c342015-02-26 14:44:43 -08003993 static void printFlags(PrintWriter pw, int val, Object[] spec) {
Joe Onorato20963df2012-01-04 18:13:24 -08003994 pw.print("[ ");
3995 for (int i=0; i<spec.length; i+=2) {
3996 int mask = (Integer)spec[i];
3997 if ((val & mask) != 0) {
3998 pw.print(spec[i+1]);
3999 pw.print(" ");
4000 }
4001 }
4002 pw.print("]");
4003 }
4004
4005 static final Object[] FLAG_DUMP_SPEC = new Object[] {
4006 ApplicationInfo.FLAG_SYSTEM, "SYSTEM",
4007 ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE",
4008 ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE",
4009 ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT",
4010 ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST",
4011 ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING",
4012 ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA",
4013 ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP",
4014 ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY",
4015 ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE",
4016 ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP",
4017 ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE",
4018 ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION",
4019 ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE",
4020 ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP",
Alex Klyubinb9f8a522015-02-03 11:12:59 -08004021 };
4022
4023 static final Object[] PRIVATE_FLAG_DUMP_SPEC = new Object[] {
4024 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED, "PRIVILEGED",
4025 ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK, "FORWARD_LOCK",
4026 ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
Joe Onorato20963df2012-01-04 18:13:24 -08004027 };
4028
Jeff Sharkeyf80b52b2015-07-17 14:56:34 -07004029 void dumpVersionLPr(IndentingPrintWriter pw) {
4030 pw.increaseIndent();
4031 for (int i= 0; i < mVersion.size(); i++) {
4032 final String volumeUuid = mVersion.keyAt(i);
4033 final VersionInfo ver = mVersion.valueAt(i);
4034 if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, volumeUuid)) {
4035 pw.println("Internal:");
4036 } else if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, volumeUuid)) {
4037 pw.println("External:");
4038 } else {
4039 pw.println("UUID " + volumeUuid + ":");
4040 }
4041 pw.increaseIndent();
4042 pw.printPair("sdkVersion", ver.sdkVersion);
4043 pw.printPair("databaseVersion", ver.databaseVersion);
4044 pw.println();
4045 pw.printPair("fingerprint", ver.fingerprint);
4046 pw.println();
4047 pw.decreaseIndent();
4048 }
4049 pw.decreaseIndent();
4050 }
4051
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004052 void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
4053 ArraySet<String> permissionNames, PackageSetting ps, SimpleDateFormat sdf,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004054 Date date, List<UserInfo> users, boolean dumpAll) {
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004055 if (checkinTag != null) {
4056 pw.print(checkinTag);
4057 pw.print(",");
4058 pw.print(ps.realName != null ? ps.realName : ps.name);
4059 pw.print(",");
4060 pw.print(ps.appId);
4061 pw.print(",");
4062 pw.print(ps.versionCode);
4063 pw.print(",");
4064 pw.print(ps.firstInstallTime);
4065 pw.print(",");
4066 pw.print(ps.lastUpdateTime);
4067 pw.print(",");
4068 pw.print(ps.installerPackageName != null ? ps.installerPackageName : "?");
4069 pw.println();
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004070 if (ps.pkg != null) {
4071 pw.print(checkinTag); pw.print("-"); pw.print("splt,");
4072 pw.print("base,");
4073 pw.println(ps.pkg.baseRevisionCode);
4074 if (ps.pkg.splitNames != null) {
4075 for (int i = 0; i < ps.pkg.splitNames.length; i++) {
4076 pw.print(checkinTag); pw.print("-"); pw.print("splt,");
4077 pw.print(ps.pkg.splitNames[i]); pw.print(",");
4078 pw.println(ps.pkg.splitRevisionCodes[i]);
4079 }
4080 }
4081 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004082 for (UserInfo user : users) {
4083 pw.print(checkinTag);
4084 pw.print("-");
4085 pw.print("usr");
4086 pw.print(",");
4087 pw.print(user.id);
4088 pw.print(",");
4089 pw.print(ps.getInstalled(user.id) ? "I" : "i");
Amith Yamasanie5bcff62014-07-19 15:44:09 -07004090 pw.print(ps.getHidden(user.id) ? "B" : "b");
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00004091 pw.print(ps.getSuspended(user.id) ? "SU" : "su");
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004092 pw.print(ps.getStopped(user.id) ? "S" : "s");
4093 pw.print(ps.getNotLaunched(user.id) ? "l" : "L");
4094 pw.print(",");
4095 pw.print(ps.getEnabled(user.id));
4096 String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
4097 pw.print(",");
4098 pw.print(lastDisabledAppCaller != null ? lastDisabledAppCaller : "?");
4099 pw.println();
4100 }
4101 return;
4102 }
4103
Dianne Hackbornc895be72013-03-11 17:48:43 -07004104 pw.print(prefix); pw.print("Package [");
4105 pw.print(ps.realName != null ? ps.realName : ps.name);
4106 pw.print("] (");
4107 pw.print(Integer.toHexString(System.identityHashCode(ps)));
4108 pw.println("):");
4109
Jeff Sharkeye31b8202015-04-29 21:44:57 -07004110 if (ps.frozen) {
4111 pw.print(prefix); pw.println(" FROZEN!");
4112 }
4113
Dianne Hackbornc895be72013-03-11 17:48:43 -07004114 if (ps.realName != null) {
4115 pw.print(prefix); pw.print(" compat name=");
4116 pw.println(ps.name);
4117 }
4118
Svetoslavc6d1c342015-02-26 14:44:43 -08004119 pw.print(prefix); pw.print(" userId="); pw.println(ps.appId);
4120
Dianne Hackbornc895be72013-03-11 17:48:43 -07004121 if (ps.sharedUser != null) {
4122 pw.print(prefix); pw.print(" sharedUser="); pw.println(ps.sharedUser);
4123 }
4124 pw.print(prefix); pw.print(" pkg="); pw.println(ps.pkg);
4125 pw.print(prefix); pw.print(" codePath="); pw.println(ps.codePathString);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004126 if (permissionNames == null) {
4127 pw.print(prefix); pw.print(" resourcePath="); pw.println(ps.resourcePathString);
4128 pw.print(prefix); pw.print(" legacyNativeLibraryDir=");
4129 pw.println(ps.legacyNativeLibraryPathString);
4130 pw.print(prefix); pw.print(" primaryCpuAbi="); pw.println(ps.primaryCpuAbiString);
4131 pw.print(prefix); pw.print(" secondaryCpuAbi="); pw.println(ps.secondaryCpuAbiString);
4132 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004133 pw.print(prefix); pw.print(" versionCode="); pw.print(ps.versionCode);
4134 if (ps.pkg != null) {
4135 pw.print(" targetSdk="); pw.print(ps.pkg.applicationInfo.targetSdkVersion);
4136 }
4137 pw.println();
4138 if (ps.pkg != null) {
4139 pw.print(prefix); pw.print(" versionName="); pw.println(ps.pkg.mVersionName);
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004140 pw.print(prefix); pw.print(" splits="); dumpSplitNames(pw, ps.pkg); pw.println();
Dianne Hackbornc895be72013-03-11 17:48:43 -07004141 pw.print(prefix); pw.print(" applicationInfo=");
4142 pw.println(ps.pkg.applicationInfo.toString());
4143 pw.print(prefix); pw.print(" flags="); printFlags(pw, ps.pkg.applicationInfo.flags,
4144 FLAG_DUMP_SPEC); pw.println();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004145 if (ps.pkg.applicationInfo.privateFlags != 0) {
4146 pw.print(prefix); pw.print(" privateFlags="); printFlags(pw,
4147 ps.pkg.applicationInfo.privateFlags, PRIVATE_FLAG_DUMP_SPEC); pw.println();
4148 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004149 pw.print(prefix); pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004150 pw.print(prefix); pw.print(" supportsScreens=[");
4151 boolean first = true;
4152 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
4153 if (!first)
4154 pw.print(", ");
4155 first = false;
4156 pw.print("small");
4157 }
4158 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
4159 if (!first)
4160 pw.print(", ");
4161 first = false;
4162 pw.print("medium");
4163 }
4164 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
4165 if (!first)
4166 pw.print(", ");
4167 first = false;
4168 pw.print("large");
4169 }
4170 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
4171 if (!first)
4172 pw.print(", ");
4173 first = false;
4174 pw.print("xlarge");
4175 }
4176 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
4177 if (!first)
4178 pw.print(", ");
4179 first = false;
4180 pw.print("resizeable");
4181 }
4182 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
4183 if (!first)
4184 pw.print(", ");
4185 first = false;
4186 pw.print("anyDensity");
4187 }
4188 pw.println("]");
4189 if (ps.pkg.libraryNames != null && ps.pkg.libraryNames.size() > 0) {
4190 pw.print(prefix); pw.println(" libraries:");
4191 for (int i=0; i<ps.pkg.libraryNames.size(); i++) {
4192 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.libraryNames.get(i));
4193 }
4194 }
4195 if (ps.pkg.usesLibraries != null && ps.pkg.usesLibraries.size() > 0) {
4196 pw.print(prefix); pw.println(" usesLibraries:");
4197 for (int i=0; i<ps.pkg.usesLibraries.size(); i++) {
4198 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.usesLibraries.get(i));
4199 }
4200 }
4201 if (ps.pkg.usesOptionalLibraries != null
4202 && ps.pkg.usesOptionalLibraries.size() > 0) {
4203 pw.print(prefix); pw.println(" usesOptionalLibraries:");
4204 for (int i=0; i<ps.pkg.usesOptionalLibraries.size(); i++) {
4205 pw.print(prefix); pw.print(" ");
4206 pw.println(ps.pkg.usesOptionalLibraries.get(i));
4207 }
4208 }
4209 if (ps.pkg.usesLibraryFiles != null
4210 && ps.pkg.usesLibraryFiles.length > 0) {
4211 pw.print(prefix); pw.println(" usesLibraryFiles:");
4212 for (int i=0; i<ps.pkg.usesLibraryFiles.length; i++) {
4213 pw.print(prefix); pw.print(" "); pw.println(ps.pkg.usesLibraryFiles[i]);
4214 }
4215 }
4216 }
4217 pw.print(prefix); pw.print(" timeStamp=");
4218 date.setTime(ps.timeStamp);
4219 pw.println(sdf.format(date));
4220 pw.print(prefix); pw.print(" firstInstallTime=");
4221 date.setTime(ps.firstInstallTime);
4222 pw.println(sdf.format(date));
4223 pw.print(prefix); pw.print(" lastUpdateTime=");
4224 date.setTime(ps.lastUpdateTime);
4225 pw.println(sdf.format(date));
4226 if (ps.installerPackageName != null) {
4227 pw.print(prefix); pw.print(" installerPackageName=");
4228 pw.println(ps.installerPackageName);
4229 }
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -07004230 if (ps.volumeUuid != null) {
4231 pw.print(prefix); pw.print(" volumeUuid=");
4232 pw.println(ps.volumeUuid);
4233 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004234 pw.print(prefix); pw.print(" signatures="); pw.println(ps.signatures);
Svetoslavcf959f62015-03-26 20:53:34 -07004235 pw.print(prefix); pw.print(" installPermissionsFixed=");
4236 pw.print(ps.installPermissionsFixed);
Dianne Hackbornc895be72013-03-11 17:48:43 -07004237 pw.print(" installStatus="); pw.println(ps.installStatus);
4238 pw.print(prefix); pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
4239 pw.println();
Svetoslavc6d1c342015-02-26 14:44:43 -08004240
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004241 if (ps.pkg != null && ps.pkg.permissions != null && ps.pkg.permissions.size() > 0) {
4242 final ArrayList<PackageParser.Permission> perms = ps.pkg.permissions;
4243 pw.print(prefix); pw.println(" declared permissions:");
4244 for (int i=0; i<perms.size(); i++) {
4245 PackageParser.Permission perm = perms.get(i);
4246 if (permissionNames != null
4247 && !permissionNames.contains(perm.info.name)) {
4248 continue;
4249 }
4250 pw.print(prefix); pw.print(" "); pw.print(perm.info.name);
4251 pw.print(": prot=");
4252 pw.print(PermissionInfo.protectionToString(perm.info.protectionLevel));
4253 if ((perm.info.flags&PermissionInfo.FLAG_COSTS_MONEY) != 0) {
4254 pw.print(", COSTS_MONEY");
4255 }
Svet Ganov3e0be742015-08-07 23:06:00 -07004256 if ((perm.info.flags&PermissionInfo.FLAG_HIDDEN) != 0) {
Svet Ganov52153f42015-08-11 08:59:12 -07004257 pw.print(", HIDDEN");
Svet Ganov3e0be742015-08-07 23:06:00 -07004258 }
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004259 if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
4260 pw.print(", INSTALLED");
4261 }
4262 pw.println();
4263 }
4264 }
4265
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004266 if ((permissionNames != null || dumpAll) && ps.pkg.requestedPermissions != null
4267 && ps.pkg.requestedPermissions.size() > 0) {
4268 final ArrayList<String> perms = ps.pkg.requestedPermissions;
4269 pw.print(prefix); pw.println(" requested permissions:");
4270 for (int i=0; i<perms.size(); i++) {
4271 String perm = perms.get(i);
4272 if (permissionNames != null
4273 && !permissionNames.contains(perm)) {
4274 continue;
4275 }
4276 pw.print(prefix); pw.print(" "); pw.println(perm);
4277 }
4278 }
4279
4280 if (ps.sharedUser == null || permissionNames != null || dumpAll) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004281 PermissionsState permissionsState = ps.getPermissionsState();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004282 dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState);
Svetoslavc6d1c342015-02-26 14:44:43 -08004283 }
4284
Dianne Hackbornc895be72013-03-11 17:48:43 -07004285 for (UserInfo user : users) {
4286 pw.print(prefix); pw.print(" User "); pw.print(user.id); pw.print(": ");
4287 pw.print(" installed=");
4288 pw.print(ps.getInstalled(user.id));
Amith Yamasanie5bcff62014-07-19 15:44:09 -07004289 pw.print(" hidden=");
4290 pw.print(ps.getHidden(user.id));
Andrei Stingaceanu1e283912015-11-26 15:26:28 +00004291 pw.print(" suspended=");
4292 pw.print(ps.getSuspended(user.id));
Dianne Hackbornc895be72013-03-11 17:48:43 -07004293 pw.print(" stopped=");
4294 pw.print(ps.getStopped(user.id));
4295 pw.print(" notLaunched=");
4296 pw.print(ps.getNotLaunched(user.id));
4297 pw.print(" enabled=");
4298 pw.println(ps.getEnabled(user.id));
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -07004299 String lastDisabledAppCaller = ps.getLastDisabledAppCaller(user.id);
4300 if (lastDisabledAppCaller != null) {
4301 pw.print(prefix); pw.print(" lastDisabledCaller: ");
4302 pw.println(lastDisabledAppCaller);
4303 }
Svetoslavc6d1c342015-02-26 14:44:43 -08004304
4305 if (ps.sharedUser == null) {
4306 PermissionsState permissionsState = ps.getPermissionsState();
4307 dumpGidsLPr(pw, prefix + " ", permissionsState.computeGids(user.id));
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004308 dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames, permissionsState
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004309 .getRuntimePermissionStates(user.id), dumpAll);
Svetoslavc6d1c342015-02-26 14:44:43 -08004310 }
4311
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004312 if (permissionNames == null) {
4313 ArraySet<String> cmp = ps.getDisabledComponents(user.id);
4314 if (cmp != null && cmp.size() > 0) {
4315 pw.print(prefix); pw.println(" disabledComponents:");
4316 for (String s : cmp) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004317 pw.print(prefix); pw.print(" "); pw.println(s);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004318 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004319 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004320 cmp = ps.getEnabledComponents(user.id);
4321 if (cmp != null && cmp.size() > 0) {
4322 pw.print(prefix); pw.println(" enabledComponents:");
4323 for (String s : cmp) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004324 pw.print(prefix); pw.print(" "); pw.println(s);
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004325 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004326 }
4327 }
4328 }
Dianne Hackbornc895be72013-03-11 17:48:43 -07004329 }
4330
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004331 void dumpPackagesLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4332 DumpState dumpState, boolean checkin) {
Kenny Root447106f2011-03-23 11:00:15 -07004333 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
4334 final Date date = new Date();
4335 boolean printedSomething = false;
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07004336 List<UserInfo> users = getAllUsers();
Kenny Root447106f2011-03-23 11:00:15 -07004337 for (final PackageSetting ps : mPackages.values()) {
4338 if (packageName != null && !packageName.equals(ps.realName)
4339 && !packageName.equals(ps.name)) {
4340 continue;
4341 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004342 if (permissionNames != null
4343 && !ps.getPermissionsState().hasRequestedPermission(permissionNames)) {
4344 continue;
4345 }
Kenny Root447106f2011-03-23 11:00:15 -07004346
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004347 if (!checkin && packageName != null) {
Kenny Root447106f2011-03-23 11:00:15 -07004348 dumpState.setSharedUser(ps.sharedUser);
4349 }
4350
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004351 if (!checkin && !printedSomething) {
Kenny Root447106f2011-03-23 11:00:15 -07004352 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004353 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004354 pw.println("Packages:");
4355 printedSomething = true;
4356 }
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004357 dumpPackageLPr(pw, " ", checkin ? "pkg" : null, permissionNames, ps, sdf, date, users,
4358 packageName != null);
Kenny Root447106f2011-03-23 11:00:15 -07004359 }
4360
4361 printedSomething = false;
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004362 if (mRenamedPackages.size() > 0 && permissionNames == null) {
Andy McFadden2f362292012-01-20 14:43:38 -08004363 for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Root447106f2011-03-23 11:00:15 -07004364 if (packageName != null && !packageName.equals(e.getKey())
4365 && !packageName.equals(e.getValue())) {
4366 continue;
4367 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004368 if (!checkin) {
4369 if (!printedSomething) {
4370 if (dumpState.onTitlePrinted())
4371 pw.println();
4372 pw.println("Renamed packages:");
4373 printedSomething = true;
4374 }
4375 pw.print(" ");
4376 } else {
4377 pw.print("ren,");
Kenny Root447106f2011-03-23 11:00:15 -07004378 }
Kenny Root447106f2011-03-23 11:00:15 -07004379 pw.print(e.getKey());
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004380 pw.print(checkin ? " -> " : ",");
Kenny Root447106f2011-03-23 11:00:15 -07004381 pw.println(e.getValue());
4382 }
4383 }
4384
4385 printedSomething = false;
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004386 if (mDisabledSysPackages.size() > 0 && permissionNames == null) {
Kenny Root447106f2011-03-23 11:00:15 -07004387 for (final PackageSetting ps : mDisabledSysPackages.values()) {
4388 if (packageName != null && !packageName.equals(ps.realName)
4389 && !packageName.equals(ps.name)) {
4390 continue;
4391 }
Dianne Hackborn60dc0d92014-01-17 13:29:21 -08004392 if (!checkin && !printedSomething) {
Kenny Root447106f2011-03-23 11:00:15 -07004393 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004394 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004395 pw.println("Hidden system packages:");
4396 printedSomething = true;
4397 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004398 dumpPackageLPr(pw, " ", checkin ? "dis" : null, permissionNames, ps, sdf, date,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004399 users, packageName != null);
Kenny Root447106f2011-03-23 11:00:15 -07004400 }
4401 }
4402 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07004403
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004404 void dumpPermissionsLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4405 DumpState dumpState) {
Kenny Root447106f2011-03-23 11:00:15 -07004406 boolean printedSomething = false;
4407 for (BasePermission p : mPermissions.values()) {
4408 if (packageName != null && !packageName.equals(p.sourcePackage)) {
4409 continue;
4410 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004411 if (permissionNames != null && !permissionNames.contains(p.name)) {
4412 continue;
4413 }
Kenny Root447106f2011-03-23 11:00:15 -07004414 if (!printedSomething) {
4415 if (dumpState.onTitlePrinted())
Dianne Hackborncbfd23e2013-06-11 14:26:53 -07004416 pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07004417 pw.println("Permissions:");
4418 printedSomething = true;
4419 }
4420 pw.print(" Permission ["); pw.print(p.name); pw.print("] (");
4421 pw.print(Integer.toHexString(System.identityHashCode(p)));
4422 pw.println("):");
4423 pw.print(" sourcePackage="); pw.println(p.sourcePackage);
4424 pw.print(" uid="); pw.print(p.uid);
Jeff Sharkey00f39042015-03-23 16:51:22 -07004425 pw.print(" gids="); pw.print(Arrays.toString(
Xiaohui Chen594f2082015-08-18 11:04:20 -07004426 p.computeGids(UserHandle.USER_SYSTEM)));
Kenny Root447106f2011-03-23 11:00:15 -07004427 pw.print(" type="); pw.print(p.type);
Dianne Hackborne639da72012-02-21 15:11:13 -08004428 pw.print(" prot=");
4429 pw.println(PermissionInfo.protectionToString(p.protectionLevel));
Kenny Root447106f2011-03-23 11:00:15 -07004430 if (p.perm != null) {
4431 pw.print(" perm="); pw.println(p.perm);
Svet Ganov3e0be742015-08-07 23:06:00 -07004432 if ((p.perm.info.flags & PermissionInfo.FLAG_INSTALLED) == 0
4433 || (p.perm.info.flags & PermissionInfo.FLAG_HIDDEN) != 0) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004434 pw.print(" flags=0x"); pw.println(Integer.toHexString(p.perm.info.flags));
4435 }
4436 }
4437 if (p.packageSetting != null) {
4438 pw.print(" packageSetting="); pw.println(p.packageSetting);
Kenny Root447106f2011-03-23 11:00:15 -07004439 }
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07004440 if (READ_EXTERNAL_STORAGE.equals(p.name)) {
Jeff Sharkey5d32e772012-04-12 15:59:23 -07004441 pw.print(" enforced=");
4442 pw.println(mReadExternalStorageEnforced);
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07004443 }
Kenny Root447106f2011-03-23 11:00:15 -07004444 }
4445 }
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07004446
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004447 void dumpSharedUsersLPr(PrintWriter pw, String packageName, ArraySet<String> permissionNames,
4448 DumpState dumpState, boolean checkin) {
Kenny Root447106f2011-03-23 11:00:15 -07004449 boolean printedSomething = false;
4450 for (SharedUserSetting su : mSharedUsers.values()) {
4451 if (packageName != null && su != dumpState.getSharedUser()) {
4452 continue;
4453 }
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004454 if (permissionNames != null
4455 && !su.getPermissionsState().hasRequestedPermission(permissionNames)) {
4456 continue;
4457 }
Dianne Hackbornd052a942014-11-21 15:23:13 -08004458 if (!checkin) {
4459 if (!printedSomething) {
4460 if (dumpState.onTitlePrinted())
4461 pw.println();
4462 pw.println("Shared users:");
4463 printedSomething = true;
4464 }
4465 pw.print(" SharedUser [");
4466 pw.print(su.name);
4467 pw.print("] (");
4468 pw.print(Integer.toHexString(System.identityHashCode(su)));
4469 pw.println("):");
Svetoslavc6d1c342015-02-26 14:44:43 -08004470
4471 String prefix = " ";
4472 pw.print(prefix); pw.print("userId="); pw.println(su.userId);
4473
4474 PermissionsState permissionsState = su.getPermissionsState();
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004475 dumpInstallPermissionsLPr(pw, prefix, permissionNames, permissionsState);
Svetoslavc6d1c342015-02-26 14:44:43 -08004476
4477 for (int userId : UserManagerService.getInstance().getUserIds()) {
4478 final int[] gids = permissionsState.computeGids(userId);
Svet Ganov8c7f7002015-05-07 10:48:44 -07004479 List<PermissionState> permissions = permissionsState
4480 .getRuntimePermissionStates(userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08004481 if (!ArrayUtils.isEmpty(gids) || !permissions.isEmpty()) {
4482 pw.print(prefix); pw.print("User "); pw.print(userId); pw.println(": ");
4483 dumpGidsLPr(pw, prefix + " ", gids);
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004484 dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames, permissions,
4485 packageName != null);
Svetoslavc6d1c342015-02-26 14:44:43 -08004486 }
Dianne Hackbornd052a942014-11-21 15:23:13 -08004487 }
4488 } else {
4489 pw.print("suid,"); pw.print(su.userId); pw.print(","); pw.println(su.name);
Kenny Root447106f2011-03-23 11:00:15 -07004490 }
4491 }
4492 }
4493
4494 void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
4495 pw.println("Settings parse messages:");
4496 pw.print(mReadMessages.toString());
4497 }
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004498
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07004499 void dumpRestoredPermissionGrantsLPr(PrintWriter pw, DumpState dumpState) {
4500 if (mRestoredUserGrants.size() > 0) {
4501 pw.println();
4502 pw.println("Restored (pending) permission grants:");
4503 for (int userIndex = 0; userIndex < mRestoredUserGrants.size(); userIndex++) {
4504 ArrayMap<String, ArraySet<RestoredPermissionGrant>> grantsByPackage =
4505 mRestoredUserGrants.valueAt(userIndex);
4506 if (grantsByPackage != null && grantsByPackage.size() > 0) {
4507 final int userId = mRestoredUserGrants.keyAt(userIndex);
4508 pw.print(" User "); pw.println(userId);
4509
4510 for (int pkgIndex = 0; pkgIndex < grantsByPackage.size(); pkgIndex++) {
4511 ArraySet<RestoredPermissionGrant> grants = grantsByPackage.valueAt(pkgIndex);
4512 if (grants != null && grants.size() > 0) {
4513 final String pkgName = grantsByPackage.keyAt(pkgIndex);
4514 pw.print(" "); pw.print(pkgName); pw.println(" :");
4515
4516 for (RestoredPermissionGrant g : grants) {
4517 pw.print(" ");
4518 pw.print(g.permissionName);
4519 if (g.granted) {
4520 pw.print(" GRANTED");
4521 }
4522 if ((g.grantBits&FLAG_PERMISSION_USER_SET) != 0) {
4523 pw.print(" user_set");
4524 }
4525 if ((g.grantBits&FLAG_PERMISSION_USER_FIXED) != 0) {
4526 pw.print(" user_fixed");
4527 }
4528 if ((g.grantBits&FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0) {
4529 pw.print(" revoke_on_upgrade");
4530 }
4531 pw.println();
4532 }
4533 }
4534 }
4535 }
4536 }
4537 pw.println();
4538 }
4539 }
4540
Jeff Sharkeyc4d05fc2014-12-01 16:24:01 -08004541 private static void dumpSplitNames(PrintWriter pw, PackageParser.Package pkg) {
4542 if (pkg == null) {
4543 pw.print("unknown");
4544 } else {
4545 // [base:10, config.mdpi, config.xhdpi:12]
4546 pw.print("[");
4547 pw.print("base");
4548 if (pkg.baseRevisionCode != 0) {
4549 pw.print(":"); pw.print(pkg.baseRevisionCode);
4550 }
4551 if (pkg.splitNames != null) {
4552 for (int i = 0; i < pkg.splitNames.length; i++) {
4553 pw.print(", ");
4554 pw.print(pkg.splitNames[i]);
4555 if (pkg.splitRevisionCodes[i] != 0) {
4556 pw.print(":"); pw.print(pkg.splitRevisionCodes[i]);
4557 }
4558 }
4559 }
4560 pw.print("]");
4561 }
4562 }
Svetoslavc6d1c342015-02-26 14:44:43 -08004563
4564 void dumpGidsLPr(PrintWriter pw, String prefix, int[] gids) {
4565 if (!ArrayUtils.isEmpty(gids)) {
Fabrice Di Meglio62271722015-04-10 17:24:02 -07004566 pw.print(prefix);
4567 pw.print("gids="); pw.println(
Svetoslavc6d1c342015-02-26 14:44:43 -08004568 PackageManagerService.arrayToString(gids));
4569 }
4570 }
4571
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004572 void dumpRuntimePermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Dianne Hackborn9f5b0a22015-08-13 18:25:20 -07004573 List<PermissionState> permissionStates, boolean dumpAll) {
4574 if (!permissionStates.isEmpty() || dumpAll) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004575 pw.print(prefix); pw.println("runtime permissions:");
Svet Ganov8c7f7002015-05-07 10:48:44 -07004576 for (PermissionState permissionState : permissionStates) {
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004577 if (permissionNames != null
4578 && !permissionNames.contains(permissionState.getName())) {
4579 continue;
4580 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07004581 pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004582 pw.print(": granted="); pw.print(permissionState.isGranted());
4583 pw.println(permissionFlagsToString(", flags=",
4584 permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08004585 }
4586 }
4587 }
4588
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004589 private static String permissionFlagsToString(String prefix, int flags) {
4590 StringBuilder flagsString = null;
Svet Ganov77ab6a82015-07-03 12:03:02 -07004591 while (flags != 0) {
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004592 if (flagsString == null) {
4593 flagsString = new StringBuilder();
4594 flagsString.append(prefix);
4595 flagsString.append("[ ");
4596 }
Svet Ganov77ab6a82015-07-03 12:03:02 -07004597 final int flag = 1 << Integer.numberOfTrailingZeros(flags);
4598 flags &= ~flag;
4599 flagsString.append(PackageManager.permissionFlagToString(flag));
4600 flagsString.append(' ');
4601 }
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004602 if (flagsString != null) {
4603 flagsString.append(']');
4604 return flagsString.toString();
4605 } else {
4606 return "";
4607 }
Svet Ganov77ab6a82015-07-03 12:03:02 -07004608 }
4609
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004610 void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Svetoslavc6d1c342015-02-26 14:44:43 -08004611 PermissionsState permissionsState) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07004612 List<PermissionState> permissionStates = permissionsState.getInstallPermissionStates();
4613 if (!permissionStates.isEmpty()) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004614 pw.print(prefix); pw.println("install permissions:");
Svet Ganov8c7f7002015-05-07 10:48:44 -07004615 for (PermissionState permissionState : permissionStates) {
Dianne Hackbornca8e6da2015-06-24 15:19:17 -07004616 if (permissionNames != null
4617 && !permissionNames.contains(permissionState.getName())) {
4618 continue;
4619 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07004620 pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
Dianne Hackborncfbfafe2015-07-21 16:57:51 -07004621 pw.print(": granted="); pw.print(permissionState.isGranted());
4622 pw.println(permissionFlagsToString(", flags=",
Svet Ganov8c7f7002015-05-07 10:48:44 -07004623 permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08004624 }
4625 }
4626 }
4627
4628 public void writeRuntimePermissionsForUserLPr(int userId, boolean sync) {
4629 if (sync) {
4630 mRuntimePermissionsPersistence.writePermissionsForUserSyncLPr(userId);
4631 } else {
4632 mRuntimePermissionsPersistence.writePermissionsForUserAsyncLPr(userId);
4633 }
4634 }
4635
4636 private final class RuntimePermissionPersistence {
4637 private static final long WRITE_PERMISSIONS_DELAY_MILLIS = 200;
Svetoslavc6d1c342015-02-26 14:44:43 -08004638 private static final long MAX_WRITE_PERMISSIONS_DELAY_MILLIS = 2000;
4639
4640 private final Handler mHandler = new MyHandler();
4641
4642 private final Object mLock;
4643
4644 @GuardedBy("mLock")
Svet Ganovba3ba812015-06-26 10:54:06 -07004645 private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray();
Svetoslavc6d1c342015-02-26 14:44:43 -08004646
4647 @GuardedBy("mLock")
Svet Ganovba3ba812015-06-26 10:54:06 -07004648 // The mapping keys are user ids.
4649 private final SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray();
4650
4651 @GuardedBy("mLock")
4652 // The mapping keys are user ids.
4653 private final SparseArray<String> mFingerprints = new SparseArray<>();
4654
4655 @GuardedBy("mLock")
4656 // The mapping keys are user ids.
4657 private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray();
Svetoslavc6d1c342015-02-26 14:44:43 -08004658
4659 public RuntimePermissionPersistence(Object lock) {
4660 mLock = lock;
4661 }
4662
Svet Ganovba3ba812015-06-26 10:54:06 -07004663 public boolean areDefaultRuntimPermissionsGrantedLPr(int userId) {
4664 return mDefaultPermissionsGranted.get(userId);
4665 }
4666
4667 public void onDefaultRuntimePermissionsGrantedLPr(int userId) {
4668 mFingerprints.put(userId, Build.FINGERPRINT);
4669 writePermissionsForUserAsyncLPr(userId);
4670 }
4671
Svetoslavc6d1c342015-02-26 14:44:43 -08004672 public void writePermissionsForUserSyncLPr(int userId) {
4673 mHandler.removeMessages(userId);
4674 writePermissionsSync(userId);
4675 }
4676
4677 public void writePermissionsForUserAsyncLPr(int userId) {
4678 final long currentTimeMillis = SystemClock.uptimeMillis();
4679
4680 if (mWriteScheduled.get(userId)) {
4681 mHandler.removeMessages(userId);
4682
4683 // If enough time passed, write without holding off anymore.
4684 final long lastNotWrittenMutationTimeMillis = mLastNotWrittenMutationTimesMillis
4685 .get(userId);
4686 final long timeSinceLastNotWrittenMutationMillis = currentTimeMillis
4687 - lastNotWrittenMutationTimeMillis;
4688 if (timeSinceLastNotWrittenMutationMillis >= MAX_WRITE_PERMISSIONS_DELAY_MILLIS) {
4689 mHandler.obtainMessage(userId).sendToTarget();
4690 return;
4691 }
4692
4693 // Hold off a bit more as settings are frequently changing.
4694 final long maxDelayMillis = Math.max(lastNotWrittenMutationTimeMillis
4695 + MAX_WRITE_PERMISSIONS_DELAY_MILLIS - currentTimeMillis, 0);
4696 final long writeDelayMillis = Math.min(WRITE_PERMISSIONS_DELAY_MILLIS,
4697 maxDelayMillis);
4698
4699 Message message = mHandler.obtainMessage(userId);
4700 mHandler.sendMessageDelayed(message, writeDelayMillis);
4701 } else {
4702 mLastNotWrittenMutationTimesMillis.put(userId, currentTimeMillis);
4703 Message message = mHandler.obtainMessage(userId);
4704 mHandler.sendMessageDelayed(message, WRITE_PERMISSIONS_DELAY_MILLIS);
4705 mWriteScheduled.put(userId, true);
4706 }
4707 }
4708
4709 private void writePermissionsSync(int userId) {
4710 AtomicFile destination = new AtomicFile(getUserRuntimePermissionsFile(userId));
4711
Svet Ganov8c7f7002015-05-07 10:48:44 -07004712 ArrayMap<String, List<PermissionState>> permissionsForPackage = new ArrayMap<>();
4713 ArrayMap<String, List<PermissionState>> permissionsForSharedUser = new ArrayMap<>();
Svetoslavc6d1c342015-02-26 14:44:43 -08004714
4715 synchronized (mLock) {
4716 mWriteScheduled.delete(userId);
4717
4718 final int packageCount = mPackages.size();
4719 for (int i = 0; i < packageCount; i++) {
4720 String packageName = mPackages.keyAt(i);
4721 PackageSetting packageSetting = mPackages.valueAt(i);
4722 if (packageSetting.sharedUser == null) {
4723 PermissionsState permissionsState = packageSetting.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07004724 List<PermissionState> permissionsStates = permissionsState
4725 .getRuntimePermissionStates(userId);
4726 if (!permissionsStates.isEmpty()) {
4727 permissionsForPackage.put(packageName, permissionsStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08004728 }
4729 }
4730 }
4731
4732 final int sharedUserCount = mSharedUsers.size();
4733 for (int i = 0; i < sharedUserCount; i++) {
4734 String sharedUserName = mSharedUsers.keyAt(i);
4735 SharedUserSetting sharedUser = mSharedUsers.valueAt(i);
4736 PermissionsState permissionsState = sharedUser.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07004737 List<PermissionState> permissionsStates = permissionsState
4738 .getRuntimePermissionStates(userId);
4739 if (!permissionsStates.isEmpty()) {
4740 permissionsForSharedUser.put(sharedUserName, permissionsStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08004741 }
4742 }
4743 }
4744
4745 FileOutputStream out = null;
4746 try {
4747 out = destination.startWrite();
4748
4749 XmlSerializer serializer = Xml.newSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01004750 serializer.setOutput(out, StandardCharsets.UTF_8.name());
Svetoslavc6d1c342015-02-26 14:44:43 -08004751 serializer.setFeature(
4752 "http://xmlpull.org/v1/doc/features.html#indent-output", true);
4753 serializer.startDocument(null, true);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07004754
Svetoslavc6d1c342015-02-26 14:44:43 -08004755 serializer.startTag(null, TAG_RUNTIME_PERMISSIONS);
4756
Svet Ganovba3ba812015-06-26 10:54:06 -07004757 String fingerprint = mFingerprints.get(userId);
Svetoslavcdfd2302015-06-25 19:07:31 -07004758 if (fingerprint != null) {
4759 serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);
4760 }
Svet Ganovba3ba812015-06-26 10:54:06 -07004761
Svetoslavc6d1c342015-02-26 14:44:43 -08004762 final int packageCount = permissionsForPackage.size();
4763 for (int i = 0; i < packageCount; i++) {
4764 String packageName = permissionsForPackage.keyAt(i);
Svet Ganov8c7f7002015-05-07 10:48:44 -07004765 List<PermissionState> permissionStates = permissionsForPackage.valueAt(i);
Svetoslavc6d1c342015-02-26 14:44:43 -08004766 serializer.startTag(null, TAG_PACKAGE);
4767 serializer.attribute(null, ATTR_NAME, packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07004768 writePermissions(serializer, permissionStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08004769 serializer.endTag(null, TAG_PACKAGE);
4770 }
4771
4772 final int sharedUserCount = permissionsForSharedUser.size();
4773 for (int i = 0; i < sharedUserCount; i++) {
4774 String packageName = permissionsForSharedUser.keyAt(i);
Svet Ganov8c7f7002015-05-07 10:48:44 -07004775 List<PermissionState> permissionStates = permissionsForSharedUser.valueAt(i);
Svetoslavc6d1c342015-02-26 14:44:43 -08004776 serializer.startTag(null, TAG_SHARED_USER);
4777 serializer.attribute(null, ATTR_NAME, packageName);
Svet Ganov8c7f7002015-05-07 10:48:44 -07004778 writePermissions(serializer, permissionStates);
Svetoslavc6d1c342015-02-26 14:44:43 -08004779 serializer.endTag(null, TAG_SHARED_USER);
4780 }
4781
4782 serializer.endTag(null, TAG_RUNTIME_PERMISSIONS);
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07004783
4784 // Now any restored permission grants that are waiting for the apps
4785 // in question to be installed. These are stored as per-package
4786 // TAG_RESTORED_RUNTIME_PERMISSIONS blocks, each containing some
4787 // number of individual permission grant entities.
4788 if (mRestoredUserGrants.get(userId) != null) {
4789 ArrayMap<String, ArraySet<RestoredPermissionGrant>> restoredGrants =
4790 mRestoredUserGrants.get(userId);
4791 if (restoredGrants != null) {
4792 final int pkgCount = restoredGrants.size();
4793 for (int i = 0; i < pkgCount; i++) {
4794 final ArraySet<RestoredPermissionGrant> pkgGrants =
4795 restoredGrants.valueAt(i);
4796 if (pkgGrants != null && pkgGrants.size() > 0) {
4797 final String pkgName = restoredGrants.keyAt(i);
4798 serializer.startTag(null, TAG_RESTORED_RUNTIME_PERMISSIONS);
4799 serializer.attribute(null, ATTR_PACKAGE_NAME, pkgName);
4800
4801 final int N = pkgGrants.size();
4802 for (int z = 0; z < N; z++) {
4803 RestoredPermissionGrant g = pkgGrants.valueAt(z);
4804 serializer.startTag(null, TAG_PERMISSION_ENTRY);
4805 serializer.attribute(null, ATTR_NAME, g.permissionName);
4806
4807 if (g.granted) {
4808 serializer.attribute(null, ATTR_GRANTED, "true");
4809 }
4810
4811 if ((g.grantBits&FLAG_PERMISSION_USER_SET) != 0) {
4812 serializer.attribute(null, ATTR_USER_SET, "true");
4813 }
4814 if ((g.grantBits&FLAG_PERMISSION_USER_FIXED) != 0) {
4815 serializer.attribute(null, ATTR_USER_FIXED, "true");
4816 }
4817 if ((g.grantBits&FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0) {
4818 serializer.attribute(null, ATTR_REVOKE_ON_UPGRADE, "true");
4819 }
4820 serializer.endTag(null, TAG_PERMISSION_ENTRY);
4821 }
4822 serializer.endTag(null, TAG_RESTORED_RUNTIME_PERMISSIONS);
4823 }
4824 }
4825 }
4826 }
4827
Svetoslavc6d1c342015-02-26 14:44:43 -08004828 serializer.endDocument();
4829 destination.finishWrite(out);
Svet Ganovba0821e2015-04-22 13:34:31 -07004830
Svet Ganovba3ba812015-06-26 10:54:06 -07004831 if (Build.FINGERPRINT.equals(fingerprint)) {
4832 mDefaultPermissionsGranted.put(userId, true);
4833 }
4834 // Any error while writing is fatal.
Svet Ganovba0821e2015-04-22 13:34:31 -07004835 } catch (Throwable t) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004836 Slog.wtf(PackageManagerService.TAG,
Svet Ganovba0821e2015-04-22 13:34:31 -07004837 "Failed to write settings, restoring backup", t);
Svetoslavc6d1c342015-02-26 14:44:43 -08004838 destination.failWrite(out);
4839 } finally {
4840 IoUtils.closeQuietly(out);
4841 }
4842 }
4843
4844 private void onUserRemoved(int userId) {
4845 // Make sure we do not
4846 mHandler.removeMessages(userId);
4847
4848 for (SettingBase sb : mPackages.values()) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07004849 revokeRuntimePermissionsAndClearFlags(sb, userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08004850 }
4851
4852 for (SettingBase sb : mSharedUsers.values()) {
Svet Ganov8c7f7002015-05-07 10:48:44 -07004853 revokeRuntimePermissionsAndClearFlags(sb, userId);
Svetoslavc6d1c342015-02-26 14:44:43 -08004854 }
4855 }
4856
Svet Ganov8c7f7002015-05-07 10:48:44 -07004857 private void revokeRuntimePermissionsAndClearFlags(SettingBase sb, int userId) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004858 PermissionsState permissionsState = sb.getPermissionsState();
Svet Ganov8c7f7002015-05-07 10:48:44 -07004859 for (PermissionState permissionState
4860 : permissionsState.getRuntimePermissionStates(userId)) {
4861 BasePermission bp = mPermissions.get(permissionState.getName());
Svetoslavc6d1c342015-02-26 14:44:43 -08004862 if (bp != null) {
4863 permissionsState.revokeRuntimePermission(bp, userId);
Svet Ganov8c7f7002015-05-07 10:48:44 -07004864 permissionsState.updatePermissionFlags(bp, userId,
4865 PackageManager.MASK_PERMISSION_FLAGS, 0);
Svetoslavc6d1c342015-02-26 14:44:43 -08004866 }
4867 }
4868 }
4869
Svet Ganovadc1cf42015-06-15 16:36:24 -07004870 public void deleteUserRuntimePermissionsFile(int userId) {
4871 getUserRuntimePermissionsFile(userId).delete();
4872 }
4873
Svetoslavc6d1c342015-02-26 14:44:43 -08004874 public void readStateForUserSyncLPr(int userId) {
4875 File permissionsFile = getUserRuntimePermissionsFile(userId);
4876 if (!permissionsFile.exists()) {
4877 return;
4878 }
4879
4880 FileInputStream in;
4881 try {
Svetoslav3dcdd372015-05-29 13:00:32 -07004882 in = new AtomicFile(permissionsFile).openRead();
Svetoslavc6d1c342015-02-26 14:44:43 -08004883 } catch (FileNotFoundException fnfe) {
4884 Slog.i(PackageManagerService.TAG, "No permissions state");
4885 return;
4886 }
4887
4888 try {
4889 XmlPullParser parser = Xml.newPullParser();
4890 parser.setInput(in, null);
4891 parseRuntimePermissionsLPr(parser, userId);
Svet Ganovba0821e2015-04-22 13:34:31 -07004892
Svet Ganove723e542015-04-23 11:58:26 -07004893 } catch (XmlPullParserException | IOException e) {
Svetoslavc6d1c342015-02-26 14:44:43 -08004894 throw new IllegalStateException("Failed parsing permissions file: "
Svet Ganove723e542015-04-23 11:58:26 -07004895 + permissionsFile , e);
Svetoslavc6d1c342015-02-26 14:44:43 -08004896 } finally {
4897 IoUtils.closeQuietly(in);
4898 }
4899 }
4900
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07004901 // Backup/restore support
4902
4903 public void rememberRestoredUserGrantLPr(String pkgName, String permission,
4904 boolean isGranted, int restoredFlagSet, int userId) {
4905 // This change will be remembered at write-settings time
4906 ArrayMap<String, ArraySet<RestoredPermissionGrant>> grantsByPackage =
4907 mRestoredUserGrants.get(userId);
4908 if (grantsByPackage == null) {
4909 grantsByPackage = new ArrayMap<String, ArraySet<RestoredPermissionGrant>>();
4910 mRestoredUserGrants.put(userId, grantsByPackage);
4911 }
4912
4913 ArraySet<RestoredPermissionGrant> grants = grantsByPackage.get(pkgName);
4914 if (grants == null) {
4915 grants = new ArraySet<RestoredPermissionGrant>();
4916 grantsByPackage.put(pkgName, grants);
4917 }
4918
4919 RestoredPermissionGrant grant = new RestoredPermissionGrant(permission,
4920 isGranted, restoredFlagSet);
4921 grants.add(grant);
4922 }
4923
4924 // Private internals
4925
Svetoslavc6d1c342015-02-26 14:44:43 -08004926 private void parseRuntimePermissionsLPr(XmlPullParser parser, int userId)
4927 throws IOException, XmlPullParserException {
Svet Ganov12a692a2015-03-28 19:34:15 -07004928 final int outerDepth = parser.getDepth();
4929 int type;
4930 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
4931 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
4932 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
4933 continue;
4934 }
Svetoslavc6d1c342015-02-26 14:44:43 -08004935
Svet Ganov12a692a2015-03-28 19:34:15 -07004936 switch (parser.getName()) {
Svet Ganovba3ba812015-06-26 10:54:06 -07004937 case TAG_RUNTIME_PERMISSIONS: {
4938 String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT);
4939 mFingerprints.put(userId, fingerprint);
4940 final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint);
4941 mDefaultPermissionsGranted.put(userId, defaultsGranted);
4942 } break;
4943
Svet Ganov12a692a2015-03-28 19:34:15 -07004944 case TAG_PACKAGE: {
4945 String name = parser.getAttributeValue(null, ATTR_NAME);
4946 PackageSetting ps = mPackages.get(name);
4947 if (ps == null) {
4948 Slog.w(PackageManagerService.TAG, "Unknown package:" + name);
4949 XmlUtils.skipCurrentTag(parser);
4950 continue;
4951 }
4952 parsePermissionsLPr(parser, ps.getPermissionsState(), userId);
4953 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08004954
Svet Ganov12a692a2015-03-28 19:34:15 -07004955 case TAG_SHARED_USER: {
4956 String name = parser.getAttributeValue(null, ATTR_NAME);
4957 SharedUserSetting sus = mSharedUsers.get(name);
4958 if (sus == null) {
4959 Slog.w(PackageManagerService.TAG, "Unknown shared user:" + name);
4960 XmlUtils.skipCurrentTag(parser);
4961 continue;
4962 }
4963 parsePermissionsLPr(parser, sus.getPermissionsState(), userId);
4964 } break;
Christopher Tatee9fd1fa2015-09-15 16:43:07 -07004965
4966 case TAG_RESTORED_RUNTIME_PERMISSIONS: {
4967 final String pkgName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
4968 parseRestoredRuntimePermissionsLPr(parser, pkgName, userId);
4969 } break;
4970 }
4971 }
4972 }
4973
4974 private void parseRestoredRuntimePermissionsLPr(XmlPullParser parser,
4975 final String pkgName, final int userId) throws IOException, XmlPullParserException {
4976 final int outerDepth = parser.getDepth();
4977 int type;
4978 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
4979 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
4980 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
4981 continue;
4982 }
4983
4984 switch (parser.getName()) {
4985 case TAG_PERMISSION_ENTRY: {
4986 final String permName = parser.getAttributeValue(null, ATTR_NAME);
4987 final boolean isGranted = "true".equals(
4988 parser.getAttributeValue(null, ATTR_GRANTED));
4989
4990 int permBits = 0;
4991 if ("true".equals(parser.getAttributeValue(null, ATTR_USER_SET))) {
4992 permBits |= FLAG_PERMISSION_USER_SET;
4993 }
4994 if ("true".equals(parser.getAttributeValue(null, ATTR_USER_FIXED))) {
4995 permBits |= FLAG_PERMISSION_USER_FIXED;
4996 }
4997 if ("true".equals(parser.getAttributeValue(null, ATTR_REVOKE_ON_UPGRADE))) {
4998 permBits |= FLAG_PERMISSION_REVOKE_ON_UPGRADE;
4999 }
5000
5001 if (isGranted || permBits != 0) {
5002 rememberRestoredUserGrantLPr(pkgName, permName, isGranted, permBits, userId);
5003 }
5004 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005005 }
5006 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005007 }
5008
Svet Ganov12a692a2015-03-28 19:34:15 -07005009 private void parsePermissionsLPr(XmlPullParser parser, PermissionsState permissionsState,
Svetoslavc6d1c342015-02-26 14:44:43 -08005010 int userId) throws IOException, XmlPullParserException {
Svet Ganov12a692a2015-03-28 19:34:15 -07005011 final int outerDepth = parser.getDepth();
5012 int type;
5013 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
5014 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
5015 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5016 continue;
Svetoslavc6d1c342015-02-26 14:44:43 -08005017 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005018
Svet Ganov12a692a2015-03-28 19:34:15 -07005019 switch (parser.getName()) {
5020 case TAG_ITEM: {
5021 String name = parser.getAttributeValue(null, ATTR_NAME);
5022 BasePermission bp = mPermissions.get(name);
5023 if (bp == null) {
5024 Slog.w(PackageManagerService.TAG, "Unknown permission:" + name);
5025 XmlUtils.skipCurrentTag(parser);
5026 continue;
5027 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005028
Svet Ganov8c7f7002015-05-07 10:48:44 -07005029 String grantedStr = parser.getAttributeValue(null, ATTR_GRANTED);
5030 final boolean granted = grantedStr == null
5031 || Boolean.parseBoolean(grantedStr);
5032
5033 String flagsStr = parser.getAttributeValue(null, ATTR_FLAGS);
5034 final int flags = (flagsStr != null)
5035 ? Integer.parseInt(flagsStr, 16) : 0;
5036
5037 if (granted) {
Svet Ganovadc1cf42015-06-15 16:36:24 -07005038 permissionsState.grantRuntimePermission(bp, userId);
5039 permissionsState.updatePermissionFlags(bp, userId,
Svet Ganov8c7f7002015-05-07 10:48:44 -07005040 PackageManager.MASK_PERMISSION_FLAGS, flags);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005041 } else {
Svet Ganovadc1cf42015-06-15 16:36:24 -07005042 permissionsState.updatePermissionFlags(bp, userId,
5043 PackageManager.MASK_PERMISSION_FLAGS, flags);
Svet Ganov12a692a2015-03-28 19:34:15 -07005044 }
Svet Ganov8c7f7002015-05-07 10:48:44 -07005045
Svet Ganov12a692a2015-03-28 19:34:15 -07005046 } break;
Svetoslavc6d1c342015-02-26 14:44:43 -08005047 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005048 }
Svetoslavc6d1c342015-02-26 14:44:43 -08005049 }
5050
Svet Ganov8c7f7002015-05-07 10:48:44 -07005051 private void writePermissions(XmlSerializer serializer,
5052 List<PermissionState> permissionStates) throws IOException {
5053 for (PermissionState permissionState : permissionStates) {
Svetoslavc6d1c342015-02-26 14:44:43 -08005054 serializer.startTag(null, TAG_ITEM);
Svet Ganov8c7f7002015-05-07 10:48:44 -07005055 serializer.attribute(null, ATTR_NAME,permissionState.getName());
5056 serializer.attribute(null, ATTR_GRANTED,
5057 String.valueOf(permissionState.isGranted()));
5058 serializer.attribute(null, ATTR_FLAGS,
5059 Integer.toHexString(permissionState.getFlags()));
Svetoslavc6d1c342015-02-26 14:44:43 -08005060 serializer.endTag(null, TAG_ITEM);
5061 }
5062 }
5063
5064 private final class MyHandler extends Handler {
5065 public MyHandler() {
5066 super(BackgroundThread.getHandler().getLooper());
5067 }
5068
5069 @Override
5070 public void handleMessage(Message message) {
5071 final int userId = message.what;
5072 Runnable callback = (Runnable) message.obj;
5073 writePermissionsSync(userId);
5074 if (callback != null) {
5075 callback.run();
5076 }
5077 }
5078 }
5079 }
Andy McFadden2f362292012-01-20 14:43:38 -08005080}