Settings.java revision b8f400020b201cc40f5e16277af0dbafec38b8a3
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; 42447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.os.Binder; 43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Environment; 44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.FileUtils; 45cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Process; 46cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Log; 47cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Slog; 48cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.SparseArray; 49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Xml; 50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 51cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.BufferedOutputStream; 52cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File; 53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileInputStream; 54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileOutputStream; 55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.IOException; 56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.PrintWriter; 57447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.text.SimpleDateFormat; 58cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.ArrayList; 59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Arrays; 60447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.util.Date; 61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashMap; 62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet; 63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Iterator; 64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/** 66cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Holds information about dynamic settings. 67cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class Settings { 69447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private static final String TAG = "PackageSettings"; 70447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 71447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private static final boolean DEBUG_STOPPED = false; 72447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 73cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mSettingsFilename; 74cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mBackupSettingsFilename; 75cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mPackageListFilename; 76cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mStoppedPackagesFilename; 77cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mBackupStoppedPackagesFilename; 78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, PackageSetting> mPackages = 79cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, PackageSetting>(); 80cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // List of replaced system applications 81cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, PackageSetting> mDisabledSysPackages = 82cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, PackageSetting>(); 83cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 84cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // These are the last platform API version we were using for 85cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // the apps installed on internal and external storage. It is 86cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // used to grant newer permissions one time during a system upgrade. 87cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int mInternalSdkPlatform; 88cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int mExternalSdkPlatform; 89cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 90cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // The user's preferred activities associated with particular intent 91cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // filters. 92cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities = 93cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new IntentResolver<PreferredActivity, PreferredActivity>() { 94cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root @Override 95cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root protected String packageForFilter(PreferredActivity filter) { 96cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return filter.mPref.mComponent.getPackageName(); 97cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 98cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root @Override 99cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root protected void dumpFilter(PrintWriter out, String prefix, 100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PreferredActivity filter) { 101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root filter.mPref.dump(out, prefix, filter); 102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root }; 104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, SharedUserSetting> mSharedUsers = 105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, SharedUserSetting>(); 106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final ArrayList<Object> mUserIds = new ArrayList<Object>(); 107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final SparseArray<Object> mOtherUserIds = 108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new SparseArray<Object>(); 109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For reading/writing settings file. 111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final ArrayList<Signature> mPastSignatures = 112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new ArrayList<Signature>(); 113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Mapping from permission names to info about them. 115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, BasePermission> mPermissions = 116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, BasePermission>(); 117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Mapping from permission tree names to info about them. 119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, BasePermission> mPermissionTrees = 120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, BasePermission>(); 121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Packages that have been uninstalled and still need their external 123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // storage data deleted. 124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final ArrayList<String> mPackagesToBeCleaned = new ArrayList<String>(); 125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Packages that have been renamed since they were first installed. 127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keys are the new names of the packages, values are the original 128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // names. The packages appear everwhere else under their original 129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // names. 130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, String> mRenamedPackages = new HashMap<String, String>(); 131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final StringBuilder mReadMessages = new StringBuilder(); 133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 134447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root /** 135447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * Used to track packages that have a shared user ID that hasn't been read 136447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * in yet. 137447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * <p> 138447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * TODO: make this just a local variable that is passed in during package 139447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * scanning to make it less confusing. 140447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root */ 141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>(); 142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Settings() { 144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root File dataDir = Environment.getDataDirectory(); 145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root File systemDir = new File(dataDir, "system"); 146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemDir.mkdirs(); 147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(systemDir.toString(), 148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRWXU|FileUtils.S_IRWXG 149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH|FileUtils.S_IXOTH, 150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename = new File(systemDir, "packages.xml"); 152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupSettingsFilename = new File(systemDir, "packages-backup.xml"); 153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackageListFilename = new File(systemDir, "packages.list"); 154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mStoppedPackagesFilename = new File(systemDir, "packages-stopped.xml"); 155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupStoppedPackagesFilename = new File(systemDir, "packages-stopped-backup.xml"); 156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 158447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage, 159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, 160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int pkgFlags, boolean create, boolean add) { 161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String name = pkg.packageName; 162447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath, 163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, create, add); 164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting peekPackageLPr(String name) { 168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return mPackages.get(name); 169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void setInstallStatus(String pkgName, int status) { 172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(pkgName); 173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p != null) { 174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p.getInstallStatus() != status) { 175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setInstallStatus(status); 176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void setInstallerPackageName(String pkgName, 181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String installerPkgName) { 182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(pkgName); 183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p != null) { 184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setInstallerPackageName(installerPkgName); 185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 188447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root SharedUserSetting getSharedUserLPw(String name, 189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags, boolean create) { 190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting s = mSharedUsers.get(name); 191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s == null) { 192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!create) { 193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s = new SharedUserSetting(name, pkgFlags); 196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) { 197447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root s.userId = newUserIdLPw(s); 198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s.userId = PackageManagerService.FIRST_APPLICATION_UID; 200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId); 202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // < 0 means we couldn't assign a userid; fall out and return 203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // s, which is currently null 204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s.userId >= 0) { 205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.put(name, s); 206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 212447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean disableSystemPackageLPw(String name) { 213447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p == null) { 215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package"); 216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 218447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting dp = mDisabledSysPackages.get(name); 219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // always make sure the system package code and resource paths dont change 220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dp == null) { 221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if((p.pkg != null) && (p.pkg.applicationInfo != null)) { 222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; 223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.put(name, p); 225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // a little trick... when we install the new package, we don't 227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // want to modify the existing PackageSetting for the built-in 228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // version. so at this point we need a new PackageSetting that 229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // is okay to muck with. 230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting newp = new PackageSetting(p); 231447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root replacePackageLPw(name, newp); 232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 237447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting enableSystemPackageLPw(String name) { 238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mDisabledSysPackages.get(name); 239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p == null) { 240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled"); 241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Reset flag in ApplicationInfo object 244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if((p.pkg != null) && (p.pkg.applicationInfo != null)) { 245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; 246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 247447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath, 248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString, p.userId, p.versionCode, p.pkgFlags); 249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.remove(name); 250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return ret; 251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 253447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath, 254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int uid, int vc, int pkgFlags) { 255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(name); 256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.userId == uid) { 258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate package, keeping first: " + name); 262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString, 265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root vc, pkgFlags); 266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = uid; 267447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (addUserIdLPw(uid, p, name)) { 268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, p); 269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 274447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) { 275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting s = mSharedUsers.get(name); 276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s != null) { 277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s.userId == uid) { 278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate shared user, keeping first: " + name); 282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s = new SharedUserSetting(name, pkgFlags); 285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s.userId = uid; 286447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (addUserIdLPw(uid, s, name)) { 287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.put(name, s); 288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Transfer ownership of permissions from one package to another. 294447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void transferPermissionsLPw(String origPkg, String newPkg) { 295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Transfer ownership of permissions to the new package. 296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i=0; i<2; i++) { 297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root HashMap<String, BasePermission> permissions = 298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root i == 0 ? mPermissionTrees : mPermissions; 299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : permissions.values()) { 300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (origPkg.equals(bp.sourcePackage)) { 301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, 302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Moving permission " + bp.name 303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " from pkg " + bp.sourcePackage 304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " + newPkg); 305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.sourcePackage = newPkg; 306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.packageSetting = null; 307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.perm = null; 308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.pendingInfo != null) { 309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.pendingInfo.packageName = newPkg; 310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.uid = 0; 312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.gids = null; 313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 318447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private PackageSetting getPackageLPw(String name, PackageSetting origPackage, 319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, 320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) { 321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(name); 322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!p.codePath.equals(codePath)) { 324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Check to see if its a disabled system app 325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) { 326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // This is an updated system app with versions in both system 327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // and data partition. Just let the most recent version 328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // take precedence. 329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Trying to update system app code path from " + 330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePathString + " to " + codePath.toString()); 331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Just a change in the code path is not an issue, but 333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // let's log a message about it. 334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from " + p.codePath 335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " + codePath + "; Retaining data and using new"); 336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /* 337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Since we've changed paths, we need to prefer the new 338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * native library path over the one stored in the 339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * package settings since we might have moved from 340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * internal to external storage or vice versa. 341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString = nativeLibraryPathString; 343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != sharedUser) { 346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + name + " shared user changed from " 348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + (p.sharedUser != null ? p.sharedUser.name : "<nothing>") 349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " 350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + (sharedUser != null ? sharedUser.name : "<nothing>") 351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; replacing with new"); 352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = null; 353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) { 355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If what we are scanning is a system package, then 356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // make it so, regardless of whether it was previously 357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // installed only in the data partition. 358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p == null) { 363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Create a new PackageSettings entry. this can end up here because 364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // of code path mismatch or user id mismatch of an updated system partition 365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!create) { 366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (origPackage != null) { 369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We are consuming the data from an existing package. 370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(origPackage.name, name, codePath, resourcePath, 371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathString, vc, pkgFlags); 372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " + name 373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " is adopting original package " + origPackage.name); 374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Note that we will retain the new package's signature so 375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // that we can keep its data. 376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSignatures s = p.signatures; 377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.copyFrom(origPackage); 378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures = s; 379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = origPackage.sharedUser; 380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = origPackage.userId; 381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.origPackage = origPackage; 382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mRenamedPackages.put(name, origPackage.name); 383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root name = origPackage.name; 384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update new package state. 385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setTimeStamp(codePath.lastModified()); 386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(name, realName, codePath, resourcePath, 388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathString, vc, pkgFlags); 389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setTimeStamp(codePath.lastModified()); 390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = sharedUser; 391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is not a system app, it starts out stopped. 392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) { 393447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (DEBUG_STOPPED) { 394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root RuntimeException e = new RuntimeException("here"); 395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root e.fillInStackTrace(); 396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.i(PackageManagerService.TAG, "Stopping package " + name, e); 397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.stopped = true; 399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.notLaunched = true; 400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (sharedUser != null) { 402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = sharedUser.userId; 403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) { 404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone the setting here for disabled system packages 405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting dis = mDisabledSysPackages.get(name); 406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dis != null) { 407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For disabled packages a new setting is created 408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // from the existing user id. This still has to be 409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // added to list of user id's 410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Copy signatures from previous setting 411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dis.signatures.mSignatures != null) { 412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures.mSignatures = dis.signatures.mSignatures.clone(); 413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = dis.userId; 415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone permissions 416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.grantedPermissions = new HashSet<String>(dis.grantedPermissions); 417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone component info 418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.disabledComponents = new HashSet<String>(dis.disabledComponents); 419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.enabledComponents = new HashSet<String>(dis.enabledComponents); 420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Add new setting to list of user ids 421447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addUserIdLPw(p.userId, p, name); 422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Assign new user id 424447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root p.userId = newUserIdLPw(p); 425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = PackageManagerService.FIRST_APPLICATION_UID; 428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.userId < 0) { 431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + name + " could not be assigned a valid uid"); 433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (add) { 436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Finish adding new package by adding it and updating shared 437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // user preferences 438447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addPackageSettingLPw(p, name, sharedUser); 439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) { 445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg = pkg; 446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.mSetEnabled = p.enabled; 447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.mSetStopped = p.stopped; 448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String codePath = pkg.applicationInfo.sourceDir; 449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String resourcePath = pkg.applicationInfo.publicSourceDir; 450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update code path if needed 451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!codePath.equalsIgnoreCase(p.codePathString)) { 452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName + 453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root " changing from " + p.codePathString + " to " + codePath); 454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePath = new File(codePath); 455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePathString = codePath; 456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Update resource path if needed 458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) { 459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName + 460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root " changing from " + p.resourcePathString + " to " + resourcePath); 461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.resourcePath = new File(resourcePath); 462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.resourcePathString = resourcePath; 463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update the native library path if needed 465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir; 466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (nativeLibraryPath != null 467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) { 468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString = nativeLibraryPath; 469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update version code if needed 471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.mVersionCode != p.versionCode) { 472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.versionCode = pkg.mVersionCode; 473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update signatures if needed. 475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.signatures.mSignatures == null) { 476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures.assignSignatures(pkg.mSignatures); 477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this app defines a shared user id initialize 479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // the shared user signatures as well. 480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) { 481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.signatures.assignSignatures(pkg.mSignatures); 482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 483447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addPackageSettingLPw(p, pkg.packageName, p.sharedUser); 484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Utility method that adds a PackageSetting to mPackages and 487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // completes updating the shared user attributes 488447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void addPackageSettingLPw(PackageSetting p, String name, 489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting sharedUser) { 490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, p); 491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (sharedUser != null) { 492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null && p.sharedUser != sharedUser) { 493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + p.name + " was user " 495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + p.sharedUser + " but is now " + sharedUser 496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; I am not changing its files so it will probably fail!"); 497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (p.userId != sharedUser.userId) { 499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + p.name + " was user id " + p.userId 501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " but is now user " + sharedUser 502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " with id " + sharedUser.userId 503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; I am not changing its files so it will probably fail!"); 504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sharedUser.packages.add(p); 507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = sharedUser; 508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.userId = sharedUser.userId; 509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /* 513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Update the shared user setting when a package using 514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * specifying the shared user id is removed. The gids 515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * associated with each permission of the deleted package 516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * are removed from the shared user's gid list only if its 517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * not in use by other permissions of packages in the 518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * shared user setting. 519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 520447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) { 521447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((deletedPs == null) || (deletedPs.pkg == null)) { 522447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Slog.i(PackageManagerService.TAG, 523447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root "Trying to update info for null package. Just ignoring"); 524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // No sharedUserId 527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (deletedPs.sharedUser == null) { 528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting sus = deletedPs.sharedUser; 531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update permissions 532447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String eachPerm : deletedPs.pkg.requestedPermissions) { 533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root boolean used = false; 534447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!sus.grantedPermissions.contains(eachPerm)) { 535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (PackageSetting pkg:sus.packages) { 538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.pkg != null && 539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) && 540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.pkg.requestedPermissions.contains(eachPerm)) { 541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root used = true; 542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root break; 543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!used) { 546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // can safely delete this permission from list 547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sus.grantedPermissions.remove(eachPerm); 548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update gids 551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int newGids[] = globalGids; 552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (String eachPerm : sus.grantedPermissions) { 553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BasePermission bp = mPermissions.get(eachPerm); 554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp != null) { 555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root newGids = PackageManagerService.appendInts(newGids, bp.gids); 556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sus.gids = newGids; 559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 561447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root int removePackageLPw(String name) { 562447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.remove(name); 565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null) { 566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser.packages.size() == 0) { 568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.remove(p.sharedUser.name); 569447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root removeUserIdLPw(p.sharedUser.userId); 570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p.sharedUser.userId; 571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 573447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root removeUserIdLPw(p.userId); 574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p.userId; 575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return -1; 578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 580447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void replacePackageLPw(String name, PackageSetting newp) { 581447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null) { 584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.add(newp); 586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 587447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root replaceUserIdLPw(p.userId, newp); 588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, newp); 591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 593447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private boolean addUserIdLPw(int uid, Object obj, Object name) { 594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID + PackageManagerService.MAX_APPLICATION_UIDS) { 595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID) { 599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int N = mUserIds.size(); 600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int index = uid - PackageManagerService.FIRST_APPLICATION_UID; 601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while (index >= N) { 602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.add(null); 603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root N++; 604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mUserIds.get(index) != null) { 606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate user id: " + uid 608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " name=" + name); 609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.set(index, obj); 612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mOtherUserIds.get(uid) != null) { 614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate shared id: " + uid 616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " name=" + name); 617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.put(uid, obj); 620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 624447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root public Object getUserIdLPr(int uid) { 625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID) { 626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int index = uid - PackageManagerService.FIRST_APPLICATION_UID; 628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return index < N ? mUserIds.get(index) : null; 629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return mOtherUserIds.get(uid); 631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 634447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void removeUserIdLPw(int uid) { 635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID) { 636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int index = uid - PackageManagerService.FIRST_APPLICATION_UID; 638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (index < N) mUserIds.set(index, null); 639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.remove(uid); 641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 644447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void replaceUserIdLPw(int uid, Object obj) { 645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (uid >= PackageManagerService.FIRST_APPLICATION_UID) { 646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int index = uid - PackageManagerService.FIRST_APPLICATION_UID; 648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (index < N) mUserIds.set(index, obj); 649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 650cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.put(uid, obj); 651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 652cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 654447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeStoppedLPr() { 655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keep the old stopped packages around until we know the new ones have 656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // been successfully written. 657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mStoppedPackagesFilename.exists()) { 658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Presence of backup settings file indicates that we failed 659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // to persist packages earlier. So preserve the older 660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // backup for future reference since the current packages 661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // might have been corrupted. 662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mBackupStoppedPackagesFilename.exists()) { 663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mStoppedPackagesFilename.renameTo(mBackupStoppedPackagesFilename)) { 664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to backup package manager stopped packages, " 665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot"); 666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mStoppedPackagesFilename.delete(); 670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup"); 671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 675447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final FileOutputStream fstr = new FileOutputStream(mStoppedPackagesFilename); 676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final BufferedOutputStream str = new BufferedOutputStream(fstr); 677cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //XmlSerializer serializer = XmlUtils.serializerInstance(); 679447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final XmlSerializer serializer = new FastXmlSerializer(); 680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setOutput(str, "utf-8"); 681cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startDocument(null, true); 682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "stopped-packages"); 685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 686447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.stopped) { 688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "pkg"); 689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", pkg.name); 690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.notLaunched) { 691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nl", "1"); 692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "pkg"); 694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "stopped-packages"); 698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endDocument(); 700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // New settings successfully written, old ones are no longer 706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // needed. 707cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupStoppedPackagesFilename.delete(); 708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mStoppedPackagesFilename.toString(), 709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IRGRP|FileUtils.S_IWGRP 711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH, 712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Done, all is good! 715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager stopped packages, " 718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " current changes will be lost at reboot", e); 719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clean up partially written files 722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mStoppedPackagesFilename.exists()) { 723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mStoppedPackagesFilename.delete()) { 724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: " + mStoppedPackagesFilename); 725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Note: assumed "stopped" field is already cleared in all packages. 730447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void readStoppedLPw() { 731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileInputStream str = null; 732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mBackupStoppedPackagesFilename.exists()) { 733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mBackupStoppedPackagesFilename); 735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Reading from backup stopped packages file\n"); 736cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, "Need to read from backup stopped packages file"); 737cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 738cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If both the backup and normal file exist, we 739cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ignore the normal one since it might have been 740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // corrupted. 741cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file " 742cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mStoppedPackagesFilename); 743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mStoppedPackagesFilename.delete(); 744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 746cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We'll try for the normal settings file. 747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 750cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (str == null) { 752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mStoppedPackagesFilename.exists()) { 753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No stopped packages file found\n"); 754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, "No stopped packages file file; " 755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "assuming all started"); 756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // At first boot, make sure no packages are stopped. 757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We usually want to have third party apps initialize 758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // in the stopped state, but not at first boot. 759cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (PackageSetting pkg : mPackages.values()) { 760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.stopped = false; 761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.notLaunched = false; 762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mStoppedPackagesFilename); 766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 767447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final XmlPullParser parser = Xml.newPullParser(); 768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root parser.setInput(str, null); 769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 771cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type=parser.next()) != XmlPullParser.START_TAG 772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && type != XmlPullParser.END_DOCUMENT) { 773cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type != XmlPullParser.START_TAG) { 777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No start tag found in stopped packages file\n"); 778cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager stopped packages"); 780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 781cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG 786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || parser.getDepth() > outerDepth)) { 787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG 788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || type == XmlPullParser.TEXT) { 789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("pkg")) { 794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting ps = mPackages.get(name); 796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps != null) { 797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.stopped = true; 798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ("1".equals(parser.getAttributeValue(null, "nl"))) { 799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.notLaunched = true; 800cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "No package known for stopped package: " + name); 803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: " 807cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getName()); 808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(XmlPullParserException e) { 815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading stopped packages: " + e); 817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 820cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 826cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 827447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeLPr() { 828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024); 829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keep the old settings around until we know the new ones have 831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // been successfully written. 832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Presence of backup settings file indicates that we failed 834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // to persist settings earlier. So preserve the older 835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // backup for future reference since the current settings 836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // might have been corrupted. 837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mBackupSettingsFilename.exists()) { 838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) { 839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, " 840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " current changes will be lost at reboot"); 841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename.delete(); 845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Preserving older settings backup"); 846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPastSignatures.clear(); 850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileOutputStream fstr = new FileOutputStream(mSettingsFilename); 853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BufferedOutputStream str = new BufferedOutputStream(fstr); 854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //XmlSerializer serializer = XmlUtils.serializerInstance(); 856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlSerializer serializer = new FastXmlSerializer(); 857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setOutput(str, "utf-8"); 858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startDocument(null, true); 859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "packages"); 862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "last-platform-version"); 864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform)); 865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform)); 866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "last-platform-version"); 867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "permission-trees"); 869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : mPermissionTrees.values()) { 870447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePermissionLPr(serializer, bp); 871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "permission-trees"); 873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "permissions"); 875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : mPermissions.values()) { 876447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePermissionLPr(serializer, bp); 877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 878cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "permissions"); 879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 880447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 881447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePackageLPr(serializer, pkg); 882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 884447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mDisabledSysPackages.values()) { 885447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writeDisabledSysPackageLPr(serializer, pkg); 886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "preferred-activities"); 889447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PreferredActivity pa : mPreferredActivities.filterSet()) { 890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pa.writeToXml(serializer); 892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 893cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "preferred-activities"); 895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 896447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final SharedUserSetting usr : mSharedUsers.values()) { 897cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "shared-user"); 898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", usr.name); 899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "userId", 900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Integer.toString(usr.userId)); 901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root usr.signatures.writeXml(serializer, "sigs", mPastSignatures); 902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (String name : usr.grantedPermissions) { 904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "shared-user"); 910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mPackagesToBeCleaned.size() > 0) { 913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i=0; i<mPackagesToBeCleaned.size(); i++) { 914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "cleaning-package"); 915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", mPackagesToBeCleaned.get(i)); 916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "cleaning-package"); 917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mRenamedPackages.size() > 0) { 921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) { 922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "renamed-package"); 923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "new", e.getKey()); 924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "old", e.getValue()); 925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "renamed-package"); 926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "packages"); 930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endDocument(); 932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // New settings successfully written, old ones are no longer 938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // needed. 939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupSettingsFilename.delete(); 940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mSettingsFilename.toString(), 941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IRGRP|FileUtils.S_IWGRP 943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH, 944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 946cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Write package list file now, use a JournaledFile. 947cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 948cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root File tempFile = new File(mPackageListFilename.toString() + ".tmp"); 949cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile); 950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root fstr = new FileOutputStream(journal.chooseForWrite()); 952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new BufferedOutputStream(fstr); 953cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root StringBuilder sb = new StringBuilder(); 955447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ApplicationInfo ai = pkg.pkg.applicationInfo; 957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String dataPath = ai.dataDir; 958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; 959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Avoid any application that has a space in its path 961cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // or that is handled by the system. 962cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID) 963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 964cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // we store on each line the following information for now: 966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 967cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // pkgName - package name 968cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // userId - application-specific user id 969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // debugFlag - 0 or 1 if the package is debuggable. 970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // dataPath - path to package's data path 971cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // NOTE: We prefer not to expose all ApplicationInfo flags for now. 973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS 975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES: 976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // system/core/run-as/run-as.c 977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 978cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.setLength(0); 979cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(ai.packageName); 980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(" "); 981cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append((int)ai.uid); 982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(isDebug ? " 1 " : " 0 "); 983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(dataPath); 984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append("\n"); 985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.write(sb.toString().getBytes()); 986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 987cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 988cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 990cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root journal.commit(); 991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root catch (Exception e) { 993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root journal.rollback(); 994cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 995cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 996cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mPackageListFilename.toString(), 997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IRGRP|FileUtils.S_IWGRP 999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH, 1000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 1001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1002447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writeStoppedLPr(); 1003cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1004cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(XmlPullParserException e) { 1007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " 1008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot", e); 1009cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 1010cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " 1011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot", e); 1012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clean up partially written files 1014cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1015cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.delete()) { 1016cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: " + mSettingsFilename); 1017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1018cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Debug.stopMethodTracing(); 1020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1022447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg) 1023cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws java.io.IOException { 1024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "updated-package"); 1025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", pkg.name); 1026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.realName != null) { 1027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "realName", pkg.realName); 1028cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1029cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "codePath", pkg.codePathString); 1030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); 1031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); 1032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); 1033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "version", String.valueOf(pkg.versionCode)); 1034cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!pkg.resourcePathString.equals(pkg.codePathString)) { 1035cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "resourcePath", pkg.resourcePathString); 1036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.nativeLibraryPathString != null) { 1038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString); 1039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1041cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "userId", Integer.toString(pkg.userId)); 1042cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1043cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId)); 1044cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1045cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1046cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is a shared user, the permissions will 1048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be written there. We still need to write an 1049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // empty permissions list so permissionsFixed will 1050cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be set. 1051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.grantedPermissions) { 1052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BasePermission bp = mPermissions.get(name); 1053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp != null) { 1054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We only need to write signature or system permissions but 1055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // this wont 1056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // match the semantics of grantedPermissions. So write all 1057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // permissions. 1058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 1060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1063cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1064cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "updated-package"); 1066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1067cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1068447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg) 1069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws java.io.IOException { 1070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "package"); 1071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", pkg.name); 1072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.realName != null) { 1073cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "realName", pkg.realName); 1074cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1075cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "codePath", pkg.codePathString); 1076cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!pkg.resourcePathString.equals(pkg.codePathString)) { 1077cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "resourcePath", pkg.resourcePathString); 1078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.nativeLibraryPathString != null) { 1080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString); 1081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags)); 1083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); 1084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); 1085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); 1086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "version", String.valueOf(pkg.versionCode)); 1087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "userId", Integer.toString(pkg.userId)); 1089cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId)); 1091cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1092cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.uidError) { 1093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "uidError", "true"); 1094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1095cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.enabled != COMPONENT_ENABLED_STATE_DEFAULT) { 1096b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn serializer.attribute(null, "enabled", Integer.toString(pkg.enabled)); 1097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) { 1099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "installStatus", "false"); 1100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.installerPackageName != null) { 1102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "installer", pkg.installerPackageName); 1103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.signatures.writeXml(serializer, "sigs", mPastSignatures); 1105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) { 1106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is a shared user, the permissions will 1109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be written there. We still need to write an 1110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // empty permissions list so permissionsFixed will 1111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be set. 1112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.grantedPermissions) { 1113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 1115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.disabledComponents.size() > 0) { 1121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "disabled-components"); 1122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.disabledComponents) { 1123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 1125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "disabled-components"); 1128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.enabledComponents.size() > 0) { 1130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "enabled-components"); 1131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.enabledComponents) { 1132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", name); 1134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "enabled-components"); 1137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "package"); 1140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1142447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writePermissionLPr(XmlSerializer serializer, BasePermission bp) 1143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws XmlPullParserException, java.io.IOException { 1144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) { 1145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "item"); 1146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "name", bp.name); 1147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "package", bp.sourcePackage); 1148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) { 1149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel)); 1150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type=" 1153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + bp.type); 1154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.type == BasePermission.TYPE_DYNAMIC) { 1155447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo; 1156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi != null) { 1157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "type", "dynamic"); 1158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi.icon != 0) { 1159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "icon", Integer.toString(pi.icon)); 1160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi.nonLocalizedLabel != null) { 1162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "label", pi.nonLocalizedLabel.toString()); 1163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "item"); 1167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() { 1171447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final HashSet<String> kList = new HashSet<String>(mPackages.keySet()); 1172447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final Iterator<String> its = kList.iterator(); 1173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>(); 1174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while (its.hasNext()) { 1175447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String key = its.next(); 1176447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting ps = mPackages.get(key); 1177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) { 1178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ret.add(ps); 1179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return ret; 1182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1184447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean readLPw() { 1185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileInputStream str = null; 1186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mBackupSettingsFilename.exists()) { 1187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mBackupSettingsFilename); 1189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Reading from backup settings file\n"); 1190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, 1191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Need to read from backup settings file"); 1192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If both the backup and settings file exist, we 1194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ignore the settings since it might have been 1195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // corrupted. 1196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Cleaning up settings file " 1197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mSettingsFilename); 1198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename.delete(); 1199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We'll try for the normal settings file. 1202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1205447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root mPendingPackages.clear(); 1206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPastSignatures.clear(); 1207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (str == null) { 1210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.exists()) { 1211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No settings file found\n"); 1212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, 1213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No settings file; creating initial state"); 1214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mSettingsFilename); 1217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlPullParser parser = Xml.newPullParser(); 1219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root parser.setInput(str, null); 1220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.START_TAG 1223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && type != XmlPullParser.END_DOCUMENT) { 1224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 1225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type != XmlPullParser.START_TAG) { 1228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No start tag found in settings file\n"); 1229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager settings"); 1231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log 1232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root .wtf(PackageManagerService.TAG, 1233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager settings"); 1234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("package")) { 1246447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPackageLPw(parser); 1247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("permissions")) { 1248447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPermissionsLPw(mPermissions, parser); 1249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("permission-trees")) { 1250447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPermissionsLPw(mPermissionTrees, parser); 1251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("shared-user")) { 1252447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readSharedUserLPw(parser); 1253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("preferred-packages")) { 1254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // no longer used. 1255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("preferred-activities")) { 1256447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPreferredActivitiesLPw(parser); 1257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("updated-package")) { 1258447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readDisabledSysPackageLPw(parser); 1259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("cleaning-package")) { 1260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackagesToBeCleaned.add(name); 1263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("renamed-package")) { 1265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nname = parser.getAttributeValue(null, "new"); 1266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String oname = parser.getAttributeValue(null, "old"); 1267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (nname != null && oname != null) { 1268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mRenamedPackages.put(nname, oname); 1269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("last-platform-version")) { 1271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mInternalSdkPlatform = mExternalSdkPlatform = 0; 1272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String internal = parser.getAttributeValue(null, "internal"); 1274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (internal != null) { 1275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mInternalSdkPlatform = Integer.parseInt(internal); 1276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String external = parser.getAttributeValue(null, "external"); 1278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (external != null) { 1279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mExternalSdkPlatform = Integer.parseInt(external); 1280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: " 1285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getName()); 1286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (XmlPullParserException e) { 1293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e); 1296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e); 1301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mPendingPackages.size(); 1305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i = 0; i < N; i++) { 1306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final PendingPackage pp = mPendingPackages.get(i); 1307447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Object idObj = getUserIdLPr(pp.sharedId); 1308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (idObj != null && idObj instanceof SharedUserSetting) { 1309447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting p = getPackageLPw(pp.name, null, pp.realName, 1310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root (SharedUserSetting) idObj, pp.codePath, pp.resourcePath, 1311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true); 1312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p == null) { 1313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unable to create application package for " + pp.name); 1315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.copyFrom(pp); 1318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (idObj != null) { 1319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String msg = "Bad package setting: package " + pp.name + " has shared uid " 1320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pp.sharedId + " that is not a shared uid\n"; 1321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append(msg); 1322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, msg); 1323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String msg = "Bad package setting: package " + pp.name + " has shared uid " 1325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pp.sharedId + " that is not defined\n"; 1326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append(msg); 1327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, msg); 1328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPendingPackages.clear(); 1331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 13321d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root /* 13331d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root * Make sure all the updated system packages have their shared users 13341d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root * associated with them. 13351d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root */ 13361d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator(); 13371d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root while (disabledIt.hasNext()) { 13381d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final PackageSetting disabledPs = disabledIt.next(); 13391d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final Object id = getUserIdLPr(disabledPs.userId); 13401d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root if (id != null && id instanceof SharedUserSetting) { 13411d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root disabledPs.sharedUser = (SharedUserSetting) id; 13421d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root } 13431d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root } 13441d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root 1345447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readStoppedLPw(); 1346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, " 1348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mSharedUsers.size() + " shared uids\n"); 1349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 1351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private int readInt(XmlPullParser parser, String ns, String name, int defValue) { 1354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String v = parser.getAttributeValue(ns, name); 1355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (v == null) { 1357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return defValue; 1358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return Integer.parseInt(v); 1360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: attribute " + name 1363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad integer value " + v + " at " 1364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return defValue; 1367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1369447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser) 1370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1379447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String tagName = parser.getName(); 1380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1381447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String name = parser.getAttributeValue(null, "name"); 1382447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String sourcePackage = parser.getAttributeValue(null, "package"); 1383447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String ptype = parser.getAttributeValue(null, "type"); 1384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null && sourcePackage != null) { 1385447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final boolean dynamic = "dynamic".equals(ptype); 1386447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final BasePermission bp = new BasePermission(name, sourcePackage, 1387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL); 1388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.protectionLevel = readInt(parser, null, "protection", 1389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PermissionInfo.PROTECTION_NORMAL); 1390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dynamic) { 1391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PermissionInfo pi = new PermissionInfo(); 1392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.packageName = sourcePackage.intern(); 1393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.name = name.intern(); 1394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.icon = readInt(parser, null, "icon", 0); 1395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.nonLocalizedLabel = parser.getAttributeValue(null, "label"); 1396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.protectionLevel = bp.protectionLevel; 1397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.pendingInfo = pi; 1398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root out.put(bp.name, bp); 1400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: permissions has" + " no name at " 1403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element reading permissions: " + parser.getName() + " at " 1408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1414447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException, 1415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root IOException { 1416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName = parser.getAttributeValue(null, "realName"); 1418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String codePathStr = parser.getAttributeValue(null, "codePath"); 1419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String resourcePathStr = parser.getAttributeValue(null, "resourcePath"); 1420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); 1421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (resourcePathStr == null) { 1422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = codePathStr; 1423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String version = parser.getAttributeValue(null, "version"); 1425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int versionCode = 0; 1426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (version != null) { 1427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode = Integer.parseInt(version); 1429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr), 1436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags); 1437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String timeStampStr = parser.getAttributeValue(null, "ft"); 1438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = Long.parseLong(timeStampStr, 16); 1441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.setTimeStamp(timeStamp); 1442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1444cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ts"); 1446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = Long.parseLong(timeStampStr); 1449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.setTimeStamp(timeStamp); 1450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "it"); 1455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.firstInstallTime = Long.parseLong(timeStampStr, 16); 1458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ut"); 1462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.lastUpdateTime = Long.parseLong(timeStampStr, 16); 1465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = parser.getAttributeValue(null, "userId"); 1469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.userId = idStr != null ? Integer.parseInt(idStr) : 0; 1470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps.userId <= 0) { 1471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String sharedIdStr = parser.getAttributeValue(null, "sharedUserId"); 1472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0; 1473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("perms")) { 1484447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, ps.grantedPermissions); 1485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <updated-package>: " + parser.getName()); 1488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.put(name, ps); 1492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1494447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException { 1495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = null; 1496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName = null; 1497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = null; 1498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String sharedIdStr = null; 1499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String codePathStr = null; 1500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String resourcePathStr = null; 1501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathStr = null; 1502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String systemStr = null; 1503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String installerPackageName = null; 1504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String uidError = null; 1505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = 0; 1507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long firstInstallTime = 0; 1508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long lastUpdateTime = 0; 1509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSettingBase packageSetting = null; 1510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String version = null; 1511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int versionCode = 0; 1512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root name = parser.getAttributeValue(null, "name"); 1514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root realName = parser.getAttributeValue(null, "realName"); 1515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root idStr = parser.getAttributeValue(null, "userId"); 1516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root uidError = parser.getAttributeValue(null, "uidError"); 1517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sharedIdStr = parser.getAttributeValue(null, "sharedUserId"); 1518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root codePathStr = parser.getAttributeValue(null, "codePath"); 1519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = parser.getAttributeValue(null, "resourcePath"); 1520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); 1521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root version = parser.getAttributeValue(null, "version"); 1522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (version != null) { 1523cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode = Integer.parseInt(version); 1525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root installerPackageName = parser.getAttributeValue(null, "installer"); 1529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemStr = parser.getAttributeValue(null, "flags"); 1531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (systemStr != null) { 1532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags = Integer.parseInt(systemStr); 1534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For backward compatibility 1538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemStr = parser.getAttributeValue(null, "system"); 1539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (systemStr != null) { 1540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM 1541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root : 0; 1542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Old settings that don't specify system... just treat 1544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // them as system, good enough. 1545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String timeStampStr = parser.getAttributeValue(null, "ft"); 1549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStamp = Long.parseLong(timeStampStr, 16); 1552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ts"); 1556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStamp = Long.parseLong(timeStampStr); 1559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "it"); 1564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root firstInstallTime = Long.parseLong(timeStampStr, 16); 1567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ut"); 1571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root lastUpdateTime = Long.parseLong(timeStampStr, 16); 1574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr 1579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " sharedUserId=" + sharedIdStr); 1580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int userId = idStr != null ? Integer.parseInt(idStr) : 0; 1581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (resourcePathStr == null) { 1582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = codePathStr; 1583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (realName != null) { 1585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root realName = realName.intern(); 1586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name == null) { 1588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <package> has no name at " 1590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (codePathStr == null) { 1592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <package> has no codePath at " 1594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (userId > 0) { 1596447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr), 1597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode, 1598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags); 1599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId=" 1601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + userId + " pkg=" + packageSetting); 1602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSetting == null) { 1603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid " 1604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + userId + " while parsing settings at " 1605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.setTimeStamp(timeStamp); 1608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.firstInstallTime = firstInstallTime; 1609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.lastUpdateTime = lastUpdateTime; 1610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (sharedIdStr != null) { 1612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0; 1613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (userId > 0) { 1614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting = new PendingPackage(name.intern(), realName, new File( 1615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId, 1616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode, pkgFlags); 1617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.setTimeStamp(timeStamp); 1618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.firstInstallTime = firstInstallTime; 1619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.lastUpdateTime = lastUpdateTime; 1620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPendingPackages.add((PendingPackage) packageSetting); 1621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Reading package " + name 1623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + ": sharedUserId=" + userId + " pkg=" + packageSetting); 1624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name 1627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad sharedId " + sharedIdStr + " at " 1628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 1633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 1634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 1638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 1639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSetting != null) { 1641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.uidError = "true".equals(uidError); 1642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installerPackageName = installerPackageName; 1643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.nativeLibraryPathString = nativeLibraryPathStr; 1644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String enabledStr = parser.getAttributeValue(null, "enabled"); 1645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (enabledStr != null) { 1646b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn try { 1647b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn packageSetting.enabled = Integer.parseInt(enabledStr); 1648b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } catch (NumberFormatException e) { 1649b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn if (enabledStr.equalsIgnoreCase("true")) { 1650b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn packageSetting.enabled = COMPONENT_ENABLED_STATE_ENABLED; 1651b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else if (enabledStr.equalsIgnoreCase("false")) { 1652b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn packageSetting.enabled = COMPONENT_ENABLED_STATE_DISABLED; 1653b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else if (enabledStr.equalsIgnoreCase("default")) { 1654b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT; 1655b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else { 1656b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn PackageManagerService.reportSettingsProblem(Log.WARN, 1657b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn "Error in package manager settings: package " + name 1658b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn + " has bad enabled value: " + idStr + " at " 1659b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn + parser.getPositionDescription()); 1660b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } 1661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT; 1664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String installStatusStr = parser.getAttributeValue(null, "installStatus"); 1666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (installStatusStr != null) { 1667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (installStatusStr.equalsIgnoreCase("false")) { 1668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE; 1669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE; 1671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1675cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1676cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1677cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1679cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1681cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("disabled-components")) { 1684447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readDisabledComponentsLPw(packageSetting, parser); 1685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("enabled-components")) { 1686447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readEnabledComponentsLPw(packageSetting, parser); 1687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("sigs")) { 1688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.signatures.readXml(parser, mPastSignatures); 1689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("perms")) { 1690447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions); 1691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.permissionsFixed = true; 1692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <package>: " + parser.getName()); 1695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1703447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser) 1704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1707cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.disabledComponents.add(name.intern()); 1718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <disabled-components> has" 1721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " no name at " + parser.getPositionDescription()); 1722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <disabled-components>: " + parser.getName()); 1726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1731447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser) 1732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1736cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1737cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1738cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1739cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1741cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1742cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.enabledComponents.add(name.intern()); 1746cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <enabled-components> has" 1749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " no name at " + parser.getPositionDescription()); 1750cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <enabled-components>: " + parser.getName()); 1754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1759447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException, IOException { 1760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = null; 1761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = null; 1762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting su = null; 1764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root name = parser.getAttributeValue(null, "name"); 1766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root idStr = parser.getAttributeValue(null, "userId"); 1767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int userId = idStr != null ? Integer.parseInt(idStr) : 0; 1768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ("true".equals(parser.getAttributeValue(null, "system"))) { 1769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1771cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name == null) { 1772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1773cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <shared-user> has no name at " 1774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (userId == 0) { 1776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: shared-user " + name 1778cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad userId " + idStr + " at " 1779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1781447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) { 1782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService 1783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at " 1784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 1790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 1791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 1793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (su != null) { 1795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1800cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("sigs")) { 1805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root su.signatures.readXml(parser, mPastSignatures); 1806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("perms")) { 1807447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, su.grantedPermissions); 1808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <shared-user>: " + parser.getName()); 1811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1820447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms) 1821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1826cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1827cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = parser.getAttributeValue(null, "name"); 1833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root outPerms.add(name.intern()); 1835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <perms> has" + " no name at " 1838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <perms>: " + parser.getName()); 1843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1848447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPreferredActivitiesLPw(XmlPullParser parser) throws XmlPullParserException, 1849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root IOException { 1850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("item")) { 1860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PreferredActivity pa = new PreferredActivity(parser); 1861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pa.mPref.getParseError() == null) { 1862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPreferredActivities.addFilter(pa); 1863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <preferred-activity> " 1866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pa.mPref.getParseError() + " at " 1867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1870cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <preferred-activities>: " + parser.getName()); 1872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1876cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Returns -1 if we could not find an available UserId to assign 1878447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private int newUserIdLPw(Object obj) { 1879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Let's be stupidly inefficient for now... 1880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 1881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i = 0; i < N; i++) { 1882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mUserIds.get(i) == null) { 1883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.set(i, obj); 1884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return PackageManagerService.FIRST_APPLICATION_UID + i; 1885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // None left? 1889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (N >= PackageManagerService.MAX_APPLICATION_UIDS) { 1890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return -1; 1891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1893cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.add(obj); 1894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return PackageManagerService.FIRST_APPLICATION_UID + N; 1895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1897447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root public PackageSetting getDisabledSystemPkgLPr(String name) { 1898447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting ps = mDisabledSysPackages.get(name); 1899447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return ps; 1900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1902447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean isEnabledLPr(ComponentInfo componentInfo, int flags) { 1903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 1904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 1905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final PackageSetting packageSettings = mPackages.get(componentInfo.packageName); 1907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) { 1908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = " + componentInfo.packageName 1909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " componentName = " + componentInfo.name); 1910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "enabledComponents: " 1911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + Arrays.toString(packageSettings.enabledComponents.toArray())); 1912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "disabledComponents: " 1913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + Arrays.toString(packageSettings.disabledComponents.toArray())); 1914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings == null) { 1916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED 19190ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn || packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER 1920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled 1921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && packageSettings.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) { 1922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings.enabledComponents.contains(componentInfo.name)) { 1925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 1926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings.disabledComponents.contains(componentInfo.name)) { 1928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return componentInfo.enabled; 1931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1932447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1933447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root String getInstallerPackageNameLPr(String packageName) { 1934447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 1935447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 1936447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 1937447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1938447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return pkg.installerPackageName; 1939447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1940447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1941447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root int getApplicationEnabledSettingLPr(String packageName) { 1942447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 1943447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 1944447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 1945447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1946447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return pkg.enabled; 1947447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1948447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1949447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root int getComponentEnabledSettingLPr(ComponentName componentName) { 1950447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String packageName = componentName.getPackageName(); 1951447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 1952447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 1953447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown component: " + componentName); 1954447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1955447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String classNameStr = componentName.getClassName(); 1956447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return pkg.getCurrentEnabledStateLPr(classNameStr); 1957447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1958447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1959447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean setPackageStoppedStateLPw(String packageName, boolean stopped, 1960447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean allowedByPermission, int uid) { 1961447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkgSetting = mPackages.get(packageName); 1962447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting == null) { 1963447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 1964447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1965447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!allowedByPermission && (uid != pkgSetting.userId)) { 1966447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new SecurityException( 1967447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root "Permission Denial: attempt to change stopped state from pid=" 1968447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root + Binder.getCallingPid() 1969447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root + ", uid=" + uid + ", package uid=" + pkgSetting.userId); 1970447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1971447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (DEBUG_STOPPED) { 1972447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (stopped) { 1973447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root RuntimeException e = new RuntimeException("here"); 1974447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root e.fillInStackTrace(); 1975447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Slog.i(TAG, "Stopping package " + packageName, e); 1976447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1977447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1978447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting.stopped != stopped) { 1979447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.stopped = stopped; 1980447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.pkg.mSetStopped = stopped; 1981447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting.notLaunched) { 1982447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting.installerPackageName != null) { 1983447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH, 1984447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.name, null, 1985447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.installerPackageName, null); 1986447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1987447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.notLaunched = false; 1988447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1989447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return true; 1990447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1991447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return false; 1992447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 1993447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 1994447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) { 1995447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 1996447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final Date date = new Date(); 1997447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 1998447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting ps : mPackages.values()) { 1999447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(ps.realName) 2000447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(ps.name)) { 2001447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2002447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2003447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2004447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null) { 2005447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root dumpState.setSharedUser(ps.sharedUser); 2006447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2007447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2008447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2009447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2010447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2011447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Packages:"); 2012447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2013447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2014447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Package ["); 2015447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(ps.realName != null ? ps.realName : ps.name); 2016447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2017447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(ps))); 2018447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2019447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2020447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.realName != null) { 2021447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" compat name="); 2022447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.name); 2023447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2024447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2025447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); pw.print(ps.userId); 2026447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids)); 2027447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sharedUser="); pw.println(ps.sharedUser); 2028447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" pkg="); pw.println(ps.pkg); 2029447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" codePath="); pw.println(ps.codePathString); 2030447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" resourcePath="); pw.println(ps.resourcePathString); 2031447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" nativeLibraryPath="); pw.println(ps.nativeLibraryPathString); 2032447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" versionCode="); pw.println(ps.versionCode); 2033447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.pkg != null) { 2034447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" versionName="); pw.println(ps.pkg.mVersionName); 2035447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir); 2036447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion); 2037447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.pkg.mOperationPending) { 2038447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" mOperationPending=true"); 2039447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2040447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" supportsScreens=["); 2041447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean first = true; 2042447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) { 2043447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2044447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2045447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2046447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("small"); 2047447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2048447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) { 2049447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2050447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2051447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2052447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("medium"); 2053447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2054447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) { 2055447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2056447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2057447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2058447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("large"); 2059447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2060447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) { 2061447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2062447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2063447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2064447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("xlarge"); 2065447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2066447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) { 2067447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2068447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2069447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2070447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("resizeable"); 2071447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2072447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) { 2073447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2074447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2075447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2076447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("anyDensity"); 2077447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2078447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2079447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("]"); 2080447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" timeStamp="); 2081447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.timeStamp); 2082447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2083447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" firstInstallTime="); 2084447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.firstInstallTime); 2085447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2086447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" lastUpdateTime="); 2087447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.lastUpdateTime); 2088447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2089447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.installerPackageName != null) { 2090447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" installerPackageName="); pw.println(ps.installerPackageName); 2091447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2092447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" signatures="); pw.println(ps.signatures); 2093447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed); 2094447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" haveGids="); pw.println(ps.haveGids); 2095447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags)); 2096447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" installStatus="); pw.print(ps.installStatus); 2097447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" stopped="); pw.print(ps.stopped); 2098447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" enabled="); pw.println(ps.enabled); 2099447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.disabledComponents.size() > 0) { 2100447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" disabledComponents:"); 2101447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : ps.disabledComponents) { 2102447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); pw.println(s); 2103447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2104447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2105447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.enabledComponents.size() > 0) { 2106447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" enabledComponents:"); 2107447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : ps.enabledComponents) { 2108447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); pw.println(s); 2109447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2110447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2111447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.grantedPermissions.size() > 0) { 2112447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" grantedPermissions:"); 2113447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : ps.grantedPermissions) { 2114447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); pw.println(s); 2115447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2116447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2117447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2118447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2119447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = false; 2120447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (mRenamedPackages.size() > 0) { 2121447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) { 2122447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(e.getKey()) 2123447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(e.getValue())) { 2124447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2125447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2126447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2127447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2128447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2129447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Renamed packages:"); 2130447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2131447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2132447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); 2133447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(e.getKey()); 2134447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" -> "); 2135447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(e.getValue()); 2136447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2137447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2138447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2139447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = false; 2140447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (mDisabledSysPackages.size() > 0) { 2141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting ps : mDisabledSysPackages.values()) { 2142447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(ps.realName) 2143447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(ps.name)) { 2144447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2145447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2146447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2147447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2148447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2149447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Hidden system packages:"); 2150447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2151447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2152447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Package ["); 2153447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(ps.realName != null ? ps.realName : ps.name); 2154447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2155447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(ps))); 2156447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2157447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.realName != null) { 2158447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" compat name="); 2159447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.name); 2160447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2161447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); 2162447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.userId); 2163447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sharedUser="); 2164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.sharedUser); 2165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" codePath="); 2166447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.codePathString); 2167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" resourcePath="); 2168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.resourcePathString); 2169447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2171447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2172447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2174447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2175447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (BasePermission p : mPermissions.values()) { 2176447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(p.sourcePackage)) { 2177447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2178447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2179447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2180447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2181447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2182447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Permissions:"); 2183447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2184447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2185447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Permission ["); pw.print(p.name); pw.print("] ("); 2186447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(p))); 2187447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2188447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sourcePackage="); pw.println(p.sourcePackage); 2189447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" uid="); pw.print(p.uid); 2190447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids)); 2191447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" type="); pw.print(p.type); 2192447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" prot="); pw.println(p.protectionLevel); 2193447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (p.packageSetting != null) { 2194447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" packageSetting="); pw.println(p.packageSetting); 2195447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2196447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (p.perm != null) { 2197447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" perm="); pw.println(p.perm); 2198447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2199447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2200447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2201447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2202447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2203447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2204447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (SharedUserSetting su : mSharedUsers.values()) { 2205447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && su != dumpState.getSharedUser()) { 2206447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2207447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2208447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2209447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2210447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2211447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Shared users:"); 2212447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2213447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2214447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" SharedUser ["); 2215447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(su.name); 2216447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2217447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(su))); 2218447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2219447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); 2220447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(su.userId); 2221447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); 2222447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(PackageManagerService.arrayToString(su.gids)); 2223447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" grantedPermissions:"); 2224447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : su.grantedPermissions) { 2225447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); 2226447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(s); 2227447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2228447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2229447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2230447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2231447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) { 2232447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Settings parse messages:"); 2233447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(mReadMessages.toString()); 2234447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root}