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; 231c27576aff247ff1d7789e0a571958726f161593Jeff Sharkeyimport static android.Manifest.permission.READ_EXTERNAL_STORAGE; 24cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 25cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.FastXmlSerializer; 26cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.JournaledFile; 27cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.XmlUtils; 28cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.server.IntentResolver; 29447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport com.android.server.pm.PackageManagerService.DumpState; 30cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 31cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlPullParser; 32cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlPullParserException; 33cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlSerializer; 34cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 35483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.app.AppGlobals; 36447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.ComponentName; 37447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.Intent; 38cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ApplicationInfo; 39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ComponentInfo; 40cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageManager; 41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageParser; 42cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PermissionInfo; 43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.Signature; 44483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.content.pm.UserInfo; 450aaa0d931716e9f57a1d84d795fab2df75092756Kenny Rootimport android.content.pm.VerifierDeviceIdentity; 46447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.os.Binder; 47cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Environment; 48cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.FileUtils; 49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Process; 50483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.os.RemoteException; 51483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.os.UserId; 52cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Log; 53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Slog; 54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.SparseArray; 55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Xml; 56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 57cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.BufferedOutputStream; 58cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File; 59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileInputStream; 60cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileOutputStream; 61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.IOException; 62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.PrintWriter; 63447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.text.SimpleDateFormat; 64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.ArrayList; 65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Arrays; 66447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.util.Date; 67cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashMap; 68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet; 69cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Iterator; 70483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport java.util.List; 712f36229db823d152f3efd879e751e81a601a75b0Andy McFaddenimport java.util.Map; 72cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 7362539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Rootimport libcore.io.IoUtils; 7462539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root 75cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/** 76cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Holds information about dynamic settings. 77cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class Settings { 79447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private static final String TAG = "PackageSettings"; 80447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 81447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private static final boolean DEBUG_STOPPED = false; 82447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 83edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage"; 84edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey private static final String ATTR_ENFORCEMENT = "enforcement"; 85edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey 86483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_ITEM = "item"; 87483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_DISABLED_COMPONENTS = "disabled-components"; 88483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_ENABLED_COMPONENTS = "enabled-components"; 89483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions"; 90483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_PACKAGE = "pkg"; 91483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 92483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String ATTR_NAME = "name"; 93483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String ATTR_NOT_LAUNCHED = "nl"; 94483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String ATTR_ENABLED = "enabled"; 95483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String ATTR_STOPPED = "stopped"; 96483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 97cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mSettingsFilename; 98cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mBackupSettingsFilename; 99cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mPackageListFilename; 100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mStoppedPackagesFilename; 101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mBackupStoppedPackagesFilename; 102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, PackageSetting> mPackages = 103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, PackageSetting>(); 104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // List of replaced system applications 105c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root private final HashMap<String, PackageSetting> mDisabledSysPackages = 106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, PackageSetting>(); 107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // These are the last platform API version we were using for 109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // the apps installed on internal and external storage. It is 110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // used to grant newer permissions one time during a system upgrade. 111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int mInternalSdkPlatform; 112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int mExternalSdkPlatform; 1130aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 114f53857716a0db805c51c0cae93550d90e32e4749Jeff Sharkey Boolean mReadExternalStorageEnforced; 115edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey 1160aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root /** Device identity for the purpose of package verification. */ 1170aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root private VerifierDeviceIdentity mVerifierDeviceIdentity; 1180aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // The user's preferred activities associated with particular intent 120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // filters. 121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities = 122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new IntentResolver<PreferredActivity, PreferredActivity>() { 123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root @Override 124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root protected String packageForFilter(PreferredActivity filter) { 125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return filter.mPref.mComponent.getPackageName(); 126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root @Override 128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root protected void dumpFilter(PrintWriter out, String prefix, 129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PreferredActivity filter) { 130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root filter.mPref.dump(out, prefix, filter); 131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root }; 133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, SharedUserSetting> mSharedUsers = 134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, SharedUserSetting>(); 135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final ArrayList<Object> mUserIds = new ArrayList<Object>(); 136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final SparseArray<Object> mOtherUserIds = 137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new SparseArray<Object>(); 138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For reading/writing settings file. 140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final ArrayList<Signature> mPastSignatures = 141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new ArrayList<Signature>(); 142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Mapping from permission names to info about them. 144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, BasePermission> mPermissions = 145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, BasePermission>(); 146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Mapping from permission tree names to info about them. 148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, BasePermission> mPermissionTrees = 149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, BasePermission>(); 150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Packages that have been uninstalled and still need their external 152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // storage data deleted. 153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final ArrayList<String> mPackagesToBeCleaned = new ArrayList<String>(); 154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Packages that have been renamed since they were first installed. 156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keys are the new names of the packages, values are the original 157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // names. The packages appear everwhere else under their original 158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // names. 159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, String> mRenamedPackages = new HashMap<String, String>(); 160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final StringBuilder mReadMessages = new StringBuilder(); 162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 163447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root /** 164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * Used to track packages that have a shared user ID that hasn't been read 165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * in yet. 166447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * <p> 167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * TODO: make this just a local variable that is passed in during package 168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * scanning to make it less confusing. 169447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root */ 170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>(); 171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 172483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private final File mSystemDir; 173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Settings() { 174483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani this(Environment.getDataDirectory()); 175483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 176483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 177483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Settings(File dataDir) { 178483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mSystemDir = new File(dataDir, "system"); 179483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mSystemDir.mkdirs(); 180483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani FileUtils.setPermissions(mSystemDir.toString(), 181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRWXU|FileUtils.S_IRWXG 182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH|FileUtils.S_IXOTH, 183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 184483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mSettingsFilename = new File(mSystemDir, "packages.xml"); 185483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml"); 186483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPackageListFilename = new File(mSystemDir, "packages.list"); 187483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Deprecated: Needed for migration 188483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml"); 189483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml"); 190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 192447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage, 193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, 194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int pkgFlags, boolean create, boolean add) { 195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String name = pkg.packageName; 196447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath, 197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, create, add); 198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 201447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting peekPackageLPr(String name) { 202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return mPackages.get(name); 203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void setInstallStatus(String pkgName, int status) { 206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(pkgName); 207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p != null) { 208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p.getInstallStatus() != status) { 209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setInstallStatus(status); 210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void setInstallerPackageName(String pkgName, 215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String installerPkgName) { 216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(pkgName); 217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p != null) { 218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setInstallerPackageName(installerPkgName); 219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 222447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root SharedUserSetting getSharedUserLPw(String name, 223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags, boolean create) { 224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting s = mSharedUsers.get(name); 225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s == null) { 226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!create) { 227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s = new SharedUserSetting(name, pkgFlags); 23021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn s.userId = newUserIdLPw(s); 231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId); 232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // < 0 means we couldn't assign a userid; fall out and return 233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // s, which is currently null 234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s.userId >= 0) { 235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.put(name, s); 236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 242447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean disableSystemPackageLPw(String name) { 243447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p == null) { 245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package"); 246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 248447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting dp = mDisabledSysPackages.get(name); 249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // always make sure the system package code and resource paths dont change 250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dp == null) { 251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if((p.pkg != null) && (p.pkg.applicationInfo != null)) { 252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; 253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.put(name, p); 255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // a little trick... when we install the new package, we don't 257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // want to modify the existing PackageSetting for the built-in 258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // version. so at this point we need a new PackageSetting that 259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // is okay to muck with. 260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting newp = new PackageSetting(p); 261447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root replacePackageLPw(name, newp); 262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 267447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting enableSystemPackageLPw(String name) { 268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mDisabledSysPackages.get(name); 269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p == null) { 270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled"); 271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Reset flag in ApplicationInfo object 274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if((p.pkg != null) && (p.pkg.applicationInfo != null)) { 275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; 276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 277447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath, 278135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.nativeLibraryPathString, p.appId, p.versionCode, p.pkgFlags); 279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.remove(name); 280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return ret; 281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 283c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root boolean isDisabledSystemPackageLPr(String name) { 284c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root return mDisabledSysPackages.containsKey(name); 285c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root } 286c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root 287c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root void removeDisabledSystemPackageLPw(String name) { 288c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root mDisabledSysPackages.remove(name); 289c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root } 290c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root 291447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath, 292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int uid, int vc, int pkgFlags) { 293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(name); 294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 295135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (p.appId == uid) { 296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate package, keeping first: " + name); 300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString, 303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root vc, pkgFlags); 304135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = uid; 305447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (addUserIdLPw(uid, p, name)) { 306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, p); 307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 312447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) { 313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting s = mSharedUsers.get(name); 314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s != null) { 315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s.userId == uid) { 316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate shared user, keeping first: " + name); 320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s = new SharedUserSetting(name, pkgFlags); 323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s.userId = uid; 324447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (addUserIdLPw(uid, s, name)) { 325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.put(name, s); 326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Transfer ownership of permissions from one package to another. 332447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void transferPermissionsLPw(String origPkg, String newPkg) { 333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Transfer ownership of permissions to the new package. 334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i=0; i<2; i++) { 335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root HashMap<String, BasePermission> permissions = 336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root i == 0 ? mPermissionTrees : mPermissions; 337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : permissions.values()) { 338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (origPkg.equals(bp.sourcePackage)) { 339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, 340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Moving permission " + bp.name 341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " from pkg " + bp.sourcePackage 342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " + newPkg); 343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.sourcePackage = newPkg; 344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.packageSetting = null; 345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.perm = null; 346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.pendingInfo != null) { 347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.pendingInfo.packageName = newPkg; 348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.uid = 0; 350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.gids = null; 351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 355483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 356447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private PackageSetting getPackageLPw(String name, PackageSetting origPackage, 357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, 358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) { 359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(name); 360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!p.codePath.equals(codePath)) { 362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Check to see if its a disabled system app 363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) { 364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // This is an updated system app with versions in both system 365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // and data partition. Just let the most recent version 366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // take precedence. 367483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, "Trying to update system app code path from " 368483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + p.codePathString + " to " + codePath.toString()); 369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Just a change in the code path is not an issue, but 371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // let's log a message about it. 372483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from " 373483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + p.codePath + " to " + codePath + "; Retaining data and using new"); 374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /* 375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Since we've changed paths, we need to prefer the new 376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * native library path over the one stored in the 377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * package settings since we might have moved from 378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * internal to external storage or vice versa. 379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString = nativeLibraryPathString; 381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != sharedUser) { 384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + name + " shared user changed from " 386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + (p.sharedUser != null ? p.sharedUser.name : "<nothing>") 387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " 388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + (sharedUser != null ? sharedUser.name : "<nothing>") 389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; replacing with new"); 390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = null; 391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) { 393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If what we are scanning is a system package, then 394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // make it so, regardless of whether it was previously 395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // installed only in the data partition. 396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p == null) { 401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Create a new PackageSettings entry. this can end up here because 402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // of code path mismatch or user id mismatch of an updated system partition 403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!create) { 404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (origPackage != null) { 407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We are consuming the data from an existing package. 408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(origPackage.name, name, codePath, resourcePath, 409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathString, vc, pkgFlags); 410483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " 411483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + name + " is adopting original package " + origPackage.name); 412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Note that we will retain the new package's signature so 413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // that we can keep its data. 414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSignatures s = p.signatures; 415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.copyFrom(origPackage); 416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures = s; 417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = origPackage.sharedUser; 418135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = origPackage.appId; 419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.origPackage = origPackage; 420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mRenamedPackages.put(name, origPackage.name); 421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root name = origPackage.name; 422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update new package state. 423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setTimeStamp(codePath.lastModified()); 424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(name, realName, codePath, resourcePath, 426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathString, vc, pkgFlags); 427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setTimeStamp(codePath.lastModified()); 428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = sharedUser; 429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is not a system app, it starts out stopped. 430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) { 431447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (DEBUG_STOPPED) { 432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root RuntimeException e = new RuntimeException("here"); 433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root e.fillInStackTrace(); 434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.i(PackageManagerService.TAG, "Stopping package " + name, e); 435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 436483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<UserInfo> users = getAllUsers(); 437483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (users != null) { 438483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 439483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani p.setStopped(true, user.id); 440483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani p.setNotLaunched(true, user.id); 441483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani writePackageRestrictionsLPr(user.id); 442483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 443483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 444cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (sharedUser != null) { 446135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = sharedUser.userId; 44721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn } else { 448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone the setting here for disabled system packages 449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting dis = mDisabledSysPackages.get(name); 450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dis != null) { 451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For disabled packages a new setting is created 452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // from the existing user id. This still has to be 453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // added to list of user id's 454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Copy signatures from previous setting 455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dis.signatures.mSignatures != null) { 456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures.mSignatures = dis.signatures.mSignatures.clone(); 457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 458135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = dis.appId; 459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone permissions 460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.grantedPermissions = new HashSet<String>(dis.grantedPermissions); 461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone component info 462483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<UserInfo> users = getAllUsers(); 463483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (users != null) { 464483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 465483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId = user.id; 466483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani p.setDisabledComponents( 467483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani new HashSet<String>(dis.getDisabledComponents(userId)), 468483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userId); 469483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani p.setEnabledComponents( 470483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani new HashSet<String>(dis.getEnabledComponents(userId)), 471483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userId); 472483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 473483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Add new setting to list of user ids 475135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani addUserIdLPw(p.appId, p, name); 476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Assign new user id 478135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = newUserIdLPw(p); 479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 482135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (p.appId < 0) { 483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + name + " could not be assigned a valid uid"); 485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (add) { 488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Finish adding new package by adding it and updating shared 489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // user preferences 490447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addPackageSettingLPw(p, name, sharedUser); 491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 496447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) { 497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg = pkg; 498483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // pkg.mSetEnabled = p.getEnabled(userId); 499483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // pkg.mSetStopped = p.getStopped(userId); 500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String codePath = pkg.applicationInfo.sourceDir; 501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String resourcePath = pkg.applicationInfo.publicSourceDir; 502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update code path if needed 503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!codePath.equalsIgnoreCase(p.codePathString)) { 504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName + 505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root " changing from " + p.codePathString + " to " + codePath); 506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePath = new File(codePath); 507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePathString = codePath; 508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Update resource path if needed 510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) { 511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName + 512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root " changing from " + p.resourcePathString + " to " + resourcePath); 513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.resourcePath = new File(resourcePath); 514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.resourcePathString = resourcePath; 515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update the native library path if needed 517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir; 518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (nativeLibraryPath != null 519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) { 520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString = nativeLibraryPath; 521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update version code if needed 523483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (pkg.mVersionCode != p.versionCode) { 524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.versionCode = pkg.mVersionCode; 525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 526483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Update signatures if needed. 527483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (p.signatures.mSignatures == null) { 528483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani p.signatures.assignSignatures(pkg.mSignatures); 529483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 530483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // If this app defines a shared user id initialize 531483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // the shared user signatures as well. 532483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) { 533483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani p.sharedUser.signatures.assignSignatures(pkg.mSignatures); 534483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 535447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addPackageSettingLPw(p, pkg.packageName, p.sharedUser); 536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Utility method that adds a PackageSetting to mPackages and 539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // completes updating the shared user attributes 540447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void addPackageSettingLPw(PackageSetting p, String name, 541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting sharedUser) { 542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, p); 543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (sharedUser != null) { 544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null && p.sharedUser != sharedUser) { 545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + p.name + " was user " 547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + p.sharedUser + " but is now " + sharedUser 548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; I am not changing its files so it will probably fail!"); 549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 550135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani } else if (p.appId != sharedUser.userId) { 551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 552135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani "Package " + p.name + " was user id " + p.appId 553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " but is now user " + sharedUser 554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " with id " + sharedUser.userId 555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; I am not changing its files so it will probably fail!"); 556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sharedUser.packages.add(p); 559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = sharedUser; 560135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = sharedUser.userId; 561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /* 565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Update the shared user setting when a package using 566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * specifying the shared user id is removed. The gids 567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * associated with each permission of the deleted package 568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * are removed from the shared user's gid list only if its 569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * not in use by other permissions of packages in the 570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * shared user setting. 571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 572447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) { 573447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((deletedPs == null) || (deletedPs.pkg == null)) { 574447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Slog.i(PackageManagerService.TAG, 575447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root "Trying to update info for null package. Just ignoring"); 576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // No sharedUserId 579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (deletedPs.sharedUser == null) { 580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting sus = deletedPs.sharedUser; 583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update permissions 584447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String eachPerm : deletedPs.pkg.requestedPermissions) { 585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root boolean used = false; 586447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!sus.grantedPermissions.contains(eachPerm)) { 587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (PackageSetting pkg:sus.packages) { 590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.pkg != null && 591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) && 592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.pkg.requestedPermissions.contains(eachPerm)) { 593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root used = true; 594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root break; 595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!used) { 598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // can safely delete this permission from list 599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sus.grantedPermissions.remove(eachPerm); 600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update gids 603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int newGids[] = globalGids; 604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (String eachPerm : sus.grantedPermissions) { 605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BasePermission bp = mPermissions.get(eachPerm); 606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp != null) { 607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root newGids = PackageManagerService.appendInts(newGids, bp.gids); 608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sus.gids = newGids; 611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 613447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root int removePackageLPw(String name) { 614447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.remove(name); 617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null) { 618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser.packages.size() == 0) { 620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.remove(p.sharedUser.name); 621447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root removeUserIdLPw(p.sharedUser.userId); 622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p.sharedUser.userId; 623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 625135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani removeUserIdLPw(p.appId); 626135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani return p.appId; 627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return -1; 630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 632447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void replacePackageLPw(String name, PackageSetting newp) { 633447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null) { 636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.add(newp); 638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 639135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani replaceUserIdLPw(p.appId, newp); 640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, newp); 643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 645447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private boolean addUserIdLPw(int uid, Object obj, Object name) { 64621fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid > Process.LAST_APPLICATION_UID) { 647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 65021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid >= Process.FIRST_APPLICATION_UID) { 651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int N = mUserIds.size(); 65221fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn final int index = uid - Process.FIRST_APPLICATION_UID; 653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while (index >= N) { 654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.add(null); 655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root N++; 656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mUserIds.get(index) != null) { 658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate user id: " + uid 660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " name=" + name); 661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.set(index, obj); 664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mOtherUserIds.get(uid) != null) { 666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate shared id: " + uid 668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " name=" + name); 669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.put(uid, obj); 672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 675cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root public Object getUserIdLPr(int uid) { 67721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid >= Process.FIRST_APPLICATION_UID) { 678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 67921fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn final int index = uid - Process.FIRST_APPLICATION_UID; 680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return index < N ? mUserIds.get(index) : null; 681cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return mOtherUserIds.get(uid); 683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 686447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void removeUserIdLPw(int uid) { 68721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid >= Process.FIRST_APPLICATION_UID) { 688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 68921fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn final int index = uid - Process.FIRST_APPLICATION_UID; 690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (index < N) mUserIds.set(index, null); 691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.remove(uid); 693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 696447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void replaceUserIdLPw(int uid, Object obj) { 69721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid >= Process.FIRST_APPLICATION_UID) { 698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 69921fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn final int index = uid - Process.FIRST_APPLICATION_UID; 700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (index < N) mUserIds.set(index, obj); 701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.put(uid, obj); 703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 706483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private File getUserPackagesStateFile(int userId) { 707483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return new File(mSystemDir, 708483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "users/" + userId + "/package-restrictions.xml"); 709483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 710483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 711483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private File getUserPackagesStateBackupFile(int userId) { 712483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return new File(mSystemDir, 713483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "users/" + userId + "/package-restrictions-backup.xml"); 714483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 715483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 716483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani void writeAllUsersPackageRestrictionsLPr() { 717483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<UserInfo> users = getAllUsers(); 718483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (users == null) return; 719483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 720483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 721483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani writePackageRestrictionsLPr(user.id); 722483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 723483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 724483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 725483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani void readAllUsersPackageRestrictionsLPr() { 726483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<UserInfo> users = getAllUsers(); 727483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (users == null) { 728483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readPackageRestrictionsLPr(0); 729483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 730483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 731483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 732483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 733483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readPackageRestrictionsLPr(user.id); 734483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 735483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 736483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 737483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani void readPackageRestrictionsLPr(int userId) { 738483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani FileInputStream str = null; 739483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani File userPackagesStateFile = getUserPackagesStateFile(userId); 740483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani File backupFile = getUserPackagesStateBackupFile(userId); 741483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (backupFile.exists()) { 742483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 743483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani str = new FileInputStream(backupFile); 744483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("Reading from backup stopped packages file\n"); 745483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.INFO, 746483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Need to read from backup stopped packages file"); 747483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (userPackagesStateFile.exists()) { 748483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // If both the backup and normal file exist, we 749483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // ignore the normal one since it might have been 750483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // corrupted. 751483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file " 752483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + userPackagesStateFile); 753483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userPackagesStateFile.delete(); 754483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 755483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (java.io.IOException e) { 756483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // We'll try for the normal settings file. 757483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 758483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 759483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 760483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 761483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (str == null) { 762483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (!userPackagesStateFile.exists()) { 763483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("No stopped packages file found\n"); 764483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.INFO, 765483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "No stopped packages file; " 766483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + "assuming all started"); 767483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // At first boot, make sure no packages are stopped. 768483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // We usually want to have third party apps initialize 769483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // in the stopped state, but not at first boot. 770483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (PackageSetting pkg : mPackages.values()) { 771483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkg.setStopped(false, userId); 772483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkg.setNotLaunched(false, userId); 773483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 774483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 775483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 776483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani str = new FileInputStream(userPackagesStateFile); 777483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 778483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final XmlPullParser parser = Xml.newPullParser(); 779483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani parser.setInput(str, null); 780483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 781483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int type; 782483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani while ((type=parser.next()) != XmlPullParser.START_TAG 783483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani && type != XmlPullParser.END_DOCUMENT) { 784483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ; 785483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 786483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 787483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (type != XmlPullParser.START_TAG) { 788483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("No start tag found in package restrictions file\n"); 789483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.WARN, 790483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "No start tag found in package manager stopped packages"); 791483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 792483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 793483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 794483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int outerDepth = parser.getDepth(); 795483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageSetting ps = null; 796483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 797483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani && (type != XmlPullParser.END_TAG 798483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || parser.getDepth() > outerDepth)) { 799483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (type == XmlPullParser.END_TAG 800483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || type == XmlPullParser.TEXT) { 801483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani continue; 802483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 803483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 804483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String tagName = parser.getName(); 805483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_PACKAGE)) { 806483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 807483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps = mPackages.get(name); 808483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (ps == null) { 809483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, "No package known for stopped package: " 810483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + name); 811483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani XmlUtils.skipCurrentTag(parser); 812483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani continue; 813483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 814483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED); 815483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int enabled = enabledStr == null ? COMPONENT_ENABLED_STATE_DEFAULT 816483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani : Integer.parseInt(enabledStr); 817483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setEnabled(enabled, userId); 818483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String stoppedStr = parser.getAttributeValue(null, ATTR_STOPPED); 819483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean stopped = stoppedStr == null ? false : Boolean.parseBoolean(stoppedStr); 820483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setStopped(stopped, userId); 821483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String notLaunchedStr = parser.getAttributeValue(null, ATTR_NOT_LAUNCHED); 822483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean notLaunched = stoppedStr == null ? false 823483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani : Boolean.parseBoolean(notLaunchedStr); 824483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setNotLaunched(notLaunched, userId); 825483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 826483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int packageDepth = parser.getDepth(); 827483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 828483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani && (type != XmlPullParser.END_TAG 829483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || parser.getDepth() > packageDepth)) { 830483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (type == XmlPullParser.END_TAG 831483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || type == XmlPullParser.TEXT) { 832483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani continue; 833483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 834483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani tagName = parser.getName(); 835483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ENABLED_COMPONENTS)) { 836483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani HashSet<String> components = readComponentsLPr(parser); 837483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setEnabledComponents(components, userId); 838483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (tagName.equals(TAG_DISABLED_COMPONENTS)) { 839483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani HashSet<String> components = readComponentsLPr(parser); 840483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setDisabledComponents(components, userId); 841483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 842483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 843483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else { 844483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: " 845483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + parser.getName()); 846483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani XmlUtils.skipCurrentTag(parser); 847483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 848483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 849483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 850483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani str.close(); 851483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 852483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (XmlPullParserException e) { 853483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("Error reading: " + e.toString()); 854483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.ERROR, 855483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Error reading stopped packages: " + e); 856483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 857483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 858483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (java.io.IOException e) { 859483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("Error reading: " + e.toString()); 860483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 861483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 862483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 863483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 864483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 865483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private HashSet<String> readComponentsLPr(XmlPullParser parser) 866483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani throws IOException, XmlPullParserException { 867483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani HashSet<String> components = new HashSet<String>(); 868483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int type; 869483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int outerDepth = parser.getDepth(); 870483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String tagName; 871483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 872483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani && (type != XmlPullParser.END_TAG 873483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || parser.getDepth() > outerDepth)) { 874483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (type == XmlPullParser.END_TAG 875483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || type == XmlPullParser.TEXT) { 876483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani continue; 877483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 878483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani tagName = parser.getName(); 879483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 880483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String componentName = parser.getAttributeValue(null, ATTR_NAME); 881483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (componentName != null) { 882483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani components.add(componentName); 883483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 884483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 885483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 886483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return components; 887483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 888483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 889483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani void writePackageRestrictionsLPr(int userId) { 890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keep the old stopped packages around until we know the new ones have 891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // been successfully written. 892483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani File userPackagesStateFile = getUserPackagesStateFile(userId); 893483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani File backupFile = getUserPackagesStateBackupFile(userId); 894483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani new File(userPackagesStateFile.getParent()).mkdirs(); 895483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (userPackagesStateFile.exists()) { 896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Presence of backup settings file indicates that we failed 897cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // to persist packages earlier. So preserve the older 898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // backup for future reference since the current packages 899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // might have been corrupted. 900483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (!backupFile.exists()) { 901483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (!userPackagesStateFile.renameTo(backupFile)) { 902483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, "Unable to backup user packages state file, " 903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot"); 904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 907483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userPackagesStateFile.delete(); 908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup"); 909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 913483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile); 914447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final BufferedOutputStream str = new BufferedOutputStream(fstr); 915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 916447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final XmlSerializer serializer = new FastXmlSerializer(); 917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setOutput(str, "utf-8"); 918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startDocument(null, true); 919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 921483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS); 922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 923447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 924483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (pkg.getStopped(userId) 925483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || pkg.getNotLaunched(userId) 926483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || pkg.getEnabled(userId) != COMPONENT_ENABLED_STATE_DEFAULT 927483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || pkg.getEnabledComponents(userId).size() > 0 928483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || pkg.getDisabledComponents(userId).size() > 0) { 929483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_PACKAGE); 930483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, pkg.name); 931483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean stopped = pkg.getStopped(userId); 932483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean notLaunched = pkg.getNotLaunched(userId); 933483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int enabled = pkg.getEnabled(userId); 934483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani HashSet<String> enabledComponents = pkg.getEnabledComponents(userId); 935483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani HashSet<String> disabledComponents = pkg.getDisabledComponents(userId); 936483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 937483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (stopped) { 938483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_STOPPED, "true"); 939483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 940483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (notLaunched) { 941483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NOT_LAUNCHED, "true"); 942483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 943483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (enabled != COMPONENT_ENABLED_STATE_DEFAULT) { 944483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_ENABLED, Integer.toString(enabled)); 945483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 946483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (enabledComponents.size() > 0) { 947483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ENABLED_COMPONENTS); 948483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (final String name : enabledComponents) { 949483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 950483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 951483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 952483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 953483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ENABLED_COMPONENTS); 954483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 955483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (disabledComponents.size() > 0) { 956483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_DISABLED_COMPONENTS); 957483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (final String name : disabledComponents) { 958483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 959483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 960483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 961483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 962483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_DISABLED_COMPONENTS); 963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 964483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_PACKAGE); 965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 967cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 968483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS); 969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endDocument(); 971cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // New settings successfully written, old ones are no longer 977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // needed. 978483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani backupFile.delete(); 979483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani FileUtils.setPermissions(userPackagesStateFile.toString(), 980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 98170522addd031f6c667849f76c074e463a141c61dNick Kralevich |FileUtils.S_IRGRP|FileUtils.S_IWGRP, 982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Done, all is good! 985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 987483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, 988483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Unable to write package manager user packages state, " 989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " current changes will be lost at reboot", e); 990cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clean up partially written files 993483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (userPackagesStateFile.exists()) { 994483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (!userPackagesStateFile.delete()) { 995483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: " 996483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + mStoppedPackagesFilename); 997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Note: assumed "stopped" field is already cleared in all packages. 1002483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Legacy reader, used to read in the old file format after an upgrade. Not used after that. 1003447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void readStoppedLPw() { 1004cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileInputStream str = null; 1005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mBackupStoppedPackagesFilename.exists()) { 1006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mBackupStoppedPackagesFilename); 1008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Reading from backup stopped packages file\n"); 1009483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.INFO, 1010483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Need to read from backup stopped packages file"); 1011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If both the backup and normal file exist, we 1013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ignore the normal one since it might have been 1014cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // corrupted. 1015cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file " 1016cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mStoppedPackagesFilename); 1017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mStoppedPackagesFilename.delete(); 1018cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We'll try for the normal settings file. 1021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1023cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (str == null) { 1026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mStoppedPackagesFilename.exists()) { 1027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No stopped packages file found\n"); 1028483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.INFO, 1029483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "No stopped packages file file; assuming all started"); 1030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // At first boot, make sure no packages are stopped. 1031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We usually want to have third party apps initialize 1032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // in the stopped state, but not at first boot. 1033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (PackageSetting pkg : mPackages.values()) { 1034483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkg.setStopped(false, 0); 1035483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkg.setNotLaunched(false, 0); 1036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mStoppedPackagesFilename); 1040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1041447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final XmlPullParser parser = Xml.newPullParser(); 1042cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root parser.setInput(str, null); 1043cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1044cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1045cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type=parser.next()) != XmlPullParser.START_TAG 1046cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && type != XmlPullParser.END_DOCUMENT) { 1047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 1048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1050cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type != XmlPullParser.START_TAG) { 1051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No start tag found in stopped packages file\n"); 1052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager stopped packages"); 1054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 1059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG 1060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || parser.getDepth() > outerDepth)) { 1061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG 1062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || type == XmlPullParser.TEXT) { 1063cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1064cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1067483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_PACKAGE)) { 1068483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 1069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting ps = mPackages.get(name); 1070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps != null) { 1071483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setStopped(true, 0); 1072483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("1".equals(parser.getAttributeValue(null, ATTR_NOT_LAUNCHED))) { 1073483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setNotLaunched(true, 0); 1074cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1075cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1076483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, 1077483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "No package known for stopped package: " + name); 1078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: " 1082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getName()); 1083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1089483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (XmlPullParserException e) { 1090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1091483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.ERROR, 1092483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Error reading stopped packages: " + e); 1093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 1094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1095483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (java.io.IOException e) { 1096cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 1099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1103447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeLPr() { 1104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024); 1105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keep the old settings around until we know the new ones have 1107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // been successfully written. 1108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Presence of backup settings file indicates that we failed 1110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // to persist settings earlier. So preserve the older 1111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // backup for future reference since the current settings 1112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // might have been corrupted. 1113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mBackupSettingsFilename.exists()) { 1114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) { 1115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, " 1116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " current changes will be lost at reboot"); 1117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename.delete(); 1121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Preserving older settings backup"); 1122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPastSignatures.clear(); 1126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileOutputStream fstr = new FileOutputStream(mSettingsFilename); 1129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BufferedOutputStream str = new BufferedOutputStream(fstr); 1130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //XmlSerializer serializer = XmlUtils.serializerInstance(); 1132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlSerializer serializer = new FastXmlSerializer(); 1133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setOutput(str, "utf-8"); 1134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startDocument(null, true); 1135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 1136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "packages"); 1138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "last-platform-version"); 1140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform)); 1141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform)); 1142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "last-platform-version"); 1143edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey 11440aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root if (mVerifierDeviceIdentity != null) { 11450aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.startTag(null, "verifier"); 11460aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.attribute(null, "device", mVerifierDeviceIdentity.toString()); 11470aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.endTag(null, "verifier"); 11480aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 11490aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 1150f53857716a0db805c51c0cae93550d90e32e4749Jeff Sharkey if (mReadExternalStorageEnforced != null) { 1151edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE); 1152edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey serializer.attribute( 11535d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0"); 1154edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE); 1155edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey } 1156edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey 1157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "permission-trees"); 1158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : mPermissionTrees.values()) { 1159447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePermissionLPr(serializer, bp); 1160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "permission-trees"); 1162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "permissions"); 1164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : mPermissions.values()) { 1165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePermissionLPr(serializer, bp); 1166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "permissions"); 1168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1169447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 1170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePackageLPr(serializer, pkg); 1171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mDisabledSysPackages.values()) { 1174447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writeDisabledSysPackageLPr(serializer, pkg); 1175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1177fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn writePreferredActivitiesLPr(serializer); 1178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1179447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final SharedUserSetting usr : mSharedUsers.values()) { 1180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "shared-user"); 1181483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, usr.name); 1182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "userId", 1183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Integer.toString(usr.userId)); 1184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root usr.signatures.writeXml(serializer, "sigs", mPastSignatures); 1185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (String name : usr.grantedPermissions) { 1187483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1188483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 1189483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "shared-user"); 1193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mPackagesToBeCleaned.size() > 0) { 1196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i=0; i<mPackagesToBeCleaned.size(); i++) { 1197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "cleaning-package"); 1198483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, mPackagesToBeCleaned.get(i)); 1199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "cleaning-package"); 1200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mRenamedPackages.size() > 0) { 12042f36229db823d152f3efd879e751e81a601a75b0Andy McFadden for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) { 1205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "renamed-package"); 1206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "new", e.getKey()); 1207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "old", e.getValue()); 1208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "renamed-package"); 1209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "packages"); 1213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endDocument(); 1215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 1217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 1218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // New settings successfully written, old ones are no longer 1221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // needed. 1222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupSettingsFilename.delete(); 1223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mSettingsFilename.toString(), 1224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 122570522addd031f6c667849f76c074e463a141c61dNick Kralevich |FileUtils.S_IRGRP|FileUtils.S_IWGRP, 1226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 1227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Write package list file now, use a JournaledFile. 1229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root File tempFile = new File(mPackageListFilename.toString() + ".tmp"); 1231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile); 1232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root fstr = new FileOutputStream(journal.chooseForWrite()); 1234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new BufferedOutputStream(fstr); 1235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root StringBuilder sb = new StringBuilder(); 1237447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 1238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ApplicationInfo ai = pkg.pkg.applicationInfo; 1239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String dataPath = ai.dataDir; 1240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; 1241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Avoid any application that has a space in its path 1243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // or that is handled by the system. 1244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID) 1245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // we store on each line the following information for now: 1248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // pkgName - package name 1250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // userId - application-specific user id 1251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // debugFlag - 0 or 1 if the package is debuggable. 1252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // dataPath - path to package's data path 1253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // NOTE: We prefer not to expose all ApplicationInfo flags for now. 1255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS 1257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES: 1258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // system/core/run-as/run-as.c 1259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.setLength(0); 1261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(ai.packageName); 1262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(" "); 1263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append((int)ai.uid); 1264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(isDebug ? " 1 " : " 0 "); 1265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(dataPath); 1266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append("\n"); 1267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.write(sb.toString().getBytes()); 1268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 1270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 1271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root journal.commit(); 127362539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root } catch (Exception e) { 127462539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root IoUtils.closeQuietly(str); 1275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root journal.rollback(); 1276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mPackageListFilename.toString(), 1279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 128070522addd031f6c667849f76c074e463a141c61dNick Kralevich |FileUtils.S_IRGRP|FileUtils.S_IWGRP, 1281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 1282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1283483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani writeAllUsersPackageRestrictionsLPr(); 1284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(XmlPullParserException e) { 1287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " 1288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot", e); 1289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 1290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " 1291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot", e); 1292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clean up partially written files 1294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.delete()) { 1296483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: " 1297483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + mSettingsFilename); 1298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Debug.stopMethodTracing(); 1301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1303fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn void writePreferredActivitiesLPr(XmlSerializer serializer) 1304fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn throws IllegalArgumentException, IllegalStateException, IOException { 1305fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn serializer.startTag(null, "preferred-activities"); 1306fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn for (final PreferredActivity pa : mPreferredActivities.filterSet()) { 1307fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn serializer.startTag(null, TAG_ITEM); 1308fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn pa.writeToXml(serializer); 1309fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn serializer.endTag(null, TAG_ITEM); 1310fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1311fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn serializer.endTag(null, "preferred-activities"); 1312fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1313fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1314447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg) 1315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws java.io.IOException { 1316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "updated-package"); 1317483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, pkg.name); 1318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.realName != null) { 1319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "realName", pkg.realName); 1320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "codePath", pkg.codePathString); 1322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); 1323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); 1324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); 1325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "version", String.valueOf(pkg.versionCode)); 1326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!pkg.resourcePathString.equals(pkg.codePathString)) { 1327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "resourcePath", pkg.resourcePathString); 1328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.nativeLibraryPathString != null) { 1330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString); 1331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1333135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani serializer.attribute(null, "userId", Integer.toString(pkg.appId)); 1334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1335135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId)); 1336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is a shared user, the permissions will 1340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be written there. We still need to write an 1341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // empty permissions list so permissionsFixed will 1342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be set. 1343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.grantedPermissions) { 1344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BasePermission bp = mPermissions.get(name); 1345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp != null) { 1346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We only need to write signature or system permissions but 1347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // this wont 1348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // match the semantics of grantedPermissions. So write all 1349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // permissions. 1350483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1351483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 1352483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "updated-package"); 1358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1360447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg) 1361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws java.io.IOException { 1362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "package"); 1363483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, pkg.name); 1364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.realName != null) { 1365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "realName", pkg.realName); 1366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "codePath", pkg.codePathString); 1368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!pkg.resourcePathString.equals(pkg.codePathString)) { 1369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "resourcePath", pkg.resourcePathString); 1370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.nativeLibraryPathString != null) { 1372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString); 1373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags)); 1375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); 1376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); 1377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); 1378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "version", String.valueOf(pkg.versionCode)); 1379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1380135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani serializer.attribute(null, "userId", Integer.toString(pkg.appId)); 1381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1382135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId)); 1383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.uidError) { 1385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "uidError", "true"); 1386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) { 1388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "installStatus", "false"); 1389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.installerPackageName != null) { 1391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "installer", pkg.installerPackageName); 1392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.signatures.writeXml(serializer, "sigs", mPastSignatures); 1394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) { 1395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is a shared user, the permissions will 1398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be written there. We still need to write an 1399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // empty permissions list so permissionsFixed will 1400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be set. 1401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.grantedPermissions) { 1402483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1403483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 1404483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "package"); 1411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1413447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writePermissionLPr(XmlSerializer serializer, BasePermission bp) 1414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws XmlPullParserException, java.io.IOException { 1415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) { 1416483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1417483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, bp.name); 1418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "package", bp.sourcePackage); 1419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) { 1420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel)); 1421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type=" 1424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + bp.type); 1425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.type == BasePermission.TYPE_DYNAMIC) { 1426447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo; 1427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi != null) { 1428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "type", "dynamic"); 1429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi.icon != 0) { 1430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "icon", Integer.toString(pi.icon)); 1431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi.nonLocalizedLabel != null) { 1433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "label", pi.nonLocalizedLabel.toString()); 1434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1437483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1441447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() { 1442447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final HashSet<String> kList = new HashSet<String>(mPackages.keySet()); 1443447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final Iterator<String> its = kList.iterator(); 1444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>(); 1445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while (its.hasNext()) { 1446447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String key = its.next(); 1447447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting ps = mPackages.get(key); 1448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) { 1449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ret.add(ps); 1450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return ret; 1453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1455483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean readLPw(List<UserInfo> users) { 1456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileInputStream str = null; 1457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mBackupSettingsFilename.exists()) { 1458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mBackupSettingsFilename); 1460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Reading from backup settings file\n"); 1461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, 1462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Need to read from backup settings file"); 1463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If both the backup and settings file exist, we 1465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ignore the settings since it might have been 1466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // corrupted. 1467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Cleaning up settings file " 1468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mSettingsFilename); 1469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename.delete(); 1470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We'll try for the normal settings file. 1473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1476447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root mPendingPackages.clear(); 1477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPastSignatures.clear(); 1478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (str == null) { 1481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.exists()) { 1482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No settings file found\n"); 1483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, 1484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No settings file; creating initial state"); 1485fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn readDefaultPreferredAppsLPw(); 1486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mSettingsFilename); 1489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlPullParser parser = Xml.newPullParser(); 1491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root parser.setInput(str, null); 1492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.START_TAG 1495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && type != XmlPullParser.END_DOCUMENT) { 1496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 1497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type != XmlPullParser.START_TAG) { 1500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No start tag found in settings file\n"); 1501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager settings"); 150358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn Log.wtf(PackageManagerService.TAG, 150458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn "No start tag found in package manager settings"); 1505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("package")) { 1517447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPackageLPw(parser); 1518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("permissions")) { 1519447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPermissionsLPw(mPermissions, parser); 1520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("permission-trees")) { 1521447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPermissionsLPw(mPermissionTrees, parser); 1522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("shared-user")) { 1523447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readSharedUserLPw(parser); 1524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("preferred-packages")) { 1525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // no longer used. 1526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("preferred-activities")) { 1527447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPreferredActivitiesLPw(parser); 1528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("updated-package")) { 1529447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readDisabledSysPackageLPw(parser); 1530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("cleaning-package")) { 1531483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 1532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackagesToBeCleaned.add(name); 1534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("renamed-package")) { 1536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nname = parser.getAttributeValue(null, "new"); 1537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String oname = parser.getAttributeValue(null, "old"); 1538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (nname != null && oname != null) { 1539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mRenamedPackages.put(nname, oname); 1540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("last-platform-version")) { 1542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mInternalSdkPlatform = mExternalSdkPlatform = 0; 1543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String internal = parser.getAttributeValue(null, "internal"); 1545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (internal != null) { 1546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mInternalSdkPlatform = Integer.parseInt(internal); 1547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String external = parser.getAttributeValue(null, "external"); 1549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (external != null) { 1550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mExternalSdkPlatform = Integer.parseInt(external); 1551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 15540aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } else if (tagName.equals("verifier")) { 15550aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root final String deviceIdentity = parser.getAttributeValue(null, "device"); 15560aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root try { 15570aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity); 15580aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } catch (IllegalArgumentException e) { 15590aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: " 15600aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root + e.getMessage()); 15610aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 1562edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) { 1563edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT); 15645d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey mReadExternalStorageEnforced = "1".equals(enforcement); 1565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: " 1567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getName()); 1568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (XmlPullParserException e) { 1575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e); 1578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e); 1583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mPendingPackages.size(); 1587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i = 0; i < N; i++) { 1588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final PendingPackage pp = mPendingPackages.get(i); 1589447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Object idObj = getUserIdLPr(pp.sharedId); 1590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (idObj != null && idObj instanceof SharedUserSetting) { 1591447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting p = getPackageLPw(pp.name, null, pp.realName, 1592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root (SharedUserSetting) idObj, pp.codePath, pp.resourcePath, 1593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true); 1594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p == null) { 1595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unable to create application package for " + pp.name); 1597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.copyFrom(pp); 1600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (idObj != null) { 1601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String msg = "Bad package setting: package " + pp.name + " has shared uid " 1602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pp.sharedId + " that is not a shared uid\n"; 1603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append(msg); 1604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, msg); 1605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String msg = "Bad package setting: package " + pp.name + " has shared uid " 1607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pp.sharedId + " that is not defined\n"; 1608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append(msg); 1609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, msg); 1610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPendingPackages.clear(); 1613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 16141d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root /* 16151d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root * Make sure all the updated system packages have their shared users 16161d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root * associated with them. 16171d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root */ 16181d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator(); 16191d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root while (disabledIt.hasNext()) { 16201d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final PackageSetting disabledPs = disabledIt.next(); 1621135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani final Object id = getUserIdLPr(disabledPs.appId); 16221d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root if (id != null && id instanceof SharedUserSetting) { 16231d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root disabledPs.sharedUser = (SharedUserSetting) id; 16241d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root } 16251d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root } 16261d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root 1627483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (mBackupStoppedPackagesFilename.exists() 1628483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || mStoppedPackagesFilename.exists()) { 1629483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Read old file 1630483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readStoppedLPw(); 1631483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mBackupStoppedPackagesFilename.delete(); 1632483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mStoppedPackagesFilename.delete(); 1633483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Migrate to new file format 1634483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani writePackageRestrictionsLPr(0); 1635483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else { 1636483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (users == null) { 1637483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readPackageRestrictionsLPr(0); 1638483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else { 1639483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 1640483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readPackageRestrictionsLPr(user.id); 1641483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1642483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1643483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, " 1645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mSharedUsers.size() + " shared uids\n"); 1646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 1648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1650fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn private void readDefaultPreferredAppsLPw() { 1651fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn // Read preferred apps from .../etc/preferred-apps directory. 1652fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps"); 1653fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!preferredDir.exists() || !preferredDir.isDirectory()) { 1654fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn return; 1655fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1656fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!preferredDir.canRead()) { 1657fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Directory " + preferredDir + " cannot be read"); 1658fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn return; 1659fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1660fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1661fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn // Iterate over the files in the directory and scan .xml files 1662fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn for (File f : preferredDir.listFiles()) { 1663fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!f.getPath().endsWith(".xml")) { 1664fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring"); 1665fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn continue; 1666fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1667fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!f.canRead()) { 1668fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Preferred apps file " + f + " cannot be read"); 1669fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn continue; 1670fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1671fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1672fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn FileInputStream str = null; 1673fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn try { 1674fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn str = new FileInputStream(f); 1675fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn XmlPullParser parser = Xml.newPullParser(); 1676fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn parser.setInput(str, null); 1677fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1678fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn int type; 1679fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn while ((type = parser.next()) != XmlPullParser.START_TAG 1680fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn && type != XmlPullParser.END_DOCUMENT) { 1681fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn ; 1682fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1683fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1684fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (type != XmlPullParser.START_TAG) { 1685fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Preferred apps file " + f + " does not have start tag"); 1686fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn continue; 1687fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1688fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!"preferred-activities".equals(parser.getName())) { 1689fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Preferred apps file " + f 1690fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn + " does not start with 'preferred-activities'"); 1691fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn continue; 1692fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1693fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn readPreferredActivitiesLPw(parser); 1694fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } catch (XmlPullParserException e) { 1695fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Error reading apps file " + f, e); 1696fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } catch (IOException e) { 1697fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Error reading apps file " + f, e); 1698fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } finally { 1699fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (str != null) { 1700fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn try { 1701fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn str.close(); 1702fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } catch (IOException e) { 1703fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1704fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1705fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1706fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1707fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1708fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private int readInt(XmlPullParser parser, String ns, String name, int defValue) { 1710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String v = parser.getAttributeValue(ns, name); 1711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (v == null) { 1713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return defValue; 1714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return Integer.parseInt(v); 1716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: attribute " + name 1719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad integer value " + v + " at " 1720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return defValue; 1723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1725447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser) 1726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1735447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String tagName = parser.getName(); 1736483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 1737483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final String name = parser.getAttributeValue(null, ATTR_NAME); 1738447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String sourcePackage = parser.getAttributeValue(null, "package"); 1739447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String ptype = parser.getAttributeValue(null, "type"); 1740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null && sourcePackage != null) { 1741447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final boolean dynamic = "dynamic".equals(ptype); 1742447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final BasePermission bp = new BasePermission(name, sourcePackage, 1743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL); 1744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.protectionLevel = readInt(parser, null, "protection", 1745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PermissionInfo.PROTECTION_NORMAL); 1746e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn bp.protectionLevel = PermissionInfo.fixProtectionLevel(bp.protectionLevel); 1747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dynamic) { 1748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PermissionInfo pi = new PermissionInfo(); 1749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.packageName = sourcePackage.intern(); 1750cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.name = name.intern(); 1751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.icon = readInt(parser, null, "icon", 0); 1752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.nonLocalizedLabel = parser.getAttributeValue(null, "label"); 1753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.protectionLevel = bp.protectionLevel; 1754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.pendingInfo = pi; 1755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root out.put(bp.name, bp); 1757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1759cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: permissions has" + " no name at " 1760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element reading permissions: " + parser.getName() + " at " 1765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1771447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException, 1772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root IOException { 1773483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 1774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName = parser.getAttributeValue(null, "realName"); 1775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String codePathStr = parser.getAttributeValue(null, "codePath"); 1776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String resourcePathStr = parser.getAttributeValue(null, "resourcePath"); 1777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); 1778cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (resourcePathStr == null) { 1779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = codePathStr; 1780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1781cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String version = parser.getAttributeValue(null, "version"); 1782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int versionCode = 0; 1783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (version != null) { 1784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode = Integer.parseInt(version); 1786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr), 1793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags); 1794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String timeStampStr = parser.getAttributeValue(null, "ft"); 1795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = Long.parseLong(timeStampStr, 16); 1798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.setTimeStamp(timeStamp); 1799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1800cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ts"); 1803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = Long.parseLong(timeStampStr); 1806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.setTimeStamp(timeStamp); 1807cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "it"); 1812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.firstInstallTime = Long.parseLong(timeStampStr, 16); 1815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ut"); 1819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1820cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.lastUpdateTime = Long.parseLong(timeStampStr, 16); 1822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = parser.getAttributeValue(null, "userId"); 1826135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani ps.appId = idStr != null ? Integer.parseInt(idStr) : 0; 1827135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (ps.appId <= 0) { 1828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String sharedIdStr = parser.getAttributeValue(null, "sharedUserId"); 1829135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani ps.appId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0; 1830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("perms")) { 1841447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, ps.grantedPermissions); 1842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <updated-package>: " + parser.getName()); 1845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.put(name, ps); 1849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1851447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException { 1852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = null; 1853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName = null; 1854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = null; 1855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String sharedIdStr = null; 1856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String codePathStr = null; 1857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String resourcePathStr = null; 1858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathStr = null; 1859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String systemStr = null; 1860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String installerPackageName = null; 1861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String uidError = null; 1862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = 0; 1864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long firstInstallTime = 0; 1865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long lastUpdateTime = 0; 1866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSettingBase packageSetting = null; 1867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String version = null; 1868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int versionCode = 0; 1869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1870483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani name = parser.getAttributeValue(null, ATTR_NAME); 1871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root realName = parser.getAttributeValue(null, "realName"); 1872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root idStr = parser.getAttributeValue(null, "userId"); 1873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root uidError = parser.getAttributeValue(null, "uidError"); 1874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sharedIdStr = parser.getAttributeValue(null, "sharedUserId"); 1875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root codePathStr = parser.getAttributeValue(null, "codePath"); 1876cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = parser.getAttributeValue(null, "resourcePath"); 1877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); 1878cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root version = parser.getAttributeValue(null, "version"); 1879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (version != null) { 1880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode = Integer.parseInt(version); 1882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root installerPackageName = parser.getAttributeValue(null, "installer"); 1886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemStr = parser.getAttributeValue(null, "flags"); 1888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (systemStr != null) { 1889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags = Integer.parseInt(systemStr); 1891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1893cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For backward compatibility 1895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemStr = parser.getAttributeValue(null, "system"); 1896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (systemStr != null) { 1897cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM 1898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root : 0; 1899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Old settings that don't specify system... just treat 1901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // them as system, good enough. 1902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String timeStampStr = parser.getAttributeValue(null, "ft"); 1906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStamp = Long.parseLong(timeStampStr, 16); 1909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ts"); 1913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStamp = Long.parseLong(timeStampStr); 1916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "it"); 1921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root firstInstallTime = Long.parseLong(timeStampStr, 16); 1924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ut"); 1928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root lastUpdateTime = Long.parseLong(timeStampStr, 16); 1931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr 1936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " sharedUserId=" + sharedIdStr); 1937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int userId = idStr != null ? Integer.parseInt(idStr) : 0; 1938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (resourcePathStr == null) { 1939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = codePathStr; 1940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (realName != null) { 1942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root realName = realName.intern(); 1943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name == null) { 1945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1946cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <package> has no name at " 1947cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1948cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (codePathStr == null) { 1949cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <package> has no codePath at " 1951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (userId > 0) { 1953447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr), 1954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode, 1955cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags); 1956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId=" 1958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + userId + " pkg=" + packageSetting); 1959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSetting == null) { 1960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid " 1961cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + userId + " while parsing settings at " 1962cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1964cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.setTimeStamp(timeStamp); 1965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.firstInstallTime = firstInstallTime; 1966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.lastUpdateTime = lastUpdateTime; 1967cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1968cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (sharedIdStr != null) { 1969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0; 1970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (userId > 0) { 1971cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting = new PendingPackage(name.intern(), realName, new File( 1972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId, 1973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode, pkgFlags); 1974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.setTimeStamp(timeStamp); 1975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.firstInstallTime = firstInstallTime; 1976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.lastUpdateTime = lastUpdateTime; 1977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPendingPackages.add((PendingPackage) packageSetting); 1978cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1979cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Reading package " + name 1980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + ": sharedUserId=" + userId + " pkg=" + packageSetting); 1981cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name 1984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad sharedId " + sharedIdStr + " at " 1985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1987cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1988cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 1990cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 1991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1994cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 1995cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 1996cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSetting != null) { 1998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.uidError = "true".equals(uidError); 1999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installerPackageName = installerPackageName; 2000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.nativeLibraryPathString = nativeLibraryPathStr; 2001483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Handle legacy string here for single-user mode 2002483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED); 2003cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (enabledStr != null) { 2004b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn try { 2005483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */); 2006b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } catch (NumberFormatException e) { 2007b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn if (enabledStr.equalsIgnoreCase("true")) { 2008483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0); 2009b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else if (enabledStr.equalsIgnoreCase("false")) { 2010483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0); 2011b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else if (enabledStr.equalsIgnoreCase("default")) { 2012483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0); 2013b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else { 2014b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn PackageManagerService.reportSettingsProblem(Log.WARN, 2015b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn "Error in package manager settings: package " + name 2016b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn + " has bad enabled value: " + idStr + " at " 2017b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn + parser.getPositionDescription()); 2018b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } 2019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2021483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0); 2022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2023483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 2024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String installStatusStr = parser.getAttributeValue(null, "installStatus"); 2025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (installStatusStr != null) { 2026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (installStatusStr.equalsIgnoreCase("false")) { 2027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE; 2028cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2029cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE; 2030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2034cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2035cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2041cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2042483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Legacy 2043483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_DISABLED_COMPONENTS)) { 2044483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readDisabledComponentsLPw(packageSetting, parser, 0); 2045483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (tagName.equals(TAG_ENABLED_COMPONENTS)) { 2046483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readEnabledComponentsLPw(packageSetting, parser, 0); 2047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("sigs")) { 2048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.signatures.readXml(parser, mPastSignatures); 2049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("perms")) { 2050447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions); 2051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.permissionsFixed = true; 2052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <package>: " + parser.getName()); 2055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2063483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser, 2064483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId) throws IOException, XmlPullParserException { 2065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2067cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2068cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2073cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2074483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 2075483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 2076cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 2077483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.addDisabledComponent(name.intern(), userId); 2078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <disabled-components> has" 2081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " no name at " + parser.getPositionDescription()); 2082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <disabled-components>: " + parser.getName()); 2086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2089cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2091483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser, 2092483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId) throws IOException, XmlPullParserException { 2093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2095cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2096cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2102483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 2103483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 2104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 2105483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.addEnabledComponent(name.intern(), userId); 2106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <enabled-components> has" 2109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " no name at " + parser.getPositionDescription()); 2110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <enabled-components>: " + parser.getName()); 2114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2119483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException { 2120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = null; 2121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = null; 2122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 2123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting su = null; 2124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 2125483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani name = parser.getAttributeValue(null, ATTR_NAME); 2126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root idStr = parser.getAttributeValue(null, "userId"); 2127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int userId = idStr != null ? Integer.parseInt(idStr) : 0; 2128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ("true".equals(parser.getAttributeValue(null, "system"))) { 2129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 2130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name == null) { 2132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <shared-user> has no name at " 2134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (userId == 0) { 2136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: shared-user " + name 2138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad userId " + idStr + " at " 2139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) { 2142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService 2143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at " 2144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 2150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 2151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 2153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (su != null) { 2155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("sigs")) { 2165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root su.signatures.readXml(parser, mPastSignatures); 2166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("perms")) { 2167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, su.grantedPermissions); 2168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <shared-user>: " + parser.getName()); 2171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2180447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms) 2181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 2182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2191483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 2192483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 2193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 2194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root outPerms.add(name.intern()); 2195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <perms> has" + " no name at " 2198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <perms>: " + parser.getName()); 2203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2208447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPreferredActivitiesLPw(XmlPullParser parser) throws XmlPullParserException, 2209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root IOException { 2210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2219483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 2220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PreferredActivity pa = new PreferredActivity(parser); 2221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pa.mPref.getParseError() == null) { 2222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPreferredActivities.addFilter(pa); 2223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <preferred-activity> " 2226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pa.mPref.getParseError() + " at " 2227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <preferred-activities>: " + parser.getName()); 2232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2237135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani void removeUserLPr(int userId) { 2238135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani File file = getUserPackagesStateFile(userId); 2239135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani file.delete(); 2240135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani file = getUserPackagesStateBackupFile(userId); 2241135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani file.delete(); 2242135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani } 2243135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani 2244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Returns -1 if we could not find an available UserId to assign 2245447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private int newUserIdLPw(Object obj) { 2246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Let's be stupidly inefficient for now... 2247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 2248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i = 0; i < N; i++) { 2249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mUserIds.get(i) == null) { 2250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.set(i, obj); 225121fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn return Process.FIRST_APPLICATION_UID + i; 2252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // None left? 225621fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) { 2257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return -1; 2258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.add(obj); 226121fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn return Process.FIRST_APPLICATION_UID + N; 2262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 22640aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() { 22650aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root if (mVerifierDeviceIdentity == null) { 22660aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root mVerifierDeviceIdentity = VerifierDeviceIdentity.generate(); 22670aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 22680aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root writeLPr(); 22690aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 22700aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 22710aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root return mVerifierDeviceIdentity; 22720aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 22730aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 2274447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root public PackageSetting getDisabledSystemPkgLPr(String name) { 2275447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting ps = mDisabledSysPackages.get(name); 2276447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return ps; 2277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2279483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean isEnabledLPr(ComponentInfo componentInfo, int flags, int userId) { 2280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 2282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2283483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final String pkgName = componentInfo.packageName; 2284483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final PackageSetting packageSettings = mPackages.get(pkgName); 2285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) { 2286483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = " 2287483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + componentInfo.packageName + " componentName = " + componentInfo.name); 2288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "enabledComponents: " 2289483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + Arrays.toString(packageSettings.getEnabledComponents(userId).toArray())); 2290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "disabledComponents: " 2291483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + Arrays.toString(packageSettings.getDisabledComponents(userId).toArray())); 2292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings == null) { 2294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 2295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2296483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final int enabled = packageSettings.getEnabled(userId); 2297483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (enabled == COMPONENT_ENABLED_STATE_DISABLED 2298483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || enabled == COMPONENT_ENABLED_STATE_DISABLED_USER 2299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled 2300483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani && enabled == COMPONENT_ENABLED_STATE_DEFAULT)) { 2301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 2302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2303483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (packageSettings.getEnabledComponents(userId).contains(componentInfo.name)) { 2304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 2305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2306483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (packageSettings.getDisabledComponents(userId).contains(componentInfo.name)) { 2307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 2308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return componentInfo.enabled; 2310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2311447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2312447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root String getInstallerPackageNameLPr(String packageName) { 2313447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 2314447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 2315447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 2316447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2317447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return pkg.installerPackageName; 2318447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2319447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2320483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int getApplicationEnabledSettingLPr(String packageName, int userId) { 2321447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 2322447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 2323447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 2324447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2325483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return pkg.getEnabled(userId); 2326447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2327447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2328483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int getComponentEnabledSettingLPr(ComponentName componentName, int userId) { 2329447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String packageName = componentName.getPackageName(); 2330447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 2331447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 2332447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown component: " + componentName); 2333447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2334447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String classNameStr = componentName.getClassName(); 2335483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return pkg.getCurrentEnabledStateLPr(classNameStr, userId); 2336447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2337483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 2338447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean setPackageStoppedStateLPw(String packageName, boolean stopped, 2339483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean allowedByPermission, int uid, int userId) { 2340483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int appId = UserId.getAppId(uid); 2341447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkgSetting = mPackages.get(packageName); 2342447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting == null) { 2343447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 2344447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2345135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (!allowedByPermission && (appId != pkgSetting.appId)) { 2346447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new SecurityException( 2347447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root "Permission Denial: attempt to change stopped state from pid=" 2348447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root + Binder.getCallingPid() 2349135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani + ", uid=" + uid + ", package uid=" + pkgSetting.appId); 2350447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2351447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (DEBUG_STOPPED) { 2352447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (stopped) { 2353447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root RuntimeException e = new RuntimeException("here"); 2354447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root e.fillInStackTrace(); 2355447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Slog.i(TAG, "Stopping package " + packageName, e); 2356447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2357447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2358483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (pkgSetting.getStopped(userId) != stopped) { 2359483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkgSetting.setStopped(stopped, userId); 2360483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // pkgSetting.pkg.mSetStopped = stopped; 2361483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (pkgSetting.getNotLaunched(userId)) { 2362447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting.installerPackageName != null) { 2363447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH, 2364447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.name, null, 2365135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani pkgSetting.installerPackageName, null, userId); 2366447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2367483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkgSetting.setNotLaunched(false, userId); 2368447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2369447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return true; 2370447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2371447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return false; 2372447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2373447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2374483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private List<UserInfo> getAllUsers() { 23757ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani long id = Binder.clearCallingIdentity(); 2376483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 2377483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return AppGlobals.getPackageManager().getUsers(); 2378483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (RemoteException re) { 2379483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Local to system process, shouldn't happen 2380483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (NullPointerException npe) { 2381483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // packagemanager not yet initialized 23827ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani } finally { 23837ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani Binder.restoreCallingIdentity(id); 2384483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 2385483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return null; 2386483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 2387483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 238820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato static final void printFlags(PrintWriter pw, int val, Object[] spec) { 238920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print("[ "); 239020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato for (int i=0; i<spec.length; i+=2) { 239120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato int mask = (Integer)spec[i]; 239220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato if ((val & mask) != 0) { 239320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print(spec[i+1]); 239420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print(" "); 239520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato } 239620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato } 239720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print("]"); 239820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato } 239920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato 240020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato static final Object[] FLAG_DUMP_SPEC = new Object[] { 240120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_SYSTEM, "SYSTEM", 240220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE", 240320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE", 240420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT", 240520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST", 240620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING", 240720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA", 240820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP", 240920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY", 241020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE", 241120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP", 241220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE", 241320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION", 241420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE", 241520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP", 241620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_STOPPED, "STOPPED", 241720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_FORWARD_LOCK, "FORWARD_LOCK", 241820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE", 241920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato }; 242020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato 2421447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2422447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 2423447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final Date date = new Date(); 2424447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 24257ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani List<UserInfo> users = getAllUsers(); 2426447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting ps : mPackages.values()) { 2427447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(ps.realName) 2428447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(ps.name)) { 2429447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2430447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2431447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2432447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null) { 2433447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root dumpState.setSharedUser(ps.sharedUser); 2434447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2435447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2436447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2437447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2438447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2439447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Packages:"); 2440447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2441447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2442447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Package ["); 2443447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(ps.realName != null ? ps.realName : ps.name); 2444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2445447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(ps))); 2446447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2447447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2448447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.realName != null) { 2449447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" compat name="); 2450447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.name); 2451447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2452447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2453135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani pw.print(" userId="); pw.print(ps.appId); 2454447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids)); 2455447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sharedUser="); pw.println(ps.sharedUser); 2456447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" pkg="); pw.println(ps.pkg); 2457447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" codePath="); pw.println(ps.codePathString); 2458447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" resourcePath="); pw.println(ps.resourcePathString); 2459447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" nativeLibraryPath="); pw.println(ps.nativeLibraryPathString); 2460447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" versionCode="); pw.println(ps.versionCode); 2461447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.pkg != null) { 2462eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root pw.print(" applicationInfo="); pw.println(ps.pkg.applicationInfo.toString()); 246320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print(" flags="); printFlags(pw, ps.pkg.applicationInfo.flags, FLAG_DUMP_SPEC); pw.println(); 2464447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" versionName="); pw.println(ps.pkg.mVersionName); 2465447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir); 2466447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion); 2467447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.pkg.mOperationPending) { 2468447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" mOperationPending=true"); 2469447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2470447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" supportsScreens=["); 2471447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean first = true; 2472447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) { 2473447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2474447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2475447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2476447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("small"); 2477447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2478447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) { 2479447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2480447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2481447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2482447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("medium"); 2483447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2484447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) { 2485447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2486447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2487447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2488447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("large"); 2489447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2490447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) { 2491447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2492447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2493447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2494447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("xlarge"); 2495447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2496447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) { 2497447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2498447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2499447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2500447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("resizeable"); 2501447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2502447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) { 2503447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2504447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2505447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2506447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("anyDensity"); 2507447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2508447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2509447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("]"); 2510447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" timeStamp="); 2511447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.timeStamp); 2512447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2513447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" firstInstallTime="); 2514447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.firstInstallTime); 2515447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2516447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" lastUpdateTime="); 2517447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.lastUpdateTime); 2518447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2519447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.installerPackageName != null) { 2520447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" installerPackageName="); pw.println(ps.installerPackageName); 2521447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2522447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" signatures="); pw.println(ps.signatures); 2523447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed); 2524447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" haveGids="); pw.println(ps.haveGids); 2525447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags)); 2526447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" installStatus="); pw.print(ps.installStatus); 2527483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 2528483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" User "); pw.print(user.id); pw.print(": "); 2529483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" stopped="); 2530483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(ps.getStopped(user.id)); 2531483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" enabled="); 2532483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.println(ps.getEnabled(user.id)); 2533483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (ps.getDisabledComponents(user.id).size() > 0) { 2534483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.println(" disabledComponents:"); 2535483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (String s : ps.getDisabledComponents(user.id)) { 2536483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" "); pw.println(s); 2537483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 2538447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2539483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (ps.getEnabledComponents(user.id).size() > 0) { 2540483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.println(" enabledComponents:"); 2541483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (String s : ps.getEnabledComponents(user.id)) { 2542483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" "); pw.println(s); 2543483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 2544447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2545447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2546447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.grantedPermissions.size() > 0) { 2547447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" grantedPermissions:"); 2548447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : ps.grantedPermissions) { 2549447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); pw.println(s); 2550447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2551447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2552447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2553447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2554447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = false; 2555447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (mRenamedPackages.size() > 0) { 25562f36229db823d152f3efd879e751e81a601a75b0Andy McFadden for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) { 2557447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(e.getKey()) 2558447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(e.getValue())) { 2559447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2560447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2561447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2562447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2563447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2564447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Renamed packages:"); 2565447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2566447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2567447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); 2568447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(e.getKey()); 2569447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" -> "); 2570447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(e.getValue()); 2571447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2572447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2573447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2574447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = false; 2575447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (mDisabledSysPackages.size() > 0) { 2576447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting ps : mDisabledSysPackages.values()) { 2577447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(ps.realName) 2578447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(ps.name)) { 2579447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2580447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2581447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2582447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2583447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2584447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Hidden system packages:"); 2585447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2586447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2587447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Package ["); 2588447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(ps.realName != null ? ps.realName : ps.name); 2589447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2590447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(ps))); 2591447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2592447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.realName != null) { 2593447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" compat name="); 2594447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.name); 2595447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2596eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root if (ps.pkg != null && ps.pkg.applicationInfo != null) { 2597eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root pw.print(" applicationInfo="); 2598eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root pw.println(ps.pkg.applicationInfo.toString()); 2599eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root } 2600447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); 2601135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani pw.println(ps.appId); 2602447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sharedUser="); 2603447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.sharedUser); 2604447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" codePath="); 2605447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.codePathString); 2606447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" resourcePath="); 2607447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.resourcePathString); 2608447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2609447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2610447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2611483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 2612447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2613447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2614447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (BasePermission p : mPermissions.values()) { 2615447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(p.sourcePackage)) { 2616447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2617447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2618447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2619447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2620447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2621447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Permissions:"); 2622447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2623447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2624447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Permission ["); pw.print(p.name); pw.print("] ("); 2625447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(p))); 2626447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2627447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sourcePackage="); pw.println(p.sourcePackage); 2628447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" uid="); pw.print(p.uid); 2629447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids)); 2630447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" type="); pw.print(p.type); 2631e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn pw.print(" prot="); 2632e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn pw.println(PermissionInfo.protectionToString(p.protectionLevel)); 2633447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (p.packageSetting != null) { 2634447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" packageSetting="); pw.println(p.packageSetting); 2635447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2636447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (p.perm != null) { 2637447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" perm="); pw.println(p.perm); 2638447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 26391c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey if (READ_EXTERNAL_STORAGE.equals(p.name)) { 26405d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey pw.print(" enforced="); 26415d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey pw.println(mReadExternalStorageEnforced); 26421c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey } 2643447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2644447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 26451c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey 2646447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2647447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2648447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (SharedUserSetting su : mSharedUsers.values()) { 2649447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && su != dumpState.getSharedUser()) { 2650447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2651447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2652447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2653447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2654447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2655447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Shared users:"); 2656447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2657447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2658447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" SharedUser ["); 2659447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(su.name); 2660447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2661447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(su))); 2662447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2663447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); 2664447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(su.userId); 2665447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); 2666447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(PackageManagerService.arrayToString(su.gids)); 2667447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" grantedPermissions:"); 2668447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : su.grantedPermissions) { 2669447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); 2670447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(s); 2671447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2672447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2673447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2674447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2675447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) { 2676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Settings parse messages:"); 2677447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(mReadMessages.toString()); 2678447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 26792f36229db823d152f3efd879e751e81a601a75b0Andy McFadden} 2680