blob: 06f11bc9a4dab7fcc8bc6d34ddc162bfc5b0d470 [file] [log] [blame]
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.pm;
18
19import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
20import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
Dianne Hackborn0ac30312011-06-17 14:49:23 -070021import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070022import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
Jeff Sharkey1c27576a2012-04-11 19:07:08 -070023import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070024
25import com.android.internal.util.FastXmlSerializer;
26import com.android.internal.util.JournaledFile;
27import com.android.internal.util.XmlUtils;
28import com.android.server.IntentResolver;
Kenny Root447106f2011-03-23 11:00:15 -070029import com.android.server.pm.PackageManagerService.DumpState;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070030
31import org.xmlpull.v1.XmlPullParser;
32import org.xmlpull.v1.XmlPullParserException;
33import org.xmlpull.v1.XmlSerializer;
34
Kenny Root447106f2011-03-23 11:00:15 -070035import android.content.ComponentName;
Amith Yamasani258848d2012-08-10 17:06:33 -070036import android.content.Context;
Kenny Root447106f2011-03-23 11:00:15 -070037import android.content.Intent;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070038import android.content.pm.ApplicationInfo;
39import android.content.pm.ComponentInfo;
Dianne Hackborn7767eac2012-08-23 18:25:40 -070040import android.content.pm.PackageCleanItem;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070041import android.content.pm.PackageManager;
42import android.content.pm.PackageParser;
43import android.content.pm.PermissionInfo;
44import android.content.pm.Signature;
Amith Yamasani483f3b02012-03-13 16:08:00 -070045import android.content.pm.UserInfo;
Dianne Hackborn7767eac2012-08-23 18:25:40 -070046import android.content.pm.PackageUserState;
Kenny Root0aaa0d92011-09-12 16:42:55 -070047import android.content.pm.VerifierDeviceIdentity;
Kenny Root447106f2011-03-23 11:00:15 -070048import android.os.Binder;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070049import android.os.Environment;
50import android.os.FileUtils;
51import android.os.Process;
Dianne Hackbornf02b60a2012-08-16 10:48:27 -070052import android.os.UserHandle;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070053import android.util.Log;
54import android.util.Slog;
55import android.util.SparseArray;
56import android.util.Xml;
57
58import java.io.BufferedOutputStream;
59import java.io.File;
60import java.io.FileInputStream;
61import java.io.FileOutputStream;
62import java.io.IOException;
63import java.io.PrintWriter;
Kenny Root447106f2011-03-23 11:00:15 -070064import java.text.SimpleDateFormat;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070065import java.util.ArrayList;
66import java.util.Arrays;
Kenny Root447106f2011-03-23 11:00:15 -070067import java.util.Date;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070068import java.util.HashMap;
69import java.util.HashSet;
70import java.util.Iterator;
Amith Yamasani483f3b02012-03-13 16:08:00 -070071import java.util.List;
Andy McFadden2f362292012-01-20 14:43:38 -080072import java.util.Map;
Dianne Hackborn63092712012-10-07 14:45:35 -070073import java.util.Set;
74import java.util.Map.Entry;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070075
Kenny Root62539e92011-11-10 09:35:38 -080076import libcore.io.IoUtils;
77
Kenny Rootcf0b38c2011-03-22 14:17:59 -070078/**
79 * Holds information about dynamic settings.
80 */
81final class Settings {
Kenny Root447106f2011-03-23 11:00:15 -070082 private static final String TAG = "PackageSettings";
83
84 private static final boolean DEBUG_STOPPED = false;
Amith Yamasani258848d2012-08-10 17:06:33 -070085 private static final boolean DEBUG_MU = false;
Kenny Root447106f2011-03-23 11:00:15 -070086
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -070087 private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage";
88 private static final String ATTR_ENFORCEMENT = "enforcement";
89
Amith Yamasani483f3b02012-03-13 16:08:00 -070090 private static final String TAG_ITEM = "item";
91 private static final String TAG_DISABLED_COMPONENTS = "disabled-components";
92 private static final String TAG_ENABLED_COMPONENTS = "enabled-components";
93 private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions";
94 private static final String TAG_PACKAGE = "pkg";
95
96 private static final String ATTR_NAME = "name";
Dianne Hackborn7767eac2012-08-23 18:25:40 -070097 private static final String ATTR_USER = "user";
98 private static final String ATTR_CODE = "code";
Amith Yamasani483f3b02012-03-13 16:08:00 -070099 private static final String ATTR_NOT_LAUNCHED = "nl";
100 private static final String ATTR_ENABLED = "enabled";
101 private static final String ATTR_STOPPED = "stopped";
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700102 private static final String ATTR_INSTALLED = "inst";
Amith Yamasani483f3b02012-03-13 16:08:00 -0700103
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700104 private final File mSettingsFilename;
105 private final File mBackupSettingsFilename;
106 private final File mPackageListFilename;
107 private final File mStoppedPackagesFilename;
108 private final File mBackupStoppedPackagesFilename;
109 final HashMap<String, PackageSetting> mPackages =
110 new HashMap<String, PackageSetting>();
111 // List of replaced system applications
Kenny Rootc52d6fd2012-05-07 23:04:52 -0700112 private final HashMap<String, PackageSetting> mDisabledSysPackages =
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700113 new HashMap<String, PackageSetting>();
114
115 // These are the last platform API version we were using for
116 // the apps installed on internal and external storage. It is
117 // used to grant newer permissions one time during a system upgrade.
118 int mInternalSdkPlatform;
119 int mExternalSdkPlatform;
Kenny Root0aaa0d92011-09-12 16:42:55 -0700120
Jeff Sharkeyf5385772012-05-11 14:04:41 -0700121 Boolean mReadExternalStorageEnforced;
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -0700122
Kenny Root0aaa0d92011-09-12 16:42:55 -0700123 /** Device identity for the purpose of package verification. */
124 private VerifierDeviceIdentity mVerifierDeviceIdentity;
125
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700126 // The user's preferred activities associated with particular intent
127 // filters.
Dianne Hackborn63092712012-10-07 14:45:35 -0700128 final SparseArray<PreferredIntentResolver> mPreferredActivities =
129 new SparseArray<PreferredIntentResolver>();
130
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700131 final HashMap<String, SharedUserSetting> mSharedUsers =
132 new HashMap<String, SharedUserSetting>();
133 private final ArrayList<Object> mUserIds = new ArrayList<Object>();
134 private final SparseArray<Object> mOtherUserIds =
135 new SparseArray<Object>();
136
137 // For reading/writing settings file.
138 private final ArrayList<Signature> mPastSignatures =
139 new ArrayList<Signature>();
140
141 // Mapping from permission names to info about them.
142 final HashMap<String, BasePermission> mPermissions =
143 new HashMap<String, BasePermission>();
144
145 // Mapping from permission tree names to info about them.
146 final HashMap<String, BasePermission> mPermissionTrees =
147 new HashMap<String, BasePermission>();
148
149 // Packages that have been uninstalled and still need their external
150 // storage data deleted.
Jeff Sharkey752cd922012-09-23 16:25:12 -0700151 final ArrayList<PackageCleanItem> mPackagesToBeCleaned = new ArrayList<PackageCleanItem>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700152
153 // Packages that have been renamed since they were first installed.
154 // Keys are the new names of the packages, values are the original
155 // names. The packages appear everwhere else under their original
156 // names.
157 final HashMap<String, String> mRenamedPackages = new HashMap<String, String>();
158
159 final StringBuilder mReadMessages = new StringBuilder();
160
Kenny Root447106f2011-03-23 11:00:15 -0700161 /**
162 * Used to track packages that have a shared user ID that hasn't been read
163 * in yet.
164 * <p>
165 * TODO: make this just a local variable that is passed in during package
166 * scanning to make it less confusing.
167 */
168 private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700169
Amith Yamasani258848d2012-08-10 17:06:33 -0700170 private final Context mContext;
171
Amith Yamasani483f3b02012-03-13 16:08:00 -0700172 private final File mSystemDir;
Amith Yamasani258848d2012-08-10 17:06:33 -0700173 Settings(Context context) {
174 this(context, Environment.getDataDirectory());
Amith Yamasani483f3b02012-03-13 16:08:00 -0700175 }
176
Amith Yamasani258848d2012-08-10 17:06:33 -0700177 Settings(Context context, File dataDir) {
178 mContext = context;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700179 mSystemDir = new File(dataDir, "system");
180 mSystemDir.mkdirs();
181 FileUtils.setPermissions(mSystemDir.toString(),
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700182 FileUtils.S_IRWXU|FileUtils.S_IRWXG
183 |FileUtils.S_IROTH|FileUtils.S_IXOTH,
184 -1, -1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700185 mSettingsFilename = new File(mSystemDir, "packages.xml");
186 mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
187 mPackageListFilename = new File(mSystemDir, "packages.list");
188 // Deprecated: Needed for migration
189 mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
190 mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700191 }
192
Kenny Root447106f2011-03-23 11:00:15 -0700193 PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700194 String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700195 String nativeLibraryPathString, int pkgFlags, UserHandle user, boolean add) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700196 final String name = pkg.packageName;
Kenny Root447106f2011-03-23 11:00:15 -0700197 PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath,
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700198 resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags,
Amith Yamasanif031f232012-10-26 15:35:21 -0700199 user, add, true /* allowInstall */);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700200 return p;
201 }
202
Kenny Root447106f2011-03-23 11:00:15 -0700203 PackageSetting peekPackageLPr(String name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700204 return mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700205 }
206
207 void setInstallStatus(String pkgName, int status) {
208 PackageSetting p = mPackages.get(pkgName);
209 if(p != null) {
210 if(p.getInstallStatus() != status) {
211 p.setInstallStatus(status);
212 }
213 }
214 }
215
216 void setInstallerPackageName(String pkgName,
217 String installerPkgName) {
218 PackageSetting p = mPackages.get(pkgName);
219 if(p != null) {
220 p.setInstallerPackageName(installerPkgName);
221 }
222 }
223
Kenny Root447106f2011-03-23 11:00:15 -0700224 SharedUserSetting getSharedUserLPw(String name,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700225 int pkgFlags, boolean create) {
226 SharedUserSetting s = mSharedUsers.get(name);
227 if (s == null) {
228 if (!create) {
229 return null;
230 }
231 s = new SharedUserSetting(name, pkgFlags);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800232 s.userId = newUserIdLPw(s);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700233 Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
234 // < 0 means we couldn't assign a userid; fall out and return
235 // s, which is currently null
236 if (s.userId >= 0) {
237 mSharedUsers.put(name, s);
238 }
239 }
240
241 return s;
242 }
243
Kenny Root447106f2011-03-23 11:00:15 -0700244 boolean disableSystemPackageLPw(String name) {
245 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700246 if(p == null) {
247 Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package");
248 return false;
249 }
Kenny Root447106f2011-03-23 11:00:15 -0700250 final PackageSetting dp = mDisabledSysPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700251 // always make sure the system package code and resource paths dont change
252 if (dp == null) {
253 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
254 p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
255 }
256 mDisabledSysPackages.put(name, p);
257
258 // a little trick... when we install the new package, we don't
259 // want to modify the existing PackageSetting for the built-in
260 // version. so at this point we need a new PackageSetting that
261 // is okay to muck with.
262 PackageSetting newp = new PackageSetting(p);
Kenny Root447106f2011-03-23 11:00:15 -0700263 replacePackageLPw(name, newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700264 return true;
265 }
266 return false;
267 }
268
Kenny Root447106f2011-03-23 11:00:15 -0700269 PackageSetting enableSystemPackageLPw(String name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700270 PackageSetting p = mDisabledSysPackages.get(name);
271 if(p == null) {
272 Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled");
273 return null;
274 }
275 // Reset flag in ApplicationInfo object
276 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
277 p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
278 }
Kenny Root447106f2011-03-23 11:00:15 -0700279 PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
Amith Yamasani13593602012-03-22 16:16:17 -0700280 p.nativeLibraryPathString, p.appId, p.versionCode, p.pkgFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700281 mDisabledSysPackages.remove(name);
282 return ret;
283 }
284
Kenny Rootc52d6fd2012-05-07 23:04:52 -0700285 boolean isDisabledSystemPackageLPr(String name) {
286 return mDisabledSysPackages.containsKey(name);
287 }
288
289 void removeDisabledSystemPackageLPw(String name) {
290 mDisabledSysPackages.remove(name);
291 }
292
Kenny Root447106f2011-03-23 11:00:15 -0700293 PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700294 String nativeLibraryPathString, int uid, int vc, int pkgFlags) {
295 PackageSetting p = mPackages.get(name);
296 if (p != null) {
Amith Yamasani13593602012-03-22 16:16:17 -0700297 if (p.appId == uid) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700298 return p;
299 }
300 PackageManagerService.reportSettingsProblem(Log.ERROR,
301 "Adding duplicate package, keeping first: " + name);
302 return null;
303 }
304 p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString,
305 vc, pkgFlags);
Amith Yamasani13593602012-03-22 16:16:17 -0700306 p.appId = uid;
Kenny Root447106f2011-03-23 11:00:15 -0700307 if (addUserIdLPw(uid, p, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700308 mPackages.put(name, p);
309 return p;
310 }
311 return null;
312 }
313
Kenny Root447106f2011-03-23 11:00:15 -0700314 SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700315 SharedUserSetting s = mSharedUsers.get(name);
316 if (s != null) {
317 if (s.userId == uid) {
318 return s;
319 }
320 PackageManagerService.reportSettingsProblem(Log.ERROR,
321 "Adding duplicate shared user, keeping first: " + name);
322 return null;
323 }
324 s = new SharedUserSetting(name, pkgFlags);
325 s.userId = uid;
Kenny Root447106f2011-03-23 11:00:15 -0700326 if (addUserIdLPw(uid, s, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700327 mSharedUsers.put(name, s);
328 return s;
329 }
330 return null;
331 }
332
333 // Transfer ownership of permissions from one package to another.
Kenny Root447106f2011-03-23 11:00:15 -0700334 void transferPermissionsLPw(String origPkg, String newPkg) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700335 // Transfer ownership of permissions to the new package.
336 for (int i=0; i<2; i++) {
337 HashMap<String, BasePermission> permissions =
338 i == 0 ? mPermissionTrees : mPermissions;
339 for (BasePermission bp : permissions.values()) {
340 if (origPkg.equals(bp.sourcePackage)) {
341 if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG,
342 "Moving permission " + bp.name
343 + " from pkg " + bp.sourcePackage
344 + " to " + newPkg);
345 bp.sourcePackage = newPkg;
346 bp.packageSetting = null;
347 bp.perm = null;
348 if (bp.pendingInfo != null) {
349 bp.pendingInfo.packageName = newPkg;
350 }
351 bp.uid = 0;
352 bp.gids = null;
353 }
354 }
355 }
356 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700357
Kenny Root447106f2011-03-23 11:00:15 -0700358 private PackageSetting getPackageLPw(String name, PackageSetting origPackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700359 String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700360 String nativeLibraryPathString, int vc, int pkgFlags,
Amith Yamasanif031f232012-10-26 15:35:21 -0700361 UserHandle installUser, boolean add, boolean allowInstall) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700362 PackageSetting p = mPackages.get(name);
363 if (p != null) {
364 if (!p.codePath.equals(codePath)) {
365 // Check to see if its a disabled system app
366 if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
367 // This is an updated system app with versions in both system
368 // and data partition. Just let the most recent version
369 // take precedence.
Amith Yamasani483f3b02012-03-13 16:08:00 -0700370 Slog.w(PackageManagerService.TAG, "Trying to update system app code path from "
371 + p.codePathString + " to " + codePath.toString());
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700372 } else {
373 // Just a change in the code path is not an issue, but
374 // let's log a message about it.
Amith Yamasani483f3b02012-03-13 16:08:00 -0700375 Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from "
376 + p.codePath + " to " + codePath + "; Retaining data and using new");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700377 /*
378 * Since we've changed paths, we need to prefer the new
379 * native library path over the one stored in the
380 * package settings since we might have moved from
381 * internal to external storage or vice versa.
382 */
383 p.nativeLibraryPathString = nativeLibraryPathString;
384 }
385 }
386 if (p.sharedUser != sharedUser) {
387 PackageManagerService.reportSettingsProblem(Log.WARN,
388 "Package " + name + " shared user changed from "
389 + (p.sharedUser != null ? p.sharedUser.name : "<nothing>")
390 + " to "
391 + (sharedUser != null ? sharedUser.name : "<nothing>")
392 + "; replacing with new");
393 p = null;
394 } else {
395 if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
396 // If what we are scanning is a system package, then
397 // make it so, regardless of whether it was previously
398 // installed only in the data partition.
399 p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
400 }
401 }
402 }
403 if (p == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700404 if (origPackage != null) {
405 // We are consuming the data from an existing package.
406 p = new PackageSetting(origPackage.name, name, codePath, resourcePath,
407 nativeLibraryPathString, vc, pkgFlags);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700408 if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package "
409 + name + " is adopting original package " + origPackage.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700410 // Note that we will retain the new package's signature so
411 // that we can keep its data.
412 PackageSignatures s = p.signatures;
413 p.copyFrom(origPackage);
414 p.signatures = s;
415 p.sharedUser = origPackage.sharedUser;
Amith Yamasani13593602012-03-22 16:16:17 -0700416 p.appId = origPackage.appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700417 p.origPackage = origPackage;
418 mRenamedPackages.put(name, origPackage.name);
419 name = origPackage.name;
420 // Update new package state.
421 p.setTimeStamp(codePath.lastModified());
422 } else {
423 p = new PackageSetting(name, realName, codePath, resourcePath,
424 nativeLibraryPathString, vc, pkgFlags);
425 p.setTimeStamp(codePath.lastModified());
426 p.sharedUser = sharedUser;
427 // If this is not a system app, it starts out stopped.
428 if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
Kenny Root447106f2011-03-23 11:00:15 -0700429 if (DEBUG_STOPPED) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700430 RuntimeException e = new RuntimeException("here");
431 e.fillInStackTrace();
432 Slog.i(PackageManagerService.TAG, "Stopping package " + name, e);
433 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700434 List<UserInfo> users = getAllUsers();
Amith Yamasanif031f232012-10-26 15:35:21 -0700435 if (users != null && allowInstall) {
Amith Yamasani483f3b02012-03-13 16:08:00 -0700436 for (UserInfo user : users) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700437 // By default we consider this app to be installed
438 // for the user if no user has been specified (which
439 // means to leave it at its original value, and the
440 // original default value is true), or we are being
441 // asked to install for all users, or this is the
442 // user we are installing for.
443 final boolean installed = installUser == null
444 || installUser.getIdentifier() == UserHandle.USER_ALL
445 || installUser.getIdentifier() == user.id;
446 p.setUserState(user.id, COMPONENT_ENABLED_STATE_DEFAULT,
447 installed,
448 true, // stopped,
449 true, // notLaunched
450 null, null);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700451 writePackageRestrictionsLPr(user.id);
452 }
453 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700454 }
455 if (sharedUser != null) {
Amith Yamasani13593602012-03-22 16:16:17 -0700456 p.appId = sharedUser.userId;
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800457 } else {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700458 // Clone the setting here for disabled system packages
459 PackageSetting dis = mDisabledSysPackages.get(name);
460 if (dis != null) {
461 // For disabled packages a new setting is created
462 // from the existing user id. This still has to be
463 // added to list of user id's
464 // Copy signatures from previous setting
465 if (dis.signatures.mSignatures != null) {
466 p.signatures.mSignatures = dis.signatures.mSignatures.clone();
467 }
Amith Yamasani13593602012-03-22 16:16:17 -0700468 p.appId = dis.appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700469 // Clone permissions
470 p.grantedPermissions = new HashSet<String>(dis.grantedPermissions);
471 // Clone component info
Amith Yamasani483f3b02012-03-13 16:08:00 -0700472 List<UserInfo> users = getAllUsers();
473 if (users != null) {
474 for (UserInfo user : users) {
475 int userId = user.id;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700476 p.setDisabledComponentsCopy(
477 dis.getDisabledComponents(userId), userId);
478 p.setEnabledComponentsCopy(
479 dis.getEnabledComponents(userId), userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700480 }
481 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700482 // Add new setting to list of user ids
Amith Yamasani13593602012-03-22 16:16:17 -0700483 addUserIdLPw(p.appId, p, name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700484 } else {
485 // Assign new user id
Amith Yamasani13593602012-03-22 16:16:17 -0700486 p.appId = newUserIdLPw(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700487 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700488 }
489 }
Amith Yamasani13593602012-03-22 16:16:17 -0700490 if (p.appId < 0) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700491 PackageManagerService.reportSettingsProblem(Log.WARN,
492 "Package " + name + " could not be assigned a valid uid");
493 return null;
494 }
495 if (add) {
496 // Finish adding new package by adding it and updating shared
497 // user preferences
Kenny Root447106f2011-03-23 11:00:15 -0700498 addPackageSettingLPw(p, name, sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700499 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700500 } else {
Amith Yamasanif031f232012-10-26 15:35:21 -0700501 if (installUser != null && allowInstall) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700502 // The caller has explicitly specified the user they want this
503 // package installed for, and the package already exists.
504 // Make sure it conforms to the new request.
505 List<UserInfo> users = getAllUsers();
506 if (users != null) {
507 for (UserInfo user : users) {
508 if (installUser.getIdentifier() == UserHandle.USER_ALL
509 || installUser.getIdentifier() == user.id) {
510 boolean installed = p.getInstalled(user.id);
511 if (!installed) {
512 p.setInstalled(true, user.id);
513 writePackageRestrictionsLPr(user.id);
514 }
515 }
516 }
517 }
518 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700519 }
520 return p;
521 }
522
Kenny Root447106f2011-03-23 11:00:15 -0700523 void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700524 p.pkg = pkg;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700525 // pkg.mSetEnabled = p.getEnabled(userId);
526 // pkg.mSetStopped = p.getStopped(userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700527 final String codePath = pkg.applicationInfo.sourceDir;
528 final String resourcePath = pkg.applicationInfo.publicSourceDir;
529 // Update code path if needed
530 if (!codePath.equalsIgnoreCase(p.codePathString)) {
531 Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName +
532 " changing from " + p.codePathString + " to " + codePath);
533 p.codePath = new File(codePath);
534 p.codePathString = codePath;
535 }
536 //Update resource path if needed
537 if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) {
538 Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName +
539 " changing from " + p.resourcePathString + " to " + resourcePath);
540 p.resourcePath = new File(resourcePath);
541 p.resourcePathString = resourcePath;
542 }
543 // Update the native library path if needed
544 final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir;
545 if (nativeLibraryPath != null
546 && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) {
547 p.nativeLibraryPathString = nativeLibraryPath;
548 }
549 // Update version code if needed
Amith Yamasani483f3b02012-03-13 16:08:00 -0700550 if (pkg.mVersionCode != p.versionCode) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700551 p.versionCode = pkg.mVersionCode;
552 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700553 // Update signatures if needed.
554 if (p.signatures.mSignatures == null) {
555 p.signatures.assignSignatures(pkg.mSignatures);
556 }
Kenny Root5455f682012-09-09 14:52:10 -0700557 // Update flags if needed.
558 if (pkg.applicationInfo.flags != p.pkgFlags) {
559 p.pkgFlags = pkg.applicationInfo.flags;
560 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700561 // If this app defines a shared user id initialize
562 // the shared user signatures as well.
563 if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) {
564 p.sharedUser.signatures.assignSignatures(pkg.mSignatures);
565 }
Kenny Root447106f2011-03-23 11:00:15 -0700566 addPackageSettingLPw(p, pkg.packageName, p.sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700567 }
568
569 // Utility method that adds a PackageSetting to mPackages and
570 // completes updating the shared user attributes
Kenny Root447106f2011-03-23 11:00:15 -0700571 private void addPackageSettingLPw(PackageSetting p, String name,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700572 SharedUserSetting sharedUser) {
573 mPackages.put(name, p);
574 if (sharedUser != null) {
575 if (p.sharedUser != null && p.sharedUser != sharedUser) {
576 PackageManagerService.reportSettingsProblem(Log.ERROR,
577 "Package " + p.name + " was user "
578 + p.sharedUser + " but is now " + sharedUser
579 + "; I am not changing its files so it will probably fail!");
580 p.sharedUser.packages.remove(p);
Amith Yamasani13593602012-03-22 16:16:17 -0700581 } else if (p.appId != sharedUser.userId) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700582 PackageManagerService.reportSettingsProblem(Log.ERROR,
Amith Yamasani13593602012-03-22 16:16:17 -0700583 "Package " + p.name + " was user id " + p.appId
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700584 + " but is now user " + sharedUser
585 + " with id " + sharedUser.userId
586 + "; I am not changing its files so it will probably fail!");
587 }
588
589 sharedUser.packages.add(p);
590 p.sharedUser = sharedUser;
Amith Yamasani13593602012-03-22 16:16:17 -0700591 p.appId = sharedUser.userId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700592 }
593 }
594
595 /*
596 * Update the shared user setting when a package using
597 * specifying the shared user id is removed. The gids
598 * associated with each permission of the deleted package
599 * are removed from the shared user's gid list only if its
600 * not in use by other permissions of packages in the
601 * shared user setting.
602 */
Kenny Root447106f2011-03-23 11:00:15 -0700603 void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) {
604 if ((deletedPs == null) || (deletedPs.pkg == null)) {
605 Slog.i(PackageManagerService.TAG,
606 "Trying to update info for null package. Just ignoring");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700607 return;
608 }
609 // No sharedUserId
610 if (deletedPs.sharedUser == null) {
611 return;
612 }
613 SharedUserSetting sus = deletedPs.sharedUser;
614 // Update permissions
Kenny Root447106f2011-03-23 11:00:15 -0700615 for (String eachPerm : deletedPs.pkg.requestedPermissions) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700616 boolean used = false;
Kenny Root447106f2011-03-23 11:00:15 -0700617 if (!sus.grantedPermissions.contains(eachPerm)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700618 continue;
619 }
620 for (PackageSetting pkg:sus.packages) {
621 if (pkg.pkg != null &&
622 !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) &&
623 pkg.pkg.requestedPermissions.contains(eachPerm)) {
624 used = true;
625 break;
626 }
627 }
628 if (!used) {
629 // can safely delete this permission from list
630 sus.grantedPermissions.remove(eachPerm);
631 }
632 }
633 // Update gids
634 int newGids[] = globalGids;
635 for (String eachPerm : sus.grantedPermissions) {
636 BasePermission bp = mPermissions.get(eachPerm);
637 if (bp != null) {
638 newGids = PackageManagerService.appendInts(newGids, bp.gids);
639 }
640 }
641 sus.gids = newGids;
642 }
643
Kenny Root447106f2011-03-23 11:00:15 -0700644 int removePackageLPw(String name) {
645 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700646 if (p != null) {
647 mPackages.remove(name);
648 if (p.sharedUser != null) {
649 p.sharedUser.packages.remove(p);
650 if (p.sharedUser.packages.size() == 0) {
651 mSharedUsers.remove(p.sharedUser.name);
Kenny Root447106f2011-03-23 11:00:15 -0700652 removeUserIdLPw(p.sharedUser.userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700653 return p.sharedUser.userId;
654 }
655 } else {
Amith Yamasani13593602012-03-22 16:16:17 -0700656 removeUserIdLPw(p.appId);
657 return p.appId;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700658 }
659 }
660 return -1;
661 }
662
Kenny Root447106f2011-03-23 11:00:15 -0700663 private void replacePackageLPw(String name, PackageSetting newp) {
664 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700665 if (p != null) {
666 if (p.sharedUser != null) {
667 p.sharedUser.packages.remove(p);
668 p.sharedUser.packages.add(newp);
669 } else {
Amith Yamasani13593602012-03-22 16:16:17 -0700670 replaceUserIdLPw(p.appId, newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700671 }
672 }
673 mPackages.put(name, newp);
674 }
675
Kenny Root447106f2011-03-23 11:00:15 -0700676 private boolean addUserIdLPw(int uid, Object obj, Object name) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800677 if (uid > Process.LAST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700678 return false;
679 }
680
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800681 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700682 int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800683 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700684 while (index >= N) {
685 mUserIds.add(null);
686 N++;
687 }
688 if (mUserIds.get(index) != null) {
689 PackageManagerService.reportSettingsProblem(Log.ERROR,
690 "Adding duplicate user id: " + uid
691 + " name=" + name);
692 return false;
693 }
694 mUserIds.set(index, obj);
695 } else {
696 if (mOtherUserIds.get(uid) != null) {
697 PackageManagerService.reportSettingsProblem(Log.ERROR,
698 "Adding duplicate shared id: " + uid
699 + " name=" + name);
700 return false;
701 }
702 mOtherUserIds.put(uid, obj);
703 }
704 return true;
705 }
706
Kenny Root447106f2011-03-23 11:00:15 -0700707 public Object getUserIdLPr(int uid) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800708 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700709 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800710 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700711 return index < N ? mUserIds.get(index) : null;
712 } else {
713 return mOtherUserIds.get(uid);
714 }
715 }
716
Kenny Root447106f2011-03-23 11:00:15 -0700717 private void removeUserIdLPw(int uid) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800718 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700719 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800720 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700721 if (index < N) mUserIds.set(index, null);
722 } else {
723 mOtherUserIds.remove(uid);
724 }
725 }
726
Kenny Root447106f2011-03-23 11:00:15 -0700727 private void replaceUserIdLPw(int uid, Object obj) {
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800728 if (uid >= Process.FIRST_APPLICATION_UID) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700729 final int N = mUserIds.size();
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -0800730 final int index = uid - Process.FIRST_APPLICATION_UID;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700731 if (index < N) mUserIds.set(index, obj);
732 } else {
733 mOtherUserIds.put(uid, obj);
734 }
735 }
736
Dianne Hackborn63092712012-10-07 14:45:35 -0700737 PreferredIntentResolver editPreferredActivitiesLPw(int userId) {
738 PreferredIntentResolver pir = mPreferredActivities.get(userId);
739 if (pir == null) {
740 pir = new PreferredIntentResolver();
741 mPreferredActivities.put(userId, pir);
742 }
743 return pir;
744 }
745
Amith Yamasani483f3b02012-03-13 16:08:00 -0700746 private File getUserPackagesStateFile(int userId) {
Amith Yamasani61f57372012-08-31 12:12:28 -0700747 return new File(Environment.getUserSystemDirectory(userId), "package-restrictions.xml");
Amith Yamasani483f3b02012-03-13 16:08:00 -0700748 }
749
750 private File getUserPackagesStateBackupFile(int userId) {
Amith Yamasani61f57372012-08-31 12:12:28 -0700751 return new File(Environment.getUserSystemDirectory(userId),
752 "package-restrictions-backup.xml");
Amith Yamasani483f3b02012-03-13 16:08:00 -0700753 }
754
755 void writeAllUsersPackageRestrictionsLPr() {
756 List<UserInfo> users = getAllUsers();
757 if (users == null) return;
758
759 for (UserInfo user : users) {
760 writePackageRestrictionsLPr(user.id);
761 }
762 }
763
764 void readAllUsersPackageRestrictionsLPr() {
765 List<UserInfo> users = getAllUsers();
766 if (users == null) {
767 readPackageRestrictionsLPr(0);
768 return;
769 }
770
771 for (UserInfo user : users) {
772 readPackageRestrictionsLPr(user.id);
773 }
774 }
775
Dianne Hackborn63092712012-10-07 14:45:35 -0700776 private void readPreferredActivitiesLPw(XmlPullParser parser, int userId)
777 throws XmlPullParserException, IOException {
778 int outerDepth = parser.getDepth();
779 int type;
780 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
781 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
782 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
783 continue;
784 }
785
786 String tagName = parser.getName();
787 if (tagName.equals(TAG_ITEM)) {
788 PreferredActivity pa = new PreferredActivity(parser);
789 if (pa.mPref.getParseError() == null) {
790 editPreferredActivitiesLPw(userId).addFilter(pa);
791 } else {
792 PackageManagerService.reportSettingsProblem(Log.WARN,
793 "Error in package manager settings: <preferred-activity> "
794 + pa.mPref.getParseError() + " at "
795 + parser.getPositionDescription());
796 }
797 } else {
798 PackageManagerService.reportSettingsProblem(Log.WARN,
799 "Unknown element under <preferred-activities>: " + parser.getName());
800 XmlUtils.skipCurrentTag(parser);
801 }
802 }
803 }
804
Amith Yamasani483f3b02012-03-13 16:08:00 -0700805 void readPackageRestrictionsLPr(int userId) {
Amith Yamasani258848d2012-08-10 17:06:33 -0700806 if (DEBUG_MU) {
807 Log.i(TAG, "Reading package restrictions for user=" + userId);
808 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700809 FileInputStream str = null;
810 File userPackagesStateFile = getUserPackagesStateFile(userId);
811 File backupFile = getUserPackagesStateBackupFile(userId);
812 if (backupFile.exists()) {
813 try {
814 str = new FileInputStream(backupFile);
815 mReadMessages.append("Reading from backup stopped packages file\n");
816 PackageManagerService.reportSettingsProblem(Log.INFO,
817 "Need to read from backup stopped packages file");
818 if (userPackagesStateFile.exists()) {
819 // If both the backup and normal file exist, we
820 // ignore the normal one since it might have been
821 // corrupted.
822 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
823 + userPackagesStateFile);
824 userPackagesStateFile.delete();
825 }
826 } catch (java.io.IOException e) {
827 // We'll try for the normal settings file.
828 }
829 }
830
831 try {
832 if (str == null) {
833 if (!userPackagesStateFile.exists()) {
834 mReadMessages.append("No stopped packages file found\n");
835 PackageManagerService.reportSettingsProblem(Log.INFO,
836 "No stopped packages file; "
837 + "assuming all started");
838 // At first boot, make sure no packages are stopped.
839 // We usually want to have third party apps initialize
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700840 // in the stopped state, but not at first boot. Also
841 // consider all applications to be installed.
Amith Yamasani483f3b02012-03-13 16:08:00 -0700842 for (PackageSetting pkg : mPackages.values()) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700843 pkg.setUserState(userId, COMPONENT_ENABLED_STATE_DEFAULT,
844 true, // installed
845 false, // stopped
846 false, // notLaunched
847 null, null);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700848 }
849 return;
850 }
851 str = new FileInputStream(userPackagesStateFile);
852 }
853 final XmlPullParser parser = Xml.newPullParser();
854 parser.setInput(str, null);
855
856 int type;
857 while ((type=parser.next()) != XmlPullParser.START_TAG
858 && type != XmlPullParser.END_DOCUMENT) {
859 ;
860 }
861
862 if (type != XmlPullParser.START_TAG) {
863 mReadMessages.append("No start tag found in package restrictions file\n");
864 PackageManagerService.reportSettingsProblem(Log.WARN,
865 "No start tag found in package manager stopped packages");
866 return;
867 }
868
869 int outerDepth = parser.getDepth();
870 PackageSetting ps = null;
871 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
872 && (type != XmlPullParser.END_TAG
873 || parser.getDepth() > outerDepth)) {
874 if (type == XmlPullParser.END_TAG
875 || type == XmlPullParser.TEXT) {
876 continue;
877 }
878
879 String tagName = parser.getName();
880 if (tagName.equals(TAG_PACKAGE)) {
881 String name = parser.getAttributeValue(null, ATTR_NAME);
882 ps = mPackages.get(name);
883 if (ps == null) {
884 Slog.w(PackageManagerService.TAG, "No package known for stopped package: "
885 + name);
886 XmlUtils.skipCurrentTag(parser);
887 continue;
888 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700889 final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
890 final int enabled = enabledStr == null
891 ? COMPONENT_ENABLED_STATE_DEFAULT : Integer.parseInt(enabledStr);
892 final String installedStr = parser.getAttributeValue(null, ATTR_INSTALLED);
893 final boolean installed = installedStr == null
894 ? true : Boolean.parseBoolean(installedStr);
895 final String stoppedStr = parser.getAttributeValue(null, ATTR_STOPPED);
896 final boolean stopped = stoppedStr == null
897 ? false : Boolean.parseBoolean(stoppedStr);
898 final String notLaunchedStr = parser.getAttributeValue(null, ATTR_NOT_LAUNCHED);
899 final boolean notLaunched = stoppedStr == null
900 ? false : Boolean.parseBoolean(notLaunchedStr);
901
902 HashSet<String> enabledComponents = null;
903 HashSet<String> disabledComponents = null;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700904
905 int packageDepth = parser.getDepth();
906 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
907 && (type != XmlPullParser.END_TAG
908 || parser.getDepth() > packageDepth)) {
909 if (type == XmlPullParser.END_TAG
910 || type == XmlPullParser.TEXT) {
911 continue;
912 }
913 tagName = parser.getName();
914 if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700915 enabledComponents = readComponentsLPr(parser);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700916 } else if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700917 disabledComponents = readComponentsLPr(parser);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700918 }
919 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700920
921 ps.setUserState(userId, enabled, installed, stopped, notLaunched,
922 enabledComponents, disabledComponents);
Dianne Hackborn63092712012-10-07 14:45:35 -0700923 } else if (tagName.equals("preferred-activities")) {
924 readPreferredActivitiesLPw(parser, userId);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700925 } else {
926 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
927 + parser.getName());
928 XmlUtils.skipCurrentTag(parser);
929 }
930 }
931
932 str.close();
933
934 } catch (XmlPullParserException e) {
935 mReadMessages.append("Error reading: " + e.toString());
936 PackageManagerService.reportSettingsProblem(Log.ERROR,
937 "Error reading stopped packages: " + e);
938 Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
939
940 } catch (java.io.IOException e) {
941 mReadMessages.append("Error reading: " + e.toString());
942 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
943 Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
944 }
945 }
946
947 private HashSet<String> readComponentsLPr(XmlPullParser parser)
948 throws IOException, XmlPullParserException {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700949 HashSet<String> components = null;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700950 int type;
951 int outerDepth = parser.getDepth();
952 String tagName;
953 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
954 && (type != XmlPullParser.END_TAG
955 || parser.getDepth() > outerDepth)) {
956 if (type == XmlPullParser.END_TAG
957 || type == XmlPullParser.TEXT) {
958 continue;
959 }
960 tagName = parser.getName();
961 if (tagName.equals(TAG_ITEM)) {
962 String componentName = parser.getAttributeValue(null, ATTR_NAME);
963 if (componentName != null) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700964 if (components == null) {
965 components = new HashSet<String>();
966 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700967 components.add(componentName);
968 }
969 }
970 }
971 return components;
972 }
973
Dianne Hackborn63092712012-10-07 14:45:35 -0700974 void writePreferredActivitiesLPr(XmlSerializer serializer, int userId)
975 throws IllegalArgumentException, IllegalStateException, IOException {
976 serializer.startTag(null, "preferred-activities");
977 PreferredIntentResolver pir = mPreferredActivities.get(userId);
978 if (pir != null) {
979 for (final PreferredActivity pa : pir.filterSet()) {
980 serializer.startTag(null, TAG_ITEM);
981 pa.writeToXml(serializer);
982 serializer.endTag(null, TAG_ITEM);
983 }
984 }
985 serializer.endTag(null, "preferred-activities");
986 }
987
Amith Yamasani483f3b02012-03-13 16:08:00 -0700988 void writePackageRestrictionsLPr(int userId) {
Amith Yamasani258848d2012-08-10 17:06:33 -0700989 if (DEBUG_MU) {
990 Log.i(TAG, "Writing package restrictions for user=" + userId);
991 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700992 // Keep the old stopped packages around until we know the new ones have
993 // been successfully written.
Amith Yamasani483f3b02012-03-13 16:08:00 -0700994 File userPackagesStateFile = getUserPackagesStateFile(userId);
995 File backupFile = getUserPackagesStateBackupFile(userId);
996 new File(userPackagesStateFile.getParent()).mkdirs();
997 if (userPackagesStateFile.exists()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700998 // Presence of backup settings file indicates that we failed
999 // to persist packages earlier. So preserve the older
1000 // backup for future reference since the current packages
1001 // might have been corrupted.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001002 if (!backupFile.exists()) {
1003 if (!userPackagesStateFile.renameTo(backupFile)) {
1004 Log.wtf(PackageManagerService.TAG, "Unable to backup user packages state file, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001005 + "current changes will be lost at reboot");
1006 return;
1007 }
1008 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001009 userPackagesStateFile.delete();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001010 Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
1011 }
1012 }
1013
1014 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001015 final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile);
Kenny Root447106f2011-03-23 11:00:15 -07001016 final BufferedOutputStream str = new BufferedOutputStream(fstr);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001017
Kenny Root447106f2011-03-23 11:00:15 -07001018 final XmlSerializer serializer = new FastXmlSerializer();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001019 serializer.setOutput(str, "utf-8");
1020 serializer.startDocument(null, true);
1021 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
1022
Amith Yamasani483f3b02012-03-13 16:08:00 -07001023 serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001024
Kenny Root447106f2011-03-23 11:00:15 -07001025 for (final PackageSetting pkg : mPackages.values()) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001026 PackageUserState ustate = pkg.readUserState(userId);
1027 if (ustate.stopped || ustate.notLaunched || !ustate.installed
1028 || ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT
1029 || (ustate.enabledComponents != null
1030 && ustate.enabledComponents.size() > 0)
1031 || (ustate.disabledComponents != null
1032 && ustate.disabledComponents.size() > 0)) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001033 serializer.startTag(null, TAG_PACKAGE);
1034 serializer.attribute(null, ATTR_NAME, pkg.name);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001035 if (DEBUG_MU) Log.i(TAG, " pkg=" + pkg.name + ", state=" + ustate.enabled);
Amith Yamasani483f3b02012-03-13 16:08:00 -07001036
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001037 if (!ustate.installed) {
1038 serializer.attribute(null, ATTR_INSTALLED, "false");
1039 }
1040 if (ustate.stopped) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001041 serializer.attribute(null, ATTR_STOPPED, "true");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001042 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001043 if (ustate.notLaunched) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001044 serializer.attribute(null, ATTR_NOT_LAUNCHED, "true");
1045 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001046 if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
1047 serializer.attribute(null, ATTR_ENABLED,
1048 Integer.toString(ustate.enabled));
Amith Yamasani483f3b02012-03-13 16:08:00 -07001049 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001050 if (ustate.enabledComponents != null
1051 && ustate.enabledComponents.size() > 0) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001052 serializer.startTag(null, TAG_ENABLED_COMPONENTS);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001053 for (final String name : ustate.enabledComponents) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001054 serializer.startTag(null, TAG_ITEM);
1055 serializer.attribute(null, ATTR_NAME, name);
1056 serializer.endTag(null, TAG_ITEM);
1057 }
1058 serializer.endTag(null, TAG_ENABLED_COMPONENTS);
1059 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001060 if (ustate.disabledComponents != null
1061 && ustate.disabledComponents.size() > 0) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001062 serializer.startTag(null, TAG_DISABLED_COMPONENTS);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001063 for (final String name : ustate.disabledComponents) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001064 serializer.startTag(null, TAG_ITEM);
1065 serializer.attribute(null, ATTR_NAME, name);
1066 serializer.endTag(null, TAG_ITEM);
1067 }
1068 serializer.endTag(null, TAG_DISABLED_COMPONENTS);
1069 }
1070 serializer.endTag(null, TAG_PACKAGE);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001071 }
1072 }
1073
Dianne Hackborn63092712012-10-07 14:45:35 -07001074 writePreferredActivitiesLPr(serializer, userId);
1075
Amith Yamasani483f3b02012-03-13 16:08:00 -07001076 serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001077
1078 serializer.endDocument();
1079
1080 str.flush();
1081 FileUtils.sync(fstr);
1082 str.close();
1083
1084 // New settings successfully written, old ones are no longer
1085 // needed.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001086 backupFile.delete();
1087 FileUtils.setPermissions(userPackagesStateFile.toString(),
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001088 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08001089 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001090 -1, -1);
1091
1092 // Done, all is good!
1093 return;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001094 } catch(java.io.IOException e) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001095 Log.wtf(PackageManagerService.TAG,
1096 "Unable to write package manager user packages state, "
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001097 + " current changes will be lost at reboot", e);
1098 }
1099
1100 // Clean up partially written files
Amith Yamasani483f3b02012-03-13 16:08:00 -07001101 if (userPackagesStateFile.exists()) {
1102 if (!userPackagesStateFile.delete()) {
1103 Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: "
1104 + mStoppedPackagesFilename);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001105 }
1106 }
1107 }
1108
1109 // Note: assumed "stopped" field is already cleared in all packages.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001110 // Legacy reader, used to read in the old file format after an upgrade. Not used after that.
Kenny Root447106f2011-03-23 11:00:15 -07001111 void readStoppedLPw() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001112 FileInputStream str = null;
1113 if (mBackupStoppedPackagesFilename.exists()) {
1114 try {
1115 str = new FileInputStream(mBackupStoppedPackagesFilename);
1116 mReadMessages.append("Reading from backup stopped packages file\n");
Amith Yamasani483f3b02012-03-13 16:08:00 -07001117 PackageManagerService.reportSettingsProblem(Log.INFO,
1118 "Need to read from backup stopped packages file");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001119 if (mSettingsFilename.exists()) {
1120 // If both the backup and normal file exist, we
1121 // ignore the normal one since it might have been
1122 // corrupted.
1123 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
1124 + mStoppedPackagesFilename);
1125 mStoppedPackagesFilename.delete();
1126 }
1127 } catch (java.io.IOException e) {
1128 // We'll try for the normal settings file.
1129 }
1130 }
1131
1132 try {
1133 if (str == null) {
1134 if (!mStoppedPackagesFilename.exists()) {
1135 mReadMessages.append("No stopped packages file found\n");
Amith Yamasani483f3b02012-03-13 16:08:00 -07001136 PackageManagerService.reportSettingsProblem(Log.INFO,
1137 "No stopped packages file file; assuming all started");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001138 // At first boot, make sure no packages are stopped.
1139 // We usually want to have third party apps initialize
1140 // in the stopped state, but not at first boot.
1141 for (PackageSetting pkg : mPackages.values()) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001142 pkg.setStopped(false, 0);
1143 pkg.setNotLaunched(false, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001144 }
1145 return;
1146 }
1147 str = new FileInputStream(mStoppedPackagesFilename);
1148 }
Kenny Root447106f2011-03-23 11:00:15 -07001149 final XmlPullParser parser = Xml.newPullParser();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001150 parser.setInput(str, null);
1151
1152 int type;
1153 while ((type=parser.next()) != XmlPullParser.START_TAG
1154 && type != XmlPullParser.END_DOCUMENT) {
1155 ;
1156 }
1157
1158 if (type != XmlPullParser.START_TAG) {
1159 mReadMessages.append("No start tag found in stopped packages file\n");
1160 PackageManagerService.reportSettingsProblem(Log.WARN,
1161 "No start tag found in package manager stopped packages");
1162 return;
1163 }
1164
1165 int outerDepth = parser.getDepth();
1166 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1167 && (type != XmlPullParser.END_TAG
1168 || parser.getDepth() > outerDepth)) {
1169 if (type == XmlPullParser.END_TAG
1170 || type == XmlPullParser.TEXT) {
1171 continue;
1172 }
1173
1174 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07001175 if (tagName.equals(TAG_PACKAGE)) {
1176 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001177 PackageSetting ps = mPackages.get(name);
1178 if (ps != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001179 ps.setStopped(true, 0);
1180 if ("1".equals(parser.getAttributeValue(null, ATTR_NOT_LAUNCHED))) {
1181 ps.setNotLaunched(true, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001182 }
1183 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001184 Slog.w(PackageManagerService.TAG,
1185 "No package known for stopped package: " + name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001186 }
1187 XmlUtils.skipCurrentTag(parser);
1188 } else {
1189 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
1190 + parser.getName());
1191 XmlUtils.skipCurrentTag(parser);
1192 }
1193 }
1194
1195 str.close();
1196
Amith Yamasani483f3b02012-03-13 16:08:00 -07001197 } catch (XmlPullParserException e) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001198 mReadMessages.append("Error reading: " + e.toString());
Amith Yamasani483f3b02012-03-13 16:08:00 -07001199 PackageManagerService.reportSettingsProblem(Log.ERROR,
1200 "Error reading stopped packages: " + e);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001201 Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
1202
Amith Yamasani483f3b02012-03-13 16:08:00 -07001203 } catch (java.io.IOException e) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001204 mReadMessages.append("Error reading: " + e.toString());
1205 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1206 Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
1207
1208 }
1209 }
1210
Kenny Root447106f2011-03-23 11:00:15 -07001211 void writeLPr() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001212 //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
1213
1214 // Keep the old settings around until we know the new ones have
1215 // been successfully written.
1216 if (mSettingsFilename.exists()) {
1217 // Presence of backup settings file indicates that we failed
1218 // to persist settings earlier. So preserve the older
1219 // backup for future reference since the current settings
1220 // might have been corrupted.
1221 if (!mBackupSettingsFilename.exists()) {
1222 if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
1223 Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, "
1224 + " current changes will be lost at reboot");
1225 return;
1226 }
1227 } else {
1228 mSettingsFilename.delete();
1229 Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
1230 }
1231 }
1232
1233 mPastSignatures.clear();
1234
1235 try {
1236 FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
1237 BufferedOutputStream str = new BufferedOutputStream(fstr);
1238
1239 //XmlSerializer serializer = XmlUtils.serializerInstance();
1240 XmlSerializer serializer = new FastXmlSerializer();
1241 serializer.setOutput(str, "utf-8");
1242 serializer.startDocument(null, true);
1243 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
1244
1245 serializer.startTag(null, "packages");
1246
1247 serializer.startTag(null, "last-platform-version");
1248 serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform));
1249 serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
1250 serializer.endTag(null, "last-platform-version");
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07001251
Kenny Root0aaa0d92011-09-12 16:42:55 -07001252 if (mVerifierDeviceIdentity != null) {
1253 serializer.startTag(null, "verifier");
1254 serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
1255 serializer.endTag(null, "verifier");
1256 }
1257
Jeff Sharkeyf5385772012-05-11 14:04:41 -07001258 if (mReadExternalStorageEnforced != null) {
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07001259 serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
1260 serializer.attribute(
Jeff Sharkey5d32e772012-04-12 15:59:23 -07001261 null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0");
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07001262 serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE);
1263 }
1264
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001265 serializer.startTag(null, "permission-trees");
1266 for (BasePermission bp : mPermissionTrees.values()) {
Kenny Root447106f2011-03-23 11:00:15 -07001267 writePermissionLPr(serializer, bp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001268 }
1269 serializer.endTag(null, "permission-trees");
1270
1271 serializer.startTag(null, "permissions");
1272 for (BasePermission bp : mPermissions.values()) {
Kenny Root447106f2011-03-23 11:00:15 -07001273 writePermissionLPr(serializer, bp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001274 }
1275 serializer.endTag(null, "permissions");
1276
Kenny Root447106f2011-03-23 11:00:15 -07001277 for (final PackageSetting pkg : mPackages.values()) {
1278 writePackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001279 }
1280
Kenny Root447106f2011-03-23 11:00:15 -07001281 for (final PackageSetting pkg : mDisabledSysPackages.values()) {
1282 writeDisabledSysPackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001283 }
1284
Kenny Root447106f2011-03-23 11:00:15 -07001285 for (final SharedUserSetting usr : mSharedUsers.values()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001286 serializer.startTag(null, "shared-user");
Amith Yamasani483f3b02012-03-13 16:08:00 -07001287 serializer.attribute(null, ATTR_NAME, usr.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001288 serializer.attribute(null, "userId",
1289 Integer.toString(usr.userId));
1290 usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
1291 serializer.startTag(null, "perms");
1292 for (String name : usr.grantedPermissions) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001293 serializer.startTag(null, TAG_ITEM);
1294 serializer.attribute(null, ATTR_NAME, name);
1295 serializer.endTag(null, TAG_ITEM);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001296 }
1297 serializer.endTag(null, "perms");
1298 serializer.endTag(null, "shared-user");
1299 }
1300
1301 if (mPackagesToBeCleaned.size() > 0) {
Jeff Sharkey752cd922012-09-23 16:25:12 -07001302 for (PackageCleanItem item : mPackagesToBeCleaned) {
1303 final String userStr = Integer.toString(item.userId);
1304 serializer.startTag(null, "cleaning-package");
1305 serializer.attribute(null, ATTR_NAME, item.packageName);
1306 serializer.attribute(null, ATTR_CODE, item.andCode ? "true" : "false");
1307 serializer.attribute(null, ATTR_USER, userStr);
1308 serializer.endTag(null, "cleaning-package");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001309 }
1310 }
1311
1312 if (mRenamedPackages.size() > 0) {
Andy McFadden2f362292012-01-20 14:43:38 -08001313 for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001314 serializer.startTag(null, "renamed-package");
1315 serializer.attribute(null, "new", e.getKey());
1316 serializer.attribute(null, "old", e.getValue());
1317 serializer.endTag(null, "renamed-package");
1318 }
1319 }
1320
1321 serializer.endTag(null, "packages");
1322
1323 serializer.endDocument();
1324
1325 str.flush();
1326 FileUtils.sync(fstr);
1327 str.close();
1328
1329 // New settings successfully written, old ones are no longer
1330 // needed.
1331 mBackupSettingsFilename.delete();
1332 FileUtils.setPermissions(mSettingsFilename.toString(),
1333 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08001334 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001335 -1, -1);
1336
1337 // Write package list file now, use a JournaledFile.
1338 //
1339 File tempFile = new File(mPackageListFilename.toString() + ".tmp");
1340 JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
1341
1342 fstr = new FileOutputStream(journal.chooseForWrite());
1343 str = new BufferedOutputStream(fstr);
1344 try {
1345 StringBuilder sb = new StringBuilder();
Kenny Root447106f2011-03-23 11:00:15 -07001346 for (final PackageSetting pkg : mPackages.values()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001347 ApplicationInfo ai = pkg.pkg.applicationInfo;
1348 String dataPath = ai.dataDir;
1349 boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
1350
1351 // Avoid any application that has a space in its path
1352 // or that is handled by the system.
Magnus Eriksson1358ebe2012-03-27 15:40:18 +02001353 if (dataPath.indexOf(" ") >= 0 || ai.uid < Process.FIRST_APPLICATION_UID)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001354 continue;
1355
1356 // we store on each line the following information for now:
1357 //
1358 // pkgName - package name
1359 // userId - application-specific user id
1360 // debugFlag - 0 or 1 if the package is debuggable.
1361 // dataPath - path to package's data path
1362 //
1363 // NOTE: We prefer not to expose all ApplicationInfo flags for now.
1364 //
1365 // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
1366 // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
1367 // system/core/run-as/run-as.c
1368 //
1369 sb.setLength(0);
1370 sb.append(ai.packageName);
1371 sb.append(" ");
1372 sb.append((int)ai.uid);
1373 sb.append(isDebug ? " 1 " : " 0 ");
1374 sb.append(dataPath);
1375 sb.append("\n");
1376 str.write(sb.toString().getBytes());
1377 }
1378 str.flush();
1379 FileUtils.sync(fstr);
1380 str.close();
1381 journal.commit();
Kenny Root62539e92011-11-10 09:35:38 -08001382 } catch (Exception e) {
1383 IoUtils.closeQuietly(str);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001384 journal.rollback();
1385 }
1386
1387 FileUtils.setPermissions(mPackageListFilename.toString(),
1388 FileUtils.S_IRUSR|FileUtils.S_IWUSR
Nick Kralevich70522ad2012-01-06 13:58:01 -08001389 |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001390 -1, -1);
1391
Amith Yamasani483f3b02012-03-13 16:08:00 -07001392 writeAllUsersPackageRestrictionsLPr();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001393 return;
1394
1395 } catch(XmlPullParserException e) {
1396 Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1397 + "current changes will be lost at reboot", e);
1398 } catch(java.io.IOException e) {
1399 Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1400 + "current changes will be lost at reboot", e);
1401 }
1402 // Clean up partially written files
1403 if (mSettingsFilename.exists()) {
1404 if (!mSettingsFilename.delete()) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001405 Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
1406 + mSettingsFilename);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001407 }
1408 }
1409 //Debug.stopMethodTracing();
1410 }
1411
Kenny Root447106f2011-03-23 11:00:15 -07001412 void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001413 throws java.io.IOException {
1414 serializer.startTag(null, "updated-package");
Amith Yamasani483f3b02012-03-13 16:08:00 -07001415 serializer.attribute(null, ATTR_NAME, pkg.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001416 if (pkg.realName != null) {
1417 serializer.attribute(null, "realName", pkg.realName);
1418 }
1419 serializer.attribute(null, "codePath", pkg.codePathString);
1420 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1421 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1422 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1423 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1424 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1425 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1426 }
1427 if (pkg.nativeLibraryPathString != null) {
1428 serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1429 }
1430 if (pkg.sharedUser == null) {
Amith Yamasani13593602012-03-22 16:16:17 -07001431 serializer.attribute(null, "userId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001432 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07001433 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001434 }
1435 serializer.startTag(null, "perms");
1436 if (pkg.sharedUser == null) {
1437 // If this is a shared user, the permissions will
1438 // be written there. We still need to write an
1439 // empty permissions list so permissionsFixed will
1440 // be set.
1441 for (final String name : pkg.grantedPermissions) {
1442 BasePermission bp = mPermissions.get(name);
1443 if (bp != null) {
1444 // We only need to write signature or system permissions but
1445 // this wont
1446 // match the semantics of grantedPermissions. So write all
1447 // permissions.
Amith Yamasani483f3b02012-03-13 16:08:00 -07001448 serializer.startTag(null, TAG_ITEM);
1449 serializer.attribute(null, ATTR_NAME, name);
1450 serializer.endTag(null, TAG_ITEM);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001451 }
1452 }
1453 }
1454 serializer.endTag(null, "perms");
1455 serializer.endTag(null, "updated-package");
1456 }
1457
Kenny Root447106f2011-03-23 11:00:15 -07001458 void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001459 throws java.io.IOException {
1460 serializer.startTag(null, "package");
Amith Yamasani483f3b02012-03-13 16:08:00 -07001461 serializer.attribute(null, ATTR_NAME, pkg.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001462 if (pkg.realName != null) {
1463 serializer.attribute(null, "realName", pkg.realName);
1464 }
1465 serializer.attribute(null, "codePath", pkg.codePathString);
1466 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1467 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1468 }
1469 if (pkg.nativeLibraryPathString != null) {
1470 serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1471 }
1472 serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags));
1473 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1474 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1475 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1476 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1477 if (pkg.sharedUser == null) {
Amith Yamasani13593602012-03-22 16:16:17 -07001478 serializer.attribute(null, "userId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001479 } else {
Amith Yamasani13593602012-03-22 16:16:17 -07001480 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001481 }
1482 if (pkg.uidError) {
1483 serializer.attribute(null, "uidError", "true");
1484 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001485 if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1486 serializer.attribute(null, "installStatus", "false");
1487 }
1488 if (pkg.installerPackageName != null) {
1489 serializer.attribute(null, "installer", pkg.installerPackageName);
1490 }
1491 pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
1492 if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1493 serializer.startTag(null, "perms");
1494 if (pkg.sharedUser == null) {
1495 // If this is a shared user, the permissions will
1496 // be written there. We still need to write an
1497 // empty permissions list so permissionsFixed will
1498 // be set.
1499 for (final String name : pkg.grantedPermissions) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001500 serializer.startTag(null, TAG_ITEM);
1501 serializer.attribute(null, ATTR_NAME, name);
1502 serializer.endTag(null, TAG_ITEM);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001503 }
1504 }
1505 serializer.endTag(null, "perms");
1506 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001507
1508 serializer.endTag(null, "package");
1509 }
1510
Kenny Root447106f2011-03-23 11:00:15 -07001511 void writePermissionLPr(XmlSerializer serializer, BasePermission bp)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001512 throws XmlPullParserException, java.io.IOException {
1513 if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001514 serializer.startTag(null, TAG_ITEM);
1515 serializer.attribute(null, ATTR_NAME, bp.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001516 serializer.attribute(null, "package", bp.sourcePackage);
1517 if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) {
1518 serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel));
1519 }
1520 if (PackageManagerService.DEBUG_SETTINGS)
1521 Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type="
1522 + bp.type);
1523 if (bp.type == BasePermission.TYPE_DYNAMIC) {
Kenny Root447106f2011-03-23 11:00:15 -07001524 final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001525 if (pi != null) {
1526 serializer.attribute(null, "type", "dynamic");
1527 if (pi.icon != 0) {
1528 serializer.attribute(null, "icon", Integer.toString(pi.icon));
1529 }
1530 if (pi.nonLocalizedLabel != null) {
1531 serializer.attribute(null, "label", pi.nonLocalizedLabel.toString());
1532 }
1533 }
1534 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07001535 serializer.endTag(null, TAG_ITEM);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001536 }
1537 }
1538
Kenny Root447106f2011-03-23 11:00:15 -07001539 ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() {
1540 final HashSet<String> kList = new HashSet<String>(mPackages.keySet());
1541 final Iterator<String> its = kList.iterator();
1542 final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001543 while (its.hasNext()) {
Kenny Root447106f2011-03-23 11:00:15 -07001544 final String key = its.next();
1545 final PackageSetting ps = mPackages.get(key);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001546 if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1547 ret.add(ps);
1548 }
1549 }
1550 return ret;
1551 }
1552
Jeff Sharkey752cd922012-09-23 16:25:12 -07001553 void addPackageToCleanLPw(PackageCleanItem pkg) {
1554 if (!mPackagesToBeCleaned.contains(pkg)) {
1555 mPackagesToBeCleaned.add(pkg);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001556 }
1557 }
1558
Dianne Hackborn13579ed2012-11-28 18:05:36 -08001559 boolean readLPw(List<UserInfo> users, int sdkVersion, boolean onlyCore) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001560 FileInputStream str = null;
1561 if (mBackupSettingsFilename.exists()) {
1562 try {
1563 str = new FileInputStream(mBackupSettingsFilename);
1564 mReadMessages.append("Reading from backup settings file\n");
1565 PackageManagerService.reportSettingsProblem(Log.INFO,
1566 "Need to read from backup settings file");
1567 if (mSettingsFilename.exists()) {
1568 // If both the backup and settings file exist, we
1569 // ignore the settings since it might have been
1570 // corrupted.
1571 Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
1572 + mSettingsFilename);
1573 mSettingsFilename.delete();
1574 }
1575 } catch (java.io.IOException e) {
1576 // We'll try for the normal settings file.
1577 }
1578 }
1579
Kenny Root447106f2011-03-23 11:00:15 -07001580 mPendingPackages.clear();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001581 mPastSignatures.clear();
1582
1583 try {
1584 if (str == null) {
1585 if (!mSettingsFilename.exists()) {
1586 mReadMessages.append("No settings file found\n");
1587 PackageManagerService.reportSettingsProblem(Log.INFO,
1588 "No settings file; creating initial state");
Dianne Hackborn13579ed2012-11-28 18:05:36 -08001589 if (!onlyCore) {
1590 readDefaultPreferredAppsLPw(0);
1591 }
1592 mInternalSdkPlatform = mExternalSdkPlatform = sdkVersion;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001593 return false;
1594 }
1595 str = new FileInputStream(mSettingsFilename);
1596 }
1597 XmlPullParser parser = Xml.newPullParser();
1598 parser.setInput(str, null);
1599
1600 int type;
1601 while ((type = parser.next()) != XmlPullParser.START_TAG
1602 && type != XmlPullParser.END_DOCUMENT) {
1603 ;
1604 }
1605
1606 if (type != XmlPullParser.START_TAG) {
1607 mReadMessages.append("No start tag found in settings file\n");
1608 PackageManagerService.reportSettingsProblem(Log.WARN,
1609 "No start tag found in package manager settings");
Dianne Hackborn58f42a52011-10-10 13:46:34 -07001610 Log.wtf(PackageManagerService.TAG,
1611 "No start tag found in package manager settings");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001612 return false;
1613 }
1614
1615 int outerDepth = parser.getDepth();
1616 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1617 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1618 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1619 continue;
1620 }
1621
1622 String tagName = parser.getName();
1623 if (tagName.equals("package")) {
Kenny Root447106f2011-03-23 11:00:15 -07001624 readPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001625 } else if (tagName.equals("permissions")) {
Kenny Root447106f2011-03-23 11:00:15 -07001626 readPermissionsLPw(mPermissions, parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001627 } else if (tagName.equals("permission-trees")) {
Kenny Root447106f2011-03-23 11:00:15 -07001628 readPermissionsLPw(mPermissionTrees, parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001629 } else if (tagName.equals("shared-user")) {
Kenny Root447106f2011-03-23 11:00:15 -07001630 readSharedUserLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001631 } else if (tagName.equals("preferred-packages")) {
1632 // no longer used.
1633 } else if (tagName.equals("preferred-activities")) {
Dianne Hackborn63092712012-10-07 14:45:35 -07001634 // Upgrading from old single-user implementation;
1635 // these are the preferred activities for user 0.
1636 readPreferredActivitiesLPw(parser, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001637 } else if (tagName.equals("updated-package")) {
Kenny Root447106f2011-03-23 11:00:15 -07001638 readDisabledSysPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001639 } else if (tagName.equals("cleaning-package")) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001640 String name = parser.getAttributeValue(null, ATTR_NAME);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001641 String userStr = parser.getAttributeValue(null, ATTR_USER);
1642 String codeStr = parser.getAttributeValue(null, ATTR_CODE);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001643 if (name != null) {
Jeff Sharkey752cd922012-09-23 16:25:12 -07001644 int userId = 0;
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001645 boolean andCode = true;
1646 try {
1647 if (userStr != null) {
Jeff Sharkey752cd922012-09-23 16:25:12 -07001648 userId = Integer.parseInt(userStr);
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001649 }
1650 } catch (NumberFormatException e) {
1651 }
1652 if (codeStr != null) {
1653 andCode = Boolean.parseBoolean(codeStr);
1654 }
Jeff Sharkey752cd922012-09-23 16:25:12 -07001655 addPackageToCleanLPw(new PackageCleanItem(userId, name, andCode));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001656 }
1657 } else if (tagName.equals("renamed-package")) {
1658 String nname = parser.getAttributeValue(null, "new");
1659 String oname = parser.getAttributeValue(null, "old");
1660 if (nname != null && oname != null) {
1661 mRenamedPackages.put(nname, oname);
1662 }
1663 } else if (tagName.equals("last-platform-version")) {
1664 mInternalSdkPlatform = mExternalSdkPlatform = 0;
1665 try {
1666 String internal = parser.getAttributeValue(null, "internal");
1667 if (internal != null) {
1668 mInternalSdkPlatform = Integer.parseInt(internal);
1669 }
1670 String external = parser.getAttributeValue(null, "external");
1671 if (external != null) {
1672 mExternalSdkPlatform = Integer.parseInt(external);
1673 }
1674 } catch (NumberFormatException e) {
1675 }
Kenny Root0aaa0d92011-09-12 16:42:55 -07001676 } else if (tagName.equals("verifier")) {
1677 final String deviceIdentity = parser.getAttributeValue(null, "device");
1678 try {
1679 mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
1680 } catch (IllegalArgumentException e) {
1681 Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
1682 + e.getMessage());
1683 }
Jeff Sharkeyedc84ee82012-03-19 16:52:26 -07001684 } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) {
1685 final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT);
Jeff Sharkey5d32e772012-04-12 15:59:23 -07001686 mReadExternalStorageEnforced = "1".equals(enforcement);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001687 } else {
1688 Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
1689 + parser.getName());
1690 XmlUtils.skipCurrentTag(parser);
1691 }
1692 }
1693
1694 str.close();
1695
1696 } catch (XmlPullParserException e) {
1697 mReadMessages.append("Error reading: " + e.toString());
1698 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1699 Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1700
1701 } catch (java.io.IOException e) {
1702 mReadMessages.append("Error reading: " + e.toString());
1703 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1704 Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
Amith Yamasani258848d2012-08-10 17:06:33 -07001705 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001706
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001707 final int N = mPendingPackages.size();
1708 for (int i = 0; i < N; i++) {
1709 final PendingPackage pp = mPendingPackages.get(i);
Kenny Root447106f2011-03-23 11:00:15 -07001710 Object idObj = getUserIdLPr(pp.sharedId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001711 if (idObj != null && idObj instanceof SharedUserSetting) {
Kenny Root447106f2011-03-23 11:00:15 -07001712 PackageSetting p = getPackageLPw(pp.name, null, pp.realName,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001713 (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
Dianne Hackborn7767eac2012-08-23 18:25:40 -07001714 pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags,
Amith Yamasanif031f232012-10-26 15:35:21 -07001715 null, true /* add */, false /* allowInstall */);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001716 if (p == null) {
1717 PackageManagerService.reportSettingsProblem(Log.WARN,
1718 "Unable to create application package for " + pp.name);
1719 continue;
1720 }
1721 p.copyFrom(pp);
1722 } else if (idObj != null) {
1723 String msg = "Bad package setting: package " + pp.name + " has shared uid "
1724 + pp.sharedId + " that is not a shared uid\n";
1725 mReadMessages.append(msg);
1726 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1727 } else {
1728 String msg = "Bad package setting: package " + pp.name + " has shared uid "
1729 + pp.sharedId + " that is not defined\n";
1730 mReadMessages.append(msg);
1731 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1732 }
1733 }
1734 mPendingPackages.clear();
1735
Amith Yamasanif031f232012-10-26 15:35:21 -07001736 if (mBackupStoppedPackagesFilename.exists()
1737 || mStoppedPackagesFilename.exists()) {
1738 // Read old file
1739 readStoppedLPw();
1740 mBackupStoppedPackagesFilename.delete();
1741 mStoppedPackagesFilename.delete();
1742 // Migrate to new file format
1743 writePackageRestrictionsLPr(0);
1744 } else {
1745 if (users == null) {
1746 readPackageRestrictionsLPr(0);
1747 } else {
1748 for (UserInfo user : users) {
1749 readPackageRestrictionsLPr(user.id);
1750 }
1751 }
1752 }
1753
Kenny Root1d1b4892011-04-08 14:25:24 -07001754 /*
1755 * Make sure all the updated system packages have their shared users
1756 * associated with them.
1757 */
1758 final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
1759 while (disabledIt.hasNext()) {
1760 final PackageSetting disabledPs = disabledIt.next();
Amith Yamasani13593602012-03-22 16:16:17 -07001761 final Object id = getUserIdLPr(disabledPs.appId);
Kenny Root1d1b4892011-04-08 14:25:24 -07001762 if (id != null && id instanceof SharedUserSetting) {
1763 disabledPs.sharedUser = (SharedUserSetting) id;
1764 }
1765 }
1766
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001767 mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
1768 + mSharedUsers.size() + " shared uids\n");
1769
1770 return true;
1771 }
1772
Dianne Hackborn63092712012-10-07 14:45:35 -07001773 private void readDefaultPreferredAppsLPw(int userId) {
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07001774 // Read preferred apps from .../etc/preferred-apps directory.
1775 File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps");
1776 if (!preferredDir.exists() || !preferredDir.isDirectory()) {
1777 return;
1778 }
1779 if (!preferredDir.canRead()) {
1780 Slog.w(TAG, "Directory " + preferredDir + " cannot be read");
1781 return;
1782 }
1783
1784 // Iterate over the files in the directory and scan .xml files
1785 for (File f : preferredDir.listFiles()) {
1786 if (!f.getPath().endsWith(".xml")) {
1787 Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring");
1788 continue;
1789 }
1790 if (!f.canRead()) {
1791 Slog.w(TAG, "Preferred apps file " + f + " cannot be read");
1792 continue;
1793 }
1794
1795 FileInputStream str = null;
1796 try {
1797 str = new FileInputStream(f);
1798 XmlPullParser parser = Xml.newPullParser();
1799 parser.setInput(str, null);
1800
1801 int type;
1802 while ((type = parser.next()) != XmlPullParser.START_TAG
1803 && type != XmlPullParser.END_DOCUMENT) {
1804 ;
1805 }
1806
1807 if (type != XmlPullParser.START_TAG) {
1808 Slog.w(TAG, "Preferred apps file " + f + " does not have start tag");
1809 continue;
1810 }
1811 if (!"preferred-activities".equals(parser.getName())) {
1812 Slog.w(TAG, "Preferred apps file " + f
1813 + " does not start with 'preferred-activities'");
1814 continue;
1815 }
Dianne Hackborn63092712012-10-07 14:45:35 -07001816 readPreferredActivitiesLPw(parser, userId);
Dianne Hackbornfc8b7fe2012-06-18 15:38:12 -07001817 } catch (XmlPullParserException e) {
1818 Slog.w(TAG, "Error reading apps file " + f, e);
1819 } catch (IOException e) {
1820 Slog.w(TAG, "Error reading apps file " + f, e);
1821 } finally {
1822 if (str != null) {
1823 try {
1824 str.close();
1825 } catch (IOException e) {
1826 }
1827 }
1828 }
1829 }
1830 }
1831
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001832 private int readInt(XmlPullParser parser, String ns, String name, int defValue) {
1833 String v = parser.getAttributeValue(ns, name);
1834 try {
1835 if (v == null) {
1836 return defValue;
1837 }
1838 return Integer.parseInt(v);
1839 } catch (NumberFormatException e) {
1840 PackageManagerService.reportSettingsProblem(Log.WARN,
1841 "Error in package manager settings: attribute " + name
1842 + " has bad integer value " + v + " at "
1843 + parser.getPositionDescription());
1844 }
1845 return defValue;
1846 }
1847
Kenny Root447106f2011-03-23 11:00:15 -07001848 private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001849 throws IOException, XmlPullParserException {
1850 int outerDepth = parser.getDepth();
1851 int type;
1852 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1853 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1854 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1855 continue;
1856 }
1857
Kenny Root447106f2011-03-23 11:00:15 -07001858 final String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07001859 if (tagName.equals(TAG_ITEM)) {
1860 final String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Root447106f2011-03-23 11:00:15 -07001861 final String sourcePackage = parser.getAttributeValue(null, "package");
1862 final String ptype = parser.getAttributeValue(null, "type");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001863 if (name != null && sourcePackage != null) {
Kenny Root447106f2011-03-23 11:00:15 -07001864 final boolean dynamic = "dynamic".equals(ptype);
1865 final BasePermission bp = new BasePermission(name, sourcePackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001866 dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL);
1867 bp.protectionLevel = readInt(parser, null, "protection",
1868 PermissionInfo.PROTECTION_NORMAL);
Dianne Hackborne639da72012-02-21 15:11:13 -08001869 bp.protectionLevel = PermissionInfo.fixProtectionLevel(bp.protectionLevel);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001870 if (dynamic) {
1871 PermissionInfo pi = new PermissionInfo();
1872 pi.packageName = sourcePackage.intern();
1873 pi.name = name.intern();
1874 pi.icon = readInt(parser, null, "icon", 0);
1875 pi.nonLocalizedLabel = parser.getAttributeValue(null, "label");
1876 pi.protectionLevel = bp.protectionLevel;
1877 bp.pendingInfo = pi;
1878 }
1879 out.put(bp.name, bp);
1880 } else {
1881 PackageManagerService.reportSettingsProblem(Log.WARN,
1882 "Error in package manager settings: permissions has" + " no name at "
1883 + parser.getPositionDescription());
1884 }
1885 } else {
1886 PackageManagerService.reportSettingsProblem(Log.WARN,
1887 "Unknown element reading permissions: " + parser.getName() + " at "
1888 + parser.getPositionDescription());
1889 }
1890 XmlUtils.skipCurrentTag(parser);
1891 }
1892 }
1893
Kenny Root447106f2011-03-23 11:00:15 -07001894 private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001895 IOException {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001896 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001897 String realName = parser.getAttributeValue(null, "realName");
1898 String codePathStr = parser.getAttributeValue(null, "codePath");
1899 String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1900 String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1901 if (resourcePathStr == null) {
1902 resourcePathStr = codePathStr;
1903 }
1904 String version = parser.getAttributeValue(null, "version");
1905 int versionCode = 0;
1906 if (version != null) {
1907 try {
1908 versionCode = Integer.parseInt(version);
1909 } catch (NumberFormatException e) {
1910 }
1911 }
1912
1913 int pkgFlags = 0;
1914 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1915 PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
1916 new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags);
1917 String timeStampStr = parser.getAttributeValue(null, "ft");
1918 if (timeStampStr != null) {
1919 try {
1920 long timeStamp = Long.parseLong(timeStampStr, 16);
1921 ps.setTimeStamp(timeStamp);
1922 } catch (NumberFormatException e) {
1923 }
1924 } else {
1925 timeStampStr = parser.getAttributeValue(null, "ts");
1926 if (timeStampStr != null) {
1927 try {
1928 long timeStamp = Long.parseLong(timeStampStr);
1929 ps.setTimeStamp(timeStamp);
1930 } catch (NumberFormatException e) {
1931 }
1932 }
1933 }
1934 timeStampStr = parser.getAttributeValue(null, "it");
1935 if (timeStampStr != null) {
1936 try {
1937 ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
1938 } catch (NumberFormatException e) {
1939 }
1940 }
1941 timeStampStr = parser.getAttributeValue(null, "ut");
1942 if (timeStampStr != null) {
1943 try {
1944 ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
1945 } catch (NumberFormatException e) {
1946 }
1947 }
1948 String idStr = parser.getAttributeValue(null, "userId");
Amith Yamasani13593602012-03-22 16:16:17 -07001949 ps.appId = idStr != null ? Integer.parseInt(idStr) : 0;
1950 if (ps.appId <= 0) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001951 String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
Amith Yamasani13593602012-03-22 16:16:17 -07001952 ps.appId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001953 }
1954 int outerDepth = parser.getDepth();
1955 int type;
1956 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1957 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1958 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1959 continue;
1960 }
1961
1962 String tagName = parser.getName();
1963 if (tagName.equals("perms")) {
Kenny Root447106f2011-03-23 11:00:15 -07001964 readGrantedPermissionsLPw(parser, ps.grantedPermissions);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001965 } else {
1966 PackageManagerService.reportSettingsProblem(Log.WARN,
1967 "Unknown element under <updated-package>: " + parser.getName());
1968 XmlUtils.skipCurrentTag(parser);
1969 }
1970 }
1971 mDisabledSysPackages.put(name, ps);
1972 }
1973
Kenny Root447106f2011-03-23 11:00:15 -07001974 private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001975 String name = null;
1976 String realName = null;
1977 String idStr = null;
1978 String sharedIdStr = null;
1979 String codePathStr = null;
1980 String resourcePathStr = null;
1981 String nativeLibraryPathStr = null;
1982 String systemStr = null;
1983 String installerPackageName = null;
1984 String uidError = null;
1985 int pkgFlags = 0;
1986 long timeStamp = 0;
1987 long firstInstallTime = 0;
1988 long lastUpdateTime = 0;
1989 PackageSettingBase packageSetting = null;
1990 String version = null;
1991 int versionCode = 0;
1992 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07001993 name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001994 realName = parser.getAttributeValue(null, "realName");
1995 idStr = parser.getAttributeValue(null, "userId");
1996 uidError = parser.getAttributeValue(null, "uidError");
1997 sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1998 codePathStr = parser.getAttributeValue(null, "codePath");
1999 resourcePathStr = parser.getAttributeValue(null, "resourcePath");
2000 nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
2001 version = parser.getAttributeValue(null, "version");
2002 if (version != null) {
2003 try {
2004 versionCode = Integer.parseInt(version);
2005 } catch (NumberFormatException e) {
2006 }
2007 }
2008 installerPackageName = parser.getAttributeValue(null, "installer");
2009
2010 systemStr = parser.getAttributeValue(null, "flags");
2011 if (systemStr != null) {
2012 try {
2013 pkgFlags = Integer.parseInt(systemStr);
2014 } catch (NumberFormatException e) {
2015 }
2016 } else {
2017 // For backward compatibility
2018 systemStr = parser.getAttributeValue(null, "system");
2019 if (systemStr != null) {
2020 pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
2021 : 0;
2022 } else {
2023 // Old settings that don't specify system... just treat
2024 // them as system, good enough.
2025 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
2026 }
2027 }
2028 String timeStampStr = parser.getAttributeValue(null, "ft");
2029 if (timeStampStr != null) {
2030 try {
2031 timeStamp = Long.parseLong(timeStampStr, 16);
2032 } catch (NumberFormatException e) {
2033 }
2034 } else {
2035 timeStampStr = parser.getAttributeValue(null, "ts");
2036 if (timeStampStr != null) {
2037 try {
2038 timeStamp = Long.parseLong(timeStampStr);
2039 } catch (NumberFormatException e) {
2040 }
2041 }
2042 }
2043 timeStampStr = parser.getAttributeValue(null, "it");
2044 if (timeStampStr != null) {
2045 try {
2046 firstInstallTime = Long.parseLong(timeStampStr, 16);
2047 } catch (NumberFormatException e) {
2048 }
2049 }
2050 timeStampStr = parser.getAttributeValue(null, "ut");
2051 if (timeStampStr != null) {
2052 try {
2053 lastUpdateTime = Long.parseLong(timeStampStr, 16);
2054 } catch (NumberFormatException e) {
2055 }
2056 }
2057 if (PackageManagerService.DEBUG_SETTINGS)
2058 Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
2059 + " sharedUserId=" + sharedIdStr);
2060 int userId = idStr != null ? Integer.parseInt(idStr) : 0;
2061 if (resourcePathStr == null) {
2062 resourcePathStr = codePathStr;
2063 }
2064 if (realName != null) {
2065 realName = realName.intern();
2066 }
2067 if (name == null) {
2068 PackageManagerService.reportSettingsProblem(Log.WARN,
2069 "Error in package manager settings: <package> has no name at "
2070 + parser.getPositionDescription());
2071 } else if (codePathStr == null) {
2072 PackageManagerService.reportSettingsProblem(Log.WARN,
2073 "Error in package manager settings: <package> has no codePath at "
2074 + parser.getPositionDescription());
2075 } else if (userId > 0) {
Kenny Root447106f2011-03-23 11:00:15 -07002076 packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002077 new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode,
2078 pkgFlags);
2079 if (PackageManagerService.DEBUG_SETTINGS)
2080 Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
2081 + userId + " pkg=" + packageSetting);
2082 if (packageSetting == null) {
2083 PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
2084 + userId + " while parsing settings at "
2085 + parser.getPositionDescription());
2086 } else {
2087 packageSetting.setTimeStamp(timeStamp);
2088 packageSetting.firstInstallTime = firstInstallTime;
2089 packageSetting.lastUpdateTime = lastUpdateTime;
2090 }
2091 } else if (sharedIdStr != null) {
2092 userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
2093 if (userId > 0) {
2094 packageSetting = new PendingPackage(name.intern(), realName, new File(
2095 codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId,
2096 versionCode, pkgFlags);
2097 packageSetting.setTimeStamp(timeStamp);
2098 packageSetting.firstInstallTime = firstInstallTime;
2099 packageSetting.lastUpdateTime = lastUpdateTime;
2100 mPendingPackages.add((PendingPackage) packageSetting);
2101 if (PackageManagerService.DEBUG_SETTINGS)
2102 Log.i(PackageManagerService.TAG, "Reading package " + name
2103 + ": sharedUserId=" + userId + " pkg=" + packageSetting);
2104 } else {
2105 PackageManagerService.reportSettingsProblem(Log.WARN,
2106 "Error in package manager settings: package " + name
2107 + " has bad sharedId " + sharedIdStr + " at "
2108 + parser.getPositionDescription());
2109 }
2110 } else {
2111 PackageManagerService.reportSettingsProblem(Log.WARN,
2112 "Error in package manager settings: package " + name + " has bad userId "
2113 + idStr + " at " + parser.getPositionDescription());
2114 }
2115 } catch (NumberFormatException e) {
2116 PackageManagerService.reportSettingsProblem(Log.WARN,
2117 "Error in package manager settings: package " + name + " has bad userId "
2118 + idStr + " at " + parser.getPositionDescription());
2119 }
2120 if (packageSetting != null) {
2121 packageSetting.uidError = "true".equals(uidError);
2122 packageSetting.installerPackageName = installerPackageName;
2123 packageSetting.nativeLibraryPathString = nativeLibraryPathStr;
Amith Yamasani483f3b02012-03-13 16:08:00 -07002124 // Handle legacy string here for single-user mode
2125 final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002126 if (enabledStr != null) {
Dianne Hackbornb8f40002011-07-19 15:17:43 -07002127 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002128 packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07002129 } catch (NumberFormatException e) {
2130 if (enabledStr.equalsIgnoreCase("true")) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002131 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07002132 } else if (enabledStr.equalsIgnoreCase("false")) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002133 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07002134 } else if (enabledStr.equalsIgnoreCase("default")) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002135 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0);
Dianne Hackbornb8f40002011-07-19 15:17:43 -07002136 } else {
2137 PackageManagerService.reportSettingsProblem(Log.WARN,
2138 "Error in package manager settings: package " + name
2139 + " has bad enabled value: " + idStr + " at "
2140 + parser.getPositionDescription());
2141 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002142 }
2143 } else {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002144 packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002145 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07002146
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002147 final String installStatusStr = parser.getAttributeValue(null, "installStatus");
2148 if (installStatusStr != null) {
2149 if (installStatusStr.equalsIgnoreCase("false")) {
2150 packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE;
2151 } else {
2152 packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE;
2153 }
2154 }
2155
2156 int outerDepth = parser.getDepth();
2157 int type;
2158 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2159 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2160 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2161 continue;
2162 }
2163
2164 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002165 // Legacy
2166 if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
2167 readDisabledComponentsLPw(packageSetting, parser, 0);
2168 } else if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
2169 readEnabledComponentsLPw(packageSetting, parser, 0);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002170 } else if (tagName.equals("sigs")) {
2171 packageSetting.signatures.readXml(parser, mPastSignatures);
2172 } else if (tagName.equals("perms")) {
Kenny Root447106f2011-03-23 11:00:15 -07002173 readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002174 packageSetting.permissionsFixed = true;
2175 } else {
2176 PackageManagerService.reportSettingsProblem(Log.WARN,
2177 "Unknown element under <package>: " + parser.getName());
2178 XmlUtils.skipCurrentTag(parser);
2179 }
2180 }
2181 } else {
2182 XmlUtils.skipCurrentTag(parser);
2183 }
2184 }
2185
Amith Yamasani483f3b02012-03-13 16:08:00 -07002186 private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
2187 int userId) throws IOException, XmlPullParserException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002188 int outerDepth = parser.getDepth();
2189 int type;
2190 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2191 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2192 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2193 continue;
2194 }
2195
2196 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002197 if (tagName.equals(TAG_ITEM)) {
2198 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002199 if (name != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002200 packageSetting.addDisabledComponent(name.intern(), userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002201 } else {
2202 PackageManagerService.reportSettingsProblem(Log.WARN,
2203 "Error in package manager settings: <disabled-components> has"
2204 + " no name at " + parser.getPositionDescription());
2205 }
2206 } else {
2207 PackageManagerService.reportSettingsProblem(Log.WARN,
2208 "Unknown element under <disabled-components>: " + parser.getName());
2209 }
2210 XmlUtils.skipCurrentTag(parser);
2211 }
2212 }
2213
Amith Yamasani483f3b02012-03-13 16:08:00 -07002214 private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
2215 int userId) throws IOException, XmlPullParserException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002216 int outerDepth = parser.getDepth();
2217 int type;
2218 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2219 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2220 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2221 continue;
2222 }
2223
2224 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002225 if (tagName.equals(TAG_ITEM)) {
2226 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002227 if (name != null) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002228 packageSetting.addEnabledComponent(name.intern(), userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002229 } else {
2230 PackageManagerService.reportSettingsProblem(Log.WARN,
2231 "Error in package manager settings: <enabled-components> has"
2232 + " no name at " + parser.getPositionDescription());
2233 }
2234 } else {
2235 PackageManagerService.reportSettingsProblem(Log.WARN,
2236 "Unknown element under <enabled-components>: " + parser.getName());
2237 }
2238 XmlUtils.skipCurrentTag(parser);
2239 }
2240 }
2241
Amith Yamasani483f3b02012-03-13 16:08:00 -07002242 private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002243 String name = null;
2244 String idStr = null;
2245 int pkgFlags = 0;
2246 SharedUserSetting su = null;
2247 try {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002248 name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002249 idStr = parser.getAttributeValue(null, "userId");
2250 int userId = idStr != null ? Integer.parseInt(idStr) : 0;
2251 if ("true".equals(parser.getAttributeValue(null, "system"))) {
2252 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
2253 }
2254 if (name == null) {
2255 PackageManagerService.reportSettingsProblem(Log.WARN,
2256 "Error in package manager settings: <shared-user> has no name at "
2257 + parser.getPositionDescription());
2258 } else if (userId == 0) {
2259 PackageManagerService.reportSettingsProblem(Log.WARN,
2260 "Error in package manager settings: shared-user " + name
2261 + " has bad userId " + idStr + " at "
2262 + parser.getPositionDescription());
2263 } else {
Kenny Root447106f2011-03-23 11:00:15 -07002264 if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002265 PackageManagerService
2266 .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
2267 + parser.getPositionDescription());
2268 }
2269 }
2270 } catch (NumberFormatException e) {
2271 PackageManagerService.reportSettingsProblem(Log.WARN,
2272 "Error in package manager settings: package " + name + " has bad userId "
2273 + idStr + " at " + parser.getPositionDescription());
2274 }
2275 ;
2276
2277 if (su != null) {
2278 int outerDepth = parser.getDepth();
2279 int type;
2280 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2281 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2282 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2283 continue;
2284 }
2285
2286 String tagName = parser.getName();
2287 if (tagName.equals("sigs")) {
2288 su.signatures.readXml(parser, mPastSignatures);
2289 } else if (tagName.equals("perms")) {
Kenny Root447106f2011-03-23 11:00:15 -07002290 readGrantedPermissionsLPw(parser, su.grantedPermissions);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002291 } else {
2292 PackageManagerService.reportSettingsProblem(Log.WARN,
2293 "Unknown element under <shared-user>: " + parser.getName());
2294 XmlUtils.skipCurrentTag(parser);
2295 }
2296 }
2297
2298 } else {
2299 XmlUtils.skipCurrentTag(parser);
2300 }
2301 }
2302
Kenny Root447106f2011-03-23 11:00:15 -07002303 private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002304 throws IOException, XmlPullParserException {
2305 int outerDepth = parser.getDepth();
2306 int type;
2307 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2308 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2309 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2310 continue;
2311 }
2312
2313 String tagName = parser.getName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002314 if (tagName.equals(TAG_ITEM)) {
2315 String name = parser.getAttributeValue(null, ATTR_NAME);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002316 if (name != null) {
2317 outPerms.add(name.intern());
2318 } else {
2319 PackageManagerService.reportSettingsProblem(Log.WARN,
2320 "Error in package manager settings: <perms> has" + " no name at "
2321 + parser.getPositionDescription());
2322 }
2323 } else {
2324 PackageManagerService.reportSettingsProblem(Log.WARN,
2325 "Unknown element under <perms>: " + parser.getName());
2326 }
2327 XmlUtils.skipCurrentTag(parser);
2328 }
2329 }
2330
Dianne Hackborn63092712012-10-07 14:45:35 -07002331 void createNewUserLILPw(Installer installer, int userHandle, File path) {
2332 path.mkdir();
2333 FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG
2334 | FileUtils.S_IXOTH, -1, -1);
2335 for (PackageSetting ps : mPackages.values()) {
2336 // Only system apps are initially installed.
2337 ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle);
2338 // Need to create a data directory for all apps under this user.
2339 installer.createUserData(ps.name,
2340 UserHandle.getUid(userHandle, ps.appId), userHandle);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002341 }
Dianne Hackborn63092712012-10-07 14:45:35 -07002342 readDefaultPreferredAppsLPw(userHandle);
2343 writePackageRestrictionsLPr(userHandle);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002344 }
2345
Amith Yamasani13593602012-03-22 16:16:17 -07002346 void removeUserLPr(int userId) {
Dianne Hackborn63092712012-10-07 14:45:35 -07002347 Set<Entry<String, PackageSetting>> entries = mPackages.entrySet();
2348 for (Entry<String, PackageSetting> entry : entries) {
2349 entry.getValue().removeUser(userId);
2350 }
2351 mPreferredActivities.remove(userId);
Amith Yamasani13593602012-03-22 16:16:17 -07002352 File file = getUserPackagesStateFile(userId);
2353 file.delete();
2354 file = getUserPackagesStateBackupFile(userId);
2355 file.delete();
2356 }
2357
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002358 // Returns -1 if we could not find an available UserId to assign
Kenny Root447106f2011-03-23 11:00:15 -07002359 private int newUserIdLPw(Object obj) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002360 // Let's be stupidly inefficient for now...
2361 final int N = mUserIds.size();
2362 for (int i = 0; i < N; i++) {
2363 if (mUserIds.get(i) == null) {
2364 mUserIds.set(i, obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08002365 return Process.FIRST_APPLICATION_UID + i;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002366 }
2367 }
2368
2369 // None left?
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08002370 if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002371 return -1;
2372 }
2373
2374 mUserIds.add(obj);
Dianne Hackborn21fbd1f2012-02-10 10:38:10 -08002375 return Process.FIRST_APPLICATION_UID + N;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002376 }
2377
Kenny Root0aaa0d92011-09-12 16:42:55 -07002378 public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
2379 if (mVerifierDeviceIdentity == null) {
2380 mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
2381
2382 writeLPr();
2383 }
2384
2385 return mVerifierDeviceIdentity;
2386 }
2387
Kenny Root447106f2011-03-23 11:00:15 -07002388 public PackageSetting getDisabledSystemPkgLPr(String name) {
2389 PackageSetting ps = mDisabledSysPackages.get(name);
2390 return ps;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002391 }
2392
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002393 private String compToString(HashSet<String> cmp) {
2394 return cmp != null ? Arrays.toString(cmp.toArray()) : "[]";
2395 }
2396
Amith Yamasani483f3b02012-03-13 16:08:00 -07002397 boolean isEnabledLPr(ComponentInfo componentInfo, int flags, int userId) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002398 if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2399 return true;
2400 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07002401 final String pkgName = componentInfo.packageName;
2402 final PackageSetting packageSettings = mPackages.get(pkgName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002403 if (PackageManagerService.DEBUG_SETTINGS) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002404 Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = "
2405 + componentInfo.packageName + " componentName = " + componentInfo.name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002406 Log.v(PackageManagerService.TAG, "enabledComponents: "
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002407 + compToString(packageSettings.getEnabledComponents(userId)));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002408 Log.v(PackageManagerService.TAG, "disabledComponents: "
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002409 + compToString(packageSettings.getDisabledComponents(userId)));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002410 }
2411 if (packageSettings == null) {
2412 return false;
2413 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002414 PackageUserState ustate = packageSettings.readUserState(userId);
2415 if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED
2416 || ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002417 || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002418 && ustate.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002419 return false;
2420 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002421 if (ustate.enabledComponents != null
2422 && ustate.enabledComponents.contains(componentInfo.name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002423 return true;
2424 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002425 if (ustate.disabledComponents != null
2426 && ustate.disabledComponents.contains(componentInfo.name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002427 return false;
2428 }
2429 return componentInfo.enabled;
2430 }
Kenny Root447106f2011-03-23 11:00:15 -07002431
2432 String getInstallerPackageNameLPr(String packageName) {
2433 final PackageSetting pkg = mPackages.get(packageName);
2434 if (pkg == null) {
2435 throw new IllegalArgumentException("Unknown package: " + packageName);
2436 }
2437 return pkg.installerPackageName;
2438 }
2439
Amith Yamasani483f3b02012-03-13 16:08:00 -07002440 int getApplicationEnabledSettingLPr(String packageName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07002441 final PackageSetting pkg = mPackages.get(packageName);
2442 if (pkg == null) {
2443 throw new IllegalArgumentException("Unknown package: " + packageName);
2444 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07002445 return pkg.getEnabled(userId);
Kenny Root447106f2011-03-23 11:00:15 -07002446 }
2447
Amith Yamasani483f3b02012-03-13 16:08:00 -07002448 int getComponentEnabledSettingLPr(ComponentName componentName, int userId) {
Kenny Root447106f2011-03-23 11:00:15 -07002449 final String packageName = componentName.getPackageName();
2450 final PackageSetting pkg = mPackages.get(packageName);
2451 if (pkg == null) {
2452 throw new IllegalArgumentException("Unknown component: " + componentName);
2453 }
2454 final String classNameStr = componentName.getClassName();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002455 return pkg.getCurrentEnabledStateLPr(classNameStr, userId);
Kenny Root447106f2011-03-23 11:00:15 -07002456 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07002457
Kenny Root447106f2011-03-23 11:00:15 -07002458 boolean setPackageStoppedStateLPw(String packageName, boolean stopped,
Amith Yamasani483f3b02012-03-13 16:08:00 -07002459 boolean allowedByPermission, int uid, int userId) {
Dianne Hackbornf02b60a2012-08-16 10:48:27 -07002460 int appId = UserHandle.getAppId(uid);
Kenny Root447106f2011-03-23 11:00:15 -07002461 final PackageSetting pkgSetting = mPackages.get(packageName);
2462 if (pkgSetting == null) {
2463 throw new IllegalArgumentException("Unknown package: " + packageName);
2464 }
Amith Yamasani13593602012-03-22 16:16:17 -07002465 if (!allowedByPermission && (appId != pkgSetting.appId)) {
Kenny Root447106f2011-03-23 11:00:15 -07002466 throw new SecurityException(
2467 "Permission Denial: attempt to change stopped state from pid="
2468 + Binder.getCallingPid()
Amith Yamasani13593602012-03-22 16:16:17 -07002469 + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
Kenny Root447106f2011-03-23 11:00:15 -07002470 }
2471 if (DEBUG_STOPPED) {
2472 if (stopped) {
2473 RuntimeException e = new RuntimeException("here");
2474 e.fillInStackTrace();
2475 Slog.i(TAG, "Stopping package " + packageName, e);
2476 }
2477 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07002478 if (pkgSetting.getStopped(userId) != stopped) {
2479 pkgSetting.setStopped(stopped, userId);
2480 // pkgSetting.pkg.mSetStopped = stopped;
2481 if (pkgSetting.getNotLaunched(userId)) {
Kenny Root447106f2011-03-23 11:00:15 -07002482 if (pkgSetting.installerPackageName != null) {
2483 PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH,
2484 pkgSetting.name, null,
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002485 pkgSetting.installerPackageName, null, new int[] {userId});
Kenny Root447106f2011-03-23 11:00:15 -07002486 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07002487 pkgSetting.setNotLaunched(false, userId);
Kenny Root447106f2011-03-23 11:00:15 -07002488 }
2489 return true;
2490 }
2491 return false;
2492 }
2493
Amith Yamasani483f3b02012-03-13 16:08:00 -07002494 private List<UserInfo> getAllUsers() {
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07002495 long id = Binder.clearCallingIdentity();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002496 try {
Amith Yamasani920ace02012-09-20 22:15:37 -07002497 return UserManagerService.getInstance().getUsers(false);
Amith Yamasani483f3b02012-03-13 16:08:00 -07002498 } catch (NullPointerException npe) {
2499 // packagemanager not yet initialized
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07002500 } finally {
2501 Binder.restoreCallingIdentity(id);
Amith Yamasani483f3b02012-03-13 16:08:00 -07002502 }
2503 return null;
2504 }
2505
Joe Onorato20963df2012-01-04 18:13:24 -08002506 static final void printFlags(PrintWriter pw, int val, Object[] spec) {
2507 pw.print("[ ");
2508 for (int i=0; i<spec.length; i+=2) {
2509 int mask = (Integer)spec[i];
2510 if ((val & mask) != 0) {
2511 pw.print(spec[i+1]);
2512 pw.print(" ");
2513 }
2514 }
2515 pw.print("]");
2516 }
2517
2518 static final Object[] FLAG_DUMP_SPEC = new Object[] {
2519 ApplicationInfo.FLAG_SYSTEM, "SYSTEM",
2520 ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE",
2521 ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE",
2522 ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT",
2523 ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST",
2524 ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING",
2525 ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA",
2526 ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP",
2527 ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY",
2528 ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE",
2529 ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP",
2530 ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE",
2531 ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION",
2532 ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE",
2533 ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP",
Joe Onorato20963df2012-01-04 18:13:24 -08002534 ApplicationInfo.FLAG_FORWARD_LOCK, "FORWARD_LOCK",
2535 ApplicationInfo.FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
2536 };
2537
Kenny Root447106f2011-03-23 11:00:15 -07002538 void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2539 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2540 final Date date = new Date();
2541 boolean printedSomething = false;
Amith Yamasani7ea3e7d2012-04-20 15:19:35 -07002542 List<UserInfo> users = getAllUsers();
Kenny Root447106f2011-03-23 11:00:15 -07002543 for (final PackageSetting ps : mPackages.values()) {
2544 if (packageName != null && !packageName.equals(ps.realName)
2545 && !packageName.equals(ps.name)) {
2546 continue;
2547 }
2548
2549 if (packageName != null) {
2550 dumpState.setSharedUser(ps.sharedUser);
2551 }
2552
2553 if (!printedSomething) {
2554 if (dumpState.onTitlePrinted())
2555 pw.println(" ");
2556 pw.println("Packages:");
2557 printedSomething = true;
2558 }
2559 pw.print(" Package [");
2560 pw.print(ps.realName != null ? ps.realName : ps.name);
2561 pw.print("] (");
2562 pw.print(Integer.toHexString(System.identityHashCode(ps)));
2563 pw.println("):");
2564
2565 if (ps.realName != null) {
2566 pw.print(" compat name=");
2567 pw.println(ps.name);
2568 }
2569
Amith Yamasani13593602012-03-22 16:16:17 -07002570 pw.print(" userId="); pw.print(ps.appId);
Kenny Root447106f2011-03-23 11:00:15 -07002571 pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids));
2572 pw.print(" sharedUser="); pw.println(ps.sharedUser);
2573 pw.print(" pkg="); pw.println(ps.pkg);
2574 pw.print(" codePath="); pw.println(ps.codePathString);
2575 pw.print(" resourcePath="); pw.println(ps.resourcePathString);
2576 pw.print(" nativeLibraryPath="); pw.println(ps.nativeLibraryPathString);
2577 pw.print(" versionCode="); pw.println(ps.versionCode);
2578 if (ps.pkg != null) {
Kenny Rooteca64b32012-06-25 16:37:32 -07002579 pw.print(" applicationInfo="); pw.println(ps.pkg.applicationInfo.toString());
Joe Onorato20963df2012-01-04 18:13:24 -08002580 pw.print(" flags="); printFlags(pw, ps.pkg.applicationInfo.flags, FLAG_DUMP_SPEC); pw.println();
Kenny Root447106f2011-03-23 11:00:15 -07002581 pw.print(" versionName="); pw.println(ps.pkg.mVersionName);
2582 pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
2583 pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
2584 if (ps.pkg.mOperationPending) {
2585 pw.println(" mOperationPending=true");
2586 }
2587 pw.print(" supportsScreens=[");
2588 boolean first = true;
2589 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
2590 if (!first)
2591 pw.print(", ");
2592 first = false;
2593 pw.print("small");
2594 }
2595 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
2596 if (!first)
2597 pw.print(", ");
2598 first = false;
2599 pw.print("medium");
2600 }
2601 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
2602 if (!first)
2603 pw.print(", ");
2604 first = false;
2605 pw.print("large");
2606 }
2607 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
2608 if (!first)
2609 pw.print(", ");
2610 first = false;
2611 pw.print("xlarge");
2612 }
2613 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
2614 if (!first)
2615 pw.print(", ");
2616 first = false;
2617 pw.print("resizeable");
2618 }
2619 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
2620 if (!first)
2621 pw.print(", ");
2622 first = false;
2623 pw.print("anyDensity");
2624 }
Dianne Hackborn5e03e2c2012-09-06 14:21:19 -07002625 pw.println("]");
Kenny Root447106f2011-03-23 11:00:15 -07002626 }
Kenny Root447106f2011-03-23 11:00:15 -07002627 pw.print(" timeStamp=");
2628 date.setTime(ps.timeStamp);
2629 pw.println(sdf.format(date));
2630 pw.print(" firstInstallTime=");
2631 date.setTime(ps.firstInstallTime);
2632 pw.println(sdf.format(date));
2633 pw.print(" lastUpdateTime=");
2634 date.setTime(ps.lastUpdateTime);
2635 pw.println(sdf.format(date));
2636 if (ps.installerPackageName != null) {
2637 pw.print(" installerPackageName="); pw.println(ps.installerPackageName);
2638 }
2639 pw.print(" signatures="); pw.println(ps.signatures);
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -07002640 pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed);
2641 pw.print(" haveGids="); pw.print(ps.haveGids);
2642 pw.print(" installStatus="); pw.println(ps.installStatus);
Kenny Root5455f682012-09-09 14:52:10 -07002643 pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -07002644 pw.println();
Amith Yamasani483f3b02012-03-13 16:08:00 -07002645 for (UserInfo user : users) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002646 pw.print(" User "); pw.print(user.id); pw.print(": ");
2647 pw.print(" installed=");
2648 pw.print(ps.getInstalled(user.id));
Amith Yamasani483f3b02012-03-13 16:08:00 -07002649 pw.print(" stopped=");
2650 pw.print(ps.getStopped(user.id));
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002651 pw.print(" notLaunched=");
2652 pw.print(ps.getNotLaunched(user.id));
Amith Yamasani483f3b02012-03-13 16:08:00 -07002653 pw.print(" enabled=");
2654 pw.println(ps.getEnabled(user.id));
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002655 HashSet<String> cmp = ps.getDisabledComponents(user.id);
2656 if (cmp != null && cmp.size() > 0) {
2657 pw.println(" disabledComponents:");
2658 for (String s : cmp) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002659 pw.print(" "); pw.println(s);
2660 }
Kenny Root447106f2011-03-23 11:00:15 -07002661 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -07002662 cmp = ps.getEnabledComponents(user.id);
2663 if (cmp != null && cmp.size() > 0) {
2664 pw.println(" enabledComponents:");
2665 for (String s : cmp) {
Amith Yamasani483f3b02012-03-13 16:08:00 -07002666 pw.print(" "); pw.println(s);
2667 }
Kenny Root447106f2011-03-23 11:00:15 -07002668 }
2669 }
2670 if (ps.grantedPermissions.size() > 0) {
2671 pw.println(" grantedPermissions:");
2672 for (String s : ps.grantedPermissions) {
2673 pw.print(" "); pw.println(s);
2674 }
2675 }
2676 }
2677
2678 printedSomething = false;
2679 if (mRenamedPackages.size() > 0) {
Andy McFadden2f362292012-01-20 14:43:38 -08002680 for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
Kenny Root447106f2011-03-23 11:00:15 -07002681 if (packageName != null && !packageName.equals(e.getKey())
2682 && !packageName.equals(e.getValue())) {
2683 continue;
2684 }
2685 if (!printedSomething) {
2686 if (dumpState.onTitlePrinted())
2687 pw.println(" ");
2688 pw.println("Renamed packages:");
2689 printedSomething = true;
2690 }
2691 pw.print(" ");
2692 pw.print(e.getKey());
2693 pw.print(" -> ");
2694 pw.println(e.getValue());
2695 }
2696 }
2697
2698 printedSomething = false;
2699 if (mDisabledSysPackages.size() > 0) {
2700 for (final PackageSetting ps : mDisabledSysPackages.values()) {
2701 if (packageName != null && !packageName.equals(ps.realName)
2702 && !packageName.equals(ps.name)) {
2703 continue;
2704 }
2705 if (!printedSomething) {
2706 if (dumpState.onTitlePrinted())
2707 pw.println(" ");
2708 pw.println("Hidden system packages:");
2709 printedSomething = true;
2710 }
2711 pw.print(" Package [");
2712 pw.print(ps.realName != null ? ps.realName : ps.name);
2713 pw.print("] (");
2714 pw.print(Integer.toHexString(System.identityHashCode(ps)));
2715 pw.println("):");
2716 if (ps.realName != null) {
2717 pw.print(" compat name=");
2718 pw.println(ps.name);
2719 }
Kenny Rooteca64b32012-06-25 16:37:32 -07002720 if (ps.pkg != null && ps.pkg.applicationInfo != null) {
2721 pw.print(" applicationInfo=");
2722 pw.println(ps.pkg.applicationInfo.toString());
2723 }
Kenny Root447106f2011-03-23 11:00:15 -07002724 pw.print(" userId=");
Amith Yamasani13593602012-03-22 16:16:17 -07002725 pw.println(ps.appId);
Kenny Root447106f2011-03-23 11:00:15 -07002726 pw.print(" sharedUser=");
2727 pw.println(ps.sharedUser);
2728 pw.print(" codePath=");
2729 pw.println(ps.codePathString);
2730 pw.print(" resourcePath=");
2731 pw.println(ps.resourcePathString);
2732 }
2733 }
2734 }
Amith Yamasani483f3b02012-03-13 16:08:00 -07002735
Kenny Root447106f2011-03-23 11:00:15 -07002736 void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2737 boolean printedSomething = false;
2738 for (BasePermission p : mPermissions.values()) {
2739 if (packageName != null && !packageName.equals(p.sourcePackage)) {
2740 continue;
2741 }
2742 if (!printedSomething) {
2743 if (dumpState.onTitlePrinted())
2744 pw.println(" ");
2745 pw.println("Permissions:");
2746 printedSomething = true;
2747 }
2748 pw.print(" Permission ["); pw.print(p.name); pw.print("] (");
2749 pw.print(Integer.toHexString(System.identityHashCode(p)));
2750 pw.println("):");
2751 pw.print(" sourcePackage="); pw.println(p.sourcePackage);
2752 pw.print(" uid="); pw.print(p.uid);
2753 pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids));
2754 pw.print(" type="); pw.print(p.type);
Dianne Hackborne639da72012-02-21 15:11:13 -08002755 pw.print(" prot=");
2756 pw.println(PermissionInfo.protectionToString(p.protectionLevel));
Kenny Root447106f2011-03-23 11:00:15 -07002757 if (p.packageSetting != null) {
2758 pw.print(" packageSetting="); pw.println(p.packageSetting);
2759 }
2760 if (p.perm != null) {
2761 pw.print(" perm="); pw.println(p.perm);
2762 }
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07002763 if (READ_EXTERNAL_STORAGE.equals(p.name)) {
Jeff Sharkey5d32e772012-04-12 15:59:23 -07002764 pw.print(" enforced=");
2765 pw.println(mReadExternalStorageEnforced);
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07002766 }
Kenny Root447106f2011-03-23 11:00:15 -07002767 }
2768 }
Jeff Sharkey1c27576a2012-04-11 19:07:08 -07002769
Kenny Root447106f2011-03-23 11:00:15 -07002770 void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2771 boolean printedSomething = false;
2772 for (SharedUserSetting su : mSharedUsers.values()) {
2773 if (packageName != null && su != dumpState.getSharedUser()) {
2774 continue;
2775 }
2776 if (!printedSomething) {
2777 if (dumpState.onTitlePrinted())
2778 pw.println(" ");
2779 pw.println("Shared users:");
2780 printedSomething = true;
2781 }
2782 pw.print(" SharedUser [");
2783 pw.print(su.name);
2784 pw.print("] (");
2785 pw.print(Integer.toHexString(System.identityHashCode(su)));
2786 pw.println("):");
2787 pw.print(" userId=");
2788 pw.print(su.userId);
2789 pw.print(" gids=");
2790 pw.println(PackageManagerService.arrayToString(su.gids));
2791 pw.println(" grantedPermissions:");
2792 for (String s : su.grantedPermissions) {
2793 pw.print(" ");
2794 pw.println(s);
2795 }
2796 }
2797 }
2798
2799 void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
2800 pw.println("Settings parse messages:");
2801 pw.print(mReadMessages.toString());
2802 }
Andy McFadden2f362292012-01-20 14:43:38 -08002803}