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 35447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.ComponentName; 36258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.content.Context; 37447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.Intent; 38cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ApplicationInfo; 39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ComponentInfo; 407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackbornimport android.content.pm.PackageCleanItem; 41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageManager; 42cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageParser; 43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PermissionInfo; 44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.Signature; 45483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.content.pm.UserInfo; 467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackbornimport android.content.pm.PackageUserState; 470aaa0d931716e9f57a1d84d795fab2df75092756Kenny Rootimport android.content.pm.VerifierDeviceIdentity; 48447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.os.Binder; 49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Environment; 50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.FileUtils; 51cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Process; 52f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Log; 54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Slog; 55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.SparseArray; 56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Xml; 57cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 58cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.BufferedOutputStream; 59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File; 60cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileInputStream; 61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileOutputStream; 62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.IOException; 63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.PrintWriter; 64447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.text.SimpleDateFormat; 65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.ArrayList; 66cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Arrays; 67447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.util.Date; 68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashMap; 69cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet; 70cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Iterator; 71483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport java.util.List; 722f36229db823d152f3efd879e751e81a601a75b0Andy McFaddenimport java.util.Map; 736309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackbornimport java.util.Set; 746309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackbornimport java.util.Map.Entry; 75cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 7662539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Rootimport libcore.io.IoUtils; 7762539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root 78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/** 79cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Holds information about dynamic settings. 80cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 81cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class Settings { 82447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private static final String TAG = "PackageSettings"; 83447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 84447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private static final boolean DEBUG_STOPPED = false; 85258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani private static final boolean DEBUG_MU = false; 86447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 87edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage"; 88edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey private static final String ATTR_ENFORCEMENT = "enforcement"; 89edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey 90483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_ITEM = "item"; 91483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_DISABLED_COMPONENTS = "disabled-components"; 92483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_ENABLED_COMPONENTS = "enabled-components"; 93483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions"; 94483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String TAG_PACKAGE = "pkg"; 95483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 96483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String ATTR_NAME = "name"; 977767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn private static final String ATTR_USER = "user"; 987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn private static final String ATTR_CODE = "code"; 99483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String ATTR_NOT_LAUNCHED = "nl"; 100483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String ATTR_ENABLED = "enabled"; 101483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private static final String ATTR_STOPPED = "stopped"; 1027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn private static final String ATTR_INSTALLED = "inst"; 103483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mSettingsFilename; 105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mBackupSettingsFilename; 106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mPackageListFilename; 107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mStoppedPackagesFilename; 108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final File mBackupStoppedPackagesFilename; 109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, PackageSetting> mPackages = 110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, PackageSetting>(); 111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // List of replaced system applications 112c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root private final HashMap<String, PackageSetting> mDisabledSysPackages = 113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, PackageSetting>(); 114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // These are the last platform API version we were using for 116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // the apps installed on internal and external storage. It is 117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // used to grant newer permissions one time during a system upgrade. 118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int mInternalSdkPlatform; 119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int mExternalSdkPlatform; 1200aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 121f53857716a0db805c51c0cae93550d90e32e4749Jeff Sharkey Boolean mReadExternalStorageEnforced; 122edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey 1230aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root /** Device identity for the purpose of package verification. */ 1240aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root private VerifierDeviceIdentity mVerifierDeviceIdentity; 1250aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // The user's preferred activities associated with particular intent 127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // filters. 1286309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn final SparseArray<PreferredIntentResolver> mPreferredActivities = 1296309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn new SparseArray<PreferredIntentResolver>(); 1306309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn 131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, SharedUserSetting> mSharedUsers = 132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, SharedUserSetting>(); 133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final ArrayList<Object> mUserIds = new ArrayList<Object>(); 134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final SparseArray<Object> mOtherUserIds = 135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new SparseArray<Object>(); 136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For reading/writing settings file. 138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private final ArrayList<Signature> mPastSignatures = 139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new ArrayList<Signature>(); 140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Mapping from permission names to info about them. 142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, BasePermission> mPermissions = 143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, BasePermission>(); 144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Mapping from permission tree names to info about them. 146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, BasePermission> mPermissionTrees = 147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new HashMap<String, BasePermission>(); 148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Packages that have been uninstalled and still need their external 150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // storage data deleted. 151752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey final ArrayList<PackageCleanItem> mPackagesToBeCleaned = new ArrayList<PackageCleanItem>(); 152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Packages that have been renamed since they were first installed. 154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keys are the new names of the packages, values are the original 155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // names. The packages appear everwhere else under their original 156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // names. 157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final HashMap<String, String> mRenamedPackages = new HashMap<String, String>(); 158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final StringBuilder mReadMessages = new StringBuilder(); 160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 161447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root /** 162447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * Used to track packages that have a shared user ID that hasn't been read 163447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * in yet. 164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * <p> 165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * TODO: make this just a local variable that is passed in during package 166447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root * scanning to make it less confusing. 167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root */ 168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>(); 169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 170258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani private final Context mContext; 171258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani 172483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private final File mSystemDir; 173258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Settings(Context context) { 174258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani this(context, Environment.getDataDirectory()); 175483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 176483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 177258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Settings(Context context, File dataDir) { 178258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani mContext = context; 179483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mSystemDir = new File(dataDir, "system"); 180483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mSystemDir.mkdirs(); 181483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani FileUtils.setPermissions(mSystemDir.toString(), 182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRWXU|FileUtils.S_IRWXG 183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root |FileUtils.S_IROTH|FileUtils.S_IXOTH, 184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 185483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mSettingsFilename = new File(mSystemDir, "packages.xml"); 186483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml"); 187483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mPackageListFilename = new File(mSystemDir, "packages.list"); 188483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Deprecated: Needed for migration 189483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml"); 190483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml"); 191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 193447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage, 194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, 1957767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn String nativeLibraryPathString, int pkgFlags, UserHandle user, boolean add) { 196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String name = pkg.packageName; 197447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath, 1987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, 199f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani user, add, true /* allowInstall */); 200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 203447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting peekPackageLPr(String name) { 204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return mPackages.get(name); 205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void setInstallStatus(String pkgName, int status) { 208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(pkgName); 209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p != null) { 210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p.getInstallStatus() != status) { 211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setInstallStatus(status); 212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root void setInstallerPackageName(String pkgName, 217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String installerPkgName) { 218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(pkgName); 219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p != null) { 220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setInstallerPackageName(installerPkgName); 221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 224447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root SharedUserSetting getSharedUserLPw(String name, 225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags, boolean create) { 226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting s = mSharedUsers.get(name); 227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s == null) { 228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!create) { 229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s = new SharedUserSetting(name, pkgFlags); 23221fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn s.userId = newUserIdLPw(s); 233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId); 234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // < 0 means we couldn't assign a userid; fall out and return 235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // s, which is currently null 236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s.userId >= 0) { 237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.put(name, s); 238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 244447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean disableSystemPackageLPw(String name) { 245447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p == null) { 247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package"); 248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 250447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting dp = mDisabledSysPackages.get(name); 251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // always make sure the system package code and resource paths dont change 252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dp == null) { 253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if((p.pkg != null) && (p.pkg.applicationInfo != null)) { 254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; 255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.put(name, p); 257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // a little trick... when we install the new package, we don't 259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // want to modify the existing PackageSetting for the built-in 260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // version. so at this point we need a new PackageSetting that 261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // is okay to muck with. 262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting newp = new PackageSetting(p); 263447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root replacePackageLPw(name, newp); 264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 269447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting enableSystemPackageLPw(String name) { 270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mDisabledSysPackages.get(name); 271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if(p == null) { 272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled"); 273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Reset flag in ApplicationInfo object 276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if((p.pkg != null) && (p.pkg.applicationInfo != null)) { 277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; 278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 279447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath, 280135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.nativeLibraryPathString, p.appId, p.versionCode, p.pkgFlags); 281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.remove(name); 282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return ret; 283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 285c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root boolean isDisabledSystemPackageLPr(String name) { 286c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root return mDisabledSysPackages.containsKey(name); 287c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root } 288c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root 289c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root void removeDisabledSystemPackageLPw(String name) { 290c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root mDisabledSysPackages.remove(name); 291c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root } 292c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root 293447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath, 294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathString, int uid, int vc, int pkgFlags) { 295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(name); 296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 297135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (p.appId == uid) { 298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate package, keeping first: " + name); 302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString, 305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root vc, pkgFlags); 306135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = uid; 307447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (addUserIdLPw(uid, p, name)) { 308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, p); 309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 314447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) { 315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting s = mSharedUsers.get(name); 316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s != null) { 317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (s.userId == uid) { 318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate shared user, keeping first: " + name); 322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s = new SharedUserSetting(name, pkgFlags); 325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root s.userId = uid; 326447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (addUserIdLPw(uid, s, name)) { 327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.put(name, s); 328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return s; 329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Transfer ownership of permissions from one package to another. 334447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void transferPermissionsLPw(String origPkg, String newPkg) { 335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Transfer ownership of permissions to the new package. 336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i=0; i<2; i++) { 337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root HashMap<String, BasePermission> permissions = 338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root i == 0 ? mPermissionTrees : mPermissions; 339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : permissions.values()) { 340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (origPkg.equals(bp.sourcePackage)) { 341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, 342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Moving permission " + bp.name 343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " from pkg " + bp.sourcePackage 344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " + newPkg); 345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.sourcePackage = newPkg; 346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.packageSetting = null; 347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.perm = null; 348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.pendingInfo != null) { 349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.pendingInfo.packageName = newPkg; 350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.uid = 0; 352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.gids = null; 353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 357483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 358447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private PackageSetting getPackageLPw(String name, PackageSetting origPackage, 359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName, SharedUserSetting sharedUser, File codePath, File resourcePath, 3607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn String nativeLibraryPathString, int vc, int pkgFlags, 361f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani UserHandle installUser, boolean add, boolean allowInstall) { 362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting p = mPackages.get(name); 363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!p.codePath.equals(codePath)) { 365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Check to see if its a disabled system app 366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) { 367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // This is an updated system app with versions in both system 368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // and data partition. Just let the most recent version 369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // take precedence. 370483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, "Trying to update system app code path from " 371483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + p.codePathString + " to " + codePath.toString()); 372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Just a change in the code path is not an issue, but 374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // let's log a message about it. 375483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from " 376483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + p.codePath + " to " + codePath + "; Retaining data and using new"); 377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /* 378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Since we've changed paths, we need to prefer the new 379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * native library path over the one stored in the 380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * package settings since we might have moved from 381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * internal to external storage or vice versa. 382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString = nativeLibraryPathString; 384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != sharedUser) { 387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + name + " shared user changed from " 389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + (p.sharedUser != null ? p.sharedUser.name : "<nothing>") 390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " to " 391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + (sharedUser != null ? sharedUser.name : "<nothing>") 392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; replacing with new"); 393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = null; 394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) { 396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If what we are scanning is a system package, then 397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // make it so, regardless of whether it was previously 398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // installed only in the data partition. 399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p == null) { 404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (origPackage != null) { 405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We are consuming the data from an existing package. 406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(origPackage.name, name, codePath, resourcePath, 407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathString, vc, pkgFlags); 408483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " 409483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + name + " is adopting original package " + origPackage.name); 410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Note that we will retain the new package's signature so 411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // that we can keep its data. 412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSignatures s = p.signatures; 413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.copyFrom(origPackage); 414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures = s; 415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = origPackage.sharedUser; 416135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = origPackage.appId; 417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.origPackage = origPackage; 418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mRenamedPackages.put(name, origPackage.name); 419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root name = origPackage.name; 420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update new package state. 421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setTimeStamp(codePath.lastModified()); 422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p = new PackageSetting(name, realName, codePath, resourcePath, 424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathString, vc, pkgFlags); 425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.setTimeStamp(codePath.lastModified()); 426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = sharedUser; 427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is not a system app, it starts out stopped. 428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) { 429447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (DEBUG_STOPPED) { 430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root RuntimeException e = new RuntimeException("here"); 431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root e.fillInStackTrace(); 432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.i(PackageManagerService.TAG, "Stopping package " + name, e); 433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 434483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<UserInfo> users = getAllUsers(); 435f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani if (users != null && allowInstall) { 436483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 4377767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // By default we consider this app to be installed 4387767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // for the user if no user has been specified (which 4397767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // means to leave it at its original value, and the 4407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // original default value is true), or we are being 4417767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // asked to install for all users, or this is the 4427767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // user we are installing for. 4437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final boolean installed = installUser == null 4447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn || installUser.getIdentifier() == UserHandle.USER_ALL 4457767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn || installUser.getIdentifier() == user.id; 4467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn p.setUserState(user.id, COMPONENT_ENABLED_STATE_DEFAULT, 4477767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn installed, 4487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn true, // stopped, 4497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn true, // notLaunched 4507767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn null, null); 451483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani writePackageRestrictionsLPr(user.id); 452483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 453483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (sharedUser != null) { 456135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = sharedUser.userId; 45721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn } else { 458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone the setting here for disabled system packages 459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting dis = mDisabledSysPackages.get(name); 460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dis != null) { 461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For disabled packages a new setting is created 462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // from the existing user id. This still has to be 463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // added to list of user id's 464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Copy signatures from previous setting 465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dis.signatures.mSignatures != null) { 466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.signatures.mSignatures = dis.signatures.mSignatures.clone(); 467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 468135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = dis.appId; 469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone permissions 470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.grantedPermissions = new HashSet<String>(dis.grantedPermissions); 471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clone component info 472483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<UserInfo> users = getAllUsers(); 473483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (users != null) { 474483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 475483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId = user.id; 4767767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn p.setDisabledComponentsCopy( 4777767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn dis.getDisabledComponents(userId), userId); 4787767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn p.setEnabledComponentsCopy( 4797767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn dis.getEnabledComponents(userId), userId); 480483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 481483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Add new setting to list of user ids 483135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani addUserIdLPw(p.appId, p, name); 484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Assign new user id 486135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = newUserIdLPw(p); 487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 490135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (p.appId < 0) { 491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + name + " could not be assigned a valid uid"); 493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return null; 494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (add) { 496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Finish adding new package by adding it and updating shared 497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // user preferences 498447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addPackageSettingLPw(p, name, sharedUser); 499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 5007767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } else { 501f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani if (installUser != null && allowInstall) { 5027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // The caller has explicitly specified the user they want this 5037767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // package installed for, and the package already exists. 5047767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // Make sure it conforms to the new request. 5057767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn List<UserInfo> users = getAllUsers(); 5067767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (users != null) { 5077767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn for (UserInfo user : users) { 5087767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (installUser.getIdentifier() == UserHandle.USER_ALL 5097767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn || installUser.getIdentifier() == user.id) { 5107767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn boolean installed = p.getInstalled(user.id); 5117767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (!installed) { 5127767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn p.setInstalled(true, user.id); 5137767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn writePackageRestrictionsLPr(user.id); 5147767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 5157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 5167767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 5177767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 5187767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p; 521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 523447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) { 524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.pkg = pkg; 525483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // pkg.mSetEnabled = p.getEnabled(userId); 526483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // pkg.mSetStopped = p.getStopped(userId); 527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String codePath = pkg.applicationInfo.sourceDir; 528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String resourcePath = pkg.applicationInfo.publicSourceDir; 529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update code path if needed 530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!codePath.equalsIgnoreCase(p.codePathString)) { 531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName + 532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root " changing from " + p.codePathString + " to " + codePath); 533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePath = new File(codePath); 534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.codePathString = codePath; 535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Update resource path if needed 537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) { 538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName + 539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root " changing from " + p.resourcePathString + " to " + resourcePath); 540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.resourcePath = new File(resourcePath); 541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.resourcePathString = resourcePath; 542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update the native library path if needed 544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir; 545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (nativeLibraryPath != null 546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) { 547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.nativeLibraryPathString = nativeLibraryPath; 548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update version code if needed 550483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (pkg.mVersionCode != p.versionCode) { 551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.versionCode = pkg.mVersionCode; 552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 553483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Update signatures if needed. 554483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (p.signatures.mSignatures == null) { 555483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani p.signatures.assignSignatures(pkg.mSignatures); 556483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 5575455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root // Update flags if needed. 5585455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root if (pkg.applicationInfo.flags != p.pkgFlags) { 5595455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root p.pkgFlags = pkg.applicationInfo.flags; 5605455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root } 561483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // If this app defines a shared user id initialize 562483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // the shared user signatures as well. 563483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) { 564483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani p.sharedUser.signatures.assignSignatures(pkg.mSignatures); 565483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 566447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root addPackageSettingLPw(p, pkg.packageName, p.sharedUser); 567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Utility method that adds a PackageSetting to mPackages and 570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // completes updating the shared user attributes 571447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void addPackageSettingLPw(PackageSetting p, String name, 572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting sharedUser) { 573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, p); 574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (sharedUser != null) { 575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null && p.sharedUser != sharedUser) { 576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Package " + p.name + " was user " 578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + p.sharedUser + " but is now " + sharedUser 579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; I am not changing its files so it will probably fail!"); 580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 581135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani } else if (p.appId != sharedUser.userId) { 582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 583135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani "Package " + p.name + " was user id " + p.appId 584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " but is now user " + sharedUser 585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " with id " + sharedUser.userId 586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "; I am not changing its files so it will probably fail!"); 587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sharedUser.packages.add(p); 590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser = sharedUser; 591135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani p.appId = sharedUser.userId; 592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root /* 596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Update the shared user setting when a package using 597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * specifying the shared user id is removed. The gids 598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * associated with each permission of the deleted package 599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * are removed from the shared user's gid list only if its 600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * not in use by other permissions of packages in the 601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * shared user setting. 602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */ 603447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) { 604447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((deletedPs == null) || (deletedPs.pkg == null)) { 605447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Slog.i(PackageManagerService.TAG, 606447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root "Trying to update info for null package. Just ignoring"); 607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // No sharedUserId 610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (deletedPs.sharedUser == null) { 611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting sus = deletedPs.sharedUser; 614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update permissions 615447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String eachPerm : deletedPs.pkg.requestedPermissions) { 616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root boolean used = false; 617447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!sus.grantedPermissions.contains(eachPerm)) { 618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (PackageSetting pkg:sus.packages) { 621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.pkg != null && 622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) && 623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.pkg.requestedPermissions.contains(eachPerm)) { 624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root used = true; 625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root break; 626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!used) { 629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // can safely delete this permission from list 630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sus.grantedPermissions.remove(eachPerm); 631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Update gids 634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int newGids[] = globalGids; 635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (String eachPerm : sus.grantedPermissions) { 636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BasePermission bp = mPermissions.get(eachPerm); 637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp != null) { 638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root newGids = PackageManagerService.appendInts(newGids, bp.gids); 639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sus.gids = newGids; 642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 644447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root int removePackageLPw(String name) { 645447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.remove(name); 648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null) { 649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 650cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser.packages.size() == 0) { 651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSharedUsers.remove(p.sharedUser.name); 652447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root removeUserIdLPw(p.sharedUser.userId); 653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return p.sharedUser.userId; 654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 656135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani removeUserIdLPw(p.appId); 657135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani return p.appId; 658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return -1; 661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 663447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void replacePackageLPw(String name, PackageSetting newp) { 664447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting p = mPackages.get(name); 665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p != null) { 666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p.sharedUser != null) { 667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.remove(p); 668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.sharedUser.packages.add(newp); 669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 670135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani replaceUserIdLPw(p.appId, newp); 671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPackages.put(name, newp); 674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 675cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private boolean addUserIdLPw(int uid, Object obj, Object name) { 67721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid > Process.LAST_APPLICATION_UID) { 678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 679cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 68121fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid >= Process.FIRST_APPLICATION_UID) { 682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int N = mUserIds.size(); 68321fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn final int index = uid - Process.FIRST_APPLICATION_UID; 684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while (index >= N) { 685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.add(null); 686cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root N++; 687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mUserIds.get(index) != null) { 689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate user id: " + uid 691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " name=" + name); 692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.set(index, obj); 695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mOtherUserIds.get(uid) != null) { 697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, 698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Adding duplicate shared id: " + uid 699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " name=" + name); 700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.put(uid, obj); 703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 707447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root public Object getUserIdLPr(int uid) { 70821fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid >= Process.FIRST_APPLICATION_UID) { 709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 71021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn final int index = uid - Process.FIRST_APPLICATION_UID; 711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return index < N ? mUserIds.get(index) : null; 712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return mOtherUserIds.get(uid); 714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 717447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void removeUserIdLPw(int uid) { 71821fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid >= Process.FIRST_APPLICATION_UID) { 719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 72021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn final int index = uid - Process.FIRST_APPLICATION_UID; 721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (index < N) mUserIds.set(index, null); 722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.remove(uid); 724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 727447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void replaceUserIdLPw(int uid, Object obj) { 72821fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (uid >= Process.FIRST_APPLICATION_UID) { 729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 73021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn final int index = uid - Process.FIRST_APPLICATION_UID; 731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (index < N) mUserIds.set(index, obj); 732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mOtherUserIds.put(uid, obj); 734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 736cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 7376309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn PreferredIntentResolver editPreferredActivitiesLPw(int userId) { 7386309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn PreferredIntentResolver pir = mPreferredActivities.get(userId); 7396309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn if (pir == null) { 7406309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn pir = new PreferredIntentResolver(); 7416309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn mPreferredActivities.put(userId, pir); 7426309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 7436309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn return pir; 7446309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 7456309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn 746483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private File getUserPackagesStateFile(int userId) { 74761f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani return new File(Environment.getUserSystemDirectory(userId), "package-restrictions.xml"); 748483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 749483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 750483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private File getUserPackagesStateBackupFile(int userId) { 75161f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani return new File(Environment.getUserSystemDirectory(userId), 75261f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani "package-restrictions-backup.xml"); 753483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 754483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 755483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani void writeAllUsersPackageRestrictionsLPr() { 756483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<UserInfo> users = getAllUsers(); 757483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (users == null) return; 758483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 759483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 760483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani writePackageRestrictionsLPr(user.id); 761483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 762483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 763483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 764483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani void readAllUsersPackageRestrictionsLPr() { 765483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani List<UserInfo> users = getAllUsers(); 766483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (users == null) { 767483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readPackageRestrictionsLPr(0); 768483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 769483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 770483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 771483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 772483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readPackageRestrictionsLPr(user.id); 773483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 774483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 775483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 7766309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn private void readPreferredActivitiesLPw(XmlPullParser parser, int userId) 7776309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn throws XmlPullParserException, IOException { 7786309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn int outerDepth = parser.getDepth(); 7796309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn int type; 7806309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 7816309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 7826309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 7836309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn continue; 7846309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 7856309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn 7866309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn String tagName = parser.getName(); 7876309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn if (tagName.equals(TAG_ITEM)) { 7886309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn PreferredActivity pa = new PreferredActivity(parser); 7896309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn if (pa.mPref.getParseError() == null) { 7906309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn editPreferredActivitiesLPw(userId).addFilter(pa); 7916309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } else { 7926309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn PackageManagerService.reportSettingsProblem(Log.WARN, 7936309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn "Error in package manager settings: <preferred-activity> " 7946309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn + pa.mPref.getParseError() + " at " 7956309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn + parser.getPositionDescription()); 7966309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 7976309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } else { 7986309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn PackageManagerService.reportSettingsProblem(Log.WARN, 7996309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn "Unknown element under <preferred-activities>: " + parser.getName()); 8006309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn XmlUtils.skipCurrentTag(parser); 8016309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 8026309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 8036309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 8046309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn 805483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani void readPackageRestrictionsLPr(int userId) { 806258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani if (DEBUG_MU) { 807258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.i(TAG, "Reading package restrictions for user=" + userId); 808258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 809483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani FileInputStream str = null; 810483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani File userPackagesStateFile = getUserPackagesStateFile(userId); 811483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani File backupFile = getUserPackagesStateBackupFile(userId); 812483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (backupFile.exists()) { 813483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 814483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani str = new FileInputStream(backupFile); 815483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("Reading from backup stopped packages file\n"); 816483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.INFO, 817483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Need to read from backup stopped packages file"); 818483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (userPackagesStateFile.exists()) { 819483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // If both the backup and normal file exist, we 820483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // ignore the normal one since it might have been 821483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // corrupted. 822483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file " 823483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + userPackagesStateFile); 824483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userPackagesStateFile.delete(); 825483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 826483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (java.io.IOException e) { 827483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // We'll try for the normal settings file. 828483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 829483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 830483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 831483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 832483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (str == null) { 833483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (!userPackagesStateFile.exists()) { 834483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("No stopped packages file found\n"); 835483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.INFO, 836483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "No stopped packages file; " 837483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + "assuming all started"); 838483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // At first boot, make sure no packages are stopped. 839483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // We usually want to have third party apps initialize 8407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // in the stopped state, but not at first boot. Also 8417767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn // consider all applications to be installed. 842483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (PackageSetting pkg : mPackages.values()) { 8437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pkg.setUserState(userId, COMPONENT_ENABLED_STATE_DEFAULT, 8447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn true, // installed 8457767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn false, // stopped 8467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn false, // notLaunched 8477767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn null, null); 848483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 849483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 850483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 851483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani str = new FileInputStream(userPackagesStateFile); 852483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 853483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final XmlPullParser parser = Xml.newPullParser(); 854483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani parser.setInput(str, null); 855483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 856483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int type; 857483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani while ((type=parser.next()) != XmlPullParser.START_TAG 858483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani && type != XmlPullParser.END_DOCUMENT) { 859483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ; 860483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 861483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 862483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (type != XmlPullParser.START_TAG) { 863483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("No start tag found in package restrictions file\n"); 864483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.WARN, 865483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "No start tag found in package manager stopped packages"); 866483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return; 867483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 868483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 869483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int outerDepth = parser.getDepth(); 870483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageSetting ps = null; 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 879483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String tagName = parser.getName(); 880483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_PACKAGE)) { 881483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 882483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps = mPackages.get(name); 883483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (ps == null) { 884483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, "No package known for stopped package: " 885483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + name); 886483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani XmlUtils.skipCurrentTag(parser); 887483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani continue; 888483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 8897767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED); 8907767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final int enabled = enabledStr == null 8917767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn ? COMPONENT_ENABLED_STATE_DEFAULT : Integer.parseInt(enabledStr); 8927767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final String installedStr = parser.getAttributeValue(null, ATTR_INSTALLED); 8937767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final boolean installed = installedStr == null 8947767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn ? true : Boolean.parseBoolean(installedStr); 8957767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final String stoppedStr = parser.getAttributeValue(null, ATTR_STOPPED); 8967767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final boolean stopped = stoppedStr == null 8977767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn ? false : Boolean.parseBoolean(stoppedStr); 8987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final String notLaunchedStr = parser.getAttributeValue(null, ATTR_NOT_LAUNCHED); 8997767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn final boolean notLaunched = stoppedStr == null 9007767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn ? false : Boolean.parseBoolean(notLaunchedStr); 9017767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 9027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn HashSet<String> enabledComponents = null; 9037767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn HashSet<String> disabledComponents = null; 904483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 905483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int packageDepth = parser.getDepth(); 906483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 907483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani && (type != XmlPullParser.END_TAG 908483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || parser.getDepth() > packageDepth)) { 909483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (type == XmlPullParser.END_TAG 910483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || type == XmlPullParser.TEXT) { 911483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani continue; 912483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 913483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani tagName = parser.getName(); 914483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ENABLED_COMPONENTS)) { 9157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn enabledComponents = readComponentsLPr(parser); 916483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (tagName.equals(TAG_DISABLED_COMPONENTS)) { 9177767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn disabledComponents = readComponentsLPr(parser); 918483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 919483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 9207767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 9217767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn ps.setUserState(userId, enabled, installed, stopped, notLaunched, 9227767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn enabledComponents, disabledComponents); 9236309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } else if (tagName.equals("preferred-activities")) { 9246309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn readPreferredActivitiesLPw(parser, userId); 925483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else { 926483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: " 927483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + parser.getName()); 928483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani XmlUtils.skipCurrentTag(parser); 929483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 930483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 931483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 932483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani str.close(); 933483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 934483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (XmlPullParserException e) { 935483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("Error reading: " + e.toString()); 936483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.ERROR, 937483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Error reading stopped packages: " + e); 938483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 939483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 940483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (java.io.IOException e) { 941483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani mReadMessages.append("Error reading: " + e.toString()); 942483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 943483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 944483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 945483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 946483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 947483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private HashSet<String> readComponentsLPr(XmlPullParser parser) 948483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani throws IOException, XmlPullParserException { 9497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn HashSet<String> components = null; 950483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int type; 951483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int outerDepth = parser.getDepth(); 952483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String tagName; 953483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 954483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani && (type != XmlPullParser.END_TAG 955483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || parser.getDepth() > outerDepth)) { 956483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (type == XmlPullParser.END_TAG 957483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani || type == XmlPullParser.TEXT) { 958483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani continue; 959483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 960483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani tagName = parser.getName(); 961483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 962483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String componentName = parser.getAttributeValue(null, ATTR_NAME); 963483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (componentName != null) { 9647767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (components == null) { 9657767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn components = new HashSet<String>(); 9667767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 967483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani components.add(componentName); 968483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 969483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 970483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 971483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return components; 972483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 973483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 9746309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn void writePreferredActivitiesLPr(XmlSerializer serializer, int userId) 9756309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn throws IllegalArgumentException, IllegalStateException, IOException { 9766309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn serializer.startTag(null, "preferred-activities"); 9776309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn PreferredIntentResolver pir = mPreferredActivities.get(userId); 9786309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn if (pir != null) { 9796309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn for (final PreferredActivity pa : pir.filterSet()) { 9806309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn serializer.startTag(null, TAG_ITEM); 9816309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn pa.writeToXml(serializer); 9826309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn serializer.endTag(null, TAG_ITEM); 9836309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 9846309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 9856309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn serializer.endTag(null, "preferred-activities"); 9866309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 9876309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn 988483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani void writePackageRestrictionsLPr(int userId) { 989258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani if (DEBUG_MU) { 990258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani Log.i(TAG, "Writing package restrictions for user=" + userId); 991258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keep the old stopped packages around until we know the new ones have 993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // been successfully written. 994483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani File userPackagesStateFile = getUserPackagesStateFile(userId); 995483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani File backupFile = getUserPackagesStateBackupFile(userId); 996483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani new File(userPackagesStateFile.getParent()).mkdirs(); 997483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (userPackagesStateFile.exists()) { 998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Presence of backup settings file indicates that we failed 999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // to persist packages earlier. So preserve the older 1000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // backup for future reference since the current packages 1001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // might have been corrupted. 1002483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (!backupFile.exists()) { 1003483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (!userPackagesStateFile.renameTo(backupFile)) { 1004483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, "Unable to backup user packages state file, " 1005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot"); 1006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1009483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani userPackagesStateFile.delete(); 1010cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup"); 1011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1014cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1015483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile); 1016447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final BufferedOutputStream str = new BufferedOutputStream(fstr); 1017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1018447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final XmlSerializer serializer = new FastXmlSerializer(); 1019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setOutput(str, "utf-8"); 1020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startDocument(null, true); 1021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 1022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1023483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS); 1024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1025447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 10267767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn PackageUserState ustate = pkg.readUserState(userId); 10277767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.stopped || ustate.notLaunched || !ustate.installed 10287767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn || ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT 10297767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn || (ustate.enabledComponents != null 10307767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn && ustate.enabledComponents.size() > 0) 10317767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn || (ustate.disabledComponents != null 10327767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn && ustate.disabledComponents.size() > 0)) { 1033483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_PACKAGE); 1034483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, pkg.name); 10357767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (DEBUG_MU) Log.i(TAG, " pkg=" + pkg.name + ", state=" + ustate.enabled); 10367767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 10377767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (!ustate.installed) { 10387767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn serializer.attribute(null, ATTR_INSTALLED, "false"); 10397767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 10407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.stopped) { 1041483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_STOPPED, "true"); 1042483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 10437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.notLaunched) { 1044483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NOT_LAUNCHED, "true"); 1045483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 10467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) { 10477767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn serializer.attribute(null, ATTR_ENABLED, 10487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn Integer.toString(ustate.enabled)); 1049483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 10507767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.enabledComponents != null 10517767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn && ustate.enabledComponents.size() > 0) { 1052483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ENABLED_COMPONENTS); 10537767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn for (final String name : ustate.enabledComponents) { 1054483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1055483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 1056483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1057483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1058483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ENABLED_COMPONENTS); 1059483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 10607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.disabledComponents != null 10617767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn && ustate.disabledComponents.size() > 0) { 1062483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_DISABLED_COMPONENTS); 10637767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn for (final String name : ustate.disabledComponents) { 1064483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1065483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 1066483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1067483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 1068483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_DISABLED_COMPONENTS); 1069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1070483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_PACKAGE); 1071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1073cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 10746309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn writePreferredActivitiesLPr(serializer, userId); 10756309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn 1076483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS); 1077cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endDocument(); 1079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 1081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 1082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // New settings successfully written, old ones are no longer 1085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // needed. 1086483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani backupFile.delete(); 1087483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani FileUtils.setPermissions(userPackagesStateFile.toString(), 1088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 108970522addd031f6c667849f76c074e463a141c61dNick Kralevich |FileUtils.S_IRGRP|FileUtils.S_IWGRP, 1090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 1091cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1092cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Done, all is good! 1093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 1095483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, 1096483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Unable to write package manager user packages state, " 1097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " current changes will be lost at reboot", e); 1098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clean up partially written files 1101483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (userPackagesStateFile.exists()) { 1102483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (!userPackagesStateFile.delete()) { 1103483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: " 1104483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + mStoppedPackagesFilename); 1105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Note: assumed "stopped" field is already cleared in all packages. 1110483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Legacy reader, used to read in the old file format after an upgrade. Not used after that. 1111447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void readStoppedLPw() { 1112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileInputStream str = null; 1113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mBackupStoppedPackagesFilename.exists()) { 1114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mBackupStoppedPackagesFilename); 1116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Reading from backup stopped packages file\n"); 1117483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.INFO, 1118483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Need to read from backup stopped packages file"); 1119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If both the backup and normal file exist, we 1121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ignore the normal one since it might have been 1122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // corrupted. 1123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file " 1124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mStoppedPackagesFilename); 1125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mStoppedPackagesFilename.delete(); 1126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We'll try for the normal settings file. 1129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (str == null) { 1134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mStoppedPackagesFilename.exists()) { 1135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No stopped packages file found\n"); 1136483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.INFO, 1137483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "No stopped packages file file; assuming all started"); 1138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // At first boot, make sure no packages are stopped. 1139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We usually want to have third party apps initialize 1140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // in the stopped state, but not at first boot. 1141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (PackageSetting pkg : mPackages.values()) { 1142483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkg.setStopped(false, 0); 1143483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkg.setNotLaunched(false, 0); 1144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mStoppedPackagesFilename); 1148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1149447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final XmlPullParser parser = Xml.newPullParser(); 1150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root parser.setInput(str, null); 1151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type=parser.next()) != XmlPullParser.START_TAG 1154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && type != XmlPullParser.END_DOCUMENT) { 1155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 1156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type != XmlPullParser.START_TAG) { 1159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No start tag found in stopped packages file\n"); 1160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager stopped packages"); 1162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 1167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG 1168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || parser.getDepth() > outerDepth)) { 1169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG 1170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || type == XmlPullParser.TEXT) { 1171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1175483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_PACKAGE)) { 1176483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 1177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting ps = mPackages.get(name); 1178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps != null) { 1179483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setStopped(true, 0); 1180483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if ("1".equals(parser.getAttributeValue(null, ATTR_NOT_LAUNCHED))) { 1181483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani ps.setNotLaunched(true, 0); 1182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1184483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Slog.w(PackageManagerService.TAG, 1185483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "No package known for stopped package: " + name); 1186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: " 1190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getName()); 1191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1197483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (XmlPullParserException e) { 1198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1199483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani PackageManagerService.reportSettingsProblem(Log.ERROR, 1200483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani "Error reading stopped packages: " + e); 1201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 1202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1203483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (java.io.IOException e) { 1204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e); 1207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1211447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeLPr() { 1212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024); 1213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Keep the old settings around until we know the new ones have 1215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // been successfully written. 1216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Presence of backup settings file indicates that we failed 1218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // to persist settings earlier. So preserve the older 1219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // backup for future reference since the current settings 1220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // might have been corrupted. 1221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mBackupSettingsFilename.exists()) { 1222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) { 1223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, " 1224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " current changes will be lost at reboot"); 1225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename.delete(); 1229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Preserving older settings backup"); 1230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPastSignatures.clear(); 1234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileOutputStream fstr = new FileOutputStream(mSettingsFilename); 1237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BufferedOutputStream str = new BufferedOutputStream(fstr); 1238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //XmlSerializer serializer = XmlUtils.serializerInstance(); 1240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlSerializer serializer = new FastXmlSerializer(); 1241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setOutput(str, "utf-8"); 1242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startDocument(null, true); 1243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 1244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "packages"); 1246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "last-platform-version"); 1248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform)); 1249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform)); 1250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "last-platform-version"); 1251edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey 12520aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root if (mVerifierDeviceIdentity != null) { 12530aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.startTag(null, "verifier"); 12540aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.attribute(null, "device", mVerifierDeviceIdentity.toString()); 12550aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root serializer.endTag(null, "verifier"); 12560aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 12570aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 1258f53857716a0db805c51c0cae93550d90e32e4749Jeff Sharkey if (mReadExternalStorageEnforced != null) { 1259edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE); 1260edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey serializer.attribute( 12615d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0"); 1262edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE); 1263edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey } 1264edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey 1265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "permission-trees"); 1266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : mPermissionTrees.values()) { 1267447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePermissionLPr(serializer, bp); 1268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "permission-trees"); 1270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "permissions"); 1272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (BasePermission bp : mPermissions.values()) { 1273447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePermissionLPr(serializer, bp); 1274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "permissions"); 1276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1277447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 1278447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writePackageLPr(serializer, pkg); 1279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1281447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mDisabledSysPackages.values()) { 1282447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root writeDisabledSysPackageLPr(serializer, pkg); 1283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1285447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final SharedUserSetting usr : mSharedUsers.values()) { 1286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "shared-user"); 1287483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, usr.name); 1288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "userId", 1289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Integer.toString(usr.userId)); 1290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root usr.signatures.writeXml(serializer, "sigs", mPastSignatures); 1291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (String name : usr.grantedPermissions) { 1293483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1294483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 1295483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "shared-user"); 1299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mPackagesToBeCleaned.size() > 0) { 1302752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey for (PackageCleanItem item : mPackagesToBeCleaned) { 1303752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey final String userStr = Integer.toString(item.userId); 1304752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey serializer.startTag(null, "cleaning-package"); 1305752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey serializer.attribute(null, ATTR_NAME, item.packageName); 1306752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey serializer.attribute(null, ATTR_CODE, item.andCode ? "true" : "false"); 1307752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey serializer.attribute(null, ATTR_USER, userStr); 1308752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey serializer.endTag(null, "cleaning-package"); 1309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mRenamedPackages.size() > 0) { 13132f36229db823d152f3efd879e751e81a601a75b0Andy McFadden for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) { 1314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "renamed-package"); 1315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "new", e.getKey()); 1316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "old", e.getValue()); 1317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "renamed-package"); 1318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "packages"); 1322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endDocument(); 1324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 1326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 1327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // New settings successfully written, old ones are no longer 1330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // needed. 1331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mBackupSettingsFilename.delete(); 1332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mSettingsFilename.toString(), 1333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 133470522addd031f6c667849f76c074e463a141c61dNick Kralevich |FileUtils.S_IRGRP|FileUtils.S_IWGRP, 1335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 1336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Write package list file now, use a JournaledFile. 1338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root File tempFile = new File(mPackageListFilename.toString() + ".tmp"); 1340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile); 1341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root fstr = new FileOutputStream(journal.chooseForWrite()); 1343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new BufferedOutputStream(fstr); 1344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root StringBuilder sb = new StringBuilder(); 1346447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting pkg : mPackages.values()) { 1347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ApplicationInfo ai = pkg.pkg.applicationInfo; 1348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String dataPath = ai.dataDir; 1349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; 1350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Avoid any application that has a space in its path 1352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // or that is handled by the system. 13531358ebe46c47a8c5d80d3f9bc4768805ac80ca46Magnus Eriksson if (dataPath.indexOf(" ") >= 0 || ai.uid < Process.FIRST_APPLICATION_UID) 1354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // we store on each line the following information for now: 1357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // pkgName - package name 1359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // userId - application-specific user id 1360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // debugFlag - 0 or 1 if the package is debuggable. 1361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // dataPath - path to package's data path 1362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // NOTE: We prefer not to expose all ApplicationInfo flags for now. 1364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS 1366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES: 1367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // system/core/run-as/run-as.c 1368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // 1369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.setLength(0); 1370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(ai.packageName); 1371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(" "); 1372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append((int)ai.uid); 1373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(isDebug ? " 1 " : " 0 "); 1374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append(dataPath); 1375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sb.append("\n"); 1376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.write(sb.toString().getBytes()); 1377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.flush(); 1379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.sync(fstr); 1380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root journal.commit(); 138262539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root } catch (Exception e) { 138362539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root IoUtils.closeQuietly(str); 1384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root journal.rollback(); 1385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.setPermissions(mPackageListFilename.toString(), 1388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileUtils.S_IRUSR|FileUtils.S_IWUSR 138970522addd031f6c667849f76c074e463a141c61dNick Kralevich |FileUtils.S_IRGRP|FileUtils.S_IWGRP, 1390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root -1, -1); 1391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1392483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani writeAllUsersPackageRestrictionsLPr(); 1393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return; 1394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(XmlPullParserException e) { 1396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " 1397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot", e); 1398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch(java.io.IOException e) { 1399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " 1400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + "current changes will be lost at reboot", e); 1401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Clean up partially written files 1403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.delete()) { 1405483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: " 1406483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + mSettingsFilename); 1407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root //Debug.stopMethodTracing(); 1410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1412447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg) 1413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws java.io.IOException { 1414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "updated-package"); 1415483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, pkg.name); 1416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.realName != null) { 1417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "realName", pkg.realName); 1418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "codePath", pkg.codePathString); 1420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); 1421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); 1422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); 1423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "version", String.valueOf(pkg.versionCode)); 1424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!pkg.resourcePathString.equals(pkg.codePathString)) { 1425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "resourcePath", pkg.resourcePathString); 1426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.nativeLibraryPathString != null) { 1428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString); 1429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1431135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani serializer.attribute(null, "userId", Integer.toString(pkg.appId)); 1432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1433135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId)); 1434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is a shared user, the permissions will 1438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be written there. We still need to write an 1439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // empty permissions list so permissionsFixed will 1440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be set. 1441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.grantedPermissions) { 1442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root BasePermission bp = mPermissions.get(name); 1443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp != null) { 1444cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We only need to write signature or system permissions but 1445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // this wont 1446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // match the semantics of grantedPermissions. So write all 1447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // permissions. 1448483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1449483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 1450483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "updated-package"); 1456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1458447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg) 1459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws java.io.IOException { 1460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "package"); 1461483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, pkg.name); 1462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.realName != null) { 1463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "realName", pkg.realName); 1464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "codePath", pkg.codePathString); 1466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!pkg.resourcePathString.equals(pkg.codePathString)) { 1467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "resourcePath", pkg.resourcePathString); 1468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.nativeLibraryPathString != null) { 1470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString); 1471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags)); 1473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp)); 1474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime)); 1475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime)); 1476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "version", String.valueOf(pkg.versionCode)); 1477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1478135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani serializer.attribute(null, "userId", Integer.toString(pkg.appId)); 1479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1480135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId)); 1481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.uidError) { 1483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "uidError", "true"); 1484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) { 1486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "installStatus", "false"); 1487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.installerPackageName != null) { 1489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "installer", pkg.installerPackageName); 1490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkg.signatures.writeXml(serializer, "sigs", mPastSignatures); 1492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) { 1493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.startTag(null, "perms"); 1494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pkg.sharedUser == null) { 1495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If this is a shared user, the permissions will 1496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be written there. We still need to write an 1497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // empty permissions list so permissionsFixed will 1498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // be set. 1499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (final String name : pkg.grantedPermissions) { 1500483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1501483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, name); 1502483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "perms"); 1506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.endTag(null, "package"); 1509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1511447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void writePermissionLPr(XmlSerializer serializer, BasePermission bp) 1512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws XmlPullParserException, java.io.IOException { 1513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) { 1514483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.startTag(null, TAG_ITEM); 1515483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.attribute(null, ATTR_NAME, bp.name); 1516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "package", bp.sourcePackage); 1517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) { 1518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel)); 1519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 1521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type=" 1522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + bp.type); 1523cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (bp.type == BasePermission.TYPE_DYNAMIC) { 1524447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo; 1525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi != null) { 1526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "type", "dynamic"); 1527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi.icon != 0) { 1528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "icon", Integer.toString(pi.icon)); 1529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (pi.nonLocalizedLabel != null) { 1531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root serializer.attribute(null, "label", pi.nonLocalizedLabel.toString()); 1532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1535483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani serializer.endTag(null, TAG_ITEM); 1536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1539447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() { 1540447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final HashSet<String> kList = new HashSet<String>(mPackages.keySet()); 1541447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final Iterator<String> its = kList.iterator(); 1542447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>(); 1543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while (its.hasNext()) { 1544447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String key = its.next(); 1545447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting ps = mPackages.get(key); 1546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) { 1547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ret.add(ps); 1548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return ret; 1551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1553752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey void addPackageToCleanLPw(PackageCleanItem pkg) { 1554752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey if (!mPackagesToBeCleaned.contains(pkg)) { 1555752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey mPackagesToBeCleaned.add(pkg); 15567767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 15577767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 15587767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 1559483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean readLPw(List<UserInfo> users) { 1560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root FileInputStream str = null; 1561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mBackupSettingsFilename.exists()) { 1562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mBackupSettingsFilename); 1564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Reading from backup settings file\n"); 1565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, 1566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Need to read from backup settings file"); 1567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mSettingsFilename.exists()) { 1568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // If both the backup and settings file exist, we 1569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // ignore the settings since it might have been 1570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // corrupted. 1571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Cleaning up settings file " 1572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mSettingsFilename); 1573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mSettingsFilename.delete(); 1574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // We'll try for the normal settings file. 1577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1580447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root mPendingPackages.clear(); 1581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPastSignatures.clear(); 1582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (str == null) { 1585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (!mSettingsFilename.exists()) { 1586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No settings file found\n"); 1587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.INFO, 1588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No settings file; creating initial state"); 15896309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn readDefaultPreferredAppsLPw(0); 1590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str = new FileInputStream(mSettingsFilename); 1593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlPullParser parser = Xml.newPullParser(); 1595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root parser.setInput(str, null); 1596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.START_TAG 1599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && type != XmlPullParser.END_DOCUMENT) { 1600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 1601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type != XmlPullParser.START_TAG) { 1604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("No start tag found in settings file\n"); 1605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "No start tag found in package manager settings"); 160758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn Log.wtf(PackageManagerService.TAG, 160858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn "No start tag found in package manager settings"); 1609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 1610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("package")) { 1621447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPackageLPw(parser); 1622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("permissions")) { 1623447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPermissionsLPw(mPermissions, parser); 1624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("permission-trees")) { 1625447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readPermissionsLPw(mPermissionTrees, parser); 1626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("shared-user")) { 1627447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readSharedUserLPw(parser); 1628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("preferred-packages")) { 1629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // no longer used. 1630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("preferred-activities")) { 16316309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn // Upgrading from old single-user implementation; 16326309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn // these are the preferred activities for user 0. 16336309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn readPreferredActivitiesLPw(parser, 0); 1634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("updated-package")) { 1635447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readDisabledSysPackageLPw(parser); 1636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("cleaning-package")) { 1637483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 16387767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn String userStr = parser.getAttributeValue(null, ATTR_USER); 16397767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn String codeStr = parser.getAttributeValue(null, ATTR_CODE); 1640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 1641752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey int userId = 0; 16427767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn boolean andCode = true; 16437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn try { 16447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (userStr != null) { 1645752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey userId = Integer.parseInt(userStr); 16467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 16477767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } catch (NumberFormatException e) { 16487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 16497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (codeStr != null) { 16507767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn andCode = Boolean.parseBoolean(codeStr); 16517767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 1652752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey addPackageToCleanLPw(new PackageCleanItem(userId, name, andCode)); 1653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("renamed-package")) { 1655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nname = parser.getAttributeValue(null, "new"); 1656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String oname = parser.getAttributeValue(null, "old"); 1657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (nname != null && oname != null) { 1658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mRenamedPackages.put(nname, oname); 1659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("last-platform-version")) { 1661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mInternalSdkPlatform = mExternalSdkPlatform = 0; 1662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String internal = parser.getAttributeValue(null, "internal"); 1664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (internal != null) { 1665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mInternalSdkPlatform = Integer.parseInt(internal); 1666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String external = parser.getAttributeValue(null, "external"); 1668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (external != null) { 1669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mExternalSdkPlatform = Integer.parseInt(external); 1670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 16730aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } else if (tagName.equals("verifier")) { 16740aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root final String deviceIdentity = parser.getAttributeValue(null, "device"); 16750aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root try { 16760aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity); 16770aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } catch (IllegalArgumentException e) { 16780aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: " 16790aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root + e.getMessage()); 16800aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 1681edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) { 1682edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT); 16835d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey mReadExternalStorageEnforced = "1".equals(enforcement); 1684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: " 1686cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getName()); 1687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root str.close(); 1692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (XmlPullParserException e) { 1694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e); 1697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (java.io.IOException e) { 1699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Error reading: " + e.toString()); 1700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e); 1701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e); 1702258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani } 1703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mPendingPackages.size(); 1705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i = 0; i < N; i++) { 1706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final PendingPackage pp = mPendingPackages.get(i); 1707447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Object idObj = getUserIdLPr(pp.sharedId); 1708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (idObj != null && idObj instanceof SharedUserSetting) { 1709447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting p = getPackageLPw(pp.name, null, pp.realName, 1710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root (SharedUserSetting) idObj, pp.codePath, pp.resourcePath, 17117767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, 1712f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani null, true /* add */, false /* allowInstall */); 1713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (p == null) { 1714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unable to create application package for " + pp.name); 1716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root p.copyFrom(pp); 1719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (idObj != null) { 1720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String msg = "Bad package setting: package " + pp.name + " has shared uid " 1721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pp.sharedId + " that is not a shared uid\n"; 1722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append(msg); 1723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, msg); 1724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String msg = "Bad package setting: package " + pp.name + " has shared uid " 1726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + pp.sharedId + " that is not defined\n"; 1727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append(msg); 1728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, msg); 1729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPendingPackages.clear(); 1732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1733f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani if (mBackupStoppedPackagesFilename.exists() 1734f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani || mStoppedPackagesFilename.exists()) { 1735f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani // Read old file 1736f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani readStoppedLPw(); 1737f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani mBackupStoppedPackagesFilename.delete(); 1738f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani mStoppedPackagesFilename.delete(); 1739f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani // Migrate to new file format 1740f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani writePackageRestrictionsLPr(0); 1741f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani } else { 1742f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani if (users == null) { 1743f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani readPackageRestrictionsLPr(0); 1744f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani } else { 1745f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani for (UserInfo user : users) { 1746f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani readPackageRestrictionsLPr(user.id); 1747f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani } 1748f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani } 1749f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani } 1750f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani 17511d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root /* 17521d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root * Make sure all the updated system packages have their shared users 17531d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root * associated with them. 17541d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root */ 17551d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator(); 17561d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root while (disabledIt.hasNext()) { 17571d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root final PackageSetting disabledPs = disabledIt.next(); 1758135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani final Object id = getUserIdLPr(disabledPs.appId); 17591d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root if (id != null && id instanceof SharedUserSetting) { 17601d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root disabledPs.sharedUser = (SharedUserSetting) id; 17611d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root } 17621d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root } 17631d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root 1764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, " 1765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + mSharedUsers.size() + " shared uids\n"); 1766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 1768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 17706309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn private void readDefaultPreferredAppsLPw(int userId) { 1771fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn // Read preferred apps from .../etc/preferred-apps directory. 1772fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps"); 1773fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!preferredDir.exists() || !preferredDir.isDirectory()) { 1774fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn return; 1775fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1776fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!preferredDir.canRead()) { 1777fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Directory " + preferredDir + " cannot be read"); 1778fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn return; 1779fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1780fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1781fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn // Iterate over the files in the directory and scan .xml files 1782fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn for (File f : preferredDir.listFiles()) { 1783fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!f.getPath().endsWith(".xml")) { 1784fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring"); 1785fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn continue; 1786fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1787fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!f.canRead()) { 1788fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Preferred apps file " + f + " cannot be read"); 1789fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn continue; 1790fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1791fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1792fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn FileInputStream str = null; 1793fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn try { 1794fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn str = new FileInputStream(f); 1795fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn XmlPullParser parser = Xml.newPullParser(); 1796fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn parser.setInput(str, null); 1797fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1798fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn int type; 1799fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn while ((type = parser.next()) != XmlPullParser.START_TAG 1800fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn && type != XmlPullParser.END_DOCUMENT) { 1801fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn ; 1802fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1803fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1804fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (type != XmlPullParser.START_TAG) { 1805fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Preferred apps file " + f + " does not have start tag"); 1806fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn continue; 1807fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1808fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (!"preferred-activities".equals(parser.getName())) { 1809fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Preferred apps file " + f 1810fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn + " does not start with 'preferred-activities'"); 1811fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn continue; 1812fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 18136309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn readPreferredActivitiesLPw(parser, userId); 1814fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } catch (XmlPullParserException e) { 1815fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Error reading apps file " + f, e); 1816fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } catch (IOException e) { 1817fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn Slog.w(TAG, "Error reading apps file " + f, e); 1818fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } finally { 1819fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn if (str != null) { 1820fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn try { 1821fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn str.close(); 1822fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } catch (IOException e) { 1823fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1824fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1825fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1826fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1827fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn } 1828fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn 1829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root private int readInt(XmlPullParser parser, String ns, String name, int defValue) { 1830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String v = parser.getAttributeValue(ns, name); 1831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (v == null) { 1833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return defValue; 1834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return Integer.parseInt(v); 1836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: attribute " + name 1839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad integer value " + v + " at " 1840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return defValue; 1843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1845447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser) 1846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 1847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1855447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String tagName = parser.getName(); 1856483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 1857483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final String name = parser.getAttributeValue(null, ATTR_NAME); 1858447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String sourcePackage = parser.getAttributeValue(null, "package"); 1859447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String ptype = parser.getAttributeValue(null, "type"); 1860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null && sourcePackage != null) { 1861447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final boolean dynamic = "dynamic".equals(ptype); 1862447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final BasePermission bp = new BasePermission(name, sourcePackage, 1863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL); 1864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.protectionLevel = readInt(parser, null, "protection", 1865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PermissionInfo.PROTECTION_NORMAL); 1866e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn bp.protectionLevel = PermissionInfo.fixProtectionLevel(bp.protectionLevel); 1867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (dynamic) { 1868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PermissionInfo pi = new PermissionInfo(); 1869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.packageName = sourcePackage.intern(); 1870cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.name = name.intern(); 1871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.icon = readInt(parser, null, "icon", 0); 1872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.nonLocalizedLabel = parser.getAttributeValue(null, "label"); 1873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pi.protectionLevel = bp.protectionLevel; 1874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root bp.pendingInfo = pi; 1875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1876cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root out.put(bp.name, bp); 1877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1878cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: permissions has" + " no name at " 1880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element reading permissions: " + parser.getName() + " at " 1885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 1886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1891447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException, 1892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root IOException { 1893483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 1894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName = parser.getAttributeValue(null, "realName"); 1895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String codePathStr = parser.getAttributeValue(null, "codePath"); 1896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String resourcePathStr = parser.getAttributeValue(null, "resourcePath"); 1897cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); 1898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (resourcePathStr == null) { 1899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = codePathStr; 1900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String version = parser.getAttributeValue(null, "version"); 1902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int versionCode = 0; 1903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (version != null) { 1904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode = Integer.parseInt(version); 1906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 1912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr), 1913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags); 1914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String timeStampStr = parser.getAttributeValue(null, "ft"); 1915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = Long.parseLong(timeStampStr, 16); 1918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.setTimeStamp(timeStamp); 1919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ts"); 1923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = Long.parseLong(timeStampStr); 1926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.setTimeStamp(timeStamp); 1927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "it"); 1932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.firstInstallTime = Long.parseLong(timeStampStr, 16); 1935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ut"); 1939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 1940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ps.lastUpdateTime = Long.parseLong(timeStampStr, 16); 1942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 1943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = parser.getAttributeValue(null, "userId"); 1946135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani ps.appId = idStr != null ? Integer.parseInt(idStr) : 0; 1947135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (ps.appId <= 0) { 1948cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String sharedIdStr = parser.getAttributeValue(null, "sharedUserId"); 1949135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani ps.appId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0; 1950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 1952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 1953cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 1955cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 1956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 1957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 1960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("perms")) { 1961447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, ps.grantedPermissions); 1962cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 1963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 1964cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <updated-package>: " + parser.getName()); 1965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 1966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1967cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1968cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mDisabledSysPackages.put(name, ps); 1969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 1970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 1971447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException { 1972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = null; 1973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String realName = null; 1974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = null; 1975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String sharedIdStr = null; 1976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String codePathStr = null; 1977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String resourcePathStr = null; 1978cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String nativeLibraryPathStr = null; 1979cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String systemStr = null; 1980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String installerPackageName = null; 1981cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String uidError = null; 1982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 1983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long timeStamp = 0; 1984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long firstInstallTime = 0; 1985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root long lastUpdateTime = 0; 1986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageSettingBase packageSetting = null; 1987cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String version = null; 1988cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int versionCode = 0; 1989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 1990483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani name = parser.getAttributeValue(null, ATTR_NAME); 1991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root realName = parser.getAttributeValue(null, "realName"); 1992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root idStr = parser.getAttributeValue(null, "userId"); 1993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root uidError = parser.getAttributeValue(null, "uidError"); 1994cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root sharedIdStr = parser.getAttributeValue(null, "sharedUserId"); 1995cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root codePathStr = parser.getAttributeValue(null, "codePath"); 1996cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = parser.getAttributeValue(null, "resourcePath"); 1997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath"); 1998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root version = parser.getAttributeValue(null, "version"); 1999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (version != null) { 2000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 2001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode = Integer.parseInt(version); 2002cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2003cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2004cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root installerPackageName = parser.getAttributeValue(null, "installer"); 2006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemStr = parser.getAttributeValue(null, "flags"); 2008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (systemStr != null) { 2009cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 2010cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags = Integer.parseInt(systemStr); 2011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2014cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // For backward compatibility 2015cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root systemStr = parser.getAttributeValue(null, "system"); 2016cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (systemStr != null) { 2017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM 2018cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root : 0; 2019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Old settings that don't specify system... just treat 2021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // them as system, good enough. 2022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 2023cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String timeStampStr = parser.getAttributeValue(null, "ft"); 2026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 2027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 2028cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStamp = Long.parseLong(timeStampStr, 16); 2029cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ts"); 2033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 2034cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 2035cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStamp = Long.parseLong(timeStampStr); 2036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "it"); 2041cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 2042cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 2043cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root firstInstallTime = Long.parseLong(timeStampStr, 16); 2044cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2045cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2046cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root timeStampStr = parser.getAttributeValue(null, "ut"); 2048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (timeStampStr != null) { 2049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 2050cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root lastUpdateTime = Long.parseLong(timeStampStr, 16); 2051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 2055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr 2056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " sharedUserId=" + sharedIdStr); 2057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int userId = idStr != null ? Integer.parseInt(idStr) : 0; 2058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (resourcePathStr == null) { 2059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root resourcePathStr = codePathStr; 2060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (realName != null) { 2062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root realName = realName.intern(); 2063cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2064cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name == null) { 2065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <package> has no name at " 2067cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2068cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (codePathStr == null) { 2069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <package> has no codePath at " 2071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (userId > 0) { 2073447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr), 2074cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode, 2075cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags); 2076cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 2077cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId=" 2078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + userId + " pkg=" + packageSetting); 2079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSetting == null) { 2080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid " 2081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + userId + " while parsing settings at " 2082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.setTimeStamp(timeStamp); 2085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.firstInstallTime = firstInstallTime; 2086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.lastUpdateTime = lastUpdateTime; 2087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (sharedIdStr != null) { 2089cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0; 2090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (userId > 0) { 2091cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting = new PendingPackage(name.intern(), realName, new File( 2092cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId, 2093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root versionCode, pkgFlags); 2094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.setTimeStamp(timeStamp); 2095cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.firstInstallTime = firstInstallTime; 2096cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.lastUpdateTime = lastUpdateTime; 2097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mPendingPackages.add((PendingPackage) packageSetting); 2098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) 2099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.i(PackageManagerService.TAG, "Reading package " + name 2100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + ": sharedUserId=" + userId + " pkg=" + packageSetting); 2101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name 2104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad sharedId " + sharedIdStr + " at " 2105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 2110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 2111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 2115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 2116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSetting != null) { 2118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.uidError = "true".equals(uidError); 2119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installerPackageName = installerPackageName; 2120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.nativeLibraryPathString = nativeLibraryPathStr; 2121483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Handle legacy string here for single-user mode 2122483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED); 2123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (enabledStr != null) { 2124b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn try { 2125483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */); 2126b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } catch (NumberFormatException e) { 2127b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn if (enabledStr.equalsIgnoreCase("true")) { 2128483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0); 2129b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else if (enabledStr.equalsIgnoreCase("false")) { 2130483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0); 2131b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else if (enabledStr.equalsIgnoreCase("default")) { 2132483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0); 2133b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } else { 2134b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn PackageManagerService.reportSettingsProblem(Log.WARN, 2135b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn "Error in package manager settings: package " + name 2136b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn + " has bad enabled value: " + idStr + " at " 2137b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn + parser.getPositionDescription()); 2138b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn } 2139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2141483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0); 2142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2143483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 2144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final String installStatusStr = parser.getAttributeValue(null, "installStatus"); 2145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (installStatusStr != null) { 2146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (installStatusStr.equalsIgnoreCase("false")) { 2147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE; 2148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE; 2150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2162483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // Legacy 2163483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_DISABLED_COMPONENTS)) { 2164483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readDisabledComponentsLPw(packageSetting, parser, 0); 2165483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } else if (tagName.equals(TAG_ENABLED_COMPONENTS)) { 2166483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani readEnabledComponentsLPw(packageSetting, parser, 0); 2167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("sigs")) { 2168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.signatures.readXml(parser, mPastSignatures); 2169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("perms")) { 2170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions); 2171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root packageSetting.permissionsFixed = true; 2172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <package>: " + parser.getName()); 2175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2183483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser, 2184483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId) throws IOException, XmlPullParserException { 2185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2194483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 2195483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 2196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 2197483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.addDisabledComponent(name.intern(), userId); 2198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <disabled-components> has" 2201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " no name at " + parser.getPositionDescription()); 2202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <disabled-components>: " + parser.getName()); 2206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2211483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser, 2212483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int userId) throws IOException, XmlPullParserException { 2213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2222483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 2223483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 2224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 2225483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani packageSetting.addEnabledComponent(name.intern(), userId); 2226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <enabled-components> has" 2229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " no name at " + parser.getPositionDescription()); 2230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <enabled-components>: " + parser.getName()); 2234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2239483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException { 2240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String name = null; 2241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String idStr = null; 2242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int pkgFlags = 0; 2243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root SharedUserSetting su = null; 2244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root try { 2245483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani name = parser.getAttributeValue(null, ATTR_NAME); 2246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root idStr = parser.getAttributeValue(null, "userId"); 2247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int userId = idStr != null ? Integer.parseInt(idStr) : 0; 2248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ("true".equals(parser.getAttributeValue(null, "system"))) { 2249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root pkgFlags |= ApplicationInfo.FLAG_SYSTEM; 2250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name == null) { 2252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <shared-user> has no name at " 2254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (userId == 0) { 2256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: shared-user " + name 2258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + " has bad userId " + idStr + " at " 2259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2261447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) { 2262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService 2263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at " 2264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } catch (NumberFormatException e) { 2268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: package " + name + " has bad userId " 2270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + idStr + " at " + parser.getPositionDescription()); 2271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root ; 2273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (su != null) { 2275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (tagName.equals("sigs")) { 2285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root su.signatures.readXml(parser, mPastSignatures); 2286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else if (tagName.equals("perms")) { 2287447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root readGrantedPermissionsLPw(parser, su.grantedPermissions); 2288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <shared-user>: " + parser.getName()); 2291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2300447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms) 2301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root throws IOException, XmlPullParserException { 2302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int outerDepth = parser.getDepth(); 2303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root int type; 2304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 2307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root continue; 2308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root String tagName = parser.getName(); 2311483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (tagName.equals(TAG_ITEM)) { 2312483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String name = parser.getAttributeValue(null, ATTR_NAME); 2313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (name != null) { 2314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root outPerms.add(name.intern()); 2315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Error in package manager settings: <perms> has" + " no name at " 2318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root + parser.getPositionDescription()); 2319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } else { 2321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root PackageManagerService.reportSettingsProblem(Log.WARN, 2322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root "Unknown element under <perms>: " + parser.getName()); 2323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root XmlUtils.skipCurrentTag(parser); 2325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 23286309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn void createNewUserLILPw(Installer installer, int userHandle, File path) { 23296309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn path.mkdir(); 23306309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG 23316309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn | FileUtils.S_IXOTH, -1, -1); 23326309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn for (PackageSetting ps : mPackages.values()) { 23336309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn // Only system apps are initially installed. 23346309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle); 23356309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn // Need to create a data directory for all apps under this user. 23366309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn installer.createUserData(ps.name, 23376309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn UserHandle.getUid(userHandle, ps.appId), userHandle); 23386309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 23396309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn readDefaultPreferredAppsLPw(userHandle); 23406309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn writePackageRestrictionsLPr(userHandle); 2341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2343135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani void removeUserLPr(int userId) { 23446309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn Set<Entry<String, PackageSetting>> entries = mPackages.entrySet(); 23456309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn for (Entry<String, PackageSetting> entry : entries) { 23466309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn entry.getValue().removeUser(userId); 23476309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn } 23486309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn mPreferredActivities.remove(userId); 2349135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani File file = getUserPackagesStateFile(userId); 2350135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani file.delete(); 2351135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani file = getUserPackagesStateBackupFile(userId); 2352135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani file.delete(); 2353135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani } 2354135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani 2355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Returns -1 if we could not find an available UserId to assign 2356447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root private int newUserIdLPw(Object obj) { 2357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // Let's be stupidly inefficient for now... 2358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root final int N = mUserIds.size(); 2359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root for (int i = 0; i < N; i++) { 2360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (mUserIds.get(i) == null) { 2361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.set(i, obj); 236221fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn return Process.FIRST_APPLICATION_UID + i; 2363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root // None left? 236721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) { 2368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return -1; 2369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 2371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root mUserIds.add(obj); 237221fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn return Process.FIRST_APPLICATION_UID + N; 2373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 23750aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() { 23760aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root if (mVerifierDeviceIdentity == null) { 23770aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root mVerifierDeviceIdentity = VerifierDeviceIdentity.generate(); 23780aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 23790aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root writeLPr(); 23800aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 23810aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 23820aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root return mVerifierDeviceIdentity; 23830aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 23840aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 2385447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root public PackageSetting getDisabledSystemPkgLPr(String name) { 2386447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageSetting ps = mDisabledSysPackages.get(name); 2387447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return ps; 2388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root 23907767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn private String compToString(HashSet<String> cmp) { 23917767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn return cmp != null ? Arrays.toString(cmp.toArray()) : "[]"; 23927767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn } 23937767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn 2394483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean isEnabledLPr(ComponentInfo componentInfo, int flags, int userId) { 2395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 2397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2398483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final String pkgName = componentInfo.packageName; 2399483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani final PackageSetting packageSettings = mPackages.get(pkgName); 2400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (PackageManagerService.DEBUG_SETTINGS) { 2401483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = " 2402483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani + componentInfo.packageName + " componentName = " + componentInfo.name); 2403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "enabledComponents: " 24047767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn + compToString(packageSettings.getEnabledComponents(userId))); 2405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root Log.v(PackageManagerService.TAG, "disabledComponents: " 24067767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn + compToString(packageSettings.getDisabledComponents(userId))); 2407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root if (packageSettings == null) { 2409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 2410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 24117767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn PackageUserState ustate = packageSettings.readUserState(userId); 24127767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED 24137767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn || ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER 2414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled 24157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn && ustate.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) { 2416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 2417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 24187767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.enabledComponents != null 24197767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn && ustate.enabledComponents.contains(componentInfo.name)) { 2420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return true; 2421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 24227767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (ustate.disabledComponents != null 24237767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn && ustate.disabledComponents.contains(componentInfo.name)) { 2424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return false; 2425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root return componentInfo.enabled; 2427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root } 2428447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2429447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root String getInstallerPackageNameLPr(String packageName) { 2430447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 2431447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 2432447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 2433447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2434447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return pkg.installerPackageName; 2435447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2436447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2437483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int getApplicationEnabledSettingLPr(String packageName, int userId) { 2438447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 2439447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 2440447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 2441447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2442483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return pkg.getEnabled(userId); 2443447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2445483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani int getComponentEnabledSettingLPr(ComponentName componentName, int userId) { 2446447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String packageName = componentName.getPackageName(); 2447447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkg = mPackages.get(packageName); 2448447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkg == null) { 2449447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown component: " + componentName); 2450447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2451447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final String classNameStr = componentName.getClassName(); 2452483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return pkg.getCurrentEnabledStateLPr(classNameStr, userId); 2453447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2454483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 2455447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean setPackageStoppedStateLPw(String packageName, boolean stopped, 2456483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani boolean allowedByPermission, int uid, int userId) { 2457f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn int appId = UserHandle.getAppId(uid); 2458447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final PackageSetting pkgSetting = mPackages.get(packageName); 2459447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting == null) { 2460447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new IllegalArgumentException("Unknown package: " + packageName); 2461447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2462135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (!allowedByPermission && (appId != pkgSetting.appId)) { 2463447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root throw new SecurityException( 2464447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root "Permission Denial: attempt to change stopped state from pid=" 2465447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root + Binder.getCallingPid() 2466135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani + ", uid=" + uid + ", package uid=" + pkgSetting.appId); 2467447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2468447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (DEBUG_STOPPED) { 2469447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (stopped) { 2470447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root RuntimeException e = new RuntimeException("here"); 2471447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root e.fillInStackTrace(); 2472447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root Slog.i(TAG, "Stopping package " + packageName, e); 2473447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2474447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2475483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (pkgSetting.getStopped(userId) != stopped) { 2476483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkgSetting.setStopped(stopped, userId); 2477483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // pkgSetting.pkg.mSetStopped = stopped; 2478483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani if (pkgSetting.getNotLaunched(userId)) { 2479447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (pkgSetting.installerPackageName != null) { 2480447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH, 2481447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pkgSetting.name, null, 24827767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pkgSetting.installerPackageName, null, new int[] {userId}); 2483447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2484483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pkgSetting.setNotLaunched(false, userId); 2485447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2486447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return true; 2487447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2488447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root return false; 2489447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2490447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2491483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani private List<UserInfo> getAllUsers() { 24927ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani long id = Binder.clearCallingIdentity(); 2493483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani try { 2494920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani return UserManagerService.getInstance().getUsers(false); 2495483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } catch (NullPointerException npe) { 2496483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani // packagemanager not yet initialized 24977ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani } finally { 24987ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani Binder.restoreCallingIdentity(id); 2499483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 2500483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani return null; 2501483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 2502483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 250320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato static final void printFlags(PrintWriter pw, int val, Object[] spec) { 250420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print("[ "); 250520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato for (int i=0; i<spec.length; i+=2) { 250620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato int mask = (Integer)spec[i]; 250720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato if ((val & mask) != 0) { 250820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print(spec[i+1]); 250920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print(" "); 251020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato } 251120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato } 251220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print("]"); 251320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato } 251420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato 251520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato static final Object[] FLAG_DUMP_SPEC = new Object[] { 251620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_SYSTEM, "SYSTEM", 251720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE", 251820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE", 251920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT", 252020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST", 252120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING", 252220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA", 252320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP", 252420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY", 252520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE", 252620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP", 252720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE", 252820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION", 252920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE", 253020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP", 253120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_FORWARD_LOCK, "FORWARD_LOCK", 253220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato ApplicationInfo.FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE", 253320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato }; 253420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato 2535447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2536447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 2537447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root final Date date = new Date(); 2538447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 25397ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani List<UserInfo> users = getAllUsers(); 2540447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting ps : mPackages.values()) { 2541447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(ps.realName) 2542447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(ps.name)) { 2543447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2544447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2545447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2546447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null) { 2547447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root dumpState.setSharedUser(ps.sharedUser); 2548447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2549447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2550447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2551447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2552447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2553447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Packages:"); 2554447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2555447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2556447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Package ["); 2557447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(ps.realName != null ? ps.realName : ps.name); 2558447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2559447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(ps))); 2560447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2561447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2562447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.realName != null) { 2563447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" compat name="); 2564447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.name); 2565447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2566447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2567135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani pw.print(" userId="); pw.print(ps.appId); 2568447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids)); 2569447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sharedUser="); pw.println(ps.sharedUser); 2570447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" pkg="); pw.println(ps.pkg); 2571447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" codePath="); pw.println(ps.codePathString); 2572447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" resourcePath="); pw.println(ps.resourcePathString); 2573447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" nativeLibraryPath="); pw.println(ps.nativeLibraryPathString); 2574447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" versionCode="); pw.println(ps.versionCode); 2575447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.pkg != null) { 2576eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root pw.print(" applicationInfo="); pw.println(ps.pkg.applicationInfo.toString()); 257720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato pw.print(" flags="); printFlags(pw, ps.pkg.applicationInfo.flags, FLAG_DUMP_SPEC); pw.println(); 2578447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" versionName="); pw.println(ps.pkg.mVersionName); 2579447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir); 2580447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion); 2581447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.pkg.mOperationPending) { 2582447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" mOperationPending=true"); 2583447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2584447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" supportsScreens=["); 2585447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean first = true; 2586447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) { 2587447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2588447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2589447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2590447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("small"); 2591447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2592447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) { 2593447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2594447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2595447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2596447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("medium"); 2597447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2598447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) { 2599447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2600447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2601447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2602447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("large"); 2603447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2604447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) { 2605447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2606447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2607447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2608447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("xlarge"); 2609447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2610447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) { 2611447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2612447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2613447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2614447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("resizeable"); 2615447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2616447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) { 2617447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!first) 2618447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(", "); 2619447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root first = false; 2620447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("anyDensity"); 2621447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 26225e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn pw.println("]"); 2623447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2624447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" timeStamp="); 2625447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.timeStamp); 2626447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2627447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" firstInstallTime="); 2628447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.firstInstallTime); 2629447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2630447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" lastUpdateTime="); 2631447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root date.setTime(ps.lastUpdateTime); 2632447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(sdf.format(date)); 2633447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.installerPackageName != null) { 2634447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" installerPackageName="); pw.println(ps.installerPackageName); 2635447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2636447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" signatures="); pw.println(ps.signatures); 2637d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn pw.print(" permissionsFixed="); pw.print(ps.permissionsFixed); 2638d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn pw.print(" haveGids="); pw.print(ps.haveGids); 2639d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn pw.print(" installStatus="); pw.println(ps.installStatus); 26405455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC); 2641d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn pw.println(); 2642483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani for (UserInfo user : users) { 26437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pw.print(" User "); pw.print(user.id); pw.print(": "); 26447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pw.print(" installed="); 26457767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pw.print(ps.getInstalled(user.id)); 2646483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" stopped="); 2647483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(ps.getStopped(user.id)); 26487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pw.print(" notLaunched="); 26497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pw.print(ps.getNotLaunched(user.id)); 2650483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" enabled="); 2651483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.println(ps.getEnabled(user.id)); 26527767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn HashSet<String> cmp = ps.getDisabledComponents(user.id); 26537767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (cmp != null && cmp.size() > 0) { 26547767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pw.println(" disabledComponents:"); 26557767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn for (String s : cmp) { 2656483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" "); pw.println(s); 2657483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 2658447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 26597767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn cmp = ps.getEnabledComponents(user.id); 26607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn if (cmp != null && cmp.size() > 0) { 26617767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn pw.println(" enabledComponents:"); 26627767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn for (String s : cmp) { 2663483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani pw.print(" "); pw.println(s); 2664483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani } 2665447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2666447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2667447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.grantedPermissions.size() > 0) { 2668447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" grantedPermissions:"); 2669447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : ps.grantedPermissions) { 2670447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); pw.println(s); 2671447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2672447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2673447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2674447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2675447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = false; 2676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (mRenamedPackages.size() > 0) { 26772f36229db823d152f3efd879e751e81a601a75b0Andy McFadden for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) { 2678447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(e.getKey()) 2679447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(e.getValue())) { 2680447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2681447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2682447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2683447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2684447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2685447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Renamed packages:"); 2686447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2687447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2688447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); 2689447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(e.getKey()); 2690447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" -> "); 2691447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(e.getValue()); 2692447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2693447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2694447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2695447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = false; 2696447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (mDisabledSysPackages.size() > 0) { 2697447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (final PackageSetting ps : mDisabledSysPackages.values()) { 2698447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(ps.realName) 2699447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root && !packageName.equals(ps.name)) { 2700447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2701447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2702447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2703447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2704447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2705447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Hidden system packages:"); 2706447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2707447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2708447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Package ["); 2709447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(ps.realName != null ? ps.realName : ps.name); 2710447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2711447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(ps))); 2712447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2713447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (ps.realName != null) { 2714447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" compat name="); 2715447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.name); 2716447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2717eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root if (ps.pkg != null && ps.pkg.applicationInfo != null) { 2718eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root pw.print(" applicationInfo="); 2719eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root pw.println(ps.pkg.applicationInfo.toString()); 2720eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root } 2721447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); 2722135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani pw.println(ps.appId); 2723447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sharedUser="); 2724447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.sharedUser); 2725447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" codePath="); 2726447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.codePathString); 2727447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" resourcePath="); 2728447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(ps.resourcePathString); 2729447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2730447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2731447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2732483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 2733447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2734447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2735447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (BasePermission p : mPermissions.values()) { 2736447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && !packageName.equals(p.sourcePackage)) { 2737447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2738447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2739447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2740447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2741447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2742447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Permissions:"); 2743447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2744447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2745447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" Permission ["); pw.print(p.name); pw.print("] ("); 2746447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(p))); 2747447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2748447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" sourcePackage="); pw.println(p.sourcePackage); 2749447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" uid="); pw.print(p.uid); 2750447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids)); 2751447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" type="); pw.print(p.type); 2752e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn pw.print(" prot="); 2753e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn pw.println(PermissionInfo.protectionToString(p.protectionLevel)); 2754447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (p.packageSetting != null) { 2755447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" packageSetting="); pw.println(p.packageSetting); 2756447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2757447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (p.perm != null) { 2758447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" perm="); pw.println(p.perm); 2759447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 27601c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey if (READ_EXTERNAL_STORAGE.equals(p.name)) { 27615d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey pw.print(" enforced="); 27625d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey pw.println(mReadExternalStorageEnforced); 27631c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey } 2764447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2765447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 27661c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey 2767447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) { 2768447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root boolean printedSomething = false; 2769447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (SharedUserSetting su : mSharedUsers.values()) { 2770447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (packageName != null && su != dumpState.getSharedUser()) { 2771447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root continue; 2772447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2773447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (!printedSomething) { 2774447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root if (dumpState.onTitlePrinted()) 2775447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" "); 2776447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Shared users:"); 2777447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root printedSomething = true; 2778447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2779447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" SharedUser ["); 2780447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(su.name); 2781447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print("] ("); 2782447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(Integer.toHexString(System.identityHashCode(su))); 2783447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("):"); 2784447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" userId="); 2785447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(su.userId); 2786447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" gids="); 2787447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(PackageManagerService.arrayToString(su.gids)); 2788447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(" grantedPermissions:"); 2789447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root for (String s : su.grantedPermissions) { 2790447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(" "); 2791447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println(s); 2792447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2793447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2794447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 2795447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root 2796447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) { 2797447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.println("Settings parse messages:"); 2798447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root pw.print(mReadMessages.toString()); 2799447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root } 28002f36229db823d152f3efd879e751e81a601a75b0Andy McFadden} 2801