Settings.java revision 62539e9efa02c4037d3310a8b4f16f0085cd8c37
1cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/* 2cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Copyright (C) 2011 The Android Open Source Project 3cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * 4cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * you may not use this file except in compliance with the License. 6cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * You may obtain a copy of the License at 7cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * 8cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * http://www.apache.org/licenses/LICENSE-2.0 9cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * 10cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Unless required by applicable law or agreed to in writing, software 11cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * See the License for the specific language governing permissions and 14cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * limitations under the License. 15cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 16cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 17cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootpackage com.android.server.pm; 18cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 19cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 20cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 210ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackbornimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; 22cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 23cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 24cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.FastXmlSerializer; 25cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.JournaledFile; 26cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.XmlUtils; 27cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.server.IntentResolver; 28447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport com.android.server.pm.PackageManagerService.DumpState; 29cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 30cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlPullParser; 31cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlPullParserException; 32cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlSerializer; 33cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 34447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.ComponentName; 35447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.Intent; 36cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ApplicationInfo; 37cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ComponentInfo; 38cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageManager; 39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageParser; 40cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PermissionInfo; 41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.Signature; 420aaa0d931716e9f57a1d84d795fab2df75092756Kenny Rootimport android.content.pm.VerifierDeviceIdentity; 43447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.os.Binder; 44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Environment; 45cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.FileUtils; 46cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Process; 47cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Log; 48cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Slog; 49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.SparseArray; 50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Xml; 51cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 52cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.BufferedOutputStream; 53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File; 54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileInputStream; 55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileOutputStream; 56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.IOException; 57cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.PrintWriter; 58447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.text.SimpleDateFormat; 59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.ArrayList; 60cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Arrays; 61447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.util.Date; 62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashMap; 63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet; 64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Iterator; 65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 6662539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Rootimport libcore.io.IoUtils; 6762539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root 68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/** 69cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Holds information about dynamic settings. 70cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 71cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class Settings { 72447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private static final String TAG = "PackageSettings"; 73447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 74447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private static final boolean DEBUG_STOPPED = false; 75447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 76cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mSettingsFilename; 77cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mBackupSettingsFilename; 78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mPackageListFilename; 79cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mStoppedPackagesFilename; 80cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mBackupStoppedPackagesFilename; 81cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, PackageSetting> mPackages = 82cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, PackageSetting>(); 83cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // List of replaced system applications 84cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, PackageSetting> mDisabledSysPackages = 85cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, PackageSetting>(); 86cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 87cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // These are the last platform API version we were using for 88cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // the apps installed on internal and external storage. It is 89cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // used to grant newer permissions one time during a system upgrade. 90cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int mInternalSdkPlatform; 91cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int mExternalSdkPlatform; 920aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 930aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root /** Device identity for the purpose of package verification. */ 940aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root private VerifierDeviceIdentity mVerifierDeviceIdentity; 950aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 96cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // The user's preferred activities associated with particular intent 97cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // filters. 98cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities = 99cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new IntentResolver<PreferredActivity, PreferredActivity>() { 100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root @Override 101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root protected String packageForFilter(PreferredActivity filter) { 102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return filter.mPref.mComponent.getPackageName(); 103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root @Override 105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root protected void dumpFilter(PrintWriter out, String prefix, 106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PreferredActivity filter) { 107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root filter.mPref.dump(out, prefix, filter); 108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root }; 110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, SharedUserSetting> mSharedUsers = 111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, SharedUserSetting>(); 112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final ArrayList<Object> mUserIds = new ArrayList<Object>(); 113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final SparseArray<Object> mOtherUserIds = 114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new SparseArray<Object>(); 115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For reading/writing settings file. 117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final ArrayList<Signature> mPastSignatures = 118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new ArrayList<Signature>(); 119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Mapping from permission names to info about them. 121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, BasePermission> mPermissions = 122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, BasePermission>(); 123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Mapping from permission tree names to info about them. 125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, BasePermission> mPermissionTrees = 126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, BasePermission>(); 127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Packages that have been uninstalled and still need their external 129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // storage data deleted. 130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final ArrayList<String> mPackagesToBeCleaned = new ArrayList<String>(); 131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Packages that have been renamed since they were first installed. 133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keys are the new names of the packages, values are the original 134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // names. The packages appear everwhere else under their original 135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // names. 136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, String> mRenamedPackages = new HashMap<String, String>(); 137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final StringBuilder mReadMessages = new StringBuilder(); 139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 140447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root /** 141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * Used to track packages that have a shared user ID that hasn't been read 142447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * in yet. 143447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * <p> 144447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * TODO: make this just a local variable that is passed in during package 145447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * scanning to make it less confusing. 146447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root */ 147447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>(); 148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Settings() { 150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root File dataDir = Environment.getDataDirectory(); 151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root File systemDir = new File(dataDir, "system"); 152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemDir.mkdirs(); 153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(systemDir.toString(), 154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRWXU|FileUtils.S_IRWXG 155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH|FileUtils.S_IXOTH, 156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename = new File(systemDir, "packages.xml"); 158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupSettingsFilename = new File(systemDir, "packages-backup.xml"); 159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackageListFilename = new File(systemDir, "packages.list"); 160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mStoppedPackagesFilename = new File(systemDir, "packages-stopped.xml"); 161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupStoppedPackagesFilename = new File(systemDir, "packages-stopped-backup.xml"); 162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage, 165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, 166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int pkgFlags, boolean create, boolean add) { 167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String name = pkg.packageName; 168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath, 169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, create, add); 170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting peekPackageLPr(String name) { 174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return mPackages.get(name); 175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void setInstallStatus(String pkgName, int status) { 178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(pkgName); 179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p != null) { 180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p.getInstallStatus() != status) { 181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setInstallStatus(status); 182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void setInstallerPackageName(String pkgName, 187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String installerPkgName) { 188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(pkgName); 189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p != null) { 190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setInstallerPackageName(installerPkgName); 191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 194447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root SharedUserSetting getSharedUserLPw(String name, 195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags, boolean create) { 196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting s = mSharedUsers.get(name); 197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s == null) { 198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!create) { 199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s = new SharedUserSetting(name, pkgFlags); 202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) { 203447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root s.userId = newUserIdLPw(s); 204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s.userId = PackageManagerService.FIRST_APPLICATION_UID; 206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId); 208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // < 0 means we couldn't assign a userid; fall out and return 209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // s, which is currently null 210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s.userId >= 0) { 211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.put(name, s); 212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 218447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean disableSystemPackageLPw(String name) { 219447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p == null) { 221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package"); 222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 224447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting dp = mDisabledSysPackages.get(name); 225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // always make sure the system package code and resource paths dont change 226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dp == null) { 227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if((p.pkg != null) && (p.pkg.applicationInfo != null)) { 228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; 229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.put(name, p); 231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // a little trick... when we install the new package, we don't 233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // want to modify the existing PackageSetting for the built-in 234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // version. so at this point we need a new PackageSetting that 235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // is okay to muck with. 236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting newp = new PackageSetting(p); 237447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root replacePackageLPw(name, newp); 238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 243447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting enableSystemPackageLPw(String name) { 244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mDisabledSysPackages.get(name); 245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p == null) { 246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled"); 247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Reset flag in ApplicationInfo object 250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if((p.pkg != null) && (p.pkg.applicationInfo != null)) { 251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; 252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 253447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath, 254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString, p.userId, p.versionCode, p.pkgFlags); 255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.remove(name); 256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return ret; 257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 259447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath, 260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int uid, int vc, int pkgFlags) { 261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(name); 262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.userId == uid) { 264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate package, keeping first: " + name); 268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString, 271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root vc, pkgFlags); 272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = uid; 273447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (addUserIdLPw(uid, p, name)) { 274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, p); 275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 280447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) { 281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting s = mSharedUsers.get(name); 282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s != null) { 283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s.userId == uid) { 284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate shared user, keeping first: " + name); 288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s = new SharedUserSetting(name, pkgFlags); 291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s.userId = uid; 292447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (addUserIdLPw(uid, s, name)) { 293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.put(name, s); 294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Transfer ownership of permissions from one package to another. 300447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void transferPermissionsLPw(String origPkg, String newPkg) { 301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Transfer ownership of permissions to the new package. 302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i=0; i<2; i++) { 303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root HashMap<String, BasePermission> permissions = 304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root i == 0 ? mPermissionTrees : mPermissions; 305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : permissions.values()) { 306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (origPkg.equals(bp.sourcePackage)) { 307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, 308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Moving permission " + bp.name 309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " from pkg " + bp.sourcePackage 310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " + newPkg); 311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.sourcePackage = newPkg; 312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.packageSetting = null; 313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.perm = null; 314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.pendingInfo != null) { 315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.pendingInfo.packageName = newPkg; 316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.uid = 0; 318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.gids = null; 319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 324447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private PackageSetting getPackageLPw(String name, PackageSetting origPackage, 325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, 326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) { 327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(name); 328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!p.codePath.equals(codePath)) { 330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Check to see if its a disabled system app 331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) { 332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // This is an updated system app with versions in both system 333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // and data partition. Just let the most recent version 334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // take precedence. 335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Trying to update system app code path from " + 336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePathString + " to " + codePath.toString()); 337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Just a change in the code path is not an issue, but 339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // let's log a message about it. 340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from " + p.codePath 341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " + codePath + "; Retaining data and using new"); 342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /* 343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Since we've changed paths, we need to prefer the new 344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * native library path over the one stored in the 345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * package settings since we might have moved from 346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * internal to external storage or vice versa. 347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString = nativeLibraryPathString; 349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != sharedUser) { 352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + name + " shared user changed from " 354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + (p.sharedUser != null ? p.sharedUser.name : "<nothing>") 355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " 356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + (sharedUser != null ? sharedUser.name : "<nothing>") 357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; replacing with new"); 358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = null; 359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) { 361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If what we are scanning is a system package, then 362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // make it so, regardless of whether it was previously 363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // installed only in the data partition. 364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p == null) { 369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Create a new PackageSettings entry. this can end up here because 370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // of code path mismatch or user id mismatch of an updated system partition 371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!create) { 372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (origPackage != null) { 375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We are consuming the data from an existing package. 376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(origPackage.name, name, codePath, resourcePath, 377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathString, vc, pkgFlags); 378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " + name 379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " is adopting original package " + origPackage.name); 380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Note that we will retain the new package's signature so 381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // that we can keep its data. 382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSignatures s = p.signatures; 383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.copyFrom(origPackage); 384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures = s; 385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = origPackage.sharedUser; 386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = origPackage.userId; 387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.origPackage = origPackage; 388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mRenamedPackages.put(name, origPackage.name); 389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root name = origPackage.name; 390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update new package state. 391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setTimeStamp(codePath.lastModified()); 392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(name, realName, codePath, resourcePath, 394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathString, vc, pkgFlags); 395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setTimeStamp(codePath.lastModified()); 396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = sharedUser; 397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is not a system app, it starts out stopped. 398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) { 399447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (DEBUG_STOPPED) { 400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root RuntimeException e = new RuntimeException("here"); 401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root e.fillInStackTrace(); 402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.i(PackageManagerService.TAG, "Stopping package " + name, e); 403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.stopped = true; 405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.notLaunched = true; 406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (sharedUser != null) { 408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = sharedUser.userId; 409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) { 410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone the setting here for disabled system packages 411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting dis = mDisabledSysPackages.get(name); 412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dis != null) { 413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For disabled packages a new setting is created 414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // from the existing user id. This still has to be 415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // added to list of user id's 416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Copy signatures from previous setting 417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dis.signatures.mSignatures != null) { 418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures.mSignatures = dis.signatures.mSignatures.clone(); 419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = dis.userId; 421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone permissions 422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.grantedPermissions = new HashSet<String>(dis.grantedPermissions); 423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone component info 424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.disabledComponents = new HashSet<String>(dis.disabledComponents); 425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.enabledComponents = new HashSet<String>(dis.enabledComponents); 426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Add new setting to list of user ids 427447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addUserIdLPw(p.userId, p, name); 428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Assign new user id 430447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root p.userId = newUserIdLPw(p); 431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = PackageManagerService.FIRST_APPLICATION_UID; 434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.userId < 0) { 437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + name + " could not be assigned a valid uid"); 439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (add) { 442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Finish adding new package by adding it and updating shared 443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // user preferences 444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addPackageSettingLPw(p, name, sharedUser); 445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 450447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) { 451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg = pkg; 452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.mSetEnabled = p.enabled; 453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.mSetStopped = p.stopped; 454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String codePath = pkg.applicationInfo.sourceDir; 455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String resourcePath = pkg.applicationInfo.publicSourceDir; 456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update code path if needed 457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!codePath.equalsIgnoreCase(p.codePathString)) { 458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName + 459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root " changing from " + p.codePathString + " to " + codePath); 460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePath = new File(codePath); 461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePathString = codePath; 462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Update resource path if needed 464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) { 465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName + 466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root " changing from " + p.resourcePathString + " to " + resourcePath); 467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.resourcePath = new File(resourcePath); 468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.resourcePathString = resourcePath; 469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update the native library path if needed 471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir; 472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (nativeLibraryPath != null 473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) { 474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString = nativeLibraryPath; 475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update version code if needed 477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.mVersionCode != p.versionCode) { 478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.versionCode = pkg.mVersionCode; 479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update signatures if needed. 481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.signatures.mSignatures == null) { 482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures.assignSignatures(pkg.mSignatures); 483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this app defines a shared user id initialize 485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // the shared user signatures as well. 486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) { 487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.signatures.assignSignatures(pkg.mSignatures); 488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 489447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addPackageSettingLPw(p, pkg.packageName, p.sharedUser); 490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Utility method that adds a PackageSetting to mPackages and 493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // completes updating the shared user attributes 494447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void addPackageSettingLPw(PackageSetting p, String name, 495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting sharedUser) { 496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, p); 497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (sharedUser != null) { 498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null && p.sharedUser != sharedUser) { 499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + p.name + " was user " 501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + p.sharedUser + " but is now " + sharedUser 502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; I am not changing its files so it will probably fail!"); 503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (p.userId != sharedUser.userId) { 505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + p.name + " was user id " + p.userId 507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " but is now user " + sharedUser 508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " with id " + sharedUser.userId 509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; I am not changing its files so it will probably fail!"); 510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sharedUser.packages.add(p); 513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = sharedUser; 514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = sharedUser.userId; 515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /* 519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Update the shared user setting when a package using 520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * specifying the shared user id is removed. The gids 521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * associated with each permission of the deleted package 522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * are removed from the shared user's gid list only if its 523cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * not in use by other permissions of packages in the 524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * shared user setting. 525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 526447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) { 527447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((deletedPs == null) || (deletedPs.pkg == null)) { 528447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Slog.i(PackageManagerService.TAG, 529447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root "Trying to update info for null package. Just ignoring"); 530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // No sharedUserId 533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (deletedPs.sharedUser == null) { 534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting sus = deletedPs.sharedUser; 537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update permissions 538447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String eachPerm : deletedPs.pkg.requestedPermissions) { 539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root boolean used = false; 540447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!sus.grantedPermissions.contains(eachPerm)) { 541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (PackageSetting pkg:sus.packages) { 544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.pkg != null && 545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) && 546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.pkg.requestedPermissions.contains(eachPerm)) { 547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root used = true; 548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root break; 549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!used) { 552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // can safely delete this permission from list 553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sus.grantedPermissions.remove(eachPerm); 554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update gids 557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int newGids[] = globalGids; 558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (String eachPerm : sus.grantedPermissions) { 559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BasePermission bp = mPermissions.get(eachPerm); 560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp != null) { 561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root newGids = PackageManagerService.appendInts(newGids, bp.gids); 562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sus.gids = newGids; 565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 567447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root int removePackageLPw(String name) { 568447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.remove(name); 571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null) { 572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser.packages.size() == 0) { 574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.remove(p.sharedUser.name); 575447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root removeUserIdLPw(p.sharedUser.userId); 576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p.sharedUser.userId; 577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 579447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root removeUserIdLPw(p.userId); 580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p.userId; 581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return -1; 584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 586447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void replacePackageLPw(String name, PackageSetting newp) { 587447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null) { 590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.add(newp); 592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 593447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root replaceUserIdLPw(p.userId, newp); 594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, newp); 597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 599447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private boolean addUserIdLPw(int uid, Object obj, Object name) { 600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID + PackageManagerService.MAX_APPLICATION_UIDS) { 601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID) { 605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int N = mUserIds.size(); 606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int index = uid - PackageManagerService.FIRST_APPLICATION_UID; 607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while (index >= N) { 608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.add(null); 609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root N++; 610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mUserIds.get(index) != null) { 612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate user id: " + uid 614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " name=" + name); 615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.set(index, obj); 618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mOtherUserIds.get(uid) != null) { 620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate shared id: " + uid 622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " name=" + name); 623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.put(uid, obj); 626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 630447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root public Object getUserIdLPr(int uid) { 631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID) { 632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int index = uid - PackageManagerService.FIRST_APPLICATION_UID; 634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return index < N ? mUserIds.get(index) : null; 635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return mOtherUserIds.get(uid); 637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 640447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void removeUserIdLPw(int uid) { 641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID) { 642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int index = uid - PackageManagerService.FIRST_APPLICATION_UID; 644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (index < N) mUserIds.set(index, null); 645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.remove(uid); 647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 650447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void replaceUserIdLPw(int uid, Object obj) { 651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID) { 652cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int index = uid - PackageManagerService.FIRST_APPLICATION_UID; 654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (index < N) mUserIds.set(index, obj); 655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.put(uid, obj); 657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 660447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeStoppedLPr() { 661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keep the old stopped packages around until we know the new ones have 662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // been successfully written. 663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mStoppedPackagesFilename.exists()) { 664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Presence of backup settings file indicates that we failed 665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // to persist packages earlier. So preserve the older 666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // backup for future reference since the current packages 667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // might have been corrupted. 668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mBackupStoppedPackagesFilename.exists()) { 669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mStoppedPackagesFilename.renameTo(mBackupStoppedPackagesFilename)) { 670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to backup package manager stopped packages, " 671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot"); 672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 675cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mStoppedPackagesFilename.delete(); 676cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup"); 677cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 679cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 681447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final FileOutputStream fstr = new FileOutputStream(mStoppedPackagesFilename); 682447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final BufferedOutputStream str = new BufferedOutputStream(fstr); 683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //XmlSerializer serializer = XmlUtils.serializerInstance(); 685447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final XmlSerializer serializer = new FastXmlSerializer(); 686cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setOutput(str, "utf-8"); 687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startDocument(null, true); 688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "stopped-packages"); 691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 692447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.stopped) { 694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "pkg"); 695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", pkg.name); 696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.notLaunched) { 697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nl", "1"); 698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "pkg"); 700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "stopped-packages"); 704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endDocument(); 706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 707cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // New settings successfully written, old ones are no longer 712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // needed. 713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupStoppedPackagesFilename.delete(); 714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mStoppedPackagesFilename.toString(), 715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IRGRP|FileUtils.S_IWGRP 717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH, 718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Done, all is good! 721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager stopped packages, " 724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " current changes will be lost at reboot", e); 725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clean up partially written files 728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mStoppedPackagesFilename.exists()) { 729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mStoppedPackagesFilename.delete()) { 730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: " + mStoppedPackagesFilename); 731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Note: assumed "stopped" field is already cleared in all packages. 736447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void readStoppedLPw() { 737cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileInputStream str = null; 738cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mBackupStoppedPackagesFilename.exists()) { 739cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mBackupStoppedPackagesFilename); 741cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Reading from backup stopped packages file\n"); 742cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, "Need to read from backup stopped packages file"); 743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If both the backup and normal file exist, we 745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ignore the normal one since it might have been 746cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // corrupted. 747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file " 748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mStoppedPackagesFilename); 749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mStoppedPackagesFilename.delete(); 750cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We'll try for the normal settings file. 753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (str == null) { 758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mStoppedPackagesFilename.exists()) { 759cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No stopped packages file found\n"); 760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, "No stopped packages file file; " 761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "assuming all started"); 762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // At first boot, make sure no packages are stopped. 763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We usually want to have third party apps initialize 764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // in the stopped state, but not at first boot. 765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (PackageSetting pkg : mPackages.values()) { 766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.stopped = false; 767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.notLaunched = false; 768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 771cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mStoppedPackagesFilename); 772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 773447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final XmlPullParser parser = Xml.newPullParser(); 774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root parser.setInput(str, null); 775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type=parser.next()) != XmlPullParser.START_TAG 778cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && type != XmlPullParser.END_DOCUMENT) { 779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 781cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type != XmlPullParser.START_TAG) { 783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No start tag found in stopped packages file\n"); 784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager stopped packages"); 786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG 792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || parser.getDepth() > outerDepth)) { 793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG 794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || type == XmlPullParser.TEXT) { 795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("pkg")) { 800cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting ps = mPackages.get(name); 802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps != null) { 803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.stopped = true; 804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ("1".equals(parser.getAttributeValue(null, "nl"))) { 805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.notLaunched = true; 806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 807cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "No package known for stopped package: " + name); 809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: " 813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getName()); 814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 820cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(XmlPullParserException e) { 821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading stopped packages: " + e); 823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 826cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 827cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 833447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeLPr() { 834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024); 835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keep the old settings around until we know the new ones have 837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // been successfully written. 838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Presence of backup settings file indicates that we failed 840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // to persist settings earlier. So preserve the older 841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // backup for future reference since the current settings 842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // might have been corrupted. 843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mBackupSettingsFilename.exists()) { 844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) { 845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, " 846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " current changes will be lost at reboot"); 847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename.delete(); 851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Preserving older settings backup"); 852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPastSignatures.clear(); 856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileOutputStream fstr = new FileOutputStream(mSettingsFilename); 859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BufferedOutputStream str = new BufferedOutputStream(fstr); 860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //XmlSerializer serializer = XmlUtils.serializerInstance(); 862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlSerializer serializer = new FastXmlSerializer(); 863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setOutput(str, "utf-8"); 864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startDocument(null, true); 865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "packages"); 868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "last-platform-version"); 870cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform)); 871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform)); 872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "last-platform-version"); 873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 8740aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root if (mVerifierDeviceIdentity != null) { 8750aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.startTag(null, "verifier"); 8760aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.attribute(null, "device", mVerifierDeviceIdentity.toString()); 8770aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.endTag(null, "verifier"); 8780aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 8790aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "permission-trees"); 881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : mPermissionTrees.values()) { 882447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePermissionLPr(serializer, bp); 883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "permission-trees"); 885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "permissions"); 887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : mPermissions.values()) { 888447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePermissionLPr(serializer, bp); 889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "permissions"); 891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 892447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 893447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePackageLPr(serializer, pkg); 894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 896447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mDisabledSysPackages.values()) { 897447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writeDisabledSysPackageLPr(serializer, pkg); 898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "preferred-activities"); 901447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PreferredActivity pa : mPreferredActivities.filterSet()) { 902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pa.writeToXml(serializer); 904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "preferred-activities"); 907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 908447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final SharedUserSetting usr : mSharedUsers.values()) { 909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "shared-user"); 910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", usr.name); 911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "userId", 912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Integer.toString(usr.userId)); 913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root usr.signatures.writeXml(serializer, "sigs", mPastSignatures); 914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (String name : usr.grantedPermissions) { 916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "shared-user"); 922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mPackagesToBeCleaned.size() > 0) { 925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i=0; i<mPackagesToBeCleaned.size(); i++) { 926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "cleaning-package"); 927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", mPackagesToBeCleaned.get(i)); 928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "cleaning-package"); 929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mRenamedPackages.size() > 0) { 933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) { 934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "renamed-package"); 935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "new", e.getKey()); 936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "old", e.getValue()); 937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "renamed-package"); 938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "packages"); 942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endDocument(); 944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 946cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 947cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 948cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 949cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // New settings successfully written, old ones are no longer 950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // needed. 951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupSettingsFilename.delete(); 952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mSettingsFilename.toString(), 953cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IRGRP|FileUtils.S_IWGRP 955cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH, 956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Write package list file now, use a JournaledFile. 959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root File tempFile = new File(mPackageListFilename.toString() + ".tmp"); 961cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile); 962cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root fstr = new FileOutputStream(journal.chooseForWrite()); 964cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new BufferedOutputStream(fstr); 965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root StringBuilder sb = new StringBuilder(); 967447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 968cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ApplicationInfo ai = pkg.pkg.applicationInfo; 969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String dataPath = ai.dataDir; 970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; 971cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Avoid any application that has a space in its path 973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // or that is handled by the system. 974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID) 975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // we store on each line the following information for now: 978cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 979cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // pkgName - package name 980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // userId - application-specific user id 981cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // debugFlag - 0 or 1 if the package is debuggable. 982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // dataPath - path to package's data path 983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // NOTE: We prefer not to expose all ApplicationInfo flags for now. 985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS 987cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES: 988cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // system/core/run-as/run-as.c 989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 990cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.setLength(0); 991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(ai.packageName); 992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(" "); 993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append((int)ai.uid); 994cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(isDebug ? " 1 " : " 0 "); 995cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(dataPath); 996cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append("\n"); 997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.write(sb.toString().getBytes()); 998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 1000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 1001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1002cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root journal.commit(); 100362539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root } catch (Exception e) { 100462539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root IoUtils.closeQuietly(str); 1005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root journal.rollback(); 1006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mPackageListFilename.toString(), 1009cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 1010cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IRGRP|FileUtils.S_IWGRP 1011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH, 1012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 1013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1014447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writeStoppedLPr(); 1015cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1016cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1018cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(XmlPullParserException e) { 1019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " 1020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot", e); 1021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 1022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " 1023cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot", e); 1024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clean up partially written files 1026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.delete()) { 1028cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: " + mSettingsFilename); 1029cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Debug.stopMethodTracing(); 1032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1034447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg) 1035cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws java.io.IOException { 1036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "updated-package"); 1037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", pkg.name); 1038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.realName != null) { 1039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "realName", pkg.realName); 1040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1041cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "codePath", pkg.codePathString); 1042cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); 1043cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); 1044cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); 1045cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "version", String.valueOf(pkg.versionCode)); 1046cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!pkg.resourcePathString.equals(pkg.codePathString)) { 1047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "resourcePath", pkg.resourcePathString); 1048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.nativeLibraryPathString != null) { 1050cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString); 1051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "userId", Integer.toString(pkg.userId)); 1054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId)); 1056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is a shared user, the permissions will 1060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be written there. We still need to write an 1061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // empty permissions list so permissionsFixed will 1062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be set. 1063cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.grantedPermissions) { 1064cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BasePermission bp = mPermissions.get(name); 1065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp != null) { 1066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We only need to write signature or system permissions but 1067cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // this wont 1068cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // match the semantics of grantedPermissions. So write all 1069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // permissions. 1070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 1072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1073cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1074cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1075cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1076cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1077cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "updated-package"); 1078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1080447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg) 1081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws java.io.IOException { 1082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "package"); 1083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", pkg.name); 1084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.realName != null) { 1085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "realName", pkg.realName); 1086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "codePath", pkg.codePathString); 1088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!pkg.resourcePathString.equals(pkg.codePathString)) { 1089cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "resourcePath", pkg.resourcePathString); 1090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1091cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.nativeLibraryPathString != null) { 1092cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString); 1093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags)); 1095cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); 1096cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); 1097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); 1098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "version", String.valueOf(pkg.versionCode)); 1099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "userId", Integer.toString(pkg.userId)); 1101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId)); 1103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.uidError) { 1105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "uidError", "true"); 1106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.enabled != COMPONENT_ENABLED_STATE_DEFAULT) { 1108b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn serializer.attribute(null, "enabled", Integer.toString(pkg.enabled)); 1109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) { 1111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "installStatus", "false"); 1112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.installerPackageName != null) { 1114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "installer", pkg.installerPackageName); 1115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.signatures.writeXml(serializer, "sigs", mPastSignatures); 1117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) { 1118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is a shared user, the permissions will 1121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be written there. We still need to write an 1122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // empty permissions list so permissionsFixed will 1123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be set. 1124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.grantedPermissions) { 1125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 1127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.disabledComponents.size() > 0) { 1133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "disabled-components"); 1134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.disabledComponents) { 1135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 1137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "disabled-components"); 1140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.enabledComponents.size() > 0) { 1142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "enabled-components"); 1143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.enabledComponents) { 1144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 1146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "enabled-components"); 1149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "package"); 1152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1154447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writePermissionLPr(XmlSerializer serializer, BasePermission bp) 1155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws XmlPullParserException, java.io.IOException { 1156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) { 1157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", bp.name); 1159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "package", bp.sourcePackage); 1160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) { 1161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel)); 1162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type=" 1165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + bp.type); 1166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.type == BasePermission.TYPE_DYNAMIC) { 1167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo; 1168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi != null) { 1169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "type", "dynamic"); 1170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi.icon != 0) { 1171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "icon", Integer.toString(pi.icon)); 1172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi.nonLocalizedLabel != null) { 1174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "label", pi.nonLocalizedLabel.toString()); 1175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1182447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() { 1183447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final HashSet<String> kList = new HashSet<String>(mPackages.keySet()); 1184447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final Iterator<String> its = kList.iterator(); 1185447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>(); 1186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while (its.hasNext()) { 1187447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String key = its.next(); 1188447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting ps = mPackages.get(key); 1189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) { 1190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ret.add(ps); 1191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return ret; 1194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1196447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean readLPw() { 1197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileInputStream str = null; 1198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mBackupSettingsFilename.exists()) { 1199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mBackupSettingsFilename); 1201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Reading from backup settings file\n"); 1202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, 1203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Need to read from backup settings file"); 1204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If both the backup and settings file exist, we 1206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ignore the settings since it might have been 1207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // corrupted. 1208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Cleaning up settings file " 1209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mSettingsFilename); 1210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename.delete(); 1211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We'll try for the normal settings file. 1214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1217447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root mPendingPackages.clear(); 1218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPastSignatures.clear(); 1219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (str == null) { 1222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.exists()) { 1223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No settings file found\n"); 1224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, 1225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No settings file; creating initial state"); 1226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mSettingsFilename); 1229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlPullParser parser = Xml.newPullParser(); 1231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root parser.setInput(str, null); 1232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.START_TAG 1235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && type != XmlPullParser.END_DOCUMENT) { 1236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 1237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type != XmlPullParser.START_TAG) { 1240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No start tag found in settings file\n"); 1241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager settings"); 124358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn Log.wtf(PackageManagerService.TAG, 124458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn "No start tag found in package manager settings"); 1245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("package")) { 1257447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPackageLPw(parser); 1258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("permissions")) { 1259447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPermissionsLPw(mPermissions, parser); 1260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("permission-trees")) { 1261447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPermissionsLPw(mPermissionTrees, parser); 1262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("shared-user")) { 1263447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readSharedUserLPw(parser); 1264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("preferred-packages")) { 1265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // no longer used. 1266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("preferred-activities")) { 1267447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPreferredActivitiesLPw(parser); 1268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("updated-package")) { 1269447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readDisabledSysPackageLPw(parser); 1270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("cleaning-package")) { 1271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackagesToBeCleaned.add(name); 1274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("renamed-package")) { 1276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nname = parser.getAttributeValue(null, "new"); 1277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String oname = parser.getAttributeValue(null, "old"); 1278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (nname != null && oname != null) { 1279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mRenamedPackages.put(nname, oname); 1280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("last-platform-version")) { 1282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mInternalSdkPlatform = mExternalSdkPlatform = 0; 1283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String internal = parser.getAttributeValue(null, "internal"); 1285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (internal != null) { 1286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mInternalSdkPlatform = Integer.parseInt(internal); 1287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String external = parser.getAttributeValue(null, "external"); 1289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (external != null) { 1290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mExternalSdkPlatform = Integer.parseInt(external); 1291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 12940aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } else if (tagName.equals("verifier")) { 12950aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root final String deviceIdentity = parser.getAttributeValue(null, "device"); 12960aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root try { 12970aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity); 12980aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } catch (IllegalArgumentException e) { 12990aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: " 13000aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root + e.getMessage()); 13010aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 1302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: " 1304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getName()); 1305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (XmlPullParserException e) { 1312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e); 1315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e); 1320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mPendingPackages.size(); 1324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i = 0; i < N; i++) { 1325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final PendingPackage pp = mPendingPackages.get(i); 1326447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Object idObj = getUserIdLPr(pp.sharedId); 1327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (idObj != null && idObj instanceof SharedUserSetting) { 1328447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting p = getPackageLPw(pp.name, null, pp.realName, 1329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root (SharedUserSetting) idObj, pp.codePath, pp.resourcePath, 1330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true); 1331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p == null) { 1332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unable to create application package for " + pp.name); 1334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.copyFrom(pp); 1337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (idObj != null) { 1338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String msg = "Bad package setting: package " + pp.name + " has shared uid " 1339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pp.sharedId + " that is not a shared uid\n"; 1340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append(msg); 1341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, msg); 1342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String msg = "Bad package setting: package " + pp.name + " has shared uid " 1344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pp.sharedId + " that is not defined\n"; 1345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append(msg); 1346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, msg); 1347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPendingPackages.clear(); 1350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 13511d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root /* 13521d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root * Make sure all the updated system packages have their shared users 13531d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root * associated with them. 13541d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root */ 13551d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator(); 13561d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root while (disabledIt.hasNext()) { 13571d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final PackageSetting disabledPs = disabledIt.next(); 13581d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final Object id = getUserIdLPr(disabledPs.userId); 13591d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root if (id != null && id instanceof SharedUserSetting) { 13601d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root disabledPs.sharedUser = (SharedUserSetting) id; 13611d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root } 13621d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root } 13631d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root 1364447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readStoppedLPw(); 1365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, " 1367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mSharedUsers.size() + " shared uids\n"); 1368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 1370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private int readInt(XmlPullParser parser, String ns, String name, int defValue) { 1373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String v = parser.getAttributeValue(ns, name); 1374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (v == null) { 1376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return defValue; 1377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return Integer.parseInt(v); 1379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: attribute " + name 1382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad integer value " + v + " at " 1383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return defValue; 1386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1388447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser) 1389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1398447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String tagName = parser.getName(); 1399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1400447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String name = parser.getAttributeValue(null, "name"); 1401447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String sourcePackage = parser.getAttributeValue(null, "package"); 1402447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String ptype = parser.getAttributeValue(null, "type"); 1403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null && sourcePackage != null) { 1404447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final boolean dynamic = "dynamic".equals(ptype); 1405447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final BasePermission bp = new BasePermission(name, sourcePackage, 1406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL); 1407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.protectionLevel = readInt(parser, null, "protection", 1408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PermissionInfo.PROTECTION_NORMAL); 1409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dynamic) { 1410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PermissionInfo pi = new PermissionInfo(); 1411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.packageName = sourcePackage.intern(); 1412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.name = name.intern(); 1413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.icon = readInt(parser, null, "icon", 0); 1414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.nonLocalizedLabel = parser.getAttributeValue(null, "label"); 1415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.protectionLevel = bp.protectionLevel; 1416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.pendingInfo = pi; 1417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root out.put(bp.name, bp); 1419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: permissions has" + " no name at " 1422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element reading permissions: " + parser.getName() + " at " 1427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1433447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException, 1434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root IOException { 1435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName = parser.getAttributeValue(null, "realName"); 1437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String codePathStr = parser.getAttributeValue(null, "codePath"); 1438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String resourcePathStr = parser.getAttributeValue(null, "resourcePath"); 1439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); 1440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (resourcePathStr == null) { 1441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = codePathStr; 1442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String version = parser.getAttributeValue(null, "version"); 1444cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int versionCode = 0; 1445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (version != null) { 1446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode = Integer.parseInt(version); 1448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr), 1455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags); 1456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String timeStampStr = parser.getAttributeValue(null, "ft"); 1457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = Long.parseLong(timeStampStr, 16); 1460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.setTimeStamp(timeStamp); 1461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ts"); 1465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = Long.parseLong(timeStampStr); 1468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.setTimeStamp(timeStamp); 1469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "it"); 1474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.firstInstallTime = Long.parseLong(timeStampStr, 16); 1477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ut"); 1481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.lastUpdateTime = Long.parseLong(timeStampStr, 16); 1484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = parser.getAttributeValue(null, "userId"); 1488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.userId = idStr != null ? Integer.parseInt(idStr) : 0; 1489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps.userId <= 0) { 1490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String sharedIdStr = parser.getAttributeValue(null, "sharedUserId"); 1491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0; 1492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("perms")) { 1503447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, ps.grantedPermissions); 1504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <updated-package>: " + parser.getName()); 1507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.put(name, ps); 1511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1513447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException { 1514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = null; 1515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName = null; 1516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = null; 1517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String sharedIdStr = null; 1518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String codePathStr = null; 1519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String resourcePathStr = null; 1520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathStr = null; 1521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String systemStr = null; 1522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String installerPackageName = null; 1523cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String uidError = null; 1524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = 0; 1526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long firstInstallTime = 0; 1527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long lastUpdateTime = 0; 1528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSettingBase packageSetting = null; 1529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String version = null; 1530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int versionCode = 0; 1531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root name = parser.getAttributeValue(null, "name"); 1533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root realName = parser.getAttributeValue(null, "realName"); 1534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root idStr = parser.getAttributeValue(null, "userId"); 1535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root uidError = parser.getAttributeValue(null, "uidError"); 1536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sharedIdStr = parser.getAttributeValue(null, "sharedUserId"); 1537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root codePathStr = parser.getAttributeValue(null, "codePath"); 1538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = parser.getAttributeValue(null, "resourcePath"); 1539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); 1540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root version = parser.getAttributeValue(null, "version"); 1541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (version != null) { 1542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode = Integer.parseInt(version); 1544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root installerPackageName = parser.getAttributeValue(null, "installer"); 1548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemStr = parser.getAttributeValue(null, "flags"); 1550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (systemStr != null) { 1551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags = Integer.parseInt(systemStr); 1553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For backward compatibility 1557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemStr = parser.getAttributeValue(null, "system"); 1558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (systemStr != null) { 1559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM 1560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root : 0; 1561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Old settings that don't specify system... just treat 1563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // them as system, good enough. 1564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String timeStampStr = parser.getAttributeValue(null, "ft"); 1568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStamp = Long.parseLong(timeStampStr, 16); 1571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ts"); 1575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStamp = Long.parseLong(timeStampStr); 1578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "it"); 1583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root firstInstallTime = Long.parseLong(timeStampStr, 16); 1586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ut"); 1590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root lastUpdateTime = Long.parseLong(timeStampStr, 16); 1593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr 1598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " sharedUserId=" + sharedIdStr); 1599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int userId = idStr != null ? Integer.parseInt(idStr) : 0; 1600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (resourcePathStr == null) { 1601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = codePathStr; 1602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (realName != null) { 1604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root realName = realName.intern(); 1605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name == null) { 1607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <package> has no name at " 1609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (codePathStr == null) { 1611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <package> has no codePath at " 1613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (userId > 0) { 1615447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr), 1616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode, 1617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags); 1618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId=" 1620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + userId + " pkg=" + packageSetting); 1621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSetting == null) { 1622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid " 1623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + userId + " while parsing settings at " 1624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.setTimeStamp(timeStamp); 1627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.firstInstallTime = firstInstallTime; 1628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.lastUpdateTime = lastUpdateTime; 1629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (sharedIdStr != null) { 1631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0; 1632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (userId > 0) { 1633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting = new PendingPackage(name.intern(), realName, new File( 1634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId, 1635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode, pkgFlags); 1636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.setTimeStamp(timeStamp); 1637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.firstInstallTime = firstInstallTime; 1638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.lastUpdateTime = lastUpdateTime; 1639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPendingPackages.add((PendingPackage) packageSetting); 1640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Reading package " + name 1642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + ": sharedUserId=" + userId + " pkg=" + packageSetting); 1643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name 1646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad sharedId " + sharedIdStr + " at " 1647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1650cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 1652cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 1653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 1657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 1658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSetting != null) { 1660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.uidError = "true".equals(uidError); 1661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installerPackageName = installerPackageName; 1662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.nativeLibraryPathString = nativeLibraryPathStr; 1663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String enabledStr = parser.getAttributeValue(null, "enabled"); 1664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (enabledStr != null) { 1665b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn try { 1666b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn packageSetting.enabled = Integer.parseInt(enabledStr); 1667b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } catch (NumberFormatException e) { 1668b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn if (enabledStr.equalsIgnoreCase("true")) { 1669b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn packageSetting.enabled = COMPONENT_ENABLED_STATE_ENABLED; 1670b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else if (enabledStr.equalsIgnoreCase("false")) { 1671b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn packageSetting.enabled = COMPONENT_ENABLED_STATE_DISABLED; 1672b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else if (enabledStr.equalsIgnoreCase("default")) { 1673b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT; 1674b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else { 1675b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn PackageManagerService.reportSettingsProblem(Log.WARN, 1676b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn "Error in package manager settings: package " + name 1677b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn + " has bad enabled value: " + idStr + " at " 1678b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn + parser.getPositionDescription()); 1679b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } 1680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1681cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT; 1683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String installStatusStr = parser.getAttributeValue(null, "installStatus"); 1685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (installStatusStr != null) { 1686cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (installStatusStr.equalsIgnoreCase("false")) { 1687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE; 1688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE; 1690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("disabled-components")) { 1703447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readDisabledComponentsLPw(packageSetting, parser); 1704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("enabled-components")) { 1705447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readEnabledComponentsLPw(packageSetting, parser); 1706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("sigs")) { 1707cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.signatures.readXml(parser, mPastSignatures); 1708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("perms")) { 1709447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions); 1710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.permissionsFixed = true; 1711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <package>: " + parser.getName()); 1714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1722447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser) 1723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1736cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.disabledComponents.add(name.intern()); 1737cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1738cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1739cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <disabled-components> has" 1740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " no name at " + parser.getPositionDescription()); 1741cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1742cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <disabled-components>: " + parser.getName()); 1745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1746cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1750447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser) 1751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1759cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.enabledComponents.add(name.intern()); 1765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <enabled-components> has" 1768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " no name at " + parser.getPositionDescription()); 1769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1771cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <enabled-components>: " + parser.getName()); 1773cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1778447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException, IOException { 1779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = null; 1780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = null; 1781cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting su = null; 1783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root name = parser.getAttributeValue(null, "name"); 1785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root idStr = parser.getAttributeValue(null, "userId"); 1786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int userId = idStr != null ? Integer.parseInt(idStr) : 0; 1787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ("true".equals(parser.getAttributeValue(null, "system"))) { 1788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name == null) { 1791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <shared-user> has no name at " 1793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (userId == 0) { 1795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: shared-user " + name 1797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad userId " + idStr + " at " 1798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1800447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) { 1801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService 1802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at " 1803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1807cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 1809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 1810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 1812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (su != null) { 1814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1820cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("sigs")) { 1824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root su.signatures.readXml(parser, mPastSignatures); 1825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("perms")) { 1826447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, su.grantedPermissions); 1827cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <shared-user>: " + parser.getName()); 1830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1839447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms) 1840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root outPerms.add(name.intern()); 1854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <perms> has" + " no name at " 1857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <perms>: " + parser.getName()); 1862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1867447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPreferredActivitiesLPw(XmlPullParser parser) throws XmlPullParserException, 1868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root IOException { 1869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1870cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1876cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1878cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PreferredActivity pa = new PreferredActivity(parser); 1880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pa.mPref.getParseError() == null) { 1881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPreferredActivities.addFilter(pa); 1882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <preferred-activity> " 1885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pa.mPref.getParseError() + " at " 1886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <preferred-activities>: " + parser.getName()); 1891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1893cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Returns -1 if we could not find an available UserId to assign 1897447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private int newUserIdLPw(Object obj) { 1898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Let's be stupidly inefficient for now... 1899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 1900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i = 0; i < N; i++) { 1901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mUserIds.get(i) == null) { 1902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.set(i, obj); 1903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return PackageManagerService.FIRST_APPLICATION_UID + i; 1904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // None left? 1908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (N >= PackageManagerService.MAX_APPLICATION_UIDS) { 1909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return -1; 1910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.add(obj); 1913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return PackageManagerService.FIRST_APPLICATION_UID + N; 1914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 19160aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() { 19170aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root if (mVerifierDeviceIdentity == null) { 19180aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root mVerifierDeviceIdentity = VerifierDeviceIdentity.generate(); 19190aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 19200aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root writeLPr(); 19210aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 19220aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 19230aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root return mVerifierDeviceIdentity; 19240aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 19250aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 1926447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root public PackageSetting getDisabledSystemPkgLPr(String name) { 1927447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting ps = mDisabledSysPackages.get(name); 1928447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return ps; 1929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1931447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean isEnabledLPr(ComponentInfo componentInfo, int flags) { 1932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 1933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 1934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final PackageSetting packageSettings = mPackages.get(componentInfo.packageName); 1936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) { 1937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = " + componentInfo.packageName 1938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " componentName = " + componentInfo.name); 1939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "enabledComponents: " 1940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + Arrays.toString(packageSettings.enabledComponents.toArray())); 1941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "disabledComponents: " 1942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + Arrays.toString(packageSettings.disabledComponents.toArray())); 1943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings == null) { 1945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1946cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1947cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED 19480ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn || packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER 1949cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled 1950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && packageSettings.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) { 1951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1953cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings.enabledComponents.contains(componentInfo.name)) { 1954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 1955cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings.disabledComponents.contains(componentInfo.name)) { 1957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return componentInfo.enabled; 1960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1961447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1962447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root String getInstallerPackageNameLPr(String packageName) { 1963447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 1964447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 1965447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 1966447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1967447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return pkg.installerPackageName; 1968447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1969447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1970447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root int getApplicationEnabledSettingLPr(String packageName) { 1971447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 1972447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 1973447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 1974447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1975447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return pkg.enabled; 1976447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1977447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1978447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root int getComponentEnabledSettingLPr(ComponentName componentName) { 1979447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String packageName = componentName.getPackageName(); 1980447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 1981447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 1982447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown component: " + componentName); 1983447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1984447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String classNameStr = componentName.getClassName(); 1985447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return pkg.getCurrentEnabledStateLPr(classNameStr); 1986447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1987447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1988447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean setPackageStoppedStateLPw(String packageName, boolean stopped, 1989447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean allowedByPermission, int uid) { 1990447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkgSetting = mPackages.get(packageName); 1991447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting == null) { 1992447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 1993447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1994447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!allowedByPermission && (uid != pkgSetting.userId)) { 1995447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new SecurityException( 1996447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root "Permission Denial: attempt to change stopped state from pid=" 1997447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root + Binder.getCallingPid() 1998447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root + ", uid=" + uid + ", package uid=" + pkgSetting.userId); 1999447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2000447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (DEBUG_STOPPED) { 2001447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (stopped) { 2002447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root RuntimeException e = new RuntimeException("here"); 2003447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root e.fillInStackTrace(); 2004447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Slog.i(TAG, "Stopping package " + packageName, e); 2005447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2006447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2007447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting.stopped != stopped) { 2008447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.stopped = stopped; 2009447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.pkg.mSetStopped = stopped; 2010447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting.notLaunched) { 2011447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting.installerPackageName != null) { 2012447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH, 2013447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.name, null, 2014447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.installerPackageName, null); 2015447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2016447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.notLaunched = false; 2017447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2018447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return true; 2019447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2020447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return false; 2021447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2022447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2023447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2024447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 2025447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final Date date = new Date(); 2026447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2027447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting ps : mPackages.values()) { 2028447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(ps.realName) 2029447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(ps.name)) { 2030447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2031447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2032447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2033447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null) { 2034447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root dumpState.setSharedUser(ps.sharedUser); 2035447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2036447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2037447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2038447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2039447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2040447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Packages:"); 2041447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2042447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2043447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Package ["); 2044447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(ps.realName != null ? ps.realName : ps.name); 2045447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2046447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(ps))); 2047447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2048447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2049447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.realName != null) { 2050447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" compat name="); 2051447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.name); 2052447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2053447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2054447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); pw.print(ps.userId); 2055447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids)); 2056447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sharedUser="); pw.println(ps.sharedUser); 2057447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" pkg="); pw.println(ps.pkg); 2058447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" codePath="); pw.println(ps.codePathString); 2059447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" resourcePath="); pw.println(ps.resourcePathString); 2060447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" nativeLibraryPath="); pw.println(ps.nativeLibraryPathString); 2061447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" versionCode="); pw.println(ps.versionCode); 2062447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.pkg != null) { 2063447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" versionName="); pw.println(ps.pkg.mVersionName); 2064447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir); 2065447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion); 2066447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.pkg.mOperationPending) { 2067447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" mOperationPending=true"); 2068447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2069447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" supportsScreens=["); 2070447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean first = true; 2071447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) { 2072447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2073447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2074447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2075447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("small"); 2076447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2077447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) { 2078447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2079447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2080447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2081447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("medium"); 2082447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2083447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) { 2084447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2085447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2086447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2087447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("large"); 2088447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2089447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) { 2090447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2091447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2092447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2093447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("xlarge"); 2094447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2095447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) { 2096447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2097447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2098447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2099447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("resizeable"); 2100447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2101447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) { 2102447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2103447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2104447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2105447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("anyDensity"); 2106447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2107447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2108447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("]"); 2109447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" timeStamp="); 2110447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.timeStamp); 2111447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2112447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" firstInstallTime="); 2113447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.firstInstallTime); 2114447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2115447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" lastUpdateTime="); 2116447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.lastUpdateTime); 2117447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2118447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.installerPackageName != null) { 2119447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" installerPackageName="); pw.println(ps.installerPackageName); 2120447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2121447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" signatures="); pw.println(ps.signatures); 2122447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed); 2123447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" haveGids="); pw.println(ps.haveGids); 2124447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags)); 2125447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" installStatus="); pw.print(ps.installStatus); 2126447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" stopped="); pw.print(ps.stopped); 2127447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" enabled="); pw.println(ps.enabled); 2128447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.disabledComponents.size() > 0) { 2129447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" disabledComponents:"); 2130447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : ps.disabledComponents) { 2131447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); pw.println(s); 2132447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2133447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2134447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.enabledComponents.size() > 0) { 2135447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" enabledComponents:"); 2136447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : ps.enabledComponents) { 2137447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); pw.println(s); 2138447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2139447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2140447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.grantedPermissions.size() > 0) { 2141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" grantedPermissions:"); 2142447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : ps.grantedPermissions) { 2143447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); pw.println(s); 2144447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2145447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2146447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2147447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2148447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = false; 2149447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (mRenamedPackages.size() > 0) { 2150447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) { 2151447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(e.getKey()) 2152447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(e.getValue())) { 2153447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2154447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2155447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2156447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2157447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2158447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Renamed packages:"); 2159447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2160447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2161447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); 2162447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(e.getKey()); 2163447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" -> "); 2164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(e.getValue()); 2165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2166447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = false; 2169447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (mDisabledSysPackages.size() > 0) { 2170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting ps : mDisabledSysPackages.values()) { 2171447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(ps.realName) 2172447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(ps.name)) { 2173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2174447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2175447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2176447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2177447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2178447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Hidden system packages:"); 2179447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2180447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2181447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Package ["); 2182447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(ps.realName != null ? ps.realName : ps.name); 2183447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2184447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(ps))); 2185447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2186447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.realName != null) { 2187447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" compat name="); 2188447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.name); 2189447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2190447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); 2191447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.userId); 2192447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sharedUser="); 2193447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.sharedUser); 2194447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" codePath="); 2195447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.codePathString); 2196447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" resourcePath="); 2197447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.resourcePathString); 2198447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2199447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2200447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2201447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2202447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2203447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2204447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (BasePermission p : mPermissions.values()) { 2205447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(p.sourcePackage)) { 2206447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2207447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2208447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2209447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2210447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2211447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Permissions:"); 2212447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2213447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2214447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Permission ["); pw.print(p.name); pw.print("] ("); 2215447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(p))); 2216447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2217447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sourcePackage="); pw.println(p.sourcePackage); 2218447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" uid="); pw.print(p.uid); 2219447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids)); 2220447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" type="); pw.print(p.type); 2221447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" prot="); pw.println(p.protectionLevel); 2222447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (p.packageSetting != null) { 2223447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" packageSetting="); pw.println(p.packageSetting); 2224447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2225447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (p.perm != null) { 2226447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" perm="); pw.println(p.perm); 2227447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2228447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2229447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2230447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2231447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2232447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2233447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (SharedUserSetting su : mSharedUsers.values()) { 2234447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && su != dumpState.getSharedUser()) { 2235447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2236447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2237447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2238447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2239447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2240447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Shared users:"); 2241447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2242447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2243447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" SharedUser ["); 2244447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(su.name); 2245447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2246447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(su))); 2247447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2248447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); 2249447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(su.userId); 2250447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); 2251447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(PackageManagerService.arrayToString(su.gids)); 2252447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" grantedPermissions:"); 2253447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : su.grantedPermissions) { 2254447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); 2255447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(s); 2256447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2257447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2258447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2259447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2260447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) { 2261447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Settings parse messages:"); 2262447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(mReadMessages.toString()); 2263447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root}