blob: bfe6613cf63069b4721b7c34c26dbb672de77fcd [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;
23
24import com.android.internal.util.FastXmlSerializer;
25import com.android.internal.util.JournaledFile;
26import com.android.internal.util.XmlUtils;
27import com.android.server.IntentResolver;
Kenny Root447106f2011-03-23 11:00:15 -070028import com.android.server.pm.PackageManagerService.DumpState;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070029
30import org.xmlpull.v1.XmlPullParser;
31import org.xmlpull.v1.XmlPullParserException;
32import org.xmlpull.v1.XmlSerializer;
33
Kenny Root447106f2011-03-23 11:00:15 -070034import android.content.ComponentName;
35import android.content.Intent;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070036import android.content.pm.ApplicationInfo;
37import android.content.pm.ComponentInfo;
38import android.content.pm.PackageManager;
39import android.content.pm.PackageParser;
40import android.content.pm.PermissionInfo;
41import android.content.pm.Signature;
Kenny Root0aaa0d92011-09-12 16:42:55 -070042import android.content.pm.VerifierDeviceIdentity;
Kenny Root447106f2011-03-23 11:00:15 -070043import android.os.Binder;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070044import android.os.Environment;
45import android.os.FileUtils;
46import android.os.Process;
47import android.util.Log;
48import android.util.Slog;
49import android.util.SparseArray;
50import android.util.Xml;
51
52import java.io.BufferedOutputStream;
53import java.io.File;
54import java.io.FileInputStream;
55import java.io.FileOutputStream;
56import java.io.IOException;
57import java.io.PrintWriter;
Kenny Root447106f2011-03-23 11:00:15 -070058import java.text.SimpleDateFormat;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070059import java.util.ArrayList;
60import java.util.Arrays;
Kenny Root447106f2011-03-23 11:00:15 -070061import java.util.Date;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070062import java.util.HashMap;
63import java.util.HashSet;
64import java.util.Iterator;
65
66/**
67 * Holds information about dynamic settings.
68 */
69final class Settings {
Kenny Root447106f2011-03-23 11:00:15 -070070 private static final String TAG = "PackageSettings";
71
72 private static final boolean DEBUG_STOPPED = false;
73
Kenny Rootcf0b38c2011-03-22 14:17:59 -070074 private final File mSettingsFilename;
75 private final File mBackupSettingsFilename;
76 private final File mPackageListFilename;
77 private final File mStoppedPackagesFilename;
78 private final File mBackupStoppedPackagesFilename;
79 final HashMap<String, PackageSetting> mPackages =
80 new HashMap<String, PackageSetting>();
81 // List of replaced system applications
82 final HashMap<String, PackageSetting> mDisabledSysPackages =
83 new HashMap<String, PackageSetting>();
84
85 // These are the last platform API version we were using for
86 // the apps installed on internal and external storage. It is
87 // used to grant newer permissions one time during a system upgrade.
88 int mInternalSdkPlatform;
89 int mExternalSdkPlatform;
Kenny Root0aaa0d92011-09-12 16:42:55 -070090
91 /** Device identity for the purpose of package verification. */
92 private VerifierDeviceIdentity mVerifierDeviceIdentity;
93
Kenny Rootcf0b38c2011-03-22 14:17:59 -070094 // The user's preferred activities associated with particular intent
95 // filters.
96 final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities =
97 new IntentResolver<PreferredActivity, PreferredActivity>() {
98 @Override
99 protected String packageForFilter(PreferredActivity filter) {
100 return filter.mPref.mComponent.getPackageName();
101 }
102 @Override
103 protected void dumpFilter(PrintWriter out, String prefix,
104 PreferredActivity filter) {
105 filter.mPref.dump(out, prefix, filter);
106 }
107 };
108 final HashMap<String, SharedUserSetting> mSharedUsers =
109 new HashMap<String, SharedUserSetting>();
110 private final ArrayList<Object> mUserIds = new ArrayList<Object>();
111 private final SparseArray<Object> mOtherUserIds =
112 new SparseArray<Object>();
113
114 // For reading/writing settings file.
115 private final ArrayList<Signature> mPastSignatures =
116 new ArrayList<Signature>();
117
118 // Mapping from permission names to info about them.
119 final HashMap<String, BasePermission> mPermissions =
120 new HashMap<String, BasePermission>();
121
122 // Mapping from permission tree names to info about them.
123 final HashMap<String, BasePermission> mPermissionTrees =
124 new HashMap<String, BasePermission>();
125
126 // Packages that have been uninstalled and still need their external
127 // storage data deleted.
128 final ArrayList<String> mPackagesToBeCleaned = new ArrayList<String>();
129
130 // Packages that have been renamed since they were first installed.
131 // Keys are the new names of the packages, values are the original
132 // names. The packages appear everwhere else under their original
133 // names.
134 final HashMap<String, String> mRenamedPackages = new HashMap<String, String>();
135
136 final StringBuilder mReadMessages = new StringBuilder();
137
Kenny Root447106f2011-03-23 11:00:15 -0700138 /**
139 * Used to track packages that have a shared user ID that hasn't been read
140 * in yet.
141 * <p>
142 * TODO: make this just a local variable that is passed in during package
143 * scanning to make it less confusing.
144 */
145 private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700146
147 Settings() {
148 File dataDir = Environment.getDataDirectory();
149 File systemDir = new File(dataDir, "system");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700150 systemDir.mkdirs();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700151 FileUtils.setPermissions(systemDir.toString(),
152 FileUtils.S_IRWXU|FileUtils.S_IRWXG
153 |FileUtils.S_IROTH|FileUtils.S_IXOTH,
154 -1, -1);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700155 mSettingsFilename = new File(systemDir, "packages.xml");
156 mBackupSettingsFilename = new File(systemDir, "packages-backup.xml");
157 mPackageListFilename = new File(systemDir, "packages.list");
158 mStoppedPackagesFilename = new File(systemDir, "packages-stopped.xml");
159 mBackupStoppedPackagesFilename = new File(systemDir, "packages-stopped-backup.xml");
160 }
161
Kenny Root447106f2011-03-23 11:00:15 -0700162 PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700163 String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
164 String nativeLibraryPathString, int pkgFlags, boolean create, boolean add) {
165 final String name = pkg.packageName;
Kenny Root447106f2011-03-23 11:00:15 -0700166 PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700167 resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, create, add);
168 return p;
169 }
170
Kenny Root447106f2011-03-23 11:00:15 -0700171 PackageSetting peekPackageLPr(String name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700172 return mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700173 }
174
175 void setInstallStatus(String pkgName, int status) {
176 PackageSetting p = mPackages.get(pkgName);
177 if(p != null) {
178 if(p.getInstallStatus() != status) {
179 p.setInstallStatus(status);
180 }
181 }
182 }
183
184 void setInstallerPackageName(String pkgName,
185 String installerPkgName) {
186 PackageSetting p = mPackages.get(pkgName);
187 if(p != null) {
188 p.setInstallerPackageName(installerPkgName);
189 }
190 }
191
Kenny Root447106f2011-03-23 11:00:15 -0700192 SharedUserSetting getSharedUserLPw(String name,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700193 int pkgFlags, boolean create) {
194 SharedUserSetting s = mSharedUsers.get(name);
195 if (s == null) {
196 if (!create) {
197 return null;
198 }
199 s = new SharedUserSetting(name, pkgFlags);
200 if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) {
Kenny Root447106f2011-03-23 11:00:15 -0700201 s.userId = newUserIdLPw(s);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700202 } else {
203 s.userId = PackageManagerService.FIRST_APPLICATION_UID;
204 }
205 Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
206 // < 0 means we couldn't assign a userid; fall out and return
207 // s, which is currently null
208 if (s.userId >= 0) {
209 mSharedUsers.put(name, s);
210 }
211 }
212
213 return s;
214 }
215
Kenny Root447106f2011-03-23 11:00:15 -0700216 boolean disableSystemPackageLPw(String name) {
217 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700218 if(p == null) {
219 Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package");
220 return false;
221 }
Kenny Root447106f2011-03-23 11:00:15 -0700222 final PackageSetting dp = mDisabledSysPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700223 // always make sure the system package code and resource paths dont change
224 if (dp == null) {
225 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
226 p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
227 }
228 mDisabledSysPackages.put(name, p);
229
230 // a little trick... when we install the new package, we don't
231 // want to modify the existing PackageSetting for the built-in
232 // version. so at this point we need a new PackageSetting that
233 // is okay to muck with.
234 PackageSetting newp = new PackageSetting(p);
Kenny Root447106f2011-03-23 11:00:15 -0700235 replacePackageLPw(name, newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700236 return true;
237 }
238 return false;
239 }
240
Kenny Root447106f2011-03-23 11:00:15 -0700241 PackageSetting enableSystemPackageLPw(String name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700242 PackageSetting p = mDisabledSysPackages.get(name);
243 if(p == null) {
244 Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled");
245 return null;
246 }
247 // Reset flag in ApplicationInfo object
248 if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
249 p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
250 }
Kenny Root447106f2011-03-23 11:00:15 -0700251 PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700252 p.nativeLibraryPathString, p.userId, p.versionCode, p.pkgFlags);
253 mDisabledSysPackages.remove(name);
254 return ret;
255 }
256
Kenny Root447106f2011-03-23 11:00:15 -0700257 PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700258 String nativeLibraryPathString, int uid, int vc, int pkgFlags) {
259 PackageSetting p = mPackages.get(name);
260 if (p != null) {
261 if (p.userId == uid) {
262 return p;
263 }
264 PackageManagerService.reportSettingsProblem(Log.ERROR,
265 "Adding duplicate package, keeping first: " + name);
266 return null;
267 }
268 p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString,
269 vc, pkgFlags);
270 p.userId = uid;
Kenny Root447106f2011-03-23 11:00:15 -0700271 if (addUserIdLPw(uid, p, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700272 mPackages.put(name, p);
273 return p;
274 }
275 return null;
276 }
277
Kenny Root447106f2011-03-23 11:00:15 -0700278 SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700279 SharedUserSetting s = mSharedUsers.get(name);
280 if (s != null) {
281 if (s.userId == uid) {
282 return s;
283 }
284 PackageManagerService.reportSettingsProblem(Log.ERROR,
285 "Adding duplicate shared user, keeping first: " + name);
286 return null;
287 }
288 s = new SharedUserSetting(name, pkgFlags);
289 s.userId = uid;
Kenny Root447106f2011-03-23 11:00:15 -0700290 if (addUserIdLPw(uid, s, name)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700291 mSharedUsers.put(name, s);
292 return s;
293 }
294 return null;
295 }
296
297 // Transfer ownership of permissions from one package to another.
Kenny Root447106f2011-03-23 11:00:15 -0700298 void transferPermissionsLPw(String origPkg, String newPkg) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700299 // Transfer ownership of permissions to the new package.
300 for (int i=0; i<2; i++) {
301 HashMap<String, BasePermission> permissions =
302 i == 0 ? mPermissionTrees : mPermissions;
303 for (BasePermission bp : permissions.values()) {
304 if (origPkg.equals(bp.sourcePackage)) {
305 if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG,
306 "Moving permission " + bp.name
307 + " from pkg " + bp.sourcePackage
308 + " to " + newPkg);
309 bp.sourcePackage = newPkg;
310 bp.packageSetting = null;
311 bp.perm = null;
312 if (bp.pendingInfo != null) {
313 bp.pendingInfo.packageName = newPkg;
314 }
315 bp.uid = 0;
316 bp.gids = null;
317 }
318 }
319 }
320 }
321
Kenny Root447106f2011-03-23 11:00:15 -0700322 private PackageSetting getPackageLPw(String name, PackageSetting origPackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700323 String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
324 String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) {
325 PackageSetting p = mPackages.get(name);
326 if (p != null) {
327 if (!p.codePath.equals(codePath)) {
328 // Check to see if its a disabled system app
329 if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
330 // This is an updated system app with versions in both system
331 // and data partition. Just let the most recent version
332 // take precedence.
333 Slog.w(PackageManagerService.TAG, "Trying to update system app code path from " +
334 p.codePathString + " to " + codePath.toString());
335 } else {
336 // Just a change in the code path is not an issue, but
337 // let's log a message about it.
338 Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from " + p.codePath
339 + " to " + codePath + "; Retaining data and using new");
340 /*
341 * Since we've changed paths, we need to prefer the new
342 * native library path over the one stored in the
343 * package settings since we might have moved from
344 * internal to external storage or vice versa.
345 */
346 p.nativeLibraryPathString = nativeLibraryPathString;
347 }
348 }
349 if (p.sharedUser != sharedUser) {
350 PackageManagerService.reportSettingsProblem(Log.WARN,
351 "Package " + name + " shared user changed from "
352 + (p.sharedUser != null ? p.sharedUser.name : "<nothing>")
353 + " to "
354 + (sharedUser != null ? sharedUser.name : "<nothing>")
355 + "; replacing with new");
356 p = null;
357 } else {
358 if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
359 // If what we are scanning is a system package, then
360 // make it so, regardless of whether it was previously
361 // installed only in the data partition.
362 p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
363 }
364 }
365 }
366 if (p == null) {
367 // Create a new PackageSettings entry. this can end up here because
368 // of code path mismatch or user id mismatch of an updated system partition
369 if (!create) {
370 return null;
371 }
372 if (origPackage != null) {
373 // We are consuming the data from an existing package.
374 p = new PackageSetting(origPackage.name, name, codePath, resourcePath,
375 nativeLibraryPathString, vc, pkgFlags);
376 if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " + name
377 + " is adopting original package " + origPackage.name);
378 // Note that we will retain the new package's signature so
379 // that we can keep its data.
380 PackageSignatures s = p.signatures;
381 p.copyFrom(origPackage);
382 p.signatures = s;
383 p.sharedUser = origPackage.sharedUser;
384 p.userId = origPackage.userId;
385 p.origPackage = origPackage;
386 mRenamedPackages.put(name, origPackage.name);
387 name = origPackage.name;
388 // Update new package state.
389 p.setTimeStamp(codePath.lastModified());
390 } else {
391 p = new PackageSetting(name, realName, codePath, resourcePath,
392 nativeLibraryPathString, vc, pkgFlags);
393 p.setTimeStamp(codePath.lastModified());
394 p.sharedUser = sharedUser;
395 // If this is not a system app, it starts out stopped.
396 if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
Kenny Root447106f2011-03-23 11:00:15 -0700397 if (DEBUG_STOPPED) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700398 RuntimeException e = new RuntimeException("here");
399 e.fillInStackTrace();
400 Slog.i(PackageManagerService.TAG, "Stopping package " + name, e);
401 }
402 p.stopped = true;
403 p.notLaunched = true;
404 }
405 if (sharedUser != null) {
406 p.userId = sharedUser.userId;
407 } else if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) {
408 // Clone the setting here for disabled system packages
409 PackageSetting dis = mDisabledSysPackages.get(name);
410 if (dis != null) {
411 // For disabled packages a new setting is created
412 // from the existing user id. This still has to be
413 // added to list of user id's
414 // Copy signatures from previous setting
415 if (dis.signatures.mSignatures != null) {
416 p.signatures.mSignatures = dis.signatures.mSignatures.clone();
417 }
418 p.userId = dis.userId;
419 // Clone permissions
420 p.grantedPermissions = new HashSet<String>(dis.grantedPermissions);
421 // Clone component info
422 p.disabledComponents = new HashSet<String>(dis.disabledComponents);
423 p.enabledComponents = new HashSet<String>(dis.enabledComponents);
424 // Add new setting to list of user ids
Kenny Root447106f2011-03-23 11:00:15 -0700425 addUserIdLPw(p.userId, p, name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700426 } else {
427 // Assign new user id
Kenny Root447106f2011-03-23 11:00:15 -0700428 p.userId = newUserIdLPw(p);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700429 }
430 } else {
431 p.userId = PackageManagerService.FIRST_APPLICATION_UID;
432 }
433 }
434 if (p.userId < 0) {
435 PackageManagerService.reportSettingsProblem(Log.WARN,
436 "Package " + name + " could not be assigned a valid uid");
437 return null;
438 }
439 if (add) {
440 // Finish adding new package by adding it and updating shared
441 // user preferences
Kenny Root447106f2011-03-23 11:00:15 -0700442 addPackageSettingLPw(p, name, sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700443 }
444 }
445 return p;
446 }
447
Kenny Root447106f2011-03-23 11:00:15 -0700448 void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700449 p.pkg = pkg;
450 pkg.mSetEnabled = p.enabled;
451 pkg.mSetStopped = p.stopped;
452 final String codePath = pkg.applicationInfo.sourceDir;
453 final String resourcePath = pkg.applicationInfo.publicSourceDir;
454 // Update code path if needed
455 if (!codePath.equalsIgnoreCase(p.codePathString)) {
456 Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName +
457 " changing from " + p.codePathString + " to " + codePath);
458 p.codePath = new File(codePath);
459 p.codePathString = codePath;
460 }
461 //Update resource path if needed
462 if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) {
463 Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName +
464 " changing from " + p.resourcePathString + " to " + resourcePath);
465 p.resourcePath = new File(resourcePath);
466 p.resourcePathString = resourcePath;
467 }
468 // Update the native library path if needed
469 final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir;
470 if (nativeLibraryPath != null
471 && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) {
472 p.nativeLibraryPathString = nativeLibraryPath;
473 }
474 // Update version code if needed
475 if (pkg.mVersionCode != p.versionCode) {
476 p.versionCode = pkg.mVersionCode;
477 }
478 // Update signatures if needed.
479 if (p.signatures.mSignatures == null) {
480 p.signatures.assignSignatures(pkg.mSignatures);
481 }
482 // If this app defines a shared user id initialize
483 // the shared user signatures as well.
484 if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) {
485 p.sharedUser.signatures.assignSignatures(pkg.mSignatures);
486 }
Kenny Root447106f2011-03-23 11:00:15 -0700487 addPackageSettingLPw(p, pkg.packageName, p.sharedUser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700488 }
489
490 // Utility method that adds a PackageSetting to mPackages and
491 // completes updating the shared user attributes
Kenny Root447106f2011-03-23 11:00:15 -0700492 private void addPackageSettingLPw(PackageSetting p, String name,
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700493 SharedUserSetting sharedUser) {
494 mPackages.put(name, p);
495 if (sharedUser != null) {
496 if (p.sharedUser != null && p.sharedUser != sharedUser) {
497 PackageManagerService.reportSettingsProblem(Log.ERROR,
498 "Package " + p.name + " was user "
499 + p.sharedUser + " but is now " + sharedUser
500 + "; I am not changing its files so it will probably fail!");
501 p.sharedUser.packages.remove(p);
502 } else if (p.userId != sharedUser.userId) {
503 PackageManagerService.reportSettingsProblem(Log.ERROR,
504 "Package " + p.name + " was user id " + p.userId
505 + " but is now user " + sharedUser
506 + " with id " + sharedUser.userId
507 + "; I am not changing its files so it will probably fail!");
508 }
509
510 sharedUser.packages.add(p);
511 p.sharedUser = sharedUser;
512 p.userId = sharedUser.userId;
513 }
514 }
515
516 /*
517 * Update the shared user setting when a package using
518 * specifying the shared user id is removed. The gids
519 * associated with each permission of the deleted package
520 * are removed from the shared user's gid list only if its
521 * not in use by other permissions of packages in the
522 * shared user setting.
523 */
Kenny Root447106f2011-03-23 11:00:15 -0700524 void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) {
525 if ((deletedPs == null) || (deletedPs.pkg == null)) {
526 Slog.i(PackageManagerService.TAG,
527 "Trying to update info for null package. Just ignoring");
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700528 return;
529 }
530 // No sharedUserId
531 if (deletedPs.sharedUser == null) {
532 return;
533 }
534 SharedUserSetting sus = deletedPs.sharedUser;
535 // Update permissions
Kenny Root447106f2011-03-23 11:00:15 -0700536 for (String eachPerm : deletedPs.pkg.requestedPermissions) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700537 boolean used = false;
Kenny Root447106f2011-03-23 11:00:15 -0700538 if (!sus.grantedPermissions.contains(eachPerm)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700539 continue;
540 }
541 for (PackageSetting pkg:sus.packages) {
542 if (pkg.pkg != null &&
543 !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) &&
544 pkg.pkg.requestedPermissions.contains(eachPerm)) {
545 used = true;
546 break;
547 }
548 }
549 if (!used) {
550 // can safely delete this permission from list
551 sus.grantedPermissions.remove(eachPerm);
552 }
553 }
554 // Update gids
555 int newGids[] = globalGids;
556 for (String eachPerm : sus.grantedPermissions) {
557 BasePermission bp = mPermissions.get(eachPerm);
558 if (bp != null) {
559 newGids = PackageManagerService.appendInts(newGids, bp.gids);
560 }
561 }
562 sus.gids = newGids;
563 }
564
Kenny Root447106f2011-03-23 11:00:15 -0700565 int removePackageLPw(String name) {
566 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700567 if (p != null) {
568 mPackages.remove(name);
569 if (p.sharedUser != null) {
570 p.sharedUser.packages.remove(p);
571 if (p.sharedUser.packages.size() == 0) {
572 mSharedUsers.remove(p.sharedUser.name);
Kenny Root447106f2011-03-23 11:00:15 -0700573 removeUserIdLPw(p.sharedUser.userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700574 return p.sharedUser.userId;
575 }
576 } else {
Kenny Root447106f2011-03-23 11:00:15 -0700577 removeUserIdLPw(p.userId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700578 return p.userId;
579 }
580 }
581 return -1;
582 }
583
Kenny Root447106f2011-03-23 11:00:15 -0700584 private void replacePackageLPw(String name, PackageSetting newp) {
585 final PackageSetting p = mPackages.get(name);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700586 if (p != null) {
587 if (p.sharedUser != null) {
588 p.sharedUser.packages.remove(p);
589 p.sharedUser.packages.add(newp);
590 } else {
Kenny Root447106f2011-03-23 11:00:15 -0700591 replaceUserIdLPw(p.userId, newp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700592 }
593 }
594 mPackages.put(name, newp);
595 }
596
Kenny Root447106f2011-03-23 11:00:15 -0700597 private boolean addUserIdLPw(int uid, Object obj, Object name) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700598 if (uid >= PackageManagerService.FIRST_APPLICATION_UID + PackageManagerService.MAX_APPLICATION_UIDS) {
599 return false;
600 }
601
602 if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
603 int N = mUserIds.size();
604 final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
605 while (index >= N) {
606 mUserIds.add(null);
607 N++;
608 }
609 if (mUserIds.get(index) != null) {
610 PackageManagerService.reportSettingsProblem(Log.ERROR,
611 "Adding duplicate user id: " + uid
612 + " name=" + name);
613 return false;
614 }
615 mUserIds.set(index, obj);
616 } else {
617 if (mOtherUserIds.get(uid) != null) {
618 PackageManagerService.reportSettingsProblem(Log.ERROR,
619 "Adding duplicate shared id: " + uid
620 + " name=" + name);
621 return false;
622 }
623 mOtherUserIds.put(uid, obj);
624 }
625 return true;
626 }
627
Kenny Root447106f2011-03-23 11:00:15 -0700628 public Object getUserIdLPr(int uid) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700629 if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
630 final int N = mUserIds.size();
631 final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
632 return index < N ? mUserIds.get(index) : null;
633 } else {
634 return mOtherUserIds.get(uid);
635 }
636 }
637
Kenny Root447106f2011-03-23 11:00:15 -0700638 private void removeUserIdLPw(int uid) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700639 if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
640 final int N = mUserIds.size();
641 final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
642 if (index < N) mUserIds.set(index, null);
643 } else {
644 mOtherUserIds.remove(uid);
645 }
646 }
647
Kenny Root447106f2011-03-23 11:00:15 -0700648 private void replaceUserIdLPw(int uid, Object obj) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700649 if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
650 final int N = mUserIds.size();
651 final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
652 if (index < N) mUserIds.set(index, obj);
653 } else {
654 mOtherUserIds.put(uid, obj);
655 }
656 }
657
Kenny Root447106f2011-03-23 11:00:15 -0700658 void writeStoppedLPr() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700659 // Keep the old stopped packages around until we know the new ones have
660 // been successfully written.
661 if (mStoppedPackagesFilename.exists()) {
662 // Presence of backup settings file indicates that we failed
663 // to persist packages earlier. So preserve the older
664 // backup for future reference since the current packages
665 // might have been corrupted.
666 if (!mBackupStoppedPackagesFilename.exists()) {
667 if (!mStoppedPackagesFilename.renameTo(mBackupStoppedPackagesFilename)) {
668 Log.wtf(PackageManagerService.TAG, "Unable to backup package manager stopped packages, "
669 + "current changes will be lost at reboot");
670 return;
671 }
672 } else {
673 mStoppedPackagesFilename.delete();
674 Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
675 }
676 }
677
678 try {
Kenny Root447106f2011-03-23 11:00:15 -0700679 final FileOutputStream fstr = new FileOutputStream(mStoppedPackagesFilename);
680 final BufferedOutputStream str = new BufferedOutputStream(fstr);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700681
682 //XmlSerializer serializer = XmlUtils.serializerInstance();
Kenny Root447106f2011-03-23 11:00:15 -0700683 final XmlSerializer serializer = new FastXmlSerializer();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700684 serializer.setOutput(str, "utf-8");
685 serializer.startDocument(null, true);
686 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
687
688 serializer.startTag(null, "stopped-packages");
689
Kenny Root447106f2011-03-23 11:00:15 -0700690 for (final PackageSetting pkg : mPackages.values()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700691 if (pkg.stopped) {
692 serializer.startTag(null, "pkg");
693 serializer.attribute(null, "name", pkg.name);
694 if (pkg.notLaunched) {
695 serializer.attribute(null, "nl", "1");
696 }
697 serializer.endTag(null, "pkg");
698 }
699 }
700
701 serializer.endTag(null, "stopped-packages");
702
703 serializer.endDocument();
704
705 str.flush();
706 FileUtils.sync(fstr);
707 str.close();
708
709 // New settings successfully written, old ones are no longer
710 // needed.
711 mBackupStoppedPackagesFilename.delete();
712 FileUtils.setPermissions(mStoppedPackagesFilename.toString(),
713 FileUtils.S_IRUSR|FileUtils.S_IWUSR
714 |FileUtils.S_IRGRP|FileUtils.S_IWGRP
715 |FileUtils.S_IROTH,
716 -1, -1);
717
718 // Done, all is good!
719 return;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700720 } catch(java.io.IOException e) {
721 Log.wtf(PackageManagerService.TAG, "Unable to write package manager stopped packages, "
722 + " current changes will be lost at reboot", e);
723 }
724
725 // Clean up partially written files
726 if (mStoppedPackagesFilename.exists()) {
727 if (!mStoppedPackagesFilename.delete()) {
728 Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: " + mStoppedPackagesFilename);
729 }
730 }
731 }
732
733 // Note: assumed "stopped" field is already cleared in all packages.
Kenny Root447106f2011-03-23 11:00:15 -0700734 void readStoppedLPw() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700735 FileInputStream str = null;
736 if (mBackupStoppedPackagesFilename.exists()) {
737 try {
738 str = new FileInputStream(mBackupStoppedPackagesFilename);
739 mReadMessages.append("Reading from backup stopped packages file\n");
740 PackageManagerService.reportSettingsProblem(Log.INFO, "Need to read from backup stopped packages file");
741 if (mSettingsFilename.exists()) {
742 // If both the backup and normal file exist, we
743 // ignore the normal one since it might have been
744 // corrupted.
745 Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
746 + mStoppedPackagesFilename);
747 mStoppedPackagesFilename.delete();
748 }
749 } catch (java.io.IOException e) {
750 // We'll try for the normal settings file.
751 }
752 }
753
754 try {
755 if (str == null) {
756 if (!mStoppedPackagesFilename.exists()) {
757 mReadMessages.append("No stopped packages file found\n");
758 PackageManagerService.reportSettingsProblem(Log.INFO, "No stopped packages file file; "
759 + "assuming all started");
760 // At first boot, make sure no packages are stopped.
761 // We usually want to have third party apps initialize
762 // in the stopped state, but not at first boot.
763 for (PackageSetting pkg : mPackages.values()) {
764 pkg.stopped = false;
765 pkg.notLaunched = false;
766 }
767 return;
768 }
769 str = new FileInputStream(mStoppedPackagesFilename);
770 }
Kenny Root447106f2011-03-23 11:00:15 -0700771 final XmlPullParser parser = Xml.newPullParser();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700772 parser.setInput(str, null);
773
774 int type;
775 while ((type=parser.next()) != XmlPullParser.START_TAG
776 && type != XmlPullParser.END_DOCUMENT) {
777 ;
778 }
779
780 if (type != XmlPullParser.START_TAG) {
781 mReadMessages.append("No start tag found in stopped packages file\n");
782 PackageManagerService.reportSettingsProblem(Log.WARN,
783 "No start tag found in package manager stopped packages");
784 return;
785 }
786
787 int outerDepth = parser.getDepth();
788 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
789 && (type != XmlPullParser.END_TAG
790 || parser.getDepth() > outerDepth)) {
791 if (type == XmlPullParser.END_TAG
792 || type == XmlPullParser.TEXT) {
793 continue;
794 }
795
796 String tagName = parser.getName();
797 if (tagName.equals("pkg")) {
798 String name = parser.getAttributeValue(null, "name");
799 PackageSetting ps = mPackages.get(name);
800 if (ps != null) {
801 ps.stopped = true;
802 if ("1".equals(parser.getAttributeValue(null, "nl"))) {
803 ps.notLaunched = true;
804 }
805 } else {
806 Slog.w(PackageManagerService.TAG, "No package known for stopped package: " + name);
807 }
808 XmlUtils.skipCurrentTag(parser);
809 } else {
810 Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
811 + parser.getName());
812 XmlUtils.skipCurrentTag(parser);
813 }
814 }
815
816 str.close();
817
818 } catch(XmlPullParserException e) {
819 mReadMessages.append("Error reading: " + e.toString());
820 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading stopped packages: " + e);
821 Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
822
823 } catch(java.io.IOException e) {
824 mReadMessages.append("Error reading: " + e.toString());
825 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
826 Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
827
828 }
829 }
830
Kenny Root447106f2011-03-23 11:00:15 -0700831 void writeLPr() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700832 //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
833
834 // Keep the old settings around until we know the new ones have
835 // been successfully written.
836 if (mSettingsFilename.exists()) {
837 // Presence of backup settings file indicates that we failed
838 // to persist settings earlier. So preserve the older
839 // backup for future reference since the current settings
840 // might have been corrupted.
841 if (!mBackupSettingsFilename.exists()) {
842 if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
843 Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, "
844 + " current changes will be lost at reboot");
845 return;
846 }
847 } else {
848 mSettingsFilename.delete();
849 Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
850 }
851 }
852
853 mPastSignatures.clear();
854
855 try {
856 FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
857 BufferedOutputStream str = new BufferedOutputStream(fstr);
858
859 //XmlSerializer serializer = XmlUtils.serializerInstance();
860 XmlSerializer serializer = new FastXmlSerializer();
861 serializer.setOutput(str, "utf-8");
862 serializer.startDocument(null, true);
863 serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
864
865 serializer.startTag(null, "packages");
866
867 serializer.startTag(null, "last-platform-version");
868 serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform));
869 serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
870 serializer.endTag(null, "last-platform-version");
871
Kenny Root0aaa0d92011-09-12 16:42:55 -0700872 if (mVerifierDeviceIdentity != null) {
873 serializer.startTag(null, "verifier");
874 serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
875 serializer.endTag(null, "verifier");
876 }
877
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700878 serializer.startTag(null, "permission-trees");
879 for (BasePermission bp : mPermissionTrees.values()) {
Kenny Root447106f2011-03-23 11:00:15 -0700880 writePermissionLPr(serializer, bp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700881 }
882 serializer.endTag(null, "permission-trees");
883
884 serializer.startTag(null, "permissions");
885 for (BasePermission bp : mPermissions.values()) {
Kenny Root447106f2011-03-23 11:00:15 -0700886 writePermissionLPr(serializer, bp);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700887 }
888 serializer.endTag(null, "permissions");
889
Kenny Root447106f2011-03-23 11:00:15 -0700890 for (final PackageSetting pkg : mPackages.values()) {
891 writePackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700892 }
893
Kenny Root447106f2011-03-23 11:00:15 -0700894 for (final PackageSetting pkg : mDisabledSysPackages.values()) {
895 writeDisabledSysPackageLPr(serializer, pkg);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700896 }
897
898 serializer.startTag(null, "preferred-activities");
Kenny Root447106f2011-03-23 11:00:15 -0700899 for (final PreferredActivity pa : mPreferredActivities.filterSet()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700900 serializer.startTag(null, "item");
901 pa.writeToXml(serializer);
902 serializer.endTag(null, "item");
903 }
904 serializer.endTag(null, "preferred-activities");
905
Kenny Root447106f2011-03-23 11:00:15 -0700906 for (final SharedUserSetting usr : mSharedUsers.values()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700907 serializer.startTag(null, "shared-user");
908 serializer.attribute(null, "name", usr.name);
909 serializer.attribute(null, "userId",
910 Integer.toString(usr.userId));
911 usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
912 serializer.startTag(null, "perms");
913 for (String name : usr.grantedPermissions) {
914 serializer.startTag(null, "item");
915 serializer.attribute(null, "name", name);
916 serializer.endTag(null, "item");
917 }
918 serializer.endTag(null, "perms");
919 serializer.endTag(null, "shared-user");
920 }
921
922 if (mPackagesToBeCleaned.size() > 0) {
923 for (int i=0; i<mPackagesToBeCleaned.size(); i++) {
924 serializer.startTag(null, "cleaning-package");
925 serializer.attribute(null, "name", mPackagesToBeCleaned.get(i));
926 serializer.endTag(null, "cleaning-package");
927 }
928 }
929
930 if (mRenamedPackages.size() > 0) {
931 for (HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) {
932 serializer.startTag(null, "renamed-package");
933 serializer.attribute(null, "new", e.getKey());
934 serializer.attribute(null, "old", e.getValue());
935 serializer.endTag(null, "renamed-package");
936 }
937 }
938
939 serializer.endTag(null, "packages");
940
941 serializer.endDocument();
942
943 str.flush();
944 FileUtils.sync(fstr);
945 str.close();
946
947 // New settings successfully written, old ones are no longer
948 // needed.
949 mBackupSettingsFilename.delete();
950 FileUtils.setPermissions(mSettingsFilename.toString(),
951 FileUtils.S_IRUSR|FileUtils.S_IWUSR
952 |FileUtils.S_IRGRP|FileUtils.S_IWGRP
953 |FileUtils.S_IROTH,
954 -1, -1);
955
956 // Write package list file now, use a JournaledFile.
957 //
958 File tempFile = new File(mPackageListFilename.toString() + ".tmp");
959 JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
960
961 fstr = new FileOutputStream(journal.chooseForWrite());
962 str = new BufferedOutputStream(fstr);
963 try {
964 StringBuilder sb = new StringBuilder();
Kenny Root447106f2011-03-23 11:00:15 -0700965 for (final PackageSetting pkg : mPackages.values()) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700966 ApplicationInfo ai = pkg.pkg.applicationInfo;
967 String dataPath = ai.dataDir;
968 boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
969
970 // Avoid any application that has a space in its path
971 // or that is handled by the system.
972 if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID)
973 continue;
974
975 // we store on each line the following information for now:
976 //
977 // pkgName - package name
978 // userId - application-specific user id
979 // debugFlag - 0 or 1 if the package is debuggable.
980 // dataPath - path to package's data path
981 //
982 // NOTE: We prefer not to expose all ApplicationInfo flags for now.
983 //
984 // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
985 // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
986 // system/core/run-as/run-as.c
987 //
988 sb.setLength(0);
989 sb.append(ai.packageName);
990 sb.append(" ");
991 sb.append((int)ai.uid);
992 sb.append(isDebug ? " 1 " : " 0 ");
993 sb.append(dataPath);
994 sb.append("\n");
995 str.write(sb.toString().getBytes());
996 }
997 str.flush();
998 FileUtils.sync(fstr);
999 str.close();
1000 journal.commit();
1001 }
1002 catch (Exception e) {
1003 journal.rollback();
1004 }
1005
1006 FileUtils.setPermissions(mPackageListFilename.toString(),
1007 FileUtils.S_IRUSR|FileUtils.S_IWUSR
1008 |FileUtils.S_IRGRP|FileUtils.S_IWGRP
1009 |FileUtils.S_IROTH,
1010 -1, -1);
1011
Kenny Root447106f2011-03-23 11:00:15 -07001012 writeStoppedLPr();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001013
1014 return;
1015
1016 } catch(XmlPullParserException e) {
1017 Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1018 + "current changes will be lost at reboot", e);
1019 } catch(java.io.IOException e) {
1020 Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1021 + "current changes will be lost at reboot", e);
1022 }
1023 // Clean up partially written files
1024 if (mSettingsFilename.exists()) {
1025 if (!mSettingsFilename.delete()) {
1026 Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: " + mSettingsFilename);
1027 }
1028 }
1029 //Debug.stopMethodTracing();
1030 }
1031
Kenny Root447106f2011-03-23 11:00:15 -07001032 void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001033 throws java.io.IOException {
1034 serializer.startTag(null, "updated-package");
1035 serializer.attribute(null, "name", pkg.name);
1036 if (pkg.realName != null) {
1037 serializer.attribute(null, "realName", pkg.realName);
1038 }
1039 serializer.attribute(null, "codePath", pkg.codePathString);
1040 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1041 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1042 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1043 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1044 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1045 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1046 }
1047 if (pkg.nativeLibraryPathString != null) {
1048 serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1049 }
1050 if (pkg.sharedUser == null) {
1051 serializer.attribute(null, "userId", Integer.toString(pkg.userId));
1052 } else {
1053 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId));
1054 }
1055 serializer.startTag(null, "perms");
1056 if (pkg.sharedUser == null) {
1057 // If this is a shared user, the permissions will
1058 // be written there. We still need to write an
1059 // empty permissions list so permissionsFixed will
1060 // be set.
1061 for (final String name : pkg.grantedPermissions) {
1062 BasePermission bp = mPermissions.get(name);
1063 if (bp != null) {
1064 // We only need to write signature or system permissions but
1065 // this wont
1066 // match the semantics of grantedPermissions. So write all
1067 // permissions.
1068 serializer.startTag(null, "item");
1069 serializer.attribute(null, "name", name);
1070 serializer.endTag(null, "item");
1071 }
1072 }
1073 }
1074 serializer.endTag(null, "perms");
1075 serializer.endTag(null, "updated-package");
1076 }
1077
Kenny Root447106f2011-03-23 11:00:15 -07001078 void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001079 throws java.io.IOException {
1080 serializer.startTag(null, "package");
1081 serializer.attribute(null, "name", pkg.name);
1082 if (pkg.realName != null) {
1083 serializer.attribute(null, "realName", pkg.realName);
1084 }
1085 serializer.attribute(null, "codePath", pkg.codePathString);
1086 if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1087 serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1088 }
1089 if (pkg.nativeLibraryPathString != null) {
1090 serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1091 }
1092 serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags));
1093 serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1094 serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1095 serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1096 serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1097 if (pkg.sharedUser == null) {
1098 serializer.attribute(null, "userId", Integer.toString(pkg.userId));
1099 } else {
1100 serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId));
1101 }
1102 if (pkg.uidError) {
1103 serializer.attribute(null, "uidError", "true");
1104 }
1105 if (pkg.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
Dianne Hackbornb8f40002011-07-19 15:17:43 -07001106 serializer.attribute(null, "enabled", Integer.toString(pkg.enabled));
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001107 }
1108 if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1109 serializer.attribute(null, "installStatus", "false");
1110 }
1111 if (pkg.installerPackageName != null) {
1112 serializer.attribute(null, "installer", pkg.installerPackageName);
1113 }
1114 pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
1115 if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1116 serializer.startTag(null, "perms");
1117 if (pkg.sharedUser == null) {
1118 // If this is a shared user, the permissions will
1119 // be written there. We still need to write an
1120 // empty permissions list so permissionsFixed will
1121 // be set.
1122 for (final String name : pkg.grantedPermissions) {
1123 serializer.startTag(null, "item");
1124 serializer.attribute(null, "name", name);
1125 serializer.endTag(null, "item");
1126 }
1127 }
1128 serializer.endTag(null, "perms");
1129 }
1130 if (pkg.disabledComponents.size() > 0) {
1131 serializer.startTag(null, "disabled-components");
1132 for (final String name : pkg.disabledComponents) {
1133 serializer.startTag(null, "item");
1134 serializer.attribute(null, "name", name);
1135 serializer.endTag(null, "item");
1136 }
1137 serializer.endTag(null, "disabled-components");
1138 }
1139 if (pkg.enabledComponents.size() > 0) {
1140 serializer.startTag(null, "enabled-components");
1141 for (final String name : pkg.enabledComponents) {
1142 serializer.startTag(null, "item");
1143 serializer.attribute(null, "name", name);
1144 serializer.endTag(null, "item");
1145 }
1146 serializer.endTag(null, "enabled-components");
1147 }
1148
1149 serializer.endTag(null, "package");
1150 }
1151
Kenny Root447106f2011-03-23 11:00:15 -07001152 void writePermissionLPr(XmlSerializer serializer, BasePermission bp)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001153 throws XmlPullParserException, java.io.IOException {
1154 if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) {
1155 serializer.startTag(null, "item");
1156 serializer.attribute(null, "name", bp.name);
1157 serializer.attribute(null, "package", bp.sourcePackage);
1158 if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) {
1159 serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel));
1160 }
1161 if (PackageManagerService.DEBUG_SETTINGS)
1162 Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type="
1163 + bp.type);
1164 if (bp.type == BasePermission.TYPE_DYNAMIC) {
Kenny Root447106f2011-03-23 11:00:15 -07001165 final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001166 if (pi != null) {
1167 serializer.attribute(null, "type", "dynamic");
1168 if (pi.icon != 0) {
1169 serializer.attribute(null, "icon", Integer.toString(pi.icon));
1170 }
1171 if (pi.nonLocalizedLabel != null) {
1172 serializer.attribute(null, "label", pi.nonLocalizedLabel.toString());
1173 }
1174 }
1175 }
1176 serializer.endTag(null, "item");
1177 }
1178 }
1179
Kenny Root447106f2011-03-23 11:00:15 -07001180 ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() {
1181 final HashSet<String> kList = new HashSet<String>(mPackages.keySet());
1182 final Iterator<String> its = kList.iterator();
1183 final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001184 while (its.hasNext()) {
Kenny Root447106f2011-03-23 11:00:15 -07001185 final String key = its.next();
1186 final PackageSetting ps = mPackages.get(key);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001187 if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1188 ret.add(ps);
1189 }
1190 }
1191 return ret;
1192 }
1193
Kenny Root447106f2011-03-23 11:00:15 -07001194 boolean readLPw() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001195 FileInputStream str = null;
1196 if (mBackupSettingsFilename.exists()) {
1197 try {
1198 str = new FileInputStream(mBackupSettingsFilename);
1199 mReadMessages.append("Reading from backup settings file\n");
1200 PackageManagerService.reportSettingsProblem(Log.INFO,
1201 "Need to read from backup settings file");
1202 if (mSettingsFilename.exists()) {
1203 // If both the backup and settings file exist, we
1204 // ignore the settings since it might have been
1205 // corrupted.
1206 Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
1207 + mSettingsFilename);
1208 mSettingsFilename.delete();
1209 }
1210 } catch (java.io.IOException e) {
1211 // We'll try for the normal settings file.
1212 }
1213 }
1214
Kenny Root447106f2011-03-23 11:00:15 -07001215 mPendingPackages.clear();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001216 mPastSignatures.clear();
1217
1218 try {
1219 if (str == null) {
1220 if (!mSettingsFilename.exists()) {
1221 mReadMessages.append("No settings file found\n");
1222 PackageManagerService.reportSettingsProblem(Log.INFO,
1223 "No settings file; creating initial state");
1224 return false;
1225 }
1226 str = new FileInputStream(mSettingsFilename);
1227 }
1228 XmlPullParser parser = Xml.newPullParser();
1229 parser.setInput(str, null);
1230
1231 int type;
1232 while ((type = parser.next()) != XmlPullParser.START_TAG
1233 && type != XmlPullParser.END_DOCUMENT) {
1234 ;
1235 }
1236
1237 if (type != XmlPullParser.START_TAG) {
1238 mReadMessages.append("No start tag found in settings file\n");
1239 PackageManagerService.reportSettingsProblem(Log.WARN,
1240 "No start tag found in package manager settings");
Dianne Hackborn58f42a52011-10-10 13:46:34 -07001241 Log.wtf(PackageManagerService.TAG,
1242 "No start tag found in package manager settings");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001243 return false;
1244 }
1245
1246 int outerDepth = parser.getDepth();
1247 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1248 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1249 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1250 continue;
1251 }
1252
1253 String tagName = parser.getName();
1254 if (tagName.equals("package")) {
Kenny Root447106f2011-03-23 11:00:15 -07001255 readPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001256 } else if (tagName.equals("permissions")) {
Kenny Root447106f2011-03-23 11:00:15 -07001257 readPermissionsLPw(mPermissions, parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001258 } else if (tagName.equals("permission-trees")) {
Kenny Root447106f2011-03-23 11:00:15 -07001259 readPermissionsLPw(mPermissionTrees, parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001260 } else if (tagName.equals("shared-user")) {
Kenny Root447106f2011-03-23 11:00:15 -07001261 readSharedUserLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001262 } else if (tagName.equals("preferred-packages")) {
1263 // no longer used.
1264 } else if (tagName.equals("preferred-activities")) {
Kenny Root447106f2011-03-23 11:00:15 -07001265 readPreferredActivitiesLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001266 } else if (tagName.equals("updated-package")) {
Kenny Root447106f2011-03-23 11:00:15 -07001267 readDisabledSysPackageLPw(parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001268 } else if (tagName.equals("cleaning-package")) {
1269 String name = parser.getAttributeValue(null, "name");
1270 if (name != null) {
1271 mPackagesToBeCleaned.add(name);
1272 }
1273 } else if (tagName.equals("renamed-package")) {
1274 String nname = parser.getAttributeValue(null, "new");
1275 String oname = parser.getAttributeValue(null, "old");
1276 if (nname != null && oname != null) {
1277 mRenamedPackages.put(nname, oname);
1278 }
1279 } else if (tagName.equals("last-platform-version")) {
1280 mInternalSdkPlatform = mExternalSdkPlatform = 0;
1281 try {
1282 String internal = parser.getAttributeValue(null, "internal");
1283 if (internal != null) {
1284 mInternalSdkPlatform = Integer.parseInt(internal);
1285 }
1286 String external = parser.getAttributeValue(null, "external");
1287 if (external != null) {
1288 mExternalSdkPlatform = Integer.parseInt(external);
1289 }
1290 } catch (NumberFormatException e) {
1291 }
Kenny Root0aaa0d92011-09-12 16:42:55 -07001292 } else if (tagName.equals("verifier")) {
1293 final String deviceIdentity = parser.getAttributeValue(null, "device");
1294 try {
1295 mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
1296 } catch (IllegalArgumentException e) {
1297 Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
1298 + e.getMessage());
1299 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001300 } else {
1301 Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
1302 + parser.getName());
1303 XmlUtils.skipCurrentTag(parser);
1304 }
1305 }
1306
1307 str.close();
1308
1309 } catch (XmlPullParserException e) {
1310 mReadMessages.append("Error reading: " + e.toString());
1311 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1312 Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1313
1314 } catch (java.io.IOException e) {
1315 mReadMessages.append("Error reading: " + e.toString());
1316 PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1317 Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1318
1319 }
1320
1321 final int N = mPendingPackages.size();
1322 for (int i = 0; i < N; i++) {
1323 final PendingPackage pp = mPendingPackages.get(i);
Kenny Root447106f2011-03-23 11:00:15 -07001324 Object idObj = getUserIdLPr(pp.sharedId);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001325 if (idObj != null && idObj instanceof SharedUserSetting) {
Kenny Root447106f2011-03-23 11:00:15 -07001326 PackageSetting p = getPackageLPw(pp.name, null, pp.realName,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001327 (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
1328 pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true);
1329 if (p == null) {
1330 PackageManagerService.reportSettingsProblem(Log.WARN,
1331 "Unable to create application package for " + pp.name);
1332 continue;
1333 }
1334 p.copyFrom(pp);
1335 } else if (idObj != null) {
1336 String msg = "Bad package setting: package " + pp.name + " has shared uid "
1337 + pp.sharedId + " that is not a shared uid\n";
1338 mReadMessages.append(msg);
1339 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1340 } else {
1341 String msg = "Bad package setting: package " + pp.name + " has shared uid "
1342 + pp.sharedId + " that is not defined\n";
1343 mReadMessages.append(msg);
1344 PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1345 }
1346 }
1347 mPendingPackages.clear();
1348
Kenny Root1d1b4892011-04-08 14:25:24 -07001349 /*
1350 * Make sure all the updated system packages have their shared users
1351 * associated with them.
1352 */
1353 final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
1354 while (disabledIt.hasNext()) {
1355 final PackageSetting disabledPs = disabledIt.next();
1356 final Object id = getUserIdLPr(disabledPs.userId);
1357 if (id != null && id instanceof SharedUserSetting) {
1358 disabledPs.sharedUser = (SharedUserSetting) id;
1359 }
1360 }
1361
Kenny Root447106f2011-03-23 11:00:15 -07001362 readStoppedLPw();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001363
1364 mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
1365 + mSharedUsers.size() + " shared uids\n");
1366
1367 return true;
1368 }
1369
1370 private int readInt(XmlPullParser parser, String ns, String name, int defValue) {
1371 String v = parser.getAttributeValue(ns, name);
1372 try {
1373 if (v == null) {
1374 return defValue;
1375 }
1376 return Integer.parseInt(v);
1377 } catch (NumberFormatException e) {
1378 PackageManagerService.reportSettingsProblem(Log.WARN,
1379 "Error in package manager settings: attribute " + name
1380 + " has bad integer value " + v + " at "
1381 + parser.getPositionDescription());
1382 }
1383 return defValue;
1384 }
1385
Kenny Root447106f2011-03-23 11:00:15 -07001386 private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001387 throws IOException, XmlPullParserException {
1388 int outerDepth = parser.getDepth();
1389 int type;
1390 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1391 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1392 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1393 continue;
1394 }
1395
Kenny Root447106f2011-03-23 11:00:15 -07001396 final String tagName = parser.getName();
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001397 if (tagName.equals("item")) {
Kenny Root447106f2011-03-23 11:00:15 -07001398 final String name = parser.getAttributeValue(null, "name");
1399 final String sourcePackage = parser.getAttributeValue(null, "package");
1400 final String ptype = parser.getAttributeValue(null, "type");
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001401 if (name != null && sourcePackage != null) {
Kenny Root447106f2011-03-23 11:00:15 -07001402 final boolean dynamic = "dynamic".equals(ptype);
1403 final BasePermission bp = new BasePermission(name, sourcePackage,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001404 dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL);
1405 bp.protectionLevel = readInt(parser, null, "protection",
1406 PermissionInfo.PROTECTION_NORMAL);
1407 if (dynamic) {
1408 PermissionInfo pi = new PermissionInfo();
1409 pi.packageName = sourcePackage.intern();
1410 pi.name = name.intern();
1411 pi.icon = readInt(parser, null, "icon", 0);
1412 pi.nonLocalizedLabel = parser.getAttributeValue(null, "label");
1413 pi.protectionLevel = bp.protectionLevel;
1414 bp.pendingInfo = pi;
1415 }
1416 out.put(bp.name, bp);
1417 } else {
1418 PackageManagerService.reportSettingsProblem(Log.WARN,
1419 "Error in package manager settings: permissions has" + " no name at "
1420 + parser.getPositionDescription());
1421 }
1422 } else {
1423 PackageManagerService.reportSettingsProblem(Log.WARN,
1424 "Unknown element reading permissions: " + parser.getName() + " at "
1425 + parser.getPositionDescription());
1426 }
1427 XmlUtils.skipCurrentTag(parser);
1428 }
1429 }
1430
Kenny Root447106f2011-03-23 11:00:15 -07001431 private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001432 IOException {
1433 String name = parser.getAttributeValue(null, "name");
1434 String realName = parser.getAttributeValue(null, "realName");
1435 String codePathStr = parser.getAttributeValue(null, "codePath");
1436 String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1437 String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1438 if (resourcePathStr == null) {
1439 resourcePathStr = codePathStr;
1440 }
1441 String version = parser.getAttributeValue(null, "version");
1442 int versionCode = 0;
1443 if (version != null) {
1444 try {
1445 versionCode = Integer.parseInt(version);
1446 } catch (NumberFormatException e) {
1447 }
1448 }
1449
1450 int pkgFlags = 0;
1451 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1452 PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
1453 new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags);
1454 String timeStampStr = parser.getAttributeValue(null, "ft");
1455 if (timeStampStr != null) {
1456 try {
1457 long timeStamp = Long.parseLong(timeStampStr, 16);
1458 ps.setTimeStamp(timeStamp);
1459 } catch (NumberFormatException e) {
1460 }
1461 } else {
1462 timeStampStr = parser.getAttributeValue(null, "ts");
1463 if (timeStampStr != null) {
1464 try {
1465 long timeStamp = Long.parseLong(timeStampStr);
1466 ps.setTimeStamp(timeStamp);
1467 } catch (NumberFormatException e) {
1468 }
1469 }
1470 }
1471 timeStampStr = parser.getAttributeValue(null, "it");
1472 if (timeStampStr != null) {
1473 try {
1474 ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
1475 } catch (NumberFormatException e) {
1476 }
1477 }
1478 timeStampStr = parser.getAttributeValue(null, "ut");
1479 if (timeStampStr != null) {
1480 try {
1481 ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
1482 } catch (NumberFormatException e) {
1483 }
1484 }
1485 String idStr = parser.getAttributeValue(null, "userId");
1486 ps.userId = idStr != null ? Integer.parseInt(idStr) : 0;
1487 if (ps.userId <= 0) {
1488 String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1489 ps.userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1490 }
1491 int outerDepth = parser.getDepth();
1492 int type;
1493 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1494 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1495 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1496 continue;
1497 }
1498
1499 String tagName = parser.getName();
1500 if (tagName.equals("perms")) {
Kenny Root447106f2011-03-23 11:00:15 -07001501 readGrantedPermissionsLPw(parser, ps.grantedPermissions);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001502 } else {
1503 PackageManagerService.reportSettingsProblem(Log.WARN,
1504 "Unknown element under <updated-package>: " + parser.getName());
1505 XmlUtils.skipCurrentTag(parser);
1506 }
1507 }
1508 mDisabledSysPackages.put(name, ps);
1509 }
1510
Kenny Root447106f2011-03-23 11:00:15 -07001511 private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001512 String name = null;
1513 String realName = null;
1514 String idStr = null;
1515 String sharedIdStr = null;
1516 String codePathStr = null;
1517 String resourcePathStr = null;
1518 String nativeLibraryPathStr = null;
1519 String systemStr = null;
1520 String installerPackageName = null;
1521 String uidError = null;
1522 int pkgFlags = 0;
1523 long timeStamp = 0;
1524 long firstInstallTime = 0;
1525 long lastUpdateTime = 0;
1526 PackageSettingBase packageSetting = null;
1527 String version = null;
1528 int versionCode = 0;
1529 try {
1530 name = parser.getAttributeValue(null, "name");
1531 realName = parser.getAttributeValue(null, "realName");
1532 idStr = parser.getAttributeValue(null, "userId");
1533 uidError = parser.getAttributeValue(null, "uidError");
1534 sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1535 codePathStr = parser.getAttributeValue(null, "codePath");
1536 resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1537 nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1538 version = parser.getAttributeValue(null, "version");
1539 if (version != null) {
1540 try {
1541 versionCode = Integer.parseInt(version);
1542 } catch (NumberFormatException e) {
1543 }
1544 }
1545 installerPackageName = parser.getAttributeValue(null, "installer");
1546
1547 systemStr = parser.getAttributeValue(null, "flags");
1548 if (systemStr != null) {
1549 try {
1550 pkgFlags = Integer.parseInt(systemStr);
1551 } catch (NumberFormatException e) {
1552 }
1553 } else {
1554 // For backward compatibility
1555 systemStr = parser.getAttributeValue(null, "system");
1556 if (systemStr != null) {
1557 pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
1558 : 0;
1559 } else {
1560 // Old settings that don't specify system... just treat
1561 // them as system, good enough.
1562 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1563 }
1564 }
1565 String timeStampStr = parser.getAttributeValue(null, "ft");
1566 if (timeStampStr != null) {
1567 try {
1568 timeStamp = Long.parseLong(timeStampStr, 16);
1569 } catch (NumberFormatException e) {
1570 }
1571 } else {
1572 timeStampStr = parser.getAttributeValue(null, "ts");
1573 if (timeStampStr != null) {
1574 try {
1575 timeStamp = Long.parseLong(timeStampStr);
1576 } catch (NumberFormatException e) {
1577 }
1578 }
1579 }
1580 timeStampStr = parser.getAttributeValue(null, "it");
1581 if (timeStampStr != null) {
1582 try {
1583 firstInstallTime = Long.parseLong(timeStampStr, 16);
1584 } catch (NumberFormatException e) {
1585 }
1586 }
1587 timeStampStr = parser.getAttributeValue(null, "ut");
1588 if (timeStampStr != null) {
1589 try {
1590 lastUpdateTime = Long.parseLong(timeStampStr, 16);
1591 } catch (NumberFormatException e) {
1592 }
1593 }
1594 if (PackageManagerService.DEBUG_SETTINGS)
1595 Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
1596 + " sharedUserId=" + sharedIdStr);
1597 int userId = idStr != null ? Integer.parseInt(idStr) : 0;
1598 if (resourcePathStr == null) {
1599 resourcePathStr = codePathStr;
1600 }
1601 if (realName != null) {
1602 realName = realName.intern();
1603 }
1604 if (name == null) {
1605 PackageManagerService.reportSettingsProblem(Log.WARN,
1606 "Error in package manager settings: <package> has no name at "
1607 + parser.getPositionDescription());
1608 } else if (codePathStr == null) {
1609 PackageManagerService.reportSettingsProblem(Log.WARN,
1610 "Error in package manager settings: <package> has no codePath at "
1611 + parser.getPositionDescription());
1612 } else if (userId > 0) {
Kenny Root447106f2011-03-23 11:00:15 -07001613 packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001614 new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode,
1615 pkgFlags);
1616 if (PackageManagerService.DEBUG_SETTINGS)
1617 Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
1618 + userId + " pkg=" + packageSetting);
1619 if (packageSetting == null) {
1620 PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
1621 + userId + " while parsing settings at "
1622 + parser.getPositionDescription());
1623 } else {
1624 packageSetting.setTimeStamp(timeStamp);
1625 packageSetting.firstInstallTime = firstInstallTime;
1626 packageSetting.lastUpdateTime = lastUpdateTime;
1627 }
1628 } else if (sharedIdStr != null) {
1629 userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1630 if (userId > 0) {
1631 packageSetting = new PendingPackage(name.intern(), realName, new File(
1632 codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId,
1633 versionCode, pkgFlags);
1634 packageSetting.setTimeStamp(timeStamp);
1635 packageSetting.firstInstallTime = firstInstallTime;
1636 packageSetting.lastUpdateTime = lastUpdateTime;
1637 mPendingPackages.add((PendingPackage) packageSetting);
1638 if (PackageManagerService.DEBUG_SETTINGS)
1639 Log.i(PackageManagerService.TAG, "Reading package " + name
1640 + ": sharedUserId=" + userId + " pkg=" + packageSetting);
1641 } else {
1642 PackageManagerService.reportSettingsProblem(Log.WARN,
1643 "Error in package manager settings: package " + name
1644 + " has bad sharedId " + sharedIdStr + " at "
1645 + parser.getPositionDescription());
1646 }
1647 } else {
1648 PackageManagerService.reportSettingsProblem(Log.WARN,
1649 "Error in package manager settings: package " + name + " has bad userId "
1650 + idStr + " at " + parser.getPositionDescription());
1651 }
1652 } catch (NumberFormatException e) {
1653 PackageManagerService.reportSettingsProblem(Log.WARN,
1654 "Error in package manager settings: package " + name + " has bad userId "
1655 + idStr + " at " + parser.getPositionDescription());
1656 }
1657 if (packageSetting != null) {
1658 packageSetting.uidError = "true".equals(uidError);
1659 packageSetting.installerPackageName = installerPackageName;
1660 packageSetting.nativeLibraryPathString = nativeLibraryPathStr;
1661 final String enabledStr = parser.getAttributeValue(null, "enabled");
1662 if (enabledStr != null) {
Dianne Hackbornb8f40002011-07-19 15:17:43 -07001663 try {
1664 packageSetting.enabled = Integer.parseInt(enabledStr);
1665 } catch (NumberFormatException e) {
1666 if (enabledStr.equalsIgnoreCase("true")) {
1667 packageSetting.enabled = COMPONENT_ENABLED_STATE_ENABLED;
1668 } else if (enabledStr.equalsIgnoreCase("false")) {
1669 packageSetting.enabled = COMPONENT_ENABLED_STATE_DISABLED;
1670 } else if (enabledStr.equalsIgnoreCase("default")) {
1671 packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT;
1672 } else {
1673 PackageManagerService.reportSettingsProblem(Log.WARN,
1674 "Error in package manager settings: package " + name
1675 + " has bad enabled value: " + idStr + " at "
1676 + parser.getPositionDescription());
1677 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001678 }
1679 } else {
1680 packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT;
1681 }
1682 final String installStatusStr = parser.getAttributeValue(null, "installStatus");
1683 if (installStatusStr != null) {
1684 if (installStatusStr.equalsIgnoreCase("false")) {
1685 packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE;
1686 } else {
1687 packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE;
1688 }
1689 }
1690
1691 int outerDepth = parser.getDepth();
1692 int type;
1693 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1694 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1695 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1696 continue;
1697 }
1698
1699 String tagName = parser.getName();
1700 if (tagName.equals("disabled-components")) {
Kenny Root447106f2011-03-23 11:00:15 -07001701 readDisabledComponentsLPw(packageSetting, parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001702 } else if (tagName.equals("enabled-components")) {
Kenny Root447106f2011-03-23 11:00:15 -07001703 readEnabledComponentsLPw(packageSetting, parser);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001704 } else if (tagName.equals("sigs")) {
1705 packageSetting.signatures.readXml(parser, mPastSignatures);
1706 } else if (tagName.equals("perms")) {
Kenny Root447106f2011-03-23 11:00:15 -07001707 readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001708 packageSetting.permissionsFixed = true;
1709 } else {
1710 PackageManagerService.reportSettingsProblem(Log.WARN,
1711 "Unknown element under <package>: " + parser.getName());
1712 XmlUtils.skipCurrentTag(parser);
1713 }
1714 }
1715 } else {
1716 XmlUtils.skipCurrentTag(parser);
1717 }
1718 }
1719
Kenny Root447106f2011-03-23 11:00:15 -07001720 private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001721 throws IOException, XmlPullParserException {
1722 int outerDepth = parser.getDepth();
1723 int type;
1724 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1725 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1726 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1727 continue;
1728 }
1729
1730 String tagName = parser.getName();
1731 if (tagName.equals("item")) {
1732 String name = parser.getAttributeValue(null, "name");
1733 if (name != null) {
1734 packageSetting.disabledComponents.add(name.intern());
1735 } else {
1736 PackageManagerService.reportSettingsProblem(Log.WARN,
1737 "Error in package manager settings: <disabled-components> has"
1738 + " no name at " + parser.getPositionDescription());
1739 }
1740 } else {
1741 PackageManagerService.reportSettingsProblem(Log.WARN,
1742 "Unknown element under <disabled-components>: " + parser.getName());
1743 }
1744 XmlUtils.skipCurrentTag(parser);
1745 }
1746 }
1747
Kenny Root447106f2011-03-23 11:00:15 -07001748 private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001749 throws IOException, XmlPullParserException {
1750 int outerDepth = parser.getDepth();
1751 int type;
1752 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1753 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1754 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1755 continue;
1756 }
1757
1758 String tagName = parser.getName();
1759 if (tagName.equals("item")) {
1760 String name = parser.getAttributeValue(null, "name");
1761 if (name != null) {
1762 packageSetting.enabledComponents.add(name.intern());
1763 } else {
1764 PackageManagerService.reportSettingsProblem(Log.WARN,
1765 "Error in package manager settings: <enabled-components> has"
1766 + " no name at " + parser.getPositionDescription());
1767 }
1768 } else {
1769 PackageManagerService.reportSettingsProblem(Log.WARN,
1770 "Unknown element under <enabled-components>: " + parser.getName());
1771 }
1772 XmlUtils.skipCurrentTag(parser);
1773 }
1774 }
1775
Kenny Root447106f2011-03-23 11:00:15 -07001776 private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001777 String name = null;
1778 String idStr = null;
1779 int pkgFlags = 0;
1780 SharedUserSetting su = null;
1781 try {
1782 name = parser.getAttributeValue(null, "name");
1783 idStr = parser.getAttributeValue(null, "userId");
1784 int userId = idStr != null ? Integer.parseInt(idStr) : 0;
1785 if ("true".equals(parser.getAttributeValue(null, "system"))) {
1786 pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1787 }
1788 if (name == null) {
1789 PackageManagerService.reportSettingsProblem(Log.WARN,
1790 "Error in package manager settings: <shared-user> has no name at "
1791 + parser.getPositionDescription());
1792 } else if (userId == 0) {
1793 PackageManagerService.reportSettingsProblem(Log.WARN,
1794 "Error in package manager settings: shared-user " + name
1795 + " has bad userId " + idStr + " at "
1796 + parser.getPositionDescription());
1797 } else {
Kenny Root447106f2011-03-23 11:00:15 -07001798 if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001799 PackageManagerService
1800 .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
1801 + parser.getPositionDescription());
1802 }
1803 }
1804 } catch (NumberFormatException e) {
1805 PackageManagerService.reportSettingsProblem(Log.WARN,
1806 "Error in package manager settings: package " + name + " has bad userId "
1807 + idStr + " at " + parser.getPositionDescription());
1808 }
1809 ;
1810
1811 if (su != null) {
1812 int outerDepth = parser.getDepth();
1813 int type;
1814 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1815 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1816 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1817 continue;
1818 }
1819
1820 String tagName = parser.getName();
1821 if (tagName.equals("sigs")) {
1822 su.signatures.readXml(parser, mPastSignatures);
1823 } else if (tagName.equals("perms")) {
Kenny Root447106f2011-03-23 11:00:15 -07001824 readGrantedPermissionsLPw(parser, su.grantedPermissions);
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001825 } else {
1826 PackageManagerService.reportSettingsProblem(Log.WARN,
1827 "Unknown element under <shared-user>: " + parser.getName());
1828 XmlUtils.skipCurrentTag(parser);
1829 }
1830 }
1831
1832 } else {
1833 XmlUtils.skipCurrentTag(parser);
1834 }
1835 }
1836
Kenny Root447106f2011-03-23 11:00:15 -07001837 private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms)
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001838 throws IOException, XmlPullParserException {
1839 int outerDepth = parser.getDepth();
1840 int type;
1841 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1842 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1843 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1844 continue;
1845 }
1846
1847 String tagName = parser.getName();
1848 if (tagName.equals("item")) {
1849 String name = parser.getAttributeValue(null, "name");
1850 if (name != null) {
1851 outPerms.add(name.intern());
1852 } else {
1853 PackageManagerService.reportSettingsProblem(Log.WARN,
1854 "Error in package manager settings: <perms> has" + " no name at "
1855 + parser.getPositionDescription());
1856 }
1857 } else {
1858 PackageManagerService.reportSettingsProblem(Log.WARN,
1859 "Unknown element under <perms>: " + parser.getName());
1860 }
1861 XmlUtils.skipCurrentTag(parser);
1862 }
1863 }
1864
Kenny Root447106f2011-03-23 11:00:15 -07001865 private void readPreferredActivitiesLPw(XmlPullParser parser) throws XmlPullParserException,
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001866 IOException {
1867 int outerDepth = parser.getDepth();
1868 int type;
1869 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1870 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1871 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1872 continue;
1873 }
1874
1875 String tagName = parser.getName();
1876 if (tagName.equals("item")) {
1877 PreferredActivity pa = new PreferredActivity(parser);
1878 if (pa.mPref.getParseError() == null) {
1879 mPreferredActivities.addFilter(pa);
1880 } else {
1881 PackageManagerService.reportSettingsProblem(Log.WARN,
1882 "Error in package manager settings: <preferred-activity> "
1883 + pa.mPref.getParseError() + " at "
1884 + parser.getPositionDescription());
1885 }
1886 } else {
1887 PackageManagerService.reportSettingsProblem(Log.WARN,
1888 "Unknown element under <preferred-activities>: " + parser.getName());
1889 XmlUtils.skipCurrentTag(parser);
1890 }
1891 }
1892 }
1893
1894 // Returns -1 if we could not find an available UserId to assign
Kenny Root447106f2011-03-23 11:00:15 -07001895 private int newUserIdLPw(Object obj) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001896 // Let's be stupidly inefficient for now...
1897 final int N = mUserIds.size();
1898 for (int i = 0; i < N; i++) {
1899 if (mUserIds.get(i) == null) {
1900 mUserIds.set(i, obj);
1901 return PackageManagerService.FIRST_APPLICATION_UID + i;
1902 }
1903 }
1904
1905 // None left?
1906 if (N >= PackageManagerService.MAX_APPLICATION_UIDS) {
1907 return -1;
1908 }
1909
1910 mUserIds.add(obj);
1911 return PackageManagerService.FIRST_APPLICATION_UID + N;
1912 }
1913
Kenny Root0aaa0d92011-09-12 16:42:55 -07001914 public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
1915 if (mVerifierDeviceIdentity == null) {
1916 mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
1917
1918 writeLPr();
1919 }
1920
1921 return mVerifierDeviceIdentity;
1922 }
1923
Kenny Root447106f2011-03-23 11:00:15 -07001924 public PackageSetting getDisabledSystemPkgLPr(String name) {
1925 PackageSetting ps = mDisabledSysPackages.get(name);
1926 return ps;
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001927 }
1928
Kenny Root447106f2011-03-23 11:00:15 -07001929 boolean isEnabledLPr(ComponentInfo componentInfo, int flags) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001930 if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
1931 return true;
1932 }
1933 final PackageSetting packageSettings = mPackages.get(componentInfo.packageName);
1934 if (PackageManagerService.DEBUG_SETTINGS) {
1935 Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = " + componentInfo.packageName
1936 + " componentName = " + componentInfo.name);
1937 Log.v(PackageManagerService.TAG, "enabledComponents: "
1938 + Arrays.toString(packageSettings.enabledComponents.toArray()));
1939 Log.v(PackageManagerService.TAG, "disabledComponents: "
1940 + Arrays.toString(packageSettings.disabledComponents.toArray()));
1941 }
1942 if (packageSettings == null) {
1943 return false;
1944 }
1945 if (packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED
Dianne Hackborn0ac30312011-06-17 14:49:23 -07001946 || packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001947 || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
1948 && packageSettings.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
1949 return false;
1950 }
1951 if (packageSettings.enabledComponents.contains(componentInfo.name)) {
1952 return true;
1953 }
1954 if (packageSettings.disabledComponents.contains(componentInfo.name)) {
1955 return false;
1956 }
1957 return componentInfo.enabled;
1958 }
Kenny Root447106f2011-03-23 11:00:15 -07001959
1960 String getInstallerPackageNameLPr(String packageName) {
1961 final PackageSetting pkg = mPackages.get(packageName);
1962 if (pkg == null) {
1963 throw new IllegalArgumentException("Unknown package: " + packageName);
1964 }
1965 return pkg.installerPackageName;
1966 }
1967
1968 int getApplicationEnabledSettingLPr(String packageName) {
1969 final PackageSetting pkg = mPackages.get(packageName);
1970 if (pkg == null) {
1971 throw new IllegalArgumentException("Unknown package: " + packageName);
1972 }
1973 return pkg.enabled;
1974 }
1975
1976 int getComponentEnabledSettingLPr(ComponentName componentName) {
1977 final String packageName = componentName.getPackageName();
1978 final PackageSetting pkg = mPackages.get(packageName);
1979 if (pkg == null) {
1980 throw new IllegalArgumentException("Unknown component: " + componentName);
1981 }
1982 final String classNameStr = componentName.getClassName();
1983 return pkg.getCurrentEnabledStateLPr(classNameStr);
1984 }
1985
1986 boolean setPackageStoppedStateLPw(String packageName, boolean stopped,
1987 boolean allowedByPermission, int uid) {
1988 final PackageSetting pkgSetting = mPackages.get(packageName);
1989 if (pkgSetting == null) {
1990 throw new IllegalArgumentException("Unknown package: " + packageName);
1991 }
1992 if (!allowedByPermission && (uid != pkgSetting.userId)) {
1993 throw new SecurityException(
1994 "Permission Denial: attempt to change stopped state from pid="
1995 + Binder.getCallingPid()
1996 + ", uid=" + uid + ", package uid=" + pkgSetting.userId);
1997 }
1998 if (DEBUG_STOPPED) {
1999 if (stopped) {
2000 RuntimeException e = new RuntimeException("here");
2001 e.fillInStackTrace();
2002 Slog.i(TAG, "Stopping package " + packageName, e);
2003 }
2004 }
2005 if (pkgSetting.stopped != stopped) {
2006 pkgSetting.stopped = stopped;
2007 pkgSetting.pkg.mSetStopped = stopped;
2008 if (pkgSetting.notLaunched) {
2009 if (pkgSetting.installerPackageName != null) {
2010 PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH,
2011 pkgSetting.name, null,
2012 pkgSetting.installerPackageName, null);
2013 }
2014 pkgSetting.notLaunched = false;
2015 }
2016 return true;
2017 }
2018 return false;
2019 }
2020
2021 void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2022 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2023 final Date date = new Date();
2024 boolean printedSomething = false;
2025 for (final PackageSetting ps : mPackages.values()) {
2026 if (packageName != null && !packageName.equals(ps.realName)
2027 && !packageName.equals(ps.name)) {
2028 continue;
2029 }
2030
2031 if (packageName != null) {
2032 dumpState.setSharedUser(ps.sharedUser);
2033 }
2034
2035 if (!printedSomething) {
2036 if (dumpState.onTitlePrinted())
2037 pw.println(" ");
2038 pw.println("Packages:");
2039 printedSomething = true;
2040 }
2041 pw.print(" Package [");
2042 pw.print(ps.realName != null ? ps.realName : ps.name);
2043 pw.print("] (");
2044 pw.print(Integer.toHexString(System.identityHashCode(ps)));
2045 pw.println("):");
2046
2047 if (ps.realName != null) {
2048 pw.print(" compat name=");
2049 pw.println(ps.name);
2050 }
2051
2052 pw.print(" userId="); pw.print(ps.userId);
2053 pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids));
2054 pw.print(" sharedUser="); pw.println(ps.sharedUser);
2055 pw.print(" pkg="); pw.println(ps.pkg);
2056 pw.print(" codePath="); pw.println(ps.codePathString);
2057 pw.print(" resourcePath="); pw.println(ps.resourcePathString);
2058 pw.print(" nativeLibraryPath="); pw.println(ps.nativeLibraryPathString);
2059 pw.print(" versionCode="); pw.println(ps.versionCode);
2060 if (ps.pkg != null) {
2061 pw.print(" versionName="); pw.println(ps.pkg.mVersionName);
2062 pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
2063 pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
2064 if (ps.pkg.mOperationPending) {
2065 pw.println(" mOperationPending=true");
2066 }
2067 pw.print(" supportsScreens=[");
2068 boolean first = true;
2069 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
2070 if (!first)
2071 pw.print(", ");
2072 first = false;
2073 pw.print("small");
2074 }
2075 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
2076 if (!first)
2077 pw.print(", ");
2078 first = false;
2079 pw.print("medium");
2080 }
2081 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
2082 if (!first)
2083 pw.print(", ");
2084 first = false;
2085 pw.print("large");
2086 }
2087 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
2088 if (!first)
2089 pw.print(", ");
2090 first = false;
2091 pw.print("xlarge");
2092 }
2093 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
2094 if (!first)
2095 pw.print(", ");
2096 first = false;
2097 pw.print("resizeable");
2098 }
2099 if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
2100 if (!first)
2101 pw.print(", ");
2102 first = false;
2103 pw.print("anyDensity");
2104 }
2105 }
2106 pw.println("]");
2107 pw.print(" timeStamp=");
2108 date.setTime(ps.timeStamp);
2109 pw.println(sdf.format(date));
2110 pw.print(" firstInstallTime=");
2111 date.setTime(ps.firstInstallTime);
2112 pw.println(sdf.format(date));
2113 pw.print(" lastUpdateTime=");
2114 date.setTime(ps.lastUpdateTime);
2115 pw.println(sdf.format(date));
2116 if (ps.installerPackageName != null) {
2117 pw.print(" installerPackageName="); pw.println(ps.installerPackageName);
2118 }
2119 pw.print(" signatures="); pw.println(ps.signatures);
2120 pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed);
2121 pw.print(" haveGids="); pw.println(ps.haveGids);
2122 pw.print(" pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags));
2123 pw.print(" installStatus="); pw.print(ps.installStatus);
2124 pw.print(" stopped="); pw.print(ps.stopped);
2125 pw.print(" enabled="); pw.println(ps.enabled);
2126 if (ps.disabledComponents.size() > 0) {
2127 pw.println(" disabledComponents:");
2128 for (String s : ps.disabledComponents) {
2129 pw.print(" "); pw.println(s);
2130 }
2131 }
2132 if (ps.enabledComponents.size() > 0) {
2133 pw.println(" enabledComponents:");
2134 for (String s : ps.enabledComponents) {
2135 pw.print(" "); pw.println(s);
2136 }
2137 }
2138 if (ps.grantedPermissions.size() > 0) {
2139 pw.println(" grantedPermissions:");
2140 for (String s : ps.grantedPermissions) {
2141 pw.print(" "); pw.println(s);
2142 }
2143 }
2144 }
2145
2146 printedSomething = false;
2147 if (mRenamedPackages.size() > 0) {
2148 for (final HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) {
2149 if (packageName != null && !packageName.equals(e.getKey())
2150 && !packageName.equals(e.getValue())) {
2151 continue;
2152 }
2153 if (!printedSomething) {
2154 if (dumpState.onTitlePrinted())
2155 pw.println(" ");
2156 pw.println("Renamed packages:");
2157 printedSomething = true;
2158 }
2159 pw.print(" ");
2160 pw.print(e.getKey());
2161 pw.print(" -> ");
2162 pw.println(e.getValue());
2163 }
2164 }
2165
2166 printedSomething = false;
2167 if (mDisabledSysPackages.size() > 0) {
2168 for (final PackageSetting ps : mDisabledSysPackages.values()) {
2169 if (packageName != null && !packageName.equals(ps.realName)
2170 && !packageName.equals(ps.name)) {
2171 continue;
2172 }
2173 if (!printedSomething) {
2174 if (dumpState.onTitlePrinted())
2175 pw.println(" ");
2176 pw.println("Hidden system packages:");
2177 printedSomething = true;
2178 }
2179 pw.print(" Package [");
2180 pw.print(ps.realName != null ? ps.realName : ps.name);
2181 pw.print("] (");
2182 pw.print(Integer.toHexString(System.identityHashCode(ps)));
2183 pw.println("):");
2184 if (ps.realName != null) {
2185 pw.print(" compat name=");
2186 pw.println(ps.name);
2187 }
2188 pw.print(" userId=");
2189 pw.println(ps.userId);
2190 pw.print(" sharedUser=");
2191 pw.println(ps.sharedUser);
2192 pw.print(" codePath=");
2193 pw.println(ps.codePathString);
2194 pw.print(" resourcePath=");
2195 pw.println(ps.resourcePathString);
2196 }
2197 }
2198 }
2199
2200 void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2201 boolean printedSomething = false;
2202 for (BasePermission p : mPermissions.values()) {
2203 if (packageName != null && !packageName.equals(p.sourcePackage)) {
2204 continue;
2205 }
2206 if (!printedSomething) {
2207 if (dumpState.onTitlePrinted())
2208 pw.println(" ");
2209 pw.println("Permissions:");
2210 printedSomething = true;
2211 }
2212 pw.print(" Permission ["); pw.print(p.name); pw.print("] (");
2213 pw.print(Integer.toHexString(System.identityHashCode(p)));
2214 pw.println("):");
2215 pw.print(" sourcePackage="); pw.println(p.sourcePackage);
2216 pw.print(" uid="); pw.print(p.uid);
2217 pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids));
2218 pw.print(" type="); pw.print(p.type);
2219 pw.print(" prot="); pw.println(p.protectionLevel);
2220 if (p.packageSetting != null) {
2221 pw.print(" packageSetting="); pw.println(p.packageSetting);
2222 }
2223 if (p.perm != null) {
2224 pw.print(" perm="); pw.println(p.perm);
2225 }
2226 }
2227 }
2228
2229 void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2230 boolean printedSomething = false;
2231 for (SharedUserSetting su : mSharedUsers.values()) {
2232 if (packageName != null && su != dumpState.getSharedUser()) {
2233 continue;
2234 }
2235 if (!printedSomething) {
2236 if (dumpState.onTitlePrinted())
2237 pw.println(" ");
2238 pw.println("Shared users:");
2239 printedSomething = true;
2240 }
2241 pw.print(" SharedUser [");
2242 pw.print(su.name);
2243 pw.print("] (");
2244 pw.print(Integer.toHexString(System.identityHashCode(su)));
2245 pw.println("):");
2246 pw.print(" userId=");
2247 pw.print(su.userId);
2248 pw.print(" gids=");
2249 pw.println(PackageManagerService.arrayToString(su.gids));
2250 pw.println(" grantedPermissions:");
2251 for (String s : su.grantedPermissions) {
2252 pw.print(" ");
2253 pw.println(s);
2254 }
2255 }
2256 }
2257
2258 void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
2259 pw.println("Settings parse messages:");
2260 pw.print(mReadMessages.toString());
2261 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -07002262}